@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PubSubManager.d.ts","sourceRoot":"","sources":["../../src/generic/PubSubManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"PubSubManager.d.ts","sourceRoot":"","sources":["../../src/generic/PubSubManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAavD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAqB7E;AAED;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,aAAa,CAAC,aAAa,CAAC;IAC3D,OAAO,CAAC,OAAO,CAA6B;IAE5C,SAAS;IAIT,WAAkB,QAAQ,IAAI,aAAa,CAE1C;IAED;;;;OAIG;IACI,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIlD;;OAEG;IACH,IAAW,YAAY,IAAI,YAAY,GAAG,IAAI,CAE7C;IAED;;;;;OAKG;IACI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAiBxE"}
|
|
@@ -1,4 +1,34 @@
|
|
|
1
1
|
import { BaseSingleton } from '@memberjunction/global';
|
|
2
|
+
import { CACHE_INVALIDATION_TOPIC, } from './CacheInvalidationResolver.js';
|
|
3
|
+
import { GetSessionStatusTopic, PUSH_STATUS_UPDATES_TOPIC, } from './PushStatusResolver.js';
|
|
4
|
+
import { CacheInvalidationBroadcastManager } from '../broadcast/index.js';
|
|
5
|
+
const _wrappedPubSubEngines = new WeakSet();
|
|
6
|
+
/**
|
|
7
|
+
* Wraps a TypeGraphQL `PubSubEngine` so that publishes to {@link PUSH_STATUS_UPDATES_TOPIC}
|
|
8
|
+
* carrying a specific `sessionId` (`sessionId !== '*'`) are dynamically routed in $O(1)$ to
|
|
9
|
+
* `PUSH_STATUS_UPDATES:session:<sessionId>` instead of waking every connected browser tab.
|
|
10
|
+
* Wildcard (`sessionId === '*'`) updates continue to publish on {@link PUSH_STATUS_UPDATES_TOPIC}.
|
|
11
|
+
*/
|
|
12
|
+
export function CreateSessionRoutingPubSub(pubSub) {
|
|
13
|
+
if (!pubSub || typeof pubSub.publish !== 'function' || _wrappedPubSubEngines.has(pubSub)) {
|
|
14
|
+
return pubSub;
|
|
15
|
+
}
|
|
16
|
+
const rawPublish = pubSub.publish.bind(pubSub);
|
|
17
|
+
pubSub.publish = async (routingKey, payload) => {
|
|
18
|
+
if (routingKey === PUSH_STATUS_UPDATES_TOPIC &&
|
|
19
|
+
typeof payload === 'object' &&
|
|
20
|
+
payload !== null) {
|
|
21
|
+
const sessionId = payload.sessionId;
|
|
22
|
+
if (typeof sessionId === 'string' && sessionId.trim().length > 0 && sessionId.trim() !== '*') {
|
|
23
|
+
await rawPublish(GetSessionStatusTopic(sessionId), payload);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
await rawPublish(routingKey, payload);
|
|
28
|
+
};
|
|
29
|
+
_wrappedPubSubEngines.add(pubSub);
|
|
30
|
+
return pubSub;
|
|
31
|
+
}
|
|
2
32
|
/**
|
|
3
33
|
* Singleton manager that holds a reference to the type-graphql PubSubEngine,
|
|
4
34
|
* allowing any server-side code (not just resolvers with @PubSub() injection)
|
|
@@ -15,9 +45,10 @@ export class PubSubManager extends BaseSingleton {
|
|
|
15
45
|
/**
|
|
16
46
|
* Sets the PubSubEngine instance. Should be called once during server startup
|
|
17
47
|
* after buildSchemaSync creates the PubSub instance.
|
|
48
|
+
* Automatically installs $O(1)$ dynamic session routing for `PUSH_STATUS_UPDATES`.
|
|
18
49
|
*/
|
|
19
50
|
SetPubSubEngine(pubSub) {
|
|
20
|
-
this._pubSub = pubSub;
|
|
51
|
+
this._pubSub = CreateSessionRoutingPubSub(pubSub);
|
|
21
52
|
}
|
|
22
53
|
/**
|
|
23
54
|
* Gets the current PubSubEngine instance, or null if not yet configured.
|
|
@@ -27,9 +58,21 @@ export class PubSubManager extends BaseSingleton {
|
|
|
27
58
|
}
|
|
28
59
|
/**
|
|
29
60
|
* Publishes a payload to the specified topic via the PubSubEngine.
|
|
61
|
+
* For `CACHE_INVALIDATION`, automatically stamps a monotonic sequence number and
|
|
62
|
+
* records the event in the active {@link BaseCacheInvalidationBroadcastProvider}'s ring buffer.
|
|
30
63
|
* No-op if the PubSubEngine has not been configured yet.
|
|
31
64
|
*/
|
|
32
65
|
Publish(topic, payload) {
|
|
66
|
+
if (topic === CACHE_INVALIDATION_TOPIC) {
|
|
67
|
+
const provider = CacheInvalidationBroadcastManager.Instance.Provider;
|
|
68
|
+
const entityName = typeof payload.entityName === 'string' ? payload.entityName : undefined;
|
|
69
|
+
if (!provider.ShouldBroadcastEntity(entityName)) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (payload.sequence === undefined) {
|
|
73
|
+
provider.RecordInvalidation(payload);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
33
76
|
if (this._pubSub) {
|
|
34
77
|
this._pubSub.publish(topic, payload);
|
|
35
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PubSubManager.js","sourceRoot":"","sources":["../../src/generic/PubSubManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"PubSubManager.js","sourceRoot":"","sources":["../../src/generic/PubSubManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EACH,wBAAwB,GAE3B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACH,qBAAqB,EACrB,yBAAyB,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAC;AAE1E,MAAM,qBAAqB,GAAG,IAAI,OAAO,EAAgB,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAoB;IAC3D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU,IAAI,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACvF,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,CAAC,OAAO,GAAG,KAAK,EAAE,UAAkB,EAAE,OAAgB,EAAiB,EAAE;QAC3E,IACI,UAAU,KAAK,yBAAyB;YACxC,OAAO,OAAO,KAAK,QAAQ;YAC3B,OAAO,KAAK,IAAI,EAClB,CAAC;YACC,MAAM,SAAS,GAAI,OAAmC,CAAC,SAAS,CAAC;YACjE,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBAC3F,MAAM,UAAU,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC5D,OAAO;YACX,CAAC;QACL,CAAC;QACD,MAAM,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC;IACF,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,aAAc,SAAQ,aAA4B;IAG3D;QACI,KAAK,EAAE,CAAC;QAHJ,YAAO,GAAwB,IAAI,CAAC;IAI5C,CAAC;IAEM,MAAM,KAAK,QAAQ;QACtB,OAAO,KAAK,CAAC,WAAW,EAAiB,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,MAAoB;QACvC,IAAI,CAAC,OAAO,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACI,OAAO,CAAC,KAAa,EAAE,OAAgC;QAC1D,IAAI,KAAK,KAAK,wBAAwB,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,iCAAiC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACrE,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3F,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9C,OAAO;YACX,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACjC,QAAQ,CAAC,kBAAkB,CAAC,OAA8C,CAAC,CAAC;YAChF,CAAC;QACL,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,sCAAsC,KAAK,0BAA0B,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
1
2
|
import { PubSubEngine } from 'type-graphql';
|
|
2
3
|
import { UserPayload } from '../types.js';
|
|
4
|
+
import { type SessionAccessPrincipal } from '../realtimeSessions/sessionAccess.js';
|
|
3
5
|
export declare const PUSH_STATUS_UPDATES_TOPIC = "PUSH_STATUS_UPDATES";
|
|
4
6
|
export declare class PushStatusNotification {
|
|
5
7
|
message?: string;
|
|
@@ -51,6 +53,21 @@ export declare function SetPushStatusPublishHook(hook?: PushStatusPublishHook):
|
|
|
51
53
|
* @returns The update to republish, or `null` to drop it.
|
|
52
54
|
*/
|
|
53
55
|
export declare function ParseReplicatedStatusUpdate(raw: string, localServerId: string): PushStatusNotificationPayload | null;
|
|
56
|
+
/**
|
|
57
|
+
* Returns the $O(1)$ session-scoped pub/sub topic name for a given `sessionId`.
|
|
58
|
+
* Wildcard (`'*'`) or empty session IDs fall back to the broadcast {@link PUSH_STATUS_UPDATES_TOPIC}.
|
|
59
|
+
*/
|
|
60
|
+
export declare function GetSessionStatusTopic(sessionId: string): string;
|
|
61
|
+
interface ParsedMessageCacheEntry {
|
|
62
|
+
parsed: Record<string, unknown> | null;
|
|
63
|
+
isJson: boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parses and memoizes the JSON `message` envelope on a {@link PushStatusNotificationPayload}
|
|
67
|
+
* in a `WeakMap` so multiple consumers (`ShouldReplicateStatusUpdate`, filters, hooks) never
|
|
68
|
+
* call `JSON.parse` more than once per payload object.
|
|
69
|
+
*/
|
|
70
|
+
export declare function ParseStatusUpdateMessage(payload: PushStatusNotificationPayload): ParsedMessageCacheEntry;
|
|
54
71
|
/**
|
|
55
72
|
* Whether an update is worth sending to other server instances.
|
|
56
73
|
*
|
|
@@ -60,7 +77,7 @@ export declare function ParseReplicatedStatusUpdate(raw: string, localServerId:
|
|
|
60
77
|
* Progress and completion are low-rate and each is individually meaningful, which is exactly the
|
|
61
78
|
* kind of message that must survive landing on the wrong replica.
|
|
62
79
|
*/
|
|
63
|
-
export declare function ShouldReplicateStatusUpdate(message?: string): boolean;
|
|
80
|
+
export declare function ShouldReplicateStatusUpdate(message?: string, payload?: PushStatusNotificationPayload): boolean;
|
|
64
81
|
interface PushStatusNotificationArgs {
|
|
65
82
|
sessionId: string;
|
|
66
83
|
}
|
|
@@ -87,18 +104,34 @@ export declare function publishStatusUpdate(pubSub: PubSubEngine, params: Status
|
|
|
87
104
|
export interface StatusUpdatesFilterContext {
|
|
88
105
|
userPayload?: UserPayload;
|
|
89
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* The owner key of a status update for `user`: its user ID, or, for an anonymous visitor, its user ID plus its scope
|
|
109
|
+
* identity (`ResolveSessionScopeIdentity`). Every anonymous visitor shares one Anonymous user and the session id is
|
|
110
|
+
* chosen by the client (`x-session-id`), so the user ID alone would let one visitor receive another's run events.
|
|
111
|
+
* An anonymous visitor with no scope identity gets no key and receives nothing.
|
|
112
|
+
*/
|
|
113
|
+
export declare function StatusUpdateOwnerKey(user: SessionAccessPrincipal | null | undefined): string;
|
|
114
|
+
/**
|
|
115
|
+
* The owner key a status update is published with: that of the request's user, or, on a payload elevated by
|
|
116
|
+
* `ElevateUserPayload`, of the user the elevated principal stands in for (a public widget guest). The guest's socket
|
|
117
|
+
* is authenticated as the guest, so an update stamped with the elevated system user would never pass
|
|
118
|
+
* {@link StatusUpdatesFilter} and the guest would wait forever for its run to finish.
|
|
119
|
+
*/
|
|
120
|
+
export declare function StatusUpdateOwnerID(userPayload: UserPayload | undefined): string;
|
|
90
121
|
/**
|
|
91
122
|
* Filter predicate for the `statusUpdates` subscription. Exported so it can be unit-tested in
|
|
92
123
|
* isolation (it is the security-critical gate). A push reaches a subscriber only when BOTH hold:
|
|
93
|
-
* 1. the push's `sessionId` matches the subscriber's requested `sessionId` (tab routing), AND
|
|
94
|
-
* 2. the push's `ownerUserId` matches the
|
|
95
|
-
* (`context.userPayload.userRecord
|
|
124
|
+
* 1. the push's `sessionId` matches the subscriber's requested `sessionId` (tab routing), or is `'*'`, AND
|
|
125
|
+
* 2. the push's `ownerUserId` matches the owner key ({@link StatusUpdateOwnerKey}) of the subscriber
|
|
126
|
+
* CONNECTION's authenticated identity (`context.userPayload.userRecord`, established once at WS
|
|
127
|
+
* connect): the user ID for a named user, compared as a UUID; for an anonymous visitor, the user ID
|
|
128
|
+
* plus its scope identity, compared exactly because the scope part is case-significant.
|
|
96
129
|
*
|
|
97
130
|
* Condition (2) is the fix for the session-hijack class (B49): `sessionId` is a client-chosen
|
|
98
131
|
* correlation value, so a subscriber who lifts another user's `sessionId` would previously receive
|
|
99
132
|
* their pushes. Binding delivery to the connection's server-authenticated identity means knowing a
|
|
100
|
-
* `sessionId` is no longer sufficient
|
|
101
|
-
* matches.
|
|
133
|
+
* `sessionId` is no longer sufficient; the scope part does the same between anonymous visitors, who all
|
|
134
|
+
* share one Anonymous user. Fails CLOSED — a missing owner or connection key never matches.
|
|
102
135
|
*/
|
|
103
136
|
export declare function StatusUpdatesFilter(data: {
|
|
104
137
|
payload: PushStatusNotificationPayload;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PushStatusResolver.d.ts","sourceRoot":"","sources":["../../src/generic/PushStatusResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,YAAY,EAAoD,MAAM,cAAc,CAAC;AAE1H,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"PushStatusResolver.d.ts","sourceRoot":"","sources":["../../src/generic/PushStatusResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,10 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
|
+
import 'reflect-metadata';
|
|
13
14
|
import { Arg, Field, ID, ObjectType, Resolver, Root, Subscription } from 'type-graphql';
|
|
14
15
|
import { MJGlobal, UUIDsEqual } from '@memberjunction/global';
|
|
16
|
+
import { ResolveSessionScopeIdentity } from '../realtimeSessions/sessionAccess.js';
|
|
15
17
|
export const PUSH_STATUS_UPDATES_TOPIC = 'PUSH_STATUS_UPDATES';
|
|
16
18
|
let PushStatusNotification = class PushStatusNotification {
|
|
17
19
|
};
|
|
@@ -78,6 +80,48 @@ export function ParseReplicatedStatusUpdate(raw, localServerId) {
|
|
|
78
80
|
}
|
|
79
81
|
return { sessionId, ownerUserId, message: body, SourceServerId: source };
|
|
80
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Returns the $O(1)$ session-scoped pub/sub topic name for a given `sessionId`.
|
|
85
|
+
* Wildcard (`'*'`) or empty session IDs fall back to the broadcast {@link PUSH_STATUS_UPDATES_TOPIC}.
|
|
86
|
+
*/
|
|
87
|
+
export function GetSessionStatusTopic(sessionId) {
|
|
88
|
+
const normalized = sessionId?.trim();
|
|
89
|
+
if (!normalized || normalized === '*') {
|
|
90
|
+
return PUSH_STATUS_UPDATES_TOPIC;
|
|
91
|
+
}
|
|
92
|
+
return `${PUSH_STATUS_UPDATES_TOPIC}:session:${normalized}`;
|
|
93
|
+
}
|
|
94
|
+
const _parsedMessageMemo = new WeakMap();
|
|
95
|
+
/**
|
|
96
|
+
* Parses and memoizes the JSON `message` envelope on a {@link PushStatusNotificationPayload}
|
|
97
|
+
* in a `WeakMap` so multiple consumers (`ShouldReplicateStatusUpdate`, filters, hooks) never
|
|
98
|
+
* call `JSON.parse` more than once per payload object.
|
|
99
|
+
*/
|
|
100
|
+
export function ParseStatusUpdateMessage(payload) {
|
|
101
|
+
const cached = _parsedMessageMemo.get(payload);
|
|
102
|
+
if (cached) {
|
|
103
|
+
return cached;
|
|
104
|
+
}
|
|
105
|
+
if (!payload.message) {
|
|
106
|
+
const emptyEntry = { parsed: null, isJson: false };
|
|
107
|
+
_parsedMessageMemo.set(payload, emptyEntry);
|
|
108
|
+
return emptyEntry;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const raw = JSON.parse(payload.message);
|
|
112
|
+
const entry = {
|
|
113
|
+
parsed: typeof raw === 'object' && raw !== null ? raw : null,
|
|
114
|
+
isJson: true,
|
|
115
|
+
};
|
|
116
|
+
_parsedMessageMemo.set(payload, entry);
|
|
117
|
+
return entry;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
const plainEntry = { parsed: null, isJson: false };
|
|
121
|
+
_parsedMessageMemo.set(payload, plainEntry);
|
|
122
|
+
return plainEntry;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
81
125
|
/**
|
|
82
126
|
* Whether an update is worth sending to other server instances.
|
|
83
127
|
*
|
|
@@ -87,10 +131,17 @@ export function ParseReplicatedStatusUpdate(raw, localServerId) {
|
|
|
87
131
|
* Progress and completion are low-rate and each is individually meaningful, which is exactly the
|
|
88
132
|
* kind of message that must survive landing on the wrong replica.
|
|
89
133
|
*/
|
|
90
|
-
export function ShouldReplicateStatusUpdate(message) {
|
|
134
|
+
export function ShouldReplicateStatusUpdate(message, payload) {
|
|
91
135
|
if (!message) {
|
|
92
136
|
return false;
|
|
93
137
|
}
|
|
138
|
+
if (payload && payload.message === message) {
|
|
139
|
+
const entry = ParseStatusUpdateMessage(payload);
|
|
140
|
+
if (!entry.isJson) {
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
return entry.parsed?.type !== 'StreamingContent';
|
|
144
|
+
}
|
|
94
145
|
try {
|
|
95
146
|
const parsed = JSON.parse(message);
|
|
96
147
|
const type = parsed?.type;
|
|
@@ -119,7 +170,7 @@ export function PublishStatusUpdate(pubSub, params) {
|
|
|
119
170
|
// Fan out to other instances. Only reached by updates originating HERE: a message arriving from
|
|
120
171
|
// the bus is republished straight onto the local topic and never comes back through this
|
|
121
172
|
// function, so there is no loop to break beyond the SourceServerId check on the receiving side.
|
|
122
|
-
if (_publishHook && ShouldReplicateStatusUpdate(params.message)) {
|
|
173
|
+
if (_publishHook && ShouldReplicateStatusUpdate(params.message, payload)) {
|
|
123
174
|
try {
|
|
124
175
|
_publishHook(payload);
|
|
125
176
|
}
|
|
@@ -133,29 +184,58 @@ export function PublishStatusUpdate(pubSub, params) {
|
|
|
133
184
|
export function publishStatusUpdate(pubSub, params) {
|
|
134
185
|
return PublishStatusUpdate(pubSub, params);
|
|
135
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* The owner key of a status update for `user`: its user ID, or, for an anonymous visitor, its user ID plus its scope
|
|
189
|
+
* identity (`ResolveSessionScopeIdentity`). Every anonymous visitor shares one Anonymous user and the session id is
|
|
190
|
+
* chosen by the client (`x-session-id`), so the user ID alone would let one visitor receive another's run events.
|
|
191
|
+
* An anonymous visitor with no scope identity gets no key and receives nothing.
|
|
192
|
+
*/
|
|
193
|
+
export function StatusUpdateOwnerKey(user) {
|
|
194
|
+
if (!user?.ID) {
|
|
195
|
+
return '';
|
|
196
|
+
}
|
|
197
|
+
if (!user.IsMagicLinkAnonymous) {
|
|
198
|
+
return user.ID;
|
|
199
|
+
}
|
|
200
|
+
const scope = ResolveSessionScopeIdentity(user);
|
|
201
|
+
return scope ? `${user.ID.toLowerCase()}|${scope}` : '';
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* The owner key a status update is published with: that of the request's user, or, on a payload elevated by
|
|
205
|
+
* `ElevateUserPayload`, of the user the elevated principal stands in for (a public widget guest). The guest's socket
|
|
206
|
+
* is authenticated as the guest, so an update stamped with the elevated system user would never pass
|
|
207
|
+
* {@link StatusUpdatesFilter} and the guest would wait forever for its run to finish.
|
|
208
|
+
*/
|
|
209
|
+
export function StatusUpdateOwnerID(userPayload) {
|
|
210
|
+
return StatusUpdateOwnerKey(userPayload?.ElevatedFrom ?? userPayload?.userRecord);
|
|
211
|
+
}
|
|
136
212
|
/**
|
|
137
213
|
* Filter predicate for the `statusUpdates` subscription. Exported so it can be unit-tested in
|
|
138
214
|
* isolation (it is the security-critical gate). A push reaches a subscriber only when BOTH hold:
|
|
139
|
-
* 1. the push's `sessionId` matches the subscriber's requested `sessionId` (tab routing), AND
|
|
140
|
-
* 2. the push's `ownerUserId` matches the
|
|
141
|
-
* (`context.userPayload.userRecord
|
|
215
|
+
* 1. the push's `sessionId` matches the subscriber's requested `sessionId` (tab routing), or is `'*'`, AND
|
|
216
|
+
* 2. the push's `ownerUserId` matches the owner key ({@link StatusUpdateOwnerKey}) of the subscriber
|
|
217
|
+
* CONNECTION's authenticated identity (`context.userPayload.userRecord`, established once at WS
|
|
218
|
+
* connect): the user ID for a named user, compared as a UUID; for an anonymous visitor, the user ID
|
|
219
|
+
* plus its scope identity, compared exactly because the scope part is case-significant.
|
|
142
220
|
*
|
|
143
221
|
* Condition (2) is the fix for the session-hijack class (B49): `sessionId` is a client-chosen
|
|
144
222
|
* correlation value, so a subscriber who lifts another user's `sessionId` would previously receive
|
|
145
223
|
* their pushes. Binding delivery to the connection's server-authenticated identity means knowing a
|
|
146
|
-
* `sessionId` is no longer sufficient
|
|
147
|
-
* matches.
|
|
224
|
+
* `sessionId` is no longer sufficient; the scope part does the same between anonymous visitors, who all
|
|
225
|
+
* share one Anonymous user. Fails CLOSED — a missing owner or connection key never matches.
|
|
148
226
|
*/
|
|
149
227
|
export function StatusUpdatesFilter(data) {
|
|
150
228
|
const { payload, args, context } = data;
|
|
151
229
|
if (payload.sessionId !== '*' && payload.sessionId !== args.sessionId) {
|
|
152
230
|
return false;
|
|
153
231
|
}
|
|
154
|
-
const
|
|
155
|
-
|
|
232
|
+
const connectionUser = context?.userPayload?.userRecord;
|
|
233
|
+
const connectionKey = StatusUpdateOwnerKey(connectionUser);
|
|
234
|
+
if (!connectionKey || !payload.ownerUserId) {
|
|
156
235
|
return false; // fail closed — no identity on either side means no delivery
|
|
157
236
|
}
|
|
158
|
-
|
|
237
|
+
// An anonymous visitor's key carries its scope identity (case-significant), so it must match exactly.
|
|
238
|
+
return connectionUser?.IsMagicLinkAnonymous ? payload.ownerUserId === connectionKey : UUIDsEqual(payload.ownerUserId, connectionKey);
|
|
159
239
|
}
|
|
160
240
|
/** @deprecated Use {@link StatusUpdatesFilter}. */
|
|
161
241
|
export function statusUpdatesFilter(data) {
|
|
@@ -169,7 +249,9 @@ let PushStatusResolver = class PushStatusResolver {
|
|
|
169
249
|
};
|
|
170
250
|
__decorate([
|
|
171
251
|
Subscription(() => PushStatusNotification, {
|
|
172
|
-
topics:
|
|
252
|
+
topics: ({ args }) => args?.sessionId && args.sessionId !== '*'
|
|
253
|
+
? [GetSessionStatusTopic(args.sessionId), PUSH_STATUS_UPDATES_TOPIC]
|
|
254
|
+
: PUSH_STATUS_UPDATES_TOPIC,
|
|
173
255
|
filter: (data) => StatusUpdatesFilter(data),
|
|
174
256
|
}),
|
|
175
257
|
__param(0, Root()),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PushStatusResolver.js","sourceRoot":"","sources":["../../src/generic/PushStatusResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAgB,QAAQ,EAAsB,IAAI,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1H,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"PushStatusResolver.js","sourceRoot":"","sources":["../../src/generic/PushStatusResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import { AggregateExpression, BaseEntity, CompositeKey, DatabaseProviderBase, EntityFieldInfo, EntityInfo, EntityPermissionType, IMetadataProvider, RecordChangeFieldSecurityProjector, RunViewResult, UserInfo } from '@memberjunction/core';
|
|
1
|
+
import { AggregateExpression, BaseEntity, BaseEntityEvent, CompositeKey, DatabaseProviderBase, EntityFieldInfo, EntityInfo, EntityPermissionType, IMetadataProvider, RecordChangeFieldSecurityProjector, RunViewResult, UserInfo, ViewPropertyValues } from '@memberjunction/core';
|
|
2
2
|
import { MJUserViewEntityExtended } from '@memberjunction/core-entities';
|
|
3
|
+
/**
|
|
4
|
+
* Extended RunViewResult carrying a non-enumerable reference to the resolved view entity
|
|
5
|
+
* so downstream resolvers (e.g. RunViewResolver) do not re-query `MJ: User Views` a third time.
|
|
6
|
+
*/
|
|
7
|
+
export type RunViewResultWithResolvedView<T = unknown> = RunViewResult<T> & {
|
|
8
|
+
_resolvedViewEntity?: MJUserViewEntityExtended;
|
|
9
|
+
};
|
|
3
10
|
import { PubSubEngine } from 'type-graphql';
|
|
4
11
|
import { RunViewGenericParams, UserPayload } from '../types.js';
|
|
5
12
|
import { RunDynamicViewInput, RunViewByIDInput, RunViewByNameInput } from './RunViewResolver.js';
|
|
@@ -9,7 +16,9 @@ export declare class ResolverBase {
|
|
|
9
16
|
private static _emit;
|
|
10
17
|
private static _cloudeventsHeaders;
|
|
11
18
|
private static _eventSubscriptionKey;
|
|
19
|
+
private static _activeEntitySessionsKey;
|
|
12
20
|
private get eventSubscriptions();
|
|
21
|
+
private get activeEntitySessions();
|
|
13
22
|
/**
|
|
14
23
|
* Maps field names to their GraphQL-safe CodeNames and handles encryption for API responses.
|
|
15
24
|
*
|
|
@@ -151,10 +160,30 @@ export declare class ResolverBase {
|
|
|
151
160
|
*/
|
|
152
161
|
private formatFilterValue;
|
|
153
162
|
protected findBy<T = any>(provider: DatabaseProviderBase, entity: string, params: any, contextUser: UserInfo): Promise<Array<T>>;
|
|
163
|
+
/**
|
|
164
|
+
* Resolves a User View by name, consulting the in-memory {@link UserViewEngine} cache first
|
|
165
|
+
* and falling back to a database `RunView` only on a cache miss.
|
|
166
|
+
*/
|
|
167
|
+
protected resolveUserViewByName(viewName: string, provider: DatabaseProviderBase, contextUser?: UserInfo): Promise<MJUserViewEntityExtended | null>;
|
|
168
|
+
/**
|
|
169
|
+
* Resolves a User View by ID, consulting the in-memory {@link UserViewEngine} cache first
|
|
170
|
+
* and falling back to an entity `Load()` only on a cache miss.
|
|
171
|
+
*/
|
|
172
|
+
protected resolveUserViewByID(viewID: string, provider: DatabaseProviderBase, contextUser?: UserInfo): Promise<MJUserViewEntityExtended | null>;
|
|
154
173
|
RunViewByNameGeneric(viewInput: RunViewByNameInput, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine): Promise<RunViewResult<any>>;
|
|
155
174
|
RunViewByIDGeneric(viewInput: RunViewByIDInput, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine): Promise<RunViewResult<any>>;
|
|
156
175
|
RunDynamicViewGeneric(viewInput: RunDynamicViewInput, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine): Promise<RunViewResult<any>>;
|
|
157
176
|
RunViewsGeneric(viewInputs: (RunViewByNameInput & RunViewByIDInput & RunDynamicViewInput)[], provider: DatabaseProviderBase, userPayload: UserPayload): Promise<RunViewResult[]>;
|
|
177
|
+
/**
|
|
178
|
+
* What an entity event may carry to a CloudEvents sink or a log line.
|
|
179
|
+
*
|
|
180
|
+
* The whole row for an entity without field security. For one where it applies (its own flag
|
|
181
|
+
* or an IS-A ancestor's), and for `MJ: Record Changes` (whose payload columns hold other
|
|
182
|
+
* entities' values), only the primary key and the names of the fields that changed: the sink
|
|
183
|
+
* is outside MemberJunction with no reader to project the row for, and these events fire for
|
|
184
|
+
* server-internal saves too, whose objects hold every column.
|
|
185
|
+
*/
|
|
186
|
+
protected EntityEventPayload(baseEntity: BaseEntity, changedFieldNames?: string[]): Record<string, unknown>;
|
|
158
187
|
private static _priorEmittedData;
|
|
159
188
|
protected EmitCloudEvent({ component, event, eventCode, args }: MJEvent): Promise<void>;
|
|
160
189
|
protected CheckUserReadPermissions(entityName: string, userPayload: UserPayload | null, provider?: IMetadataProvider): void;
|
|
@@ -214,7 +243,7 @@ export declare class ResolverBase {
|
|
|
214
243
|
* Fails closed: no user, or an unresolvable reference, refuses.
|
|
215
244
|
*
|
|
216
245
|
* The references come from a walk of the whole parse tree
|
|
217
|
-
* (`
|
|
246
|
+
* (`StrictFragmentValidator.ValidateReadOnlyStatement`). The statement is refused when that walk does not
|
|
218
247
|
* account for every SELECT in the text, or when a FROM item names no table (a table function or
|
|
219
248
|
* a row list).
|
|
220
249
|
*
|
|
@@ -266,8 +295,11 @@ export declare class ResolverBase {
|
|
|
266
295
|
* it, contains a backslash (see {@link assertClientClauseUsesEntityBaseViews}).
|
|
267
296
|
*/
|
|
268
297
|
private hasBackslashInQuotes;
|
|
269
|
-
/**
|
|
270
|
-
|
|
298
|
+
/**
|
|
299
|
+
* Parses a whole statement with the strict validator and returns what it reads; throws unless it
|
|
300
|
+
* is one plain read-only SELECT with no write or DDL at any depth.
|
|
301
|
+
*/
|
|
302
|
+
private strictReadOnlyStatementReads;
|
|
271
303
|
private dialectForProvider;
|
|
272
304
|
/** The entity base-view allow-list for a provider's entities. */
|
|
273
305
|
private entityBaseViewAllowList;
|
|
@@ -276,7 +308,7 @@ export declare class ResolverBase {
|
|
|
276
308
|
* - Field filtering at source (Fix #7)
|
|
277
309
|
* - Improved error handling (Fix #9)
|
|
278
310
|
*/
|
|
279
|
-
protected RunViewGenericInternal(provider: DatabaseProviderBase, viewInfo: MJUserViewEntityExtended, extraFilter: string, orderBy: string, userSearchString: string, excludeUserViewRunID: string | undefined, overrideExcludeFilter: string | undefined, saveViewResults: boolean | undefined, fields: string[] | undefined, ignoreMaxRows: boolean | undefined, excludeDataFromAllPriorViewRuns: boolean | undefined, forceAuditLog: boolean | undefined, auditLogDescription: string | undefined, resultType: string | undefined, userPayload: UserPayload | null, maxRows: number | undefined, startRow: number | undefined, aggregates?: AggregateExpression[], afterKey?: CompositeKey, bypassCache?: boolean, dataSource?: 'Live' | 'Materialized', includeBinaryFields?: boolean): Promise<RunViewResult<any>>;
|
|
311
|
+
protected RunViewGenericInternal(provider: DatabaseProviderBase, viewInfo: MJUserViewEntityExtended, extraFilter: string, orderBy: string, userSearchString: string, excludeUserViewRunID: string | undefined, overrideExcludeFilter: string | undefined, saveViewResults: boolean | undefined, fields: string[] | undefined, ignoreMaxRows: boolean | undefined, excludeDataFromAllPriorViewRuns: boolean | undefined, forceAuditLog: boolean | undefined, auditLogDescription: string | undefined, resultType: string | undefined, userPayload: UserPayload | null, maxRows: number | undefined, startRow: number | undefined, aggregates?: AggregateExpression[], afterKey?: CompositeKey, bypassCache?: boolean, dataSource?: 'Live' | 'Materialized', includeBinaryFields?: boolean, alternateBaseView?: string, properties?: ViewPropertyValues, skipTotalRowCount?: boolean): Promise<RunViewResult<any>>;
|
|
280
312
|
/**
|
|
281
313
|
* Optimized implementation that:
|
|
282
314
|
* 1. Fetches user info only once (fixes N+1 query)
|
|
@@ -298,20 +330,34 @@ export declare class ResolverBase {
|
|
|
298
330
|
* skip redundant re-fetches (it already handled the event locally).
|
|
299
331
|
*
|
|
300
332
|
* The row itself rides along ONLY for entities opted in via
|
|
301
|
-
* `cacheSettings.recordDataBroadcastEntities
|
|
302
|
-
*
|
|
333
|
+
* `cacheSettings.recordDataBroadcastEntities`, and never for one under field-level security —
|
|
334
|
+
* this event reaches every connected client unprojected, so the row would otherwise be readable
|
|
335
|
+
* by sessions that could not read the record or its restricted fields.
|
|
303
336
|
*/
|
|
304
337
|
protected PublishCacheInvalidation(entityObject: BaseEntity, action: 'save' | 'delete', userPayload: UserPayload): void;
|
|
305
338
|
/**
|
|
306
339
|
* Publishes a push-status update to the client on {@link PUSH_STATUS_UPDATES_TOPIC}, stamping the
|
|
307
|
-
*
|
|
308
|
-
*
|
|
309
|
-
*
|
|
310
|
-
*
|
|
311
|
-
*
|
|
340
|
+
* owner key of `userPayload` (`StatusUpdateOwnerID`: the request's user, or the widget guest an
|
|
341
|
+
* elevated payload stands in for) so the subscription filter can bind delivery to identity (see B49 /
|
|
342
|
+
* `StatusUpdatesFilter`). The ergonomic wrapper every resolver should use instead of calling
|
|
343
|
+
* `pubSub.publish` on the topic directly — it makes omitting identity impossible. Non-resolver
|
|
344
|
+
* publishers (services, the liveness heartbeat) call the shared `PublishStatusUpdate()` function
|
|
345
|
+
* directly with an explicit `ownerUserId`.
|
|
312
346
|
*/
|
|
313
347
|
protected PublishStatusUpdate(pubSub: PubSubEngine, sessionId: string, message: string | undefined, userPayload: UserPayload): void;
|
|
314
348
|
protected ListenForEntityMessages(entityObject: BaseEntity, pubSub: PubSubEngine, userPayload: UserPayload): void;
|
|
349
|
+
/**
|
|
350
|
+
* Whether an entity event may be relayed to the session whose call created the listener. The
|
|
351
|
+
* listener is shared by every caller in the process for that entity, so an event raised by an
|
|
352
|
+
* object loaded for another user (or for the system user) is never relayed to this session.
|
|
353
|
+
*/
|
|
354
|
+
protected EntityEventBelongsToSession(event: BaseEntityEvent, userPayload: UserPayload): boolean;
|
|
355
|
+
/**
|
|
356
|
+
* The status message relayed for an entity event: the entity, key and event type. The event's
|
|
357
|
+
* payload is included only when it cannot carry record values: never for a delete (its payload
|
|
358
|
+
* is the whole deleted row), an entity under field-level security, or `MJ: Record Changes`.
|
|
359
|
+
*/
|
|
360
|
+
protected EntityStatusMessage(event: BaseEntityEvent): string;
|
|
315
361
|
/**
|
|
316
362
|
* IS-A PROMOTION over the wire: an EXISTING parent record gaining a subtype — an Animal that is
|
|
317
363
|
* now also a Dog. It arrives as the CHILD's create mutation carrying the existing parent's
|
|
@@ -369,7 +415,7 @@ export declare class ResolverBase {
|
|
|
369
415
|
* writable fields in `OldValues___`, so {@link hasCompleteOldValues} returns `false` and forces the
|
|
370
416
|
* database load (`InnerLoad`) so untouched columns retain their stored values.
|
|
371
417
|
*
|
|
372
|
-
* `
|
|
418
|
+
* `FieldLevelSecurityApplies` (own flag or an IS-A ancestor's) is the security-critical one, and it is NOT redundant with
|
|
373
419
|
* `hasDeniedReadFields`. That flag reports READ denials, and the canonical FLS configuration is
|
|
374
420
|
* Read Allow + Update Deny — which leaves it false. Such a caller would be hydrated from its own
|
|
375
421
|
* `OldValues___`, and a value it supplies there for an update-denied field arrives through
|
|
@@ -418,26 +464,25 @@ export declare class ResolverBase {
|
|
|
418
464
|
}>;
|
|
419
465
|
}, hasDeniedReadFields: boolean, hasNarrowedAuditPayload: boolean, user: UserInfo | undefined): boolean;
|
|
420
466
|
/**
|
|
421
|
-
* Field-level security
|
|
467
|
+
* Field-level security gate on the update path's client input.
|
|
422
468
|
*
|
|
423
|
-
*
|
|
424
|
-
*
|
|
425
|
-
*
|
|
426
|
-
*
|
|
427
|
-
* save" safe for a restricted user.
|
|
469
|
+
* For a caller denied at least one field on the entity, refuses (with a `FieldSecurityError`)
|
|
470
|
+
* any key in the new values or in `OldValues___` that names a field the caller cannot READ, or
|
|
471
|
+
* that names no field at all, with the same message for both (see
|
|
472
|
+
* `AssertClientInputWritableForUser`), so the refusal does not reveal which columns exist.
|
|
428
473
|
*
|
|
429
|
-
*
|
|
430
|
-
*
|
|
474
|
+
* Refused rather than dropped: a field the caller cannot read was absent from every payload the
|
|
475
|
+
* client received, so a value for it can only be fabricated. A well-behaved client never sends
|
|
476
|
+
* one (it omits fields it did not load), so ordinary traffic is unaffected.
|
|
431
477
|
*
|
|
432
|
-
*
|
|
433
|
-
*
|
|
434
|
-
* and is restricted).
|
|
478
|
+
* There is no split by update permission: Read is required for Update, so a user denied read is
|
|
479
|
+
* denied update too.
|
|
435
480
|
*
|
|
436
|
-
* Returns true when the user has a non-empty denied-read set on this entity. The caller
|
|
437
|
-
*
|
|
438
|
-
*
|
|
481
|
+
* Returns true when the user has a non-empty denied-read set on this entity. The caller must
|
|
482
|
+
* then hydrate the entity from the DATABASE (never from client OldValues), so denied fields hold
|
|
483
|
+
* true values the client input never touches.
|
|
439
484
|
*/
|
|
440
|
-
protected
|
|
485
|
+
protected AssertClientInputFieldSecurity(entityInfo: EntityInfo, userInfo: UserInfo, input: {
|
|
441
486
|
OldValues___?: Array<{
|
|
442
487
|
Key: string;
|
|
443
488
|
Value: unknown;
|
|
@@ -496,7 +541,47 @@ export declare class ResolverBase {
|
|
|
496
541
|
* `FieldByName` when available on `EntityInfo`, falling back to `.Fields.find()` for test stubs.
|
|
497
542
|
*/
|
|
498
543
|
private findEntityFieldByCodeNameOrName;
|
|
499
|
-
|
|
544
|
+
/**
|
|
545
|
+
* Whether the API never gives a client this field's stored value: an encrypted field that is not
|
|
546
|
+
* decrypted for the API reaches the client only as the sentinel or as fresh ciphertext, so the
|
|
547
|
+
* client's old value for it can never be compared with the database value.
|
|
548
|
+
*/
|
|
549
|
+
private isFieldOpaqueToClient;
|
|
550
|
+
/**
|
|
551
|
+
* The client's new values without the opaque fields it only echoed back: the sentinel, or the same
|
|
552
|
+
* value it received as the old value. Writing either would replace the stored secret.
|
|
553
|
+
*/
|
|
554
|
+
private withoutEchoedOpaqueValues;
|
|
555
|
+
/**
|
|
556
|
+
* Copies concurrency-conflict diagnostic entries with every encrypted field's values replaced by
|
|
557
|
+
* the sentinel, so the console, the error log and `MJ: Error Logs` never hold a secret.
|
|
558
|
+
*/
|
|
559
|
+
private redactEncryptedConflictValues;
|
|
560
|
+
/**
|
|
561
|
+
* Compares two typed entity field values for semantic inequality, handling `Date` epoch equality
|
|
562
|
+
* (plus optional non-`datetimeoffset` timezone-hour-shift tolerance) and `null`/`undefined` normalization.
|
|
563
|
+
*/
|
|
564
|
+
private areEntityFieldValuesDifferent;
|
|
565
|
+
/**
|
|
566
|
+
* True when two instants would be stored as the same value in the field's column: SQL Server
|
|
567
|
+
* `datetime` resolves to 1/300 s and `smalldatetime` to one minute; every other type keeps milliseconds.
|
|
568
|
+
*/
|
|
569
|
+
private datesEqualAtColumnResolution;
|
|
570
|
+
private dateColumnResolutionMs;
|
|
571
|
+
/**
|
|
572
|
+
* True when both strings are JSON documents with the same content, ignoring whitespace and key order.
|
|
573
|
+
*/
|
|
574
|
+
private jsonStringsEquivalent;
|
|
575
|
+
/**
|
|
576
|
+
* Canonical form of a JSON object or array string, or null when the text is not one.
|
|
577
|
+
*/
|
|
578
|
+
private canonicalJSONDocument;
|
|
579
|
+
protected TestAndSetClientOldValuesToDBValues<TOldVal, TNewVal, TInput extends {
|
|
580
|
+
OldValues___?: ReadonlyArray<{
|
|
581
|
+
Key: string;
|
|
582
|
+
Value: TOldVal;
|
|
583
|
+
}> | null;
|
|
584
|
+
}>(input: TInput, rawClientNewValues: Record<string, TNewVal>, entityObject: BaseEntity, contextUser: UserInfo): Promise<void>;
|
|
500
585
|
protected DeleteRecord(entityName: string, key: CompositeKey, options: DeleteOptionsInput, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine): Promise<any>;
|
|
501
586
|
protected BeforeDelete(provider: DatabaseProviderBase, key: CompositeKey): Promise<boolean>;
|
|
502
587
|
protected AfterDelete(provider: DatabaseProviderBase, key: CompositeKey): Promise<void>;
|