@memberjunction/server 6.2.0-edge.5 → 6.2.0-edge.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +3 -3
- package/dist/agentSessions/SessionJanitor.js +3 -3
- package/dist/agentSessions/SessionManager.d.ts +15 -5
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +34 -12
- package/dist/agentSessions/SessionManager.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/magicLink/MagicLinkKeys.d.ts +2 -2
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +12 -0
- package/dist/auth/magicLink/types.d.ts.map +1 -1
- package/dist/auth/sessionUserClone.d.ts +1 -1
- package/dist/auth/sessionUserClone.d.ts.map +1 -1
- package/dist/auth/sessionUserClone.js +3 -2
- package/dist/auth/sessionUserClone.js.map +1 -1
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
- package/dist/broadcast/index.d.ts +6 -0
- package/dist/broadcast/index.d.ts.map +1 -0
- package/dist/broadcast/index.js +6 -0
- package/dist/broadcast/index.js.map +1 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
- package/dist/cache.d.ts +3 -2
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js.map +1 -1
- package/dist/config.d.ts +496 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +61 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +3 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +29 -8
- package/dist/context.js.map +1 -1
- package/dist/coreRoutes.d.ts.map +1 -1
- package/dist/coreRoutes.js +14 -0
- package/dist/coreRoutes.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +635 -14
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +3366 -418
- 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.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +2 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
- package/dist/generic/PubSubManager.d.ts +10 -0
- package/dist/generic/PubSubManager.d.ts.map +1 -1
- package/dist/generic/PubSubManager.js +44 -1
- package/dist/generic/PubSubManager.js.map +1 -1
- package/dist/generic/PushStatusResolver.d.ts +39 -6
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +93 -11
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +65 -25
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +201 -101
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +11 -3
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +79 -13
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
- package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
- package/dist/generic/actionOutputFieldSecurity.js +47 -0
- package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
- package/dist/generic/fieldSecurityTransport.d.ts +30 -0
- package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
- package/dist/generic/fieldSecurityTransport.js +30 -0
- package/dist/generic/fieldSecurityTransport.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +122 -66
- package/dist/index.js.map +1 -1
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +6 -1
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
- package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.js +50 -1
- package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
- package/dist/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 +15 -6
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
- package/dist/realtimeSessions/sessionAccess.d.ts +88 -11
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +125 -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 +201 -19
- package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
- package/dist/realtimeWidget/host-identity.d.ts +1 -1
- package/dist/realtimeWidget/host-identity.js +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts +20 -1
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +17 -1
- package/dist/realtimeWidget/widgetCore.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +2 -1
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +19 -1
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +63 -12
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +1 -0
- package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
- package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
- package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/AgentSessionResolver.js +40 -17
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/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/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/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +45 -7
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +31 -3
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
- package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
- package/dist/resolvers/PipelineProgressResolver.js +5 -3
- package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +20 -6
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts +2 -0
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +15 -6
- package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
- package/dist/resolvers/RSUResolver.d.ts.map +1 -1
- package/dist/resolvers/RSUResolver.js +12 -0
- package/dist/resolvers/RSUResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +16 -2
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +82 -28
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +11 -9
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +56 -8
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +209 -64
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +4 -4
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTestResolver.js +3 -1
- package/dist/resolvers/RunTestResolver.js.map +1 -1
- package/dist/resolvers/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/rest/EntityCRUDHandler.d.ts +6 -0
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +19 -5
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +8 -5
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.d.ts +3 -3
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.js +7 -7
- 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 +22 -5
- package/dist/rest/ViewOperationsHandler.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/TaskGraphContinuationDeliverer.d.ts +5 -0
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +42 -15
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/types.d.ts +23 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +98 -98
- package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
- package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
- package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
- package/src/__tests__/AgentSessionResolver.ownership.test.ts +137 -0
- package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
- package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
- package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +206 -3
- package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
- package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
- package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
- package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +324 -46
- package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +98 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +37 -4
- package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +176 -0
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +23 -1
- package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
- package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +68 -13
- package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
- package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +17 -27
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +8 -2
- package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +4 -1
- package/src/__tests__/RunTemplateResolver.test.ts +35 -2
- package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
- package/src/__tests__/SessionManager.test.ts +95 -0
- 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 +7 -2
- package/src/__tests__/WidgetSessionService.test.ts +583 -4
- package/src/__tests__/apiRootBoot.test.ts +1 -1
- 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__/fieldSecurityFixtures.ts +91 -0
- package/src/__tests__/globalCors.test.ts +3 -3
- package/src/__tests__/localDevAuth.test.ts +196 -0
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +57 -1
- package/src/__tests__/realtimeRecordingHandler.test.ts +19 -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 +146 -7
- package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
- package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
- package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
- package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
- package/src/__tests__/resolverBase.fls.test.ts +146 -97
- package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
- package/src/__tests__/runParamsTimeZone.test.ts +179 -0
- package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
- package/src/__tests__/runViewProperties.test.ts +114 -0
- package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
- package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
- package/src/__tests__/sessionUserClone.test.ts +5 -1
- package/src/__tests__/startupSweepOrder.test.ts +40 -0
- package/src/__tests__/unifiedAuth.test.ts +28 -0
- package/src/__tests__/widgetGuestElevation.test.ts +2 -0
- package/src/agentSessions/SessionJanitor.ts +3 -3
- package/src/agentSessions/SessionManager.ts +35 -12
- package/src/auth/AuthProviderCatalogRouter.ts +3 -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/magicLink/MagicLinkKeys.ts +2 -2
- package/src/auth/magicLink/types.ts +10 -0
- package/src/auth/sessionUserClone.ts +3 -2
- package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
- package/src/broadcast/index.ts +5 -0
- package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
- package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
- package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
- package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
- package/src/cache.ts +2 -1
- package/src/config.ts +69 -0
- package/src/context.ts +32 -8
- package/src/coreRoutes.ts +15 -0
- package/src/generated/graphql-schemas/__mj.ts +2239 -102
- package/src/generic/CacheInvalidationResolver.ts +135 -78
- package/src/generic/OrphanedConversationDetailReconciler.ts +4 -2
- package/src/generic/PubSubManager.ts +54 -1
- package/src/generic/PushStatusResolver.ts +108 -11
- package/src/generic/ResolverBase.ts +237 -107
- package/src/generic/RunViewResolver.ts +80 -15
- package/src/generic/actionOutputFieldSecurity.ts +75 -0
- package/src/generic/fieldSecurityTransport.ts +62 -0
- package/src/index.ts +127 -68
- package/src/integration/CustomColumnPromoter.ts +6 -1
- 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 +20 -6
- package/src/realtimeSessions/sessionAccess.ts +181 -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 +252 -17
- package/src/realtimeWidget/host-identity.ts +1 -1
- package/src/realtimeWidget/widgetCore.ts +30 -1
- package/src/realtimeWidget/widgetGuestElevation.ts +2 -1
- package/src/resolvers/ActionResolver.ts +78 -15
- package/src/resolvers/AdhocQueryResolver.ts +1 -0
- package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
- package/src/resolvers/AgentSessionResolver.ts +46 -18
- package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
- package/src/resolvers/FetchEntityVectorsResolver.ts +132 -21
- package/src/resolvers/FileCategoryResolver.ts +1 -0
- package/src/resolvers/FileResolver.ts +14 -4
- package/src/resolvers/IntegrationDiscoveryResolver.ts +49 -7
- 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 +15 -6
- package/src/resolvers/RSUResolver.ts +12 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +104 -33
- package/src/resolvers/RemoteBrowserActionResolver.ts +15 -10
- package/src/resolvers/RunAIAgentResolver.ts +258 -82
- package/src/resolvers/RunTemplateResolver.ts +6 -4
- 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__/MergeRecordsResolver.test.ts +43 -0
- package/src/rest/EntityCRUDHandler.ts +22 -5
- package/src/rest/RESTEndpointHandler.ts +8 -5
- package/src/rest/RealtimeRecordingHandler.ts +13 -10
- package/src/rest/ViewOperationsHandler.ts +24 -6
- package/src/serverRoleConfigUnits.ts +48 -0
- package/src/services/TaskGraphContinuationDeliverer.ts +52 -20
- package/src/types.ts +23 -1
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { BaseSingleton, MJGlobal } from '@memberjunction/global';
|
|
3
|
+
import { Metadata } from '@memberjunction/core';
|
|
4
|
+
/**
|
|
5
|
+
* High-churn system telemetry/logging entities that can optionally be excluded from browser
|
|
6
|
+
* invalidation fan-out because browsers do not maintain live dataset caches for them.
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_HIGH_CHURN_SYSTEM_ENTITIES = [
|
|
9
|
+
'MJ: Audit Logs',
|
|
10
|
+
'MJ: Error Logs',
|
|
11
|
+
'MJ: AI Prompt Runs',
|
|
12
|
+
'MJ: AI Agent Runs',
|
|
13
|
+
'MJ: AI Agent Run Steps',
|
|
14
|
+
'MJ: Query Execution Histories',
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Abstract base class for MemberJunction's pluggable Cache Invalidation Broadcast Hierarchy.
|
|
18
|
+
*
|
|
19
|
+
* Provides the shared primitives used by all broadcast topologies:
|
|
20
|
+
* 1. **Monotonic Sequence Ring Buffer (Topology 1)**: Every invalidation event is stamped with a
|
|
21
|
+
* monotonically increasing `Sequence` integer and stored in a bounded circular buffer (`MaxRingBufferSize`),
|
|
22
|
+
* enabling HTTP `X-MJ-Cache-Seq` piggybacking and `GetCacheInvalidationsSince` delta catch-up.
|
|
23
|
+
* 2. **Role-Fingerprint $O(\text{Roles})$ Evaluation & Shaping Memoizer (Topology 2)**: Computes a canonical
|
|
24
|
+
* fingerprint of a user's sorted `RoleID`s (cached per `UserInfo` in a `WeakMap`) and memoizes
|
|
25
|
+
* entity read-permission checks (`CanRead`) and row-level security key-withholding (`ReadIsRowFiltered`)
|
|
26
|
+
* once per `(payload, entity, roleFingerprint)` tuple instead of once per connected WebSocket client.
|
|
27
|
+
* 3. **Cloud Multiplexer Extension Hooks (Topology 3)**: Subclasses (`AzureWebPubSubBroadcastProvider`,
|
|
28
|
+
* `AWSIoTCoreBroadcastProvider`, `GCPPubSubBroadcastProvider`) override `PublishInvalidation` and
|
|
29
|
+
* `NegotiateClientConnection` to offload WebSocket fan-out to managed cloud pub/sub infrastructure.
|
|
30
|
+
*/
|
|
31
|
+
export class BaseCacheInvalidationBroadcastProvider {
|
|
32
|
+
constructor() {
|
|
33
|
+
this._currentSequence = 0;
|
|
34
|
+
this._maxRingBufferSize = 5000;
|
|
35
|
+
this._ringBuffer = [];
|
|
36
|
+
this._ringHead = 0;
|
|
37
|
+
this._ringCount = 0;
|
|
38
|
+
this._excludedEntities = new Set();
|
|
39
|
+
this._config = {};
|
|
40
|
+
/**
|
|
41
|
+
* Memoizes canonical role fingerprints per `RoleHolder` / `UserInfo` object reference.
|
|
42
|
+
*/
|
|
43
|
+
this._roleFingerprintCache = new WeakMap();
|
|
44
|
+
/**
|
|
45
|
+
* Memoizes `Metadata.EntityByName` lookup per `CacheInvalidationPayload` object reference
|
|
46
|
+
* so `CacheInvalidationFilter` and `CacheInvalidationResolver` only look up the entity once per event.
|
|
47
|
+
*/
|
|
48
|
+
this._payloadEntityCache = new WeakMap();
|
|
49
|
+
/**
|
|
50
|
+
* Memoizes entity-level read permission (`CanRead`) per `(payload, roleFingerprint)`.
|
|
51
|
+
*/
|
|
52
|
+
this._payloadFilterMemo = new WeakMap();
|
|
53
|
+
/**
|
|
54
|
+
* Memoizes row-level security key-withholding and shaped `CacheInvalidationNotification`
|
|
55
|
+
* per `(payload, entity, roleFingerprint)`.
|
|
56
|
+
*/
|
|
57
|
+
this._payloadShapeMemo = new WeakMap();
|
|
58
|
+
}
|
|
59
|
+
static { this._serverProcessId = randomUUID(); }
|
|
60
|
+
/**
|
|
61
|
+
* Unique identifier of the running MJServer process, emitted in `X-MJ-Server-ID`.
|
|
62
|
+
*/
|
|
63
|
+
get ServerProcessID() {
|
|
64
|
+
return BaseCacheInvalidationBroadcastProvider._serverProcessId;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Latest monotonic sequence number assigned to a cache invalidation event in this process.
|
|
68
|
+
*/
|
|
69
|
+
get CurrentSequence() {
|
|
70
|
+
return this._currentSequence;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Maximum number of invalidation events held in the circular ring buffer.
|
|
74
|
+
*/
|
|
75
|
+
get MaxRingBufferSize() {
|
|
76
|
+
return this._maxRingBufferSize;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Number of invalidation events currently retained in the circular ring buffer.
|
|
80
|
+
*/
|
|
81
|
+
get BufferedEventCount() {
|
|
82
|
+
return this._ringCount;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Configures the provider instance with buffer sizing, entity exclusions, and cloud settings.
|
|
86
|
+
*/
|
|
87
|
+
Configure(config) {
|
|
88
|
+
this._config = config ?? {};
|
|
89
|
+
const desiredSize = config?.ringBufferSize && config.ringBufferSize > 0 ? Math.floor(config.ringBufferSize) : 5000;
|
|
90
|
+
if (desiredSize !== this._maxRingBufferSize || this._ringBuffer.length === 0) {
|
|
91
|
+
this._maxRingBufferSize = desiredSize;
|
|
92
|
+
this._ringBuffer = new Array(this._maxRingBufferSize);
|
|
93
|
+
this._ringHead = 0;
|
|
94
|
+
this._ringCount = 0;
|
|
95
|
+
}
|
|
96
|
+
this._excludedEntities = new Set((config?.excludedEntities ?? [])
|
|
97
|
+
.map((name) => name.trim().toLowerCase())
|
|
98
|
+
.filter((name) => name.length > 0));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Returns whether invalidation events for `entityName` should be broadcast to clients.
|
|
102
|
+
* Returns `false` for blank names or entities explicitly listed in `excludedEntities`.
|
|
103
|
+
*/
|
|
104
|
+
ShouldBroadcastEntity(entityName) {
|
|
105
|
+
if (!entityName) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
const normalized = entityName.trim().toLowerCase();
|
|
109
|
+
if (normalized.length === 0) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
return !this._excludedEntities.has(normalized);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Computes a canonical, order-independent role fingerprint for a user (`RoleHolder`).
|
|
116
|
+
* Memoized per user object in a `WeakMap` so repeated evaluations across thousands of events are $O(1)$.
|
|
117
|
+
*/
|
|
118
|
+
GetRoleFingerprint(user) {
|
|
119
|
+
if (!user || typeof user !== 'object') {
|
|
120
|
+
return 'anonymous';
|
|
121
|
+
}
|
|
122
|
+
const roles = user.UserRoles;
|
|
123
|
+
if (!Array.isArray(roles)) {
|
|
124
|
+
return 'no-roles';
|
|
125
|
+
}
|
|
126
|
+
const cached = this._roleFingerprintCache.get(user);
|
|
127
|
+
if (cached && cached.roleCount === roles.length) {
|
|
128
|
+
return cached.fingerprint;
|
|
129
|
+
}
|
|
130
|
+
let fingerprint;
|
|
131
|
+
if (roles.length === 0) {
|
|
132
|
+
fingerprint = 'roles:empty';
|
|
133
|
+
}
|
|
134
|
+
else if (roles.length === 1) {
|
|
135
|
+
fingerprint = `roles:${(roles[0]?.RoleID ?? '').trim().toLowerCase()}`;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
const normalizedIds = new Array(roles.length);
|
|
139
|
+
for (let i = 0; i < roles.length; i++) {
|
|
140
|
+
normalizedIds[i] = (roles[i]?.RoleID ?? '').trim().toLowerCase();
|
|
141
|
+
}
|
|
142
|
+
normalizedIds.sort();
|
|
143
|
+
fingerprint = `roles:${normalizedIds.join('|')}`;
|
|
144
|
+
}
|
|
145
|
+
this._roleFingerprintCache.set(user, { roleCount: roles.length, fingerprint });
|
|
146
|
+
return fingerprint;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Resolves and caches the `EntityInfo` for a `CacheInvalidationPayload` so that
|
|
150
|
+
* `CacheInvalidationFilter` and `CacheInvalidationResolver` do not repeat metadata lookups.
|
|
151
|
+
*/
|
|
152
|
+
ResolveEntityForPayload(payload, entityLookup) {
|
|
153
|
+
if (this._payloadEntityCache.has(payload)) {
|
|
154
|
+
return this._payloadEntityCache.get(payload) ?? null;
|
|
155
|
+
}
|
|
156
|
+
const entityName = payload?.entityName;
|
|
157
|
+
if (!entityName) {
|
|
158
|
+
this._payloadEntityCache.set(payload, null);
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
const entity = entityLookup
|
|
162
|
+
? (entityLookup(entityName) ?? null)
|
|
163
|
+
: (new Metadata().EntityByName(entityName) ?? null); // global-provider-ok: subscription broadcast provider resolves server-wide entity metadata once per event
|
|
164
|
+
this._payloadEntityCache.set(payload, entity);
|
|
165
|
+
return entity;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Evaluates whether `user` has entity-level read permission for `payload`, memoized by
|
|
169
|
+
* `(payload, entityName, roleFingerprint)` so $N$ subscribers sharing $R$ role combinations
|
|
170
|
+
* only run `GetUserPermisions` $R$ times per event.
|
|
171
|
+
*/
|
|
172
|
+
EvaluateEntityReadAccess(payload, user, entityLookup) {
|
|
173
|
+
if (!user) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
const entityName = payload?.entityName;
|
|
177
|
+
if (!this.ShouldBroadcastEntity(entityName)) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
const entity = this.ResolveEntityForPayload(payload, entityLookup);
|
|
181
|
+
if (!entity) {
|
|
182
|
+
// Unknown entity: deliver rather than leaving client cache silently stale
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
// Only coalesce across users when UserRoles is an array; mock users without UserRoles
|
|
186
|
+
// in isolated unit tests are evaluated directly.
|
|
187
|
+
if (!Array.isArray(user.UserRoles)) {
|
|
188
|
+
return entity.GetUserPermisions(user).CanRead;
|
|
189
|
+
}
|
|
190
|
+
let bucketMap = this._payloadFilterMemo.get(payload);
|
|
191
|
+
if (!bucketMap) {
|
|
192
|
+
bucketMap = new Map();
|
|
193
|
+
this._payloadFilterMemo.set(payload, bucketMap);
|
|
194
|
+
}
|
|
195
|
+
const bucketKey = `${entity.Name.toLowerCase()}::${this.GetRoleFingerprint(user)}`;
|
|
196
|
+
const cached = bucketMap.get(bucketKey);
|
|
197
|
+
if (cached !== undefined) {
|
|
198
|
+
return cached;
|
|
199
|
+
}
|
|
200
|
+
const canRead = entity.GetUserPermisions(user).CanRead;
|
|
201
|
+
bucketMap.set(bucketKey, canRead);
|
|
202
|
+
return canRead;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Evaluates whether every read permission the user holds on `entity` is gated by a
|
|
206
|
+
* Row-Level Security filter (`ReadRLSFilterID`).
|
|
207
|
+
*/
|
|
208
|
+
ReadIsRowFiltered(entity, user) {
|
|
209
|
+
const roles = new Set((user.UserRoles ?? []).map((role) => (role.RoleID ?? '').trim().toLowerCase()));
|
|
210
|
+
let filteredReads = 0;
|
|
211
|
+
for (const row of entity.Permissions) {
|
|
212
|
+
if (!row.CanRead)
|
|
213
|
+
continue;
|
|
214
|
+
const isDeny = row.IsDeny ?? (row.Type ?? 'Allow').trim().toLowerCase() === 'deny';
|
|
215
|
+
if (isDeny)
|
|
216
|
+
continue;
|
|
217
|
+
if (!roles.has((row.RoleID ?? '').trim().toLowerCase()))
|
|
218
|
+
continue;
|
|
219
|
+
if (!row.ReadRLSFilterID)
|
|
220
|
+
return false;
|
|
221
|
+
filteredReads += 1;
|
|
222
|
+
}
|
|
223
|
+
return filteredReads > 0;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Shapes a `CacheInvalidationPayload` into a `CacheInvalidationNotification` for `user` and `entity`.
|
|
227
|
+
* When `user` and `entity` are present and `user.UserRoles` is populated, the shaped object is
|
|
228
|
+
* memoized per `(payload, entity, roleFingerprint)` so $N$ subscribers sharing $R$ role buckets
|
|
229
|
+
* only allocate and evaluate `ReadIsRowFiltered` $R$ times per event.
|
|
230
|
+
*/
|
|
231
|
+
ShapeEventForSubscriber(payload, user, entity) {
|
|
232
|
+
if (!user || !entity || !Array.isArray(user.UserRoles)) {
|
|
233
|
+
const withholdKey = !!user && !!entity && this.ReadIsRowFiltered(entity, user);
|
|
234
|
+
return this.buildNotification(payload, withholdKey);
|
|
235
|
+
}
|
|
236
|
+
let entityMap = this._payloadShapeMemo.get(payload);
|
|
237
|
+
if (!entityMap) {
|
|
238
|
+
entityMap = new WeakMap();
|
|
239
|
+
this._payloadShapeMemo.set(payload, entityMap);
|
|
240
|
+
}
|
|
241
|
+
let roleMap = entityMap.get(entity);
|
|
242
|
+
if (!roleMap) {
|
|
243
|
+
roleMap = new Map();
|
|
244
|
+
entityMap.set(entity, roleMap);
|
|
245
|
+
}
|
|
246
|
+
const fingerprint = this.GetRoleFingerprint(user);
|
|
247
|
+
const existing = roleMap.get(fingerprint);
|
|
248
|
+
if (existing) {
|
|
249
|
+
return existing;
|
|
250
|
+
}
|
|
251
|
+
const withholdKey = this.ReadIsRowFiltered(entity, user);
|
|
252
|
+
const shaped = this.buildNotification(payload, withholdKey);
|
|
253
|
+
roleMap.set(fingerprint, shaped);
|
|
254
|
+
return shaped;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Assigns the next monotonic sequence number to `payload` (if not already stamped on this server),
|
|
258
|
+
* appends it to the bounded circular ring buffer, and invokes `OnInvalidationRecorded` for
|
|
259
|
+
* provider-specific fan-out.
|
|
260
|
+
*/
|
|
261
|
+
RecordInvalidation(payload) {
|
|
262
|
+
if (!this.ShouldBroadcastEntity(payload.entityName)) {
|
|
263
|
+
return payload;
|
|
264
|
+
}
|
|
265
|
+
if (this._ringBuffer.length === 0) {
|
|
266
|
+
this.Configure(this._config);
|
|
267
|
+
}
|
|
268
|
+
const seq = ++this._currentSequence;
|
|
269
|
+
payload.sequence = seq;
|
|
270
|
+
const writeIndex = (this._ringHead + this._ringCount) % this._maxRingBufferSize;
|
|
271
|
+
if (this._ringCount < this._maxRingBufferSize) {
|
|
272
|
+
this._ringBuffer[writeIndex] = { Sequence: seq, Payload: payload };
|
|
273
|
+
this._ringCount++;
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
// Buffer full: overwrite oldest at _ringHead and advance head
|
|
277
|
+
this._ringBuffer[this._ringHead] = { Sequence: seq, Payload: payload };
|
|
278
|
+
this._ringHead = (this._ringHead + 1) % this._maxRingBufferSize;
|
|
279
|
+
}
|
|
280
|
+
void this.OnInvalidationRecorded(payload);
|
|
281
|
+
return payload;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Returns all permission-allowed, RLS-shaped invalidation events strictly after `sinceSequence`
|
|
285
|
+
* for `user`. If `sinceSequence` has already been evicted from the ring buffer (or lies in the
|
|
286
|
+
* future due to a server restart), sets `RequiresFullRefresh: true` and returns an empty `Events` list.
|
|
287
|
+
*/
|
|
288
|
+
GetChangesSince(sinceSequence, user) {
|
|
289
|
+
if (!user) {
|
|
290
|
+
return {
|
|
291
|
+
RequiresFullRefresh: true,
|
|
292
|
+
CurrentSequence: this._currentSequence,
|
|
293
|
+
ServerProcessID: this.ServerProcessID,
|
|
294
|
+
Events: [],
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
if (sinceSequence < 0 || sinceSequence > this._currentSequence) {
|
|
298
|
+
return {
|
|
299
|
+
RequiresFullRefresh: true,
|
|
300
|
+
CurrentSequence: this._currentSequence,
|
|
301
|
+
ServerProcessID: this.ServerProcessID,
|
|
302
|
+
Events: [],
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
if (sinceSequence === this._currentSequence) {
|
|
306
|
+
return {
|
|
307
|
+
RequiresFullRefresh: false,
|
|
308
|
+
CurrentSequence: this._currentSequence,
|
|
309
|
+
ServerProcessID: this.ServerProcessID,
|
|
310
|
+
Events: [],
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
if (this._ringCount === 0) {
|
|
314
|
+
return {
|
|
315
|
+
RequiresFullRefresh: true,
|
|
316
|
+
CurrentSequence: this._currentSequence,
|
|
317
|
+
ServerProcessID: this.ServerProcessID,
|
|
318
|
+
Events: [],
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
const oldestEntry = this._ringBuffer[this._ringHead];
|
|
322
|
+
if (!oldestEntry || sinceSequence < oldestEntry.Sequence - 1) {
|
|
323
|
+
return {
|
|
324
|
+
RequiresFullRefresh: true,
|
|
325
|
+
CurrentSequence: this._currentSequence,
|
|
326
|
+
ServerProcessID: this.ServerProcessID,
|
|
327
|
+
Events: [],
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
// Coalesce duplicate entity+PK events within the catch-up window (latest event wins)
|
|
331
|
+
const coalescedPayloads = new Map();
|
|
332
|
+
for (let i = 0; i < this._ringCount; i++) {
|
|
333
|
+
const idx = (this._ringHead + i) % this._maxRingBufferSize;
|
|
334
|
+
const entry = this._ringBuffer[idx];
|
|
335
|
+
if (!entry || entry.Sequence <= sinceSequence) {
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
const payload = entry.Payload;
|
|
339
|
+
if (!this.EvaluateEntityReadAccess(payload, user)) {
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
const entity = this.ResolveEntityForPayload(payload);
|
|
343
|
+
const shaped = this.ShapeEventForSubscriber(payload, user, entity);
|
|
344
|
+
// If key is withheld (RLS-filtered), coalesce at whole-entity granularity; otherwise entity + PK
|
|
345
|
+
const dedupKey = shaped.PrimaryKeyValues
|
|
346
|
+
? `${shaped.EntityName.toLowerCase()}::pk::${shaped.PrimaryKeyValues}`
|
|
347
|
+
: `${shaped.EntityName.toLowerCase()}::all`;
|
|
348
|
+
coalescedPayloads.set(dedupKey, payload);
|
|
349
|
+
}
|
|
350
|
+
const events = [];
|
|
351
|
+
for (const payload of coalescedPayloads.values()) {
|
|
352
|
+
const entity = this.ResolveEntityForPayload(payload);
|
|
353
|
+
events.push(this.ShapeEventForSubscriber(payload, user, entity));
|
|
354
|
+
}
|
|
355
|
+
return {
|
|
356
|
+
RequiresFullRefresh: false,
|
|
357
|
+
CurrentSequence: this._currentSequence,
|
|
358
|
+
ServerProcessID: this.ServerProcessID,
|
|
359
|
+
Events: events,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Resets the sequence counter and ring buffer. Intended for unit tests.
|
|
364
|
+
*/
|
|
365
|
+
ResetStateForTesting() {
|
|
366
|
+
this._currentSequence = 0;
|
|
367
|
+
this._ringHead = 0;
|
|
368
|
+
this._ringCount = 0;
|
|
369
|
+
this._ringBuffer = new Array(this._maxRingBufferSize);
|
|
370
|
+
}
|
|
371
|
+
buildNotification(payload, withholdKey) {
|
|
372
|
+
const notification = {
|
|
373
|
+
EntityName: payload.entityName,
|
|
374
|
+
PrimaryKeyValues: withholdKey ? undefined : (payload.primaryKeyValues ?? undefined),
|
|
375
|
+
Action: payload.action,
|
|
376
|
+
SourceServerID: payload.sourceServerId,
|
|
377
|
+
Timestamp: payload.timestamp,
|
|
378
|
+
OriginSessionID: payload.originSessionId ?? undefined,
|
|
379
|
+
RecordData: withholdKey ? undefined : (payload.recordData ?? undefined),
|
|
380
|
+
};
|
|
381
|
+
if (payload.sequence !== undefined) {
|
|
382
|
+
notification.Sequence = payload.sequence;
|
|
383
|
+
}
|
|
384
|
+
return notification;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Process-wide singleton managing the active {@link BaseCacheInvalidationBroadcastProvider}.
|
|
389
|
+
*
|
|
390
|
+
* Uses `MJGlobal.Instance.ClassFactory` to instantiate the configured provider class
|
|
391
|
+
* (defaulting to `'SequencedRoleBucket'`).
|
|
392
|
+
*/
|
|
393
|
+
export class CacheInvalidationBroadcastManager extends BaseSingleton {
|
|
394
|
+
constructor() {
|
|
395
|
+
super();
|
|
396
|
+
this._provider = null;
|
|
397
|
+
this._fallbackFactory = null;
|
|
398
|
+
}
|
|
399
|
+
static get Instance() {
|
|
400
|
+
return super.getInstance();
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Registers the default fallback provider factory so `Provider` is always available even
|
|
404
|
+
* before `Configure()` is explicitly called.
|
|
405
|
+
*/
|
|
406
|
+
RegisterDefaultProviderFactory(factory) {
|
|
407
|
+
this._fallbackFactory = factory;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Returns the active broadcast provider, lazily instantiating the default
|
|
411
|
+
* `SequencedRoleBucketBroadcastProvider` if not yet configured.
|
|
412
|
+
*/
|
|
413
|
+
get Provider() {
|
|
414
|
+
if (!this._provider) {
|
|
415
|
+
this.Configure();
|
|
416
|
+
}
|
|
417
|
+
return this._provider;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Configures and activates a broadcast provider via `MJGlobal.Instance.ClassFactory`.
|
|
421
|
+
*/
|
|
422
|
+
Configure(config) {
|
|
423
|
+
const driverKey = config?.provider?.trim() || 'SequencedRoleBucket';
|
|
424
|
+
let instance = MJGlobal.Instance.ClassFactory.CreateInstance(BaseCacheInvalidationBroadcastProvider, driverKey);
|
|
425
|
+
if (!instance && this._fallbackFactory) {
|
|
426
|
+
instance = this._fallbackFactory();
|
|
427
|
+
}
|
|
428
|
+
if (!instance) {
|
|
429
|
+
throw new Error(`Failed to instantiate BaseCacheInvalidationBroadcastProvider for driver '${driverKey}'.`);
|
|
430
|
+
}
|
|
431
|
+
instance.Configure(config);
|
|
432
|
+
this._provider = instance;
|
|
433
|
+
return instance;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Explicitly sets the active provider instance (useful for testing or custom programmatic wiring).
|
|
437
|
+
*/
|
|
438
|
+
SetProvider(provider) {
|
|
439
|
+
this._provider = provider;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
//# sourceMappingURL=BaseCacheInvalidationBroadcastProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseCacheInvalidationBroadcastProvider.js","sourceRoot":"","sources":["../../src/broadcast/BaseCacheInvalidationBroadcastProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAc,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AA+ItE;;;GAGG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAsB;IACjE,gBAAgB;IAChB,gBAAgB;IAChB,oBAAoB;IACpB,mBAAmB;IACnB,wBAAwB;IACxB,+BAA+B;CAClC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAgB,sCAAsC;IAA5D;QAGY,qBAAgB,GAAG,CAAC,CAAC;QACrB,uBAAkB,GAAG,IAAI,CAAC;QAC1B,gBAAW,GAAuC,EAAE,CAAC;QACrD,cAAS,GAAG,CAAC,CAAC;QACd,eAAU,GAAG,CAAC,CAAC;QACf,sBAAiB,GAAgB,IAAI,GAAG,EAAU,CAAC;QACjD,YAAO,GAAiC,EAAE,CAAC;QAErD;;WAEG;QACc,0BAAqB,GAAG,IAAI,OAAO,EAAsD,CAAC;QAE3G;;;WAGG;QACc,wBAAmB,GAAG,IAAI,OAAO,EAA+C,CAAC;QAElG;;WAEG;QACc,uBAAkB,GAAG,IAAI,OAAO,EAAkD,CAAC;QAEpG;;;WAGG;QACc,sBAAiB,GAAG,IAAI,OAAO,EAG7C,CAAC;IA+YR,CAAC;aAhb2B,qBAAgB,GAAW,UAAU,EAAE,AAAvB,CAAwB;IAmChE;;OAEG;IACH,IAAW,eAAe;QACtB,OAAO,sCAAsC,CAAC,gBAAgB,CAAC;IACnE,CAAC;IAOD;;OAEG;IACH,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,MAAqC;QAClD,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,MAAM,EAAE,cAAc,IAAI,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnH,IAAI,WAAW,KAAK,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3E,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,CAA8B,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACnF,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,CAC5B,CAAC,MAAM,EAAE,gBAAgB,IAAI,EAAE,CAAC;aAC3B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;aACxC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CACzC,CAAC;IACN,CAAC;IAED;;;OAGG;IACI,qBAAqB,CAAC,UAAqC;QAC9D,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACnD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACI,kBAAkB,CAAC,IAAmC;QACzD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,WAAW,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,UAAU,CAAC;QACtB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YAC9C,OAAO,MAAM,CAAC,WAAW,CAAC;QAC9B,CAAC;QAED,IAAI,WAAmB,CAAC;QACxB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,WAAW,GAAG,aAAa,CAAC;QAChC,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3E,CAAC;aAAM,CAAC;YACJ,MAAM,aAAa,GAAa,IAAI,KAAK,CAAS,KAAK,CAAC,MAAM,CAAC,CAAC;YAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrE,CAAC;YACD,aAAa,CAAC,IAAI,EAAE,CAAC;YACrB,WAAW,GAAG,SAAS,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/E,OAAO,WAAW,CAAC;IACvB,CAAC;IAED;;;OAGG;IACI,uBAAuB,CAC1B,OAAiC,EACjC,YAAoE;QAEpE,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;QACzD,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,MAAM,GAAG,YAAY;YACvB,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;YACpC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,0GAA0G;QACnK,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACI,wBAAwB,CAC3B,OAAiC,EACjC,IAA0B,EAC1B,YAAoE;QAEpE,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,0EAA0E;YAC1E,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,sFAAsF;QACtF,iDAAiD;QACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,OAAO,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;QAClD,CAAC;QAED,IAAI,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;YACvC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QACnF,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;QACvD,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClC,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACI,iBAAiB,CACpB,MAAyD,EACzD,IAAgB;QAEhB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACtG,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,SAAS;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;YACnF,IAAI,MAAM;gBAAE,SAAS;YACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAAE,SAAS;YAClE,IAAI,CAAC,GAAG,CAAC,eAAe;gBAAE,OAAO,KAAK,CAAC;YACvC,aAAa,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,aAAa,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACI,uBAAuB,CAC1B,OAAiC,EACjC,IAA4B,EAC5B,MAA4E;QAE5E,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC/E,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,SAAS,GAAG,IAAI,OAAO,EAAsD,CAAC;YAC9E,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;YAC3D,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACX,OAAO,QAAQ,CAAC;QACpB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,OAAiC;QACvD,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAClD,OAAO,OAAO,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC;QACpC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC;QAEvB,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAChF,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5C,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YACnE,IAAI,CAAC,UAAU,EAAE,CAAC;QACtB,CAAC;aAAM,CAAC;YACJ,8DAA8D;YAC9D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YACvE,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACpE,CAAC;QAED,KAAK,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACI,eAAe,CAClB,aAAqB,EACrB,IAA0B;QAE1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO;gBACH,mBAAmB,EAAE,IAAI;gBACzB,eAAe,EAAE,IAAI,CAAC,gBAAgB;gBACtC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,MAAM,EAAE,EAAE;aACb,CAAC;QACN,CAAC;QAED,IAAI,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC7D,OAAO;gBACH,mBAAmB,EAAE,IAAI;gBACzB,eAAe,EAAE,IAAI,CAAC,gBAAgB;gBACtC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,MAAM,EAAE,EAAE;aACb,CAAC;QACN,CAAC;QAED,IAAI,aAAa,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1C,OAAO;gBACH,mBAAmB,EAAE,KAAK;gBAC1B,eAAe,EAAE,IAAI,CAAC,gBAAgB;gBACtC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,MAAM,EAAE,EAAE;aACb,CAAC;QACN,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACH,mBAAmB,EAAE,IAAI;gBACzB,eAAe,EAAE,IAAI,CAAC,gBAAgB;gBACtC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,MAAM,EAAE,EAAE;aACb,CAAC;QACN,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,IAAI,aAAa,GAAG,WAAW,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC3D,OAAO;gBACH,mBAAmB,EAAE,IAAI;gBACzB,eAAe,EAAE,IAAI,CAAC,gBAAgB;gBACtC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,MAAM,EAAE,EAAE;aACb,CAAC;QACN,CAAC;QAED,qFAAqF;QACrF,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAoC,CAAC;QACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;YAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,aAAa,EAAE,CAAC;gBAC5C,SAAS;YACb,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;gBAChD,SAAS;YACb,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACnE,iGAAiG;YACjG,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB;gBACpC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,SAAS,MAAM,CAAC,gBAAgB,EAAE;gBACtE,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC;YAChD,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,MAAM,GAAoC,EAAE,CAAC;QACnD,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,OAAO;YACH,mBAAmB,EAAE,KAAK;YAC1B,eAAe,EAAE,IAAI,CAAC,gBAAgB;YACtC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,MAAM,EAAE,MAAM;SACjB,CAAC;IACN,CAAC;IAED;;OAEG;IACI,oBAAoB;QACvB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,CAA8B,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACvF,CAAC;IAkBO,iBAAiB,CACrB,OAAiC,EACjC,WAAoB;QAEpB,MAAM,YAAY,GAAkC;YAChD,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,IAAI,SAAS,CAAC;YACnF,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,SAAS;YACrD,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,SAAS,CAAC;SAC1E,CAAC;QACF,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjC,YAAY,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC7C,CAAC;QACD,OAAO,YAAY,CAAC;IACxB,CAAC;;AAGL;;;;;GAKG;AACH,MAAM,OAAO,iCAAkC,SAAQ,aAAgD;IAInG;QACI,KAAK,EAAE,CAAC;QAJJ,cAAS,GAAkD,IAAI,CAAC;QAChE,qBAAgB,GAA0D,IAAI,CAAC;IAIvF,CAAC;IAEM,MAAM,KAAK,QAAQ;QACtB,OAAO,KAAK,CAAC,WAAW,EAAqC,CAAC;IAClE,CAAC;IAED;;;OAGG;IACI,8BAA8B,CAAC,OAAqD;QACvF,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACf,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,SAAS,EAAE,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,SAAU,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,MAAqC;QAClD,MAAM,SAAS,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,qBAAqB,CAAC;QACpE,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CACxD,sCAAsC,EACtC,SAAS,CACZ,CAAC;QACF,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACrC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACX,4EAA4E,SAAS,IAAI,CAC5F,CAAC;QACN,CAAC;QACD,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,QAAgD;QAC/D,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;CACJ"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './BaseCacheInvalidationBroadcastProvider.js';
|
|
2
|
+
export * from './providers/SequencedRoleBucketBroadcastProvider.js';
|
|
3
|
+
export * from './providers/AzureWebPubSubBroadcastProvider.js';
|
|
4
|
+
export * from './providers/AWSIoTCoreBroadcastProvider.js';
|
|
5
|
+
export * from './providers/GCPPubSubBroadcastProvider.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/broadcast/index.ts"],"names":[],"mappings":"AAAA,cAAc,6CAA6C,CAAC;AAC5D,cAAc,qDAAqD,CAAC;AACpE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,2CAA2C,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './BaseCacheInvalidationBroadcastProvider.js';
|
|
2
|
+
export * from './providers/SequencedRoleBucketBroadcastProvider.js';
|
|
3
|
+
export * from './providers/AzureWebPubSubBroadcastProvider.js';
|
|
4
|
+
export * from './providers/AWSIoTCoreBroadcastProvider.js';
|
|
5
|
+
export * from './providers/GCPPubSubBroadcastProvider.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/broadcast/index.ts"],"names":[],"mappings":"AAAA,cAAc,6CAA6C,CAAC;AAC5D,cAAc,qDAAqD,CAAC;AACpE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,2CAA2C,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { UserInfo } from '@memberjunction/core';
|
|
2
|
+
import { BaseCacheInvalidationBroadcastProvider, CacheBroadcastNegotiationResult, CacheInvalidationBroadcastTopology } from '../BaseCacheInvalidationBroadcastProvider.js';
|
|
3
|
+
import type { CacheInvalidationNotification, CacheInvalidationPayload } from '../../generic/CacheInvalidationResolver.js';
|
|
4
|
+
/**
|
|
5
|
+
* Envelope published to an AWS IoT Core MQTT role topic.
|
|
6
|
+
*/
|
|
7
|
+
export interface AWSIoTCoreTopicMessage {
|
|
8
|
+
Topic: string;
|
|
9
|
+
QoS: 0 | 1;
|
|
10
|
+
Event: CacheInvalidationNotification;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Transport callback used by {@link AWSIoTCoreBroadcastProvider} to publish a shaped
|
|
14
|
+
* invalidation notification to an AWS IoT Core MQTT topic.
|
|
15
|
+
*/
|
|
16
|
+
export type AWSIoTCoreTopicPublisher = (message: AWSIoTCoreTopicMessage) => Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Topology 3 Cloud Multiplexer Provider for **AWS IoT Core MQTT over WebSockets** (`'AWSIoTCore'`).
|
|
19
|
+
*
|
|
20
|
+
* Offloads per-client WebSocket connection management and message fan-out from MJServer
|
|
21
|
+
* to AWS IoT Core's managed MQTT message broker:
|
|
22
|
+
* - Each authenticated browser client calls `NegotiateCacheBroadcastConnection` to obtain
|
|
23
|
+
* a SigV4-presigned `wss://<endpoint>/mqtt` URL and its authorized MQTT topic list
|
|
24
|
+
* (`<topicPrefix>/roles/<RoleID>`).
|
|
25
|
+
* - When an entity mutation occurs, MJServer shapes the invalidation payload once per
|
|
26
|
+
* authorized role on the entity and publishes to `<topicPrefix>/roles/<RoleID>`.
|
|
27
|
+
*/
|
|
28
|
+
export declare class AWSIoTCoreBroadcastProvider extends BaseCacheInvalidationBroadcastProvider {
|
|
29
|
+
private _topicPublisher;
|
|
30
|
+
get Topology(): CacheInvalidationBroadcastTopology;
|
|
31
|
+
/**
|
|
32
|
+
* Installs a custom MQTT topic publisher (e.g., AWS SDK `IoTDataPlaneClient` adapter or test spy).
|
|
33
|
+
*/
|
|
34
|
+
SetTopicPublisher(publisher: AWSIoTCoreTopicPublisher | null): void;
|
|
35
|
+
/**
|
|
36
|
+
* Computes the MQTT topic filters (`<topicPrefix>/roles/<roleId>`) for a user's roles.
|
|
37
|
+
*/
|
|
38
|
+
GetAuthorizedTopicsForUser(user: UserInfo): string[];
|
|
39
|
+
protected OnInvalidationRecorded(payload: CacheInvalidationPayload): Promise<void>;
|
|
40
|
+
NegotiateClientConnection(user: UserInfo, defaultGraphQLWsUrl?: string): Promise<CacheBroadcastNegotiationResult>;
|
|
41
|
+
private buildSigV4PresignedMqttUrl;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=AWSIoTCoreBroadcastProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AWSIoTCoreBroadcastProvider.d.ts","sourceRoot":"","sources":["../../../src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EACH,sCAAsC,EACtC,+BAA+B,EAC/B,kCAAkC,EACrC,MAAM,8CAA8C,CAAC;AACtD,OAAO,KAAK,EACR,6BAA6B,EAC7B,wBAAwB,EAC3B,MAAM,4CAA4C,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACX,KAAK,EAAE,6BAA6B,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1F;;;;;;;;;;GAUG;AACH,qBACa,2BAA4B,SAAQ,sCAAsC;IACnF,OAAO,CAAC,eAAe,CAAyC;IAEhE,IAAoB,QAAQ,IAAI,kCAAkC,CAEjE;IAED;;OAEG;IACI,iBAAiB,CAAC,SAAS,EAAE,wBAAwB,GAAG,IAAI,GAAG,IAAI;IAI1E;;OAEG;IACI,0BAA0B,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE;cAclC,sBAAsB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B3E,yBAAyB,CAC3C,IAAI,EAAE,QAAQ,EACd,mBAAmB,SAAa,GACjC,OAAO,CAAC,+BAA+B,CAAC;IAmC3C,OAAO,CAAC,0BAA0B;CA4CrC"}
|