@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
|
@@ -15,7 +15,7 @@ import { LogStatus } from '@memberjunction/core';
|
|
|
15
15
|
import { configInfo } from '../config.js';
|
|
16
16
|
import { MagicLinkKeyManager } from '../auth/magicLink/MagicLinkKeys.js';
|
|
17
17
|
import { RegisterMagicLinkAuthProvider } from '../auth/magicLink/MagicLinkRouter.js';
|
|
18
|
-
import { WidgetSessionService } from './WidgetSessionService.js';
|
|
18
|
+
import { WidgetSessionService, WIDGET_REFRESH_PATH } from './WidgetSessionService.js';
|
|
19
19
|
import { LooksLikeBot } from './widgetCore.js';
|
|
20
20
|
/** The mount path for the widget public router (`/widget`). */
|
|
21
21
|
export const WIDGET_MOUNT_PATH = '/widget';
|
|
@@ -47,7 +47,9 @@ function ensureWidgetSigning(publicUrl, widgetConfig) {
|
|
|
47
47
|
*/
|
|
48
48
|
export function CreateWidgetHandler(publicUrl, config) {
|
|
49
49
|
ensureWidgetSigning(publicUrl, config);
|
|
50
|
-
|
|
50
|
+
// A widget may hand an anonymous guest only a scope-isolated role (MJ#6043); the opt-in list is the one
|
|
51
|
+
// magic-link invites already use, so an admin declares "safe for anonymous visitors" in one place.
|
|
52
|
+
const service = new WidgetSessionService(publicUrl, config, { GrantableRoleNames: configInfo.magicLink?.grantableRoleNames ?? [] });
|
|
51
53
|
// Per-instance DYNAMIC mint limiter (W6 hardening): keyed by (widgetKey + IP) so each widget
|
|
52
54
|
// deployment gets its own bucket and one abusive IP can't exhaust a shared instance's budget for
|
|
53
55
|
// everyone. The per-request `limit` is the widget instance's stored `RateLimitPerMinute` (cached,
|
|
@@ -69,7 +71,7 @@ export function CreateWidgetHandler(publicUrl, config) {
|
|
|
69
71
|
publicRouter.post('/session', json(), mintLimiter, async (req, res) => {
|
|
70
72
|
await handleMint(service, req, res, false);
|
|
71
73
|
});
|
|
72
|
-
publicRouter.post(
|
|
74
|
+
publicRouter.post(WIDGET_REFRESH_PATH, json(), mintLimiter, async (req, res) => {
|
|
73
75
|
await handleMint(service, req, res, true);
|
|
74
76
|
});
|
|
75
77
|
// W5 magic-link upgrade ("Verify it's you"): emails a verification link scoped to the widget's app.
|
|
@@ -150,6 +152,15 @@ async function handleUpgrade(service, req, res) {
|
|
|
150
152
|
const status = result.success ? 200 : result.errorCode === 'invalid_email' ? 400 : result.errorCode === 'server_error' ? 500 : 403;
|
|
151
153
|
res.status(status).json(result);
|
|
152
154
|
}
|
|
155
|
+
/** Extracts a raw JWT from an `Authorization: Bearer <token>` header, or undefined when absent/malformed. */
|
|
156
|
+
function extractBearerToken(authHeader) {
|
|
157
|
+
if (!authHeader) {
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
const match = /^Bearer\s+(\S+)$/i.exec(authHeader.trim());
|
|
161
|
+
const token = match?.[1]?.trim();
|
|
162
|
+
return token && token.length > 0 ? token : undefined;
|
|
163
|
+
}
|
|
153
164
|
/** Shared mint/refresh handler — parses the request, calls the service, maps the status. */
|
|
154
165
|
async function handleMint(service, req, res, refresh) {
|
|
155
166
|
const body = (req.body ?? {});
|
|
@@ -158,6 +169,8 @@ async function handleMint(service, req, res, refresh) {
|
|
|
158
169
|
res.status(400).json({ success: false, errorCode: 'not_found', error: 'widgetKey is required.' });
|
|
159
170
|
return;
|
|
160
171
|
}
|
|
172
|
+
// The service validates the key's shape (ToProofPublicJwk) and refuses anything that is not a public P-256 JWK.
|
|
173
|
+
const proofKey = body.proofKey === undefined ? undefined : body.proofKey;
|
|
161
174
|
// W6 hardening: coarse bot/automation rejection before any DB lookup or token mint. Returns the same
|
|
162
175
|
// 403 as a policy rejection so a probe can't distinguish "bot-blocked" from "bad key/origin".
|
|
163
176
|
if (LooksLikeBot(req.get('user-agent'))) {
|
|
@@ -170,6 +183,9 @@ async function handleMint(service, req, res, refresh) {
|
|
|
170
183
|
origin,
|
|
171
184
|
hostAssertion: typeof body.hostAssertion === 'string' ? body.hostAssertion : undefined,
|
|
172
185
|
visitorKey: typeof body.visitorKey === 'string' ? body.visitorKey : undefined,
|
|
186
|
+
BearerToken: refresh ? extractBearerToken(req.get('authorization')) : undefined,
|
|
187
|
+
Proof: refresh ? req.get('dpop') : undefined,
|
|
188
|
+
ProofKey: refresh ? undefined : proofKey,
|
|
173
189
|
audit: { ipAddress: req.ip, userAgent: req.get('user-agent') ?? undefined, origin },
|
|
174
190
|
};
|
|
175
191
|
const result = refresh ? await service.RefreshGuestSession(input) : await service.MintGuestSession(input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WidgetRouter.js","sourceRoot":"","sources":["../../src/realtimeWidget/WidgetRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAA+B,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"WidgetRouter.js","sourceRoot":"","sources":["../../src/realtimeWidget/WidgetRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,13 +9,36 @@
|
|
|
9
9
|
* widget guest is ephemeral). Forensics ride the opaque per-session id (`mj_sid`)
|
|
10
10
|
* carried in the token, plus best-effort structured audit logging. The minted
|
|
11
11
|
* token is validated by the SAME `magic-link` auth provider (same issuer/audience/
|
|
12
|
-
* JWKS) and synthesized into a constrained guest principal by `
|
|
12
|
+
* JWKS) and synthesized into a constrained guest principal by `BuildMagicLinkSessionUser`.
|
|
13
13
|
*
|
|
14
14
|
* @module @memberjunction/server/widget
|
|
15
15
|
*/
|
|
16
|
+
import { type ProofPublicJwk } from '@memberjunction/global';
|
|
16
17
|
import { type WidgetConfig } from '../config.js';
|
|
17
|
-
import { type WidgetMintErrorCode } from './widgetCore.js';
|
|
18
|
+
import { type GuestRolePolicy, type WidgetMintErrorCode } from './widgetCore.js';
|
|
18
19
|
import { type ResolvedVisitorIdentity } from './visitorIdentity.js';
|
|
20
|
+
/**
|
|
21
|
+
* Maximum clock-skew / late-timer grace window (seconds) after `exp` during which
|
|
22
|
+
* `RefreshGuestSession` still accepts a widget guest Bearer token and preserves its `mj_sid`.
|
|
23
|
+
*/
|
|
24
|
+
export declare const REFRESH_GRACE_SECONDS = 300;
|
|
25
|
+
/**
|
|
26
|
+
* Hard end of a widget guest session (seconds after its first mint, `mj_sid_iat`). Refresh keeps the
|
|
27
|
+
* visitor's `mj_sid`, so without an end a token captured once could be renewed forever and keep reading
|
|
28
|
+
* that visitor's conversations; past this point refresh is refused and no token outlives it.
|
|
29
|
+
*/
|
|
30
|
+
export declare const MAX_GUEST_SESSION_SECONDS: number;
|
|
31
|
+
/**
|
|
32
|
+
* The least lifetime a refreshed token may have. Refresh is refused once less than this remains before the hard end,
|
|
33
|
+
* so the last refresh gets the 403 that makes the widget start a new session. It must exceed the widget's refresh
|
|
34
|
+
* lead (60 s before `exp`): a token issued with less would be due for refresh at once, every time, until the rate
|
|
35
|
+
* limiter answered 429 instead. It also keeps a re-minted token's `exp` after its `iat`.
|
|
36
|
+
*/
|
|
37
|
+
export declare const MIN_REFRESHED_TOKEN_SECONDS = 120;
|
|
38
|
+
/** The refresh route's path under the widget mount; the refresh proof must name it (`htu`). */
|
|
39
|
+
export declare const WIDGET_REFRESH_PATH = "/session/refresh";
|
|
40
|
+
/** How far a refresh proof's signing time (`iat`) may be from the server clock, either way. */
|
|
41
|
+
export declare const REFRESH_PROOF_MAX_SKEW_SECONDS = 60;
|
|
19
42
|
/** Per-request forensic context captured for audit (sourced from the HTTP request). */
|
|
20
43
|
export interface WidgetMintAuditContext {
|
|
21
44
|
ipAddress?: string;
|
|
@@ -41,6 +64,19 @@ export interface MintGuestSessionInput {
|
|
|
41
64
|
* server mints a fresh one. Ignored entirely when remembering is off.
|
|
42
65
|
*/
|
|
43
66
|
visitorKey?: string;
|
|
67
|
+
/**
|
|
68
|
+
* The caller's current guest session JWT (`Authorization: Bearer <token>`), required by
|
|
69
|
+
* `RefreshGuestSession` so a refresh proves possession of the session being renewed and
|
|
70
|
+
* preserves its `mj_sid` (`sessionId`).
|
|
71
|
+
*/
|
|
72
|
+
BearerToken?: string;
|
|
73
|
+
/**
|
|
74
|
+
* The widget's proof key (public P-256 JWK, from the mint body's `proofKey`). Its thumbprint is signed into
|
|
75
|
+
* the token as `cnf.jkt`; a token minted without one cannot be refreshed.
|
|
76
|
+
*/
|
|
77
|
+
ProofKey?: ProofPublicJwk;
|
|
78
|
+
/** The refresh proof (`DPoP` header), signed by the key registered at mint. Required by `RefreshGuestSession`. */
|
|
79
|
+
Proof?: string;
|
|
44
80
|
audit?: WidgetMintAuditContext;
|
|
45
81
|
}
|
|
46
82
|
/** Result of a guest-session mint. */
|
|
@@ -157,18 +193,35 @@ export interface UpgradeGuestSessionResult {
|
|
|
157
193
|
export declare class WidgetSessionService {
|
|
158
194
|
private readonly publicUrl;
|
|
159
195
|
private readonly config;
|
|
160
|
-
|
|
196
|
+
/** Which roles a widget may hand to an anonymous guest; by default only the scope-isolated `Widget Guest`. */
|
|
197
|
+
private readonly guestRolePolicy;
|
|
198
|
+
constructor(publicUrl: string, config: WidgetConfig,
|
|
199
|
+
/** Which roles a widget may hand to an anonymous guest; by default only the scope-isolated `Widget Guest`. */
|
|
200
|
+
guestRolePolicy?: GuestRolePolicy);
|
|
161
201
|
/**
|
|
162
202
|
* Resolves the widget instance, enforces guardrails, and mints a guest JWT.
|
|
163
203
|
* Never throws for business failures — returns `{ success: false, errorCode }`.
|
|
164
204
|
*/
|
|
165
205
|
MintGuestSession(input: MintGuestSessionInput): Promise<MintGuestSessionResult>;
|
|
166
206
|
/**
|
|
167
|
-
* Refreshes a live guest session
|
|
168
|
-
*
|
|
169
|
-
*
|
|
207
|
+
* Refreshes a live guest session while preserving its per-visitor `sessionId` (`mj_sid`).
|
|
208
|
+
* Requires the caller's current widget guest JWT (`input.BearerToken`), verified against the
|
|
209
|
+
* magic-link signing key with a {@link REFRESH_GRACE_SECONDS} post-expiry grace window, and
|
|
210
|
+
* bound to the resolved widget instance (`mj_widget_id === widget.ID`, `mj_anon === true`,
|
|
211
|
+
* `mj_magic_link === true`). Any failure returns the same uniform 403 shape as an unknown widget key.
|
|
170
212
|
*/
|
|
171
213
|
RefreshGuestSession(input: MintGuestSessionInput): Promise<MintGuestSessionResult>;
|
|
214
|
+
/**
|
|
215
|
+
* Verifies a `RefreshGuestSession` request: the caller's current widget guest JWT and the proof that the
|
|
216
|
+
* caller holds the key the token is bound to. Returns the session to carry forward, or `null` when the token
|
|
217
|
+
* is missing, tampered, expired past {@link REFRESH_GRACE_SECONDS}, past the session's hard end
|
|
218
|
+
* ({@link MAX_GUEST_SESSION_SECONDS}) or without a session start, non-anonymous, minted for a different
|
|
219
|
+
* widget, issued by another deployment, or not bound to a key; or when the proof is missing or not made by
|
|
220
|
+
* that key for this request and token.
|
|
221
|
+
*/
|
|
222
|
+
private verifyRefreshRequest;
|
|
223
|
+
/** The token half of {@link verifyRefreshRequest}: everything except the proof. */
|
|
224
|
+
private verifyRefreshBearerToken;
|
|
172
225
|
/**
|
|
173
226
|
* Short-TTL, size-bounded cache of resolved per-instance rate limits, so the limiter doesn't hit
|
|
174
227
|
* the DB per request. The cache key (`widgetKey`) is presented by an UNAUTHENTICATED caller on the
|
|
@@ -197,7 +250,7 @@ export declare class WidgetSessionService {
|
|
|
197
250
|
* clicks the emailed link → the existing public `POST /magic-link/redeem` mints a VERIFIED session
|
|
198
251
|
* JWT → the widget swaps it in via `transport.UpdateToken`, preserving the live conversationId.
|
|
199
252
|
*
|
|
200
|
-
* This converges on the SAME `AuthProviderFactory` + `
|
|
253
|
+
* This converges on the SAME `AuthProviderFactory` + `BuildMagicLinkSessionUser` path as the guest
|
|
201
254
|
* mint (D1), so the verified session is just a more-privileged principal on the one pathway. Never
|
|
202
255
|
* throws for business failures — returns a structured result.
|
|
203
256
|
*/
|
|
@@ -263,6 +316,13 @@ export declare class WidgetSessionService {
|
|
|
263
316
|
private loadWidgetByKey;
|
|
264
317
|
/** Resolves the guest role's NAME from its id (claims carry the name, not the id). */
|
|
265
318
|
private resolveGuestRoleName;
|
|
319
|
+
/**
|
|
320
|
+
* The ONE decision, for mint and refresh alike, of which role a guest token carries: the widget's `GuestRoleID`
|
|
321
|
+
* must resolve, and it must be a role the deployment may hand to an anonymous visitor
|
|
322
|
+
* ({@link IsIsolatedGuestRole}). Both refusals are the admin's to fix, so both are logged with the widget id;
|
|
323
|
+
* the visitor gets a uniform rejection.
|
|
324
|
+
*/
|
|
325
|
+
private resolveIsolatedGuestRole;
|
|
266
326
|
/** Resolves the server-side context user used to READ widget config (not the guest principal). */
|
|
267
327
|
private resolveLookupUser;
|
|
268
328
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WidgetSessionService.d.ts","sourceRoot":"","sources":["../../src/realtimeWidget/WidgetSessionService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"WidgetSessionService.d.ts","sourceRoot":"","sources":["../../src/realtimeWidget/WidgetSessionService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,EAA8F,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAMzJ,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAyF,KAAK,eAAe,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGxK,OAAO,EAA+D,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAQjI;;;GAGG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,QAAY,CAAC;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,+FAA+F;AAC/F,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AAEtD,+FAA+F;AAC/F,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAoBjD,uFAAuF;AACvF,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qCAAqC;AACrC,MAAM,WAAW,qBAAqB;IACpC,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,kHAAkH;IAClH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,sBAAsB,CAAC;CAChC;AAED,sCAAsC;AACtC,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,gGAAgG;IAChG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yFAAyF;IACzF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iGAAiG;IACjG,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mGAAmG;IACnG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oHAAoH;IACpH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAED,wGAAwG;AACxG,MAAM,WAAW,2BAA2B;IAC1C,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,oGAAoG;IACpG,UAAU,EAAE,MAAM,CAAC;IACnB,uGAAuG;IACvG,aAAa,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,+CAA+C;AAC/C,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAED,4CAA4C;AAC5C,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAeD,6CAA6C;AAC7C,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAED,oFAAoF;AACpF,MAAM,WAAW,wBAAwB;IACvC,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,yGAAyG;AACzG,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,kGAAkG;IAClG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAOD;;;GAGG;AACH,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,8GAA8G;IAC9G,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAHf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY;IACrC,8GAA8G;IAC7F,eAAe,GAAE,eAA4C;IAGhF;;;OAGG;IACU,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAwE5F;;;;;;OAMG;IACU,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAuD/F;;;;;;;OAOG;YACW,oBAAoB;IAuBlC,mFAAmF;IACnF,OAAO,CAAC,wBAAwB;IAkDhC;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAG5B;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAU;IACzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAU;IAE3D,yFAAyF;IACzF,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED;;;;;OAKG;IACU,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0B5E;;;;;;;;;;OAUG;IACU,cAAc,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAyChG;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAYlB,oEAAoE;IACpE,OAAO,CAAC,SAAS;IAgEjB;;;;;OAKG;YACW,+BAA+B;IAuB7C;;;;;OAKG;IACU,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAyB9G;;;;OAIG;IACU,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmBnF;;;;OAIG;YACW,yBAAyB;IA6BvC;;;;;;OAMG;YACW,uBAAuB;IAiBrC;;;;;;;OAOG;YACW,8BAA8B;IAmB5C;;;;OAIG;YACW,oCAAoC;IA2BlD,mFAAmF;YACrE,eAAe;IAuB7B,sFAAsF;IACtF,OAAO,CAAC,oBAAoB;IAM5B;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAkBhC,kGAAkG;IAClG,OAAO,CAAC,iBAAiB;IAIzB;;;;;OAKG;IACH,OAAO,CAAC,OAAO;CAYhB"}
|
|
@@ -9,18 +9,20 @@
|
|
|
9
9
|
* widget guest is ephemeral). Forensics ride the opaque per-session id (`mj_sid`)
|
|
10
10
|
* carried in the token, plus best-effort structured audit logging. The minted
|
|
11
11
|
* token is validated by the SAME `magic-link` auth provider (same issuer/audience/
|
|
12
|
-
* JWKS) and synthesized into a constrained guest principal by `
|
|
12
|
+
* JWKS) and synthesized into a constrained guest principal by `BuildMagicLinkSessionUser`.
|
|
13
13
|
*
|
|
14
14
|
* @module @memberjunction/server/widget
|
|
15
15
|
*/
|
|
16
|
+
import { createPublicKey } from 'node:crypto';
|
|
17
|
+
import jwt from 'jsonwebtoken';
|
|
16
18
|
import { Metadata, RunView, LogError, LogStatus } from '@memberjunction/core';
|
|
17
|
-
import { MJLruCache, UUIDsEqual } from '@memberjunction/global';
|
|
19
|
+
import { ComputeJwkThumbprint, MJLruCache, ToProofPublicJwk, UUIDsEqual, VerifyProofOfPossessionJwt } from '@memberjunction/global';
|
|
18
20
|
import { ResolveConfiguredPrincipal } from '../auth/principals.js';
|
|
19
21
|
import { MagicLinkKeyManager } from '../auth/magicLink/MagicLinkKeys.js';
|
|
20
22
|
import { GenerateSessionId } from '../auth/magicLink/magicLinkCore.js';
|
|
21
23
|
import { MagicLinkService } from '../auth/magicLink/MagicLinkService.js';
|
|
22
24
|
import { configInfo } from '../config.js';
|
|
23
|
-
import { BuildWidgetGuestClaims, EvaluateWidgetMint, ParseEnabledChannels } from './widgetCore.js';
|
|
25
|
+
import { BuildWidgetGuestClaims, EvaluateWidgetMint, IsIsolatedGuestRole, ParseEnabledChannels } from './widgetCore.js';
|
|
24
26
|
import { VerifyHostAssertion } from './host-identity.js';
|
|
25
27
|
import { WriteReturningVisitorRecap } from '../agentSessions/ReturningVisitorRecap.js';
|
|
26
28
|
import { ResolveIdentityByEmail, MergeVisitorIdentity, ForgetVisitor } from './visitorIdentity.js';
|
|
@@ -28,6 +30,28 @@ const WIDGET_ENTITY = 'MJ: Conversation Widget Instances';
|
|
|
28
30
|
const CONVERSATIONS_ENTITY = 'MJ: Conversations';
|
|
29
31
|
/** Shape of the durable visitor anchor key (opaque base64url, same alphabet as generateSessionId). */
|
|
30
32
|
const VISITOR_KEY_PATTERN = /^[A-Za-z0-9_-]{16,128}$/;
|
|
33
|
+
/**
|
|
34
|
+
* Maximum clock-skew / late-timer grace window (seconds) after `exp` during which
|
|
35
|
+
* `RefreshGuestSession` still accepts a widget guest Bearer token and preserves its `mj_sid`.
|
|
36
|
+
*/
|
|
37
|
+
export const REFRESH_GRACE_SECONDS = 300;
|
|
38
|
+
/**
|
|
39
|
+
* Hard end of a widget guest session (seconds after its first mint, `mj_sid_iat`). Refresh keeps the
|
|
40
|
+
* visitor's `mj_sid`, so without an end a token captured once could be renewed forever and keep reading
|
|
41
|
+
* that visitor's conversations; past this point refresh is refused and no token outlives it.
|
|
42
|
+
*/
|
|
43
|
+
export const MAX_GUEST_SESSION_SECONDS = 12 * 3600;
|
|
44
|
+
/**
|
|
45
|
+
* The least lifetime a refreshed token may have. Refresh is refused once less than this remains before the hard end,
|
|
46
|
+
* so the last refresh gets the 403 that makes the widget start a new session. It must exceed the widget's refresh
|
|
47
|
+
* lead (60 s before `exp`): a token issued with less would be due for refresh at once, every time, until the rate
|
|
48
|
+
* limiter answered 429 instead. It also keeps a re-minted token's `exp` after its `iat`.
|
|
49
|
+
*/
|
|
50
|
+
export const MIN_REFRESHED_TOKEN_SECONDS = 120;
|
|
51
|
+
/** The refresh route's path under the widget mount; the refresh proof must name it (`htu`). */
|
|
52
|
+
export const WIDGET_REFRESH_PATH = '/session/refresh';
|
|
53
|
+
/** How far a refresh proof's signing time (`iat`) may be from the server clock, either way. */
|
|
54
|
+
export const REFRESH_PROOF_MAX_SKEW_SECONDS = 60;
|
|
31
55
|
/** Minimal email sanity check (presence + single `@` with a dotted domain) — not full RFC validation. */
|
|
32
56
|
function isLikelyEmail(email) {
|
|
33
57
|
return /^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email);
|
|
@@ -37,9 +61,12 @@ function isLikelyEmail(email) {
|
|
|
37
61
|
* Stateless; constructed once at server startup alongside the magic-link service.
|
|
38
62
|
*/
|
|
39
63
|
export class WidgetSessionService {
|
|
40
|
-
constructor(publicUrl, config
|
|
64
|
+
constructor(publicUrl, config,
|
|
65
|
+
/** Which roles a widget may hand to an anonymous guest; by default only the scope-isolated `Widget Guest`. */
|
|
66
|
+
guestRolePolicy = { GrantableRoleNames: [] }) {
|
|
41
67
|
this.publicUrl = publicUrl;
|
|
42
68
|
this.config = config;
|
|
69
|
+
this.guestRolePolicy = guestRolePolicy;
|
|
43
70
|
/**
|
|
44
71
|
* Short-TTL, size-bounded cache of resolved per-instance rate limits, so the limiter doesn't hit
|
|
45
72
|
* the DB per request. The cache key (`widgetKey`) is presented by an UNAUTHENTICATED caller on the
|
|
@@ -73,11 +100,11 @@ export class WidgetSessionService {
|
|
|
73
100
|
if (!eligibility.ok) {
|
|
74
101
|
return this.audited({ success: false, errorCode: eligibility.errorCode, error: 'Widget mint rejected.' }, input, widget);
|
|
75
102
|
}
|
|
76
|
-
const
|
|
77
|
-
if (
|
|
78
|
-
|
|
79
|
-
return this.audited({ success: false, errorCode: 'server_error', error: 'Guest role not resolvable.' }, input, widget);
|
|
103
|
+
const guestRole = this.resolveIsolatedGuestRole(widget);
|
|
104
|
+
if (guestRole.ok === false) {
|
|
105
|
+
return this.audited(guestRole.refusal, input, widget);
|
|
80
106
|
}
|
|
107
|
+
const guestRoleName = guestRole.name;
|
|
81
108
|
// D1 host-identity strategy: a HostIdentity widget MUST present a valid host assertion.
|
|
82
109
|
let hostIdentity;
|
|
83
110
|
if (widget.AuthStrategy === 'HostIdentity') {
|
|
@@ -98,7 +125,16 @@ export class WidgetSessionService {
|
|
|
98
125
|
// RV4 (host-identity path): when a host asserts a resolvable identity, promote the visitor's prior
|
|
99
126
|
// anonymous trail to that record and surface the pair so the client stamps the new conversation.
|
|
100
127
|
const resolvedIdentity = await this.resolveHostIdentityIfApplicable(widget, hostIdentity, returningVisitor, contextUser);
|
|
101
|
-
|
|
128
|
+
let proofKeyThumbprint;
|
|
129
|
+
if (input.ProofKey !== undefined) {
|
|
130
|
+
const proofKey = ToProofPublicJwk(input.ProofKey);
|
|
131
|
+
if (!proofKey) {
|
|
132
|
+
LogError(`[Widget] Mint for widget ${widget.ID} refused: the proof key is not a public P-256 JWK.`);
|
|
133
|
+
return this.audited({ success: false, errorCode: 'not_found', error: 'Widget mint rejected.' }, input, widget);
|
|
134
|
+
}
|
|
135
|
+
proofKeyThumbprint = await ComputeJwkThumbprint(proofKey);
|
|
136
|
+
}
|
|
137
|
+
return this.audited(this.mintToken(widget, guestRoleName, hostIdentity, returningVisitor, resolvedIdentity, undefined, proofKeyThumbprint), input, widget);
|
|
102
138
|
}
|
|
103
139
|
catch (e) {
|
|
104
140
|
LogError(e);
|
|
@@ -106,12 +142,133 @@ export class WidgetSessionService {
|
|
|
106
142
|
}
|
|
107
143
|
}
|
|
108
144
|
/**
|
|
109
|
-
* Refreshes a live guest session
|
|
110
|
-
*
|
|
111
|
-
*
|
|
145
|
+
* Refreshes a live guest session while preserving its per-visitor `sessionId` (`mj_sid`).
|
|
146
|
+
* Requires the caller's current widget guest JWT (`input.BearerToken`), verified against the
|
|
147
|
+
* magic-link signing key with a {@link REFRESH_GRACE_SECONDS} post-expiry grace window, and
|
|
148
|
+
* bound to the resolved widget instance (`mj_widget_id === widget.ID`, `mj_anon === true`,
|
|
149
|
+
* `mj_magic_link === true`). Any failure returns the same uniform 403 shape as an unknown widget key.
|
|
112
150
|
*/
|
|
113
151
|
async RefreshGuestSession(input) {
|
|
114
|
-
|
|
152
|
+
try {
|
|
153
|
+
const contextUser = this.resolveLookupUser();
|
|
154
|
+
if (!contextUser) {
|
|
155
|
+
LogError('[Widget] No lookup context user available; server not configured.');
|
|
156
|
+
return { success: false, errorCode: 'server_error', error: 'Server not configured for widget sessions.' };
|
|
157
|
+
}
|
|
158
|
+
const widget = await this.loadWidgetByKey(input.widgetKey, contextUser);
|
|
159
|
+
if (!widget) {
|
|
160
|
+
return this.audited({ success: false, errorCode: 'not_found', error: 'Unknown widget key.' }, input, undefined);
|
|
161
|
+
}
|
|
162
|
+
const eligibility = EvaluateWidgetMint({ Status: widget.Status, AllowedOrigins: widget.AllowedOrigins, Modality: widget.Modality }, input.origin);
|
|
163
|
+
if (!eligibility.ok) {
|
|
164
|
+
return this.audited({ success: false, errorCode: eligibility.errorCode, error: 'Widget mint rejected.' }, input, widget);
|
|
165
|
+
}
|
|
166
|
+
const guestRole = this.resolveIsolatedGuestRole(widget);
|
|
167
|
+
if (guestRole.ok === false) {
|
|
168
|
+
return this.audited(guestRole.refusal, input, widget);
|
|
169
|
+
}
|
|
170
|
+
const guestRoleName = guestRole.name;
|
|
171
|
+
let hostIdentity;
|
|
172
|
+
if (widget.AuthStrategy === 'HostIdentity') {
|
|
173
|
+
const verified = this.verifyHost(widget, input.hostAssertion);
|
|
174
|
+
if (!verified) {
|
|
175
|
+
return this.audited({ success: false, errorCode: 'host_assertion_invalid', error: 'Host identity assertion invalid.' }, input, widget);
|
|
176
|
+
}
|
|
177
|
+
hostIdentity = verified;
|
|
178
|
+
}
|
|
179
|
+
const existingSession = await this.verifyRefreshRequest(input.BearerToken, input.Proof, widget.ID);
|
|
180
|
+
if (!existingSession) {
|
|
181
|
+
return this.audited({ success: false, errorCode: 'not_found', error: 'Unknown widget key.' }, input, widget);
|
|
182
|
+
}
|
|
183
|
+
const returningVisitor = await this.resolveReturningVisitor(widget, input.visitorKey, contextUser);
|
|
184
|
+
const resolvedIdentity = await this.resolveHostIdentityIfApplicable(widget, hostIdentity, returningVisitor, contextUser);
|
|
185
|
+
return this.audited(this.mintToken(widget, guestRoleName, hostIdentity, returningVisitor, resolvedIdentity, existingSession, existingSession.KeyThumbprint), input, widget);
|
|
186
|
+
}
|
|
187
|
+
catch (e) {
|
|
188
|
+
LogError(e);
|
|
189
|
+
return { success: false, errorCode: 'server_error', error: e instanceof Error ? e.message : String(e) };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Verifies a `RefreshGuestSession` request: the caller's current widget guest JWT and the proof that the
|
|
194
|
+
* caller holds the key the token is bound to. Returns the session to carry forward, or `null` when the token
|
|
195
|
+
* is missing, tampered, expired past {@link REFRESH_GRACE_SECONDS}, past the session's hard end
|
|
196
|
+
* ({@link MAX_GUEST_SESSION_SECONDS}) or without a session start, non-anonymous, minted for a different
|
|
197
|
+
* widget, issued by another deployment, or not bound to a key; or when the proof is missing or not made by
|
|
198
|
+
* that key for this request and token.
|
|
199
|
+
*/
|
|
200
|
+
async verifyRefreshRequest(bearerToken, proof, widgetId) {
|
|
201
|
+
const session = this.verifyRefreshBearerToken(bearerToken, widgetId);
|
|
202
|
+
if (!session) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
const verification = await VerifyProofOfPossessionJwt(proof ?? '', {
|
|
206
|
+
Method: 'POST',
|
|
207
|
+
PathSuffix: WIDGET_REFRESH_PATH,
|
|
208
|
+
AccessToken: (bearerToken ?? '').trim(),
|
|
209
|
+
NowSeconds: Math.floor(Date.now() / 1000),
|
|
210
|
+
MaxSkewSeconds: REFRESH_PROOF_MAX_SKEW_SECONDS,
|
|
211
|
+
});
|
|
212
|
+
if (verification.Valid === false) {
|
|
213
|
+
LogError(`[Widget] Refresh proof refused for widget ${widgetId} (${verification.Reason}).`);
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
if (verification.Thumbprint !== session.KeyThumbprint) {
|
|
217
|
+
LogError(`[Widget] Refresh proof refused for widget ${widgetId}: signed by a key the token is not bound to.`);
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
return session;
|
|
221
|
+
}
|
|
222
|
+
/** The token half of {@link verifyRefreshRequest}: everything except the proof. */
|
|
223
|
+
verifyRefreshBearerToken(bearerToken, widgetId) {
|
|
224
|
+
const token = (bearerToken ?? '').trim();
|
|
225
|
+
if (!token) {
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
try {
|
|
229
|
+
const jwk = MagicLinkKeyManager.Instance.GetJWKS().keys[0];
|
|
230
|
+
if (!jwk) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
const publicKey = createPublicKey({ key: { ...jwk }, format: 'jwk' });
|
|
234
|
+
const verified = jwt.verify(token, publicKey, {
|
|
235
|
+
algorithms: ['RS256'],
|
|
236
|
+
audience: this.config.audience,
|
|
237
|
+
issuer: this.publicUrl,
|
|
238
|
+
ignoreExpiration: true,
|
|
239
|
+
});
|
|
240
|
+
if (typeof verified !== 'object' || verified === null) {
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
const payload = verified;
|
|
244
|
+
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
245
|
+
if (typeof payload.exp !== 'number' || nowSeconds > payload.exp + REFRESH_GRACE_SECONDS) {
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
if (payload.mj_magic_link !== true || payload.mj_anon !== true) {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
if (typeof payload.mj_widget_id !== 'string' || !UUIDsEqual(payload.mj_widget_id, widgetId)) {
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
const sid = typeof payload.mj_sid === 'string' ? payload.mj_sid.trim() : '';
|
|
255
|
+
if (sid.length === 0) {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
const startedAt = payload.mj_sid_iat;
|
|
259
|
+
if (typeof startedAt !== 'number' || !Number.isFinite(startedAt) || startedAt + MAX_GUEST_SESSION_SECONDS - nowSeconds < MIN_REFRESHED_TOKEN_SECONDS) {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
const keyThumbprint = typeof payload.cnf?.jkt === 'string' ? payload.cnf.jkt : '';
|
|
263
|
+
if (keyThumbprint.length === 0) {
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
return { SessionId: sid, StartedAtSeconds: startedAt, KeyThumbprint: keyThumbprint };
|
|
267
|
+
}
|
|
268
|
+
catch (e) {
|
|
269
|
+
LogError(`[Widget] Refresh token verification failed for widget ${widgetId}: ${e instanceof Error ? e.message : String(e)}`);
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
115
272
|
}
|
|
116
273
|
static { this.RATE_LIMIT_CACHE_TTL_MS = 60_000; }
|
|
117
274
|
static { this.RATE_LIMIT_CACHE_MAX_SIZE = 10_000; }
|
|
@@ -158,7 +315,7 @@ export class WidgetSessionService {
|
|
|
158
315
|
* clicks the emailed link → the existing public `POST /magic-link/redeem` mints a VERIFIED session
|
|
159
316
|
* JWT → the widget swaps it in via `transport.UpdateToken`, preserving the live conversationId.
|
|
160
317
|
*
|
|
161
|
-
* This converges on the SAME `AuthProviderFactory` + `
|
|
318
|
+
* This converges on the SAME `AuthProviderFactory` + `BuildMagicLinkSessionUser` path as the guest
|
|
162
319
|
* mint (D1), so the verified session is just a more-privileged principal on the one pathway. Never
|
|
163
320
|
* throws for business failures — returns a structured result.
|
|
164
321
|
*/
|
|
@@ -220,12 +377,16 @@ export class WidgetSessionService {
|
|
|
220
377
|
return null;
|
|
221
378
|
}
|
|
222
379
|
/** Builds + signs the guest JWT for an eligible widget instance. */
|
|
223
|
-
mintToken(widget, guestRoleName, hostIdentity, returningVisitor, resolvedIdentity) {
|
|
380
|
+
mintToken(widget, guestRoleName, hostIdentity, returningVisitor, resolvedIdentity, existingSession, proofKeyThumbprint) {
|
|
224
381
|
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
225
382
|
const ttlMinutes = widget.SessionTTLMinutes || this.config.defaultSessionTtlMinutes;
|
|
226
|
-
// Generated once and
|
|
227
|
-
// this id so the Widget Guest RLS
|
|
228
|
-
|
|
383
|
+
// Generated once on initial mint and preserved across refreshes: the widget (and server-side
|
|
384
|
+
// voice session creation) stamps Conversation.ExternalID with this id so the Widget Guest RLS
|
|
385
|
+
// filters ({{ScopeResourceID}}) and AuthorizeSessionAccess isolate this guest's rows.
|
|
386
|
+
const sessionId = existingSession?.SessionId ?? GenerateSessionId();
|
|
387
|
+
const startedAtSeconds = existingSession?.StartedAtSeconds ?? nowSeconds;
|
|
388
|
+
// No token outlives the session's hard end, so the cap holds for API calls as well as for refresh.
|
|
389
|
+
const ttlSeconds = Math.min(ttlMinutes * 60, startedAtSeconds + MAX_GUEST_SESSION_SECONDS - nowSeconds);
|
|
229
390
|
const claims = BuildWidgetGuestClaims({
|
|
230
391
|
issuer: this.publicUrl,
|
|
231
392
|
audience: this.config.audience,
|
|
@@ -235,7 +396,9 @@ export class WidgetSessionService {
|
|
|
235
396
|
applicationId: widget.ApplicationID,
|
|
236
397
|
guestRoleName,
|
|
237
398
|
nowSeconds,
|
|
238
|
-
ttlSeconds
|
|
399
|
+
ttlSeconds,
|
|
400
|
+
sessionStartedAtSeconds: startedAtSeconds,
|
|
401
|
+
proofKeyThumbprint,
|
|
239
402
|
hostIdentity,
|
|
240
403
|
// RV1/RV2/RV4: carry the returning-visitor anchor + resolved identity as claims so the voice path
|
|
241
404
|
// (server-created conversation) stamps the same fields the text path stamps client-side.
|
|
@@ -423,6 +586,7 @@ export class WidgetSessionService {
|
|
|
423
586
|
ExtraFilter: `VisitorKey = '${visitorKey}' AND ApplicationID = '${applicationId.replace(/'/g, "''")}'`,
|
|
424
587
|
OrderBy: '__mj_CreatedAt DESC',
|
|
425
588
|
MaxRows: 1,
|
|
589
|
+
SkipTotalRowCount: true,
|
|
426
590
|
Fields: ['ID'],
|
|
427
591
|
ResultType: 'simple',
|
|
428
592
|
}, contextUser);
|
|
@@ -443,6 +607,7 @@ export class WidgetSessionService {
|
|
|
443
607
|
EntityName: WIDGET_ENTITY,
|
|
444
608
|
ExtraFilter: `PublicKey = '${key.replace(/'/g, "''")}'`,
|
|
445
609
|
MaxRows: 1,
|
|
610
|
+
SkipTotalRowCount: true,
|
|
446
611
|
ResultType: 'entity_object',
|
|
447
612
|
}, contextUser);
|
|
448
613
|
if (!result.Success) {
|
|
@@ -457,6 +622,25 @@ export class WidgetSessionService {
|
|
|
457
622
|
const role = md?.Roles.find((r) => UUIDsEqual(r.ID, guestRoleId));
|
|
458
623
|
return role?.Name ?? null;
|
|
459
624
|
}
|
|
625
|
+
/**
|
|
626
|
+
* The ONE decision, for mint and refresh alike, of which role a guest token carries: the widget's `GuestRoleID`
|
|
627
|
+
* must resolve, and it must be a role the deployment may hand to an anonymous visitor
|
|
628
|
+
* ({@link IsIsolatedGuestRole}). Both refusals are the admin's to fix, so both are logged with the widget id;
|
|
629
|
+
* the visitor gets a uniform rejection.
|
|
630
|
+
*/
|
|
631
|
+
resolveIsolatedGuestRole(widget) {
|
|
632
|
+
const name = this.resolveGuestRoleName(widget.GuestRoleID);
|
|
633
|
+
if (!name) {
|
|
634
|
+
LogError(`[Widget] Guest role ${widget.GuestRoleID} for widget ${widget.ID} not found in metadata.`);
|
|
635
|
+
return { ok: false, refusal: { success: false, errorCode: 'server_error', error: 'Guest role not resolvable.' } };
|
|
636
|
+
}
|
|
637
|
+
if (!IsIsolatedGuestRole(name, this.guestRolePolicy)) {
|
|
638
|
+
LogError(`[Widget] Widget ${widget.ID} grants guest role '${name}', whose row filters do not isolate anonymous visitors ` +
|
|
639
|
+
`from each other. Use the Widget Guest role, or list '${name}' in magicLink.grantableRoleNames to allow it (MJ#6043).`);
|
|
640
|
+
return { ok: false, refusal: { success: false, errorCode: 'guest_role_not_isolated', error: 'Widget mint rejected.' } };
|
|
641
|
+
}
|
|
642
|
+
return { ok: true, name };
|
|
643
|
+
}
|
|
460
644
|
/** Resolves the server-side context user used to READ widget config (not the guest principal). */
|
|
461
645
|
resolveLookupUser() {
|
|
462
646
|
return ResolveConfiguredPrincipal(this.config.contextUserForLookup, 'Widget');
|