@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
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { EntityInfo } from '@memberjunction/core';
|
|
1
3
|
export declare const CACHE_INVALIDATION_TOPIC = "CACHE_INVALIDATION";
|
|
2
4
|
/**
|
|
3
5
|
* Supply the configured allowlist. Called once from the server entry point during bootstrap.
|
|
@@ -15,17 +17,23 @@ export declare function ConfigureRecordDataBroadcast(entities: readonly string[]
|
|
|
15
17
|
*
|
|
16
18
|
* The subscription below is filtered only by ENTITY-level read permission, so anything included
|
|
17
19
|
* here is disclosed to every signed-in session that may read the entity at all — regardless of
|
|
18
|
-
* row-level security or any tenant scoping a consumer applies on the read
|
|
19
|
-
* this push traverses. The answer is therefore NO unless a deployment has
|
|
20
|
-
* entity in via `cacheSettings.recordDataBroadcastEntities
|
|
20
|
+
* row-level security, field-level security, or any tenant scoping a consumer applies on the read
|
|
21
|
+
* path, none of which this push traverses. The answer is therefore NO unless a deployment has
|
|
22
|
+
* explicitly opted the entity in via `cacheSettings.recordDataBroadcastEntities`, and always NO
|
|
23
|
+
* for an entity under field-level security (its own flag or an IS-A ancestor's), and for
|
|
24
|
+
* `MJ: Record Changes`, whatever the allowlist says: the row would carry columns (or, for Record
|
|
25
|
+
* Changes, other entities' values) some of those sessions may not read.
|
|
21
26
|
*
|
|
22
27
|
* Callers that get `false` simply omit `recordData`; the event still carries the entity name and
|
|
23
28
|
* primary key, so clients evict and re-fetch through the normal access-controlled read path.
|
|
24
29
|
*
|
|
25
30
|
* Matching is exact (trimmed, case-insensitive) rather than substring: a loose match would let an
|
|
26
31
|
* allowlisted name drag in every entity whose name contains it.
|
|
32
|
+
*
|
|
33
|
+
* @param entityInfo The entity's metadata, when the caller holds it. Otherwise it is looked up by
|
|
34
|
+
* name, so the field-security refusal applies either way.
|
|
27
35
|
*/
|
|
28
|
-
export declare function MayBroadcastRecordData(entityName: string): boolean;
|
|
36
|
+
export declare function MayBroadcastRecordData(entityName: string, entityInfo?: EntityInfo | null): boolean;
|
|
29
37
|
export declare class CacheInvalidationNotification {
|
|
30
38
|
EntityName: string;
|
|
31
39
|
PrimaryKeyValues?: string;
|
|
@@ -34,6 +42,22 @@ export declare class CacheInvalidationNotification {
|
|
|
34
42
|
Timestamp: Date;
|
|
35
43
|
OriginSessionID?: string;
|
|
36
44
|
RecordData?: string;
|
|
45
|
+
Sequence?: number;
|
|
46
|
+
}
|
|
47
|
+
export declare class CacheInvalidationCatchUpResult {
|
|
48
|
+
RequiresFullRefresh: boolean;
|
|
49
|
+
CurrentSequence: number;
|
|
50
|
+
ServerProcessID: string;
|
|
51
|
+
Events: CacheInvalidationNotification[];
|
|
52
|
+
}
|
|
53
|
+
export declare class CacheBroadcastConnectionToken {
|
|
54
|
+
Provider: string;
|
|
55
|
+
Url: string;
|
|
56
|
+
Token?: string;
|
|
57
|
+
Groups: string[];
|
|
58
|
+
ExpiresAt: string;
|
|
59
|
+
ServerProcessID: string;
|
|
60
|
+
CurrentSequence: number;
|
|
37
61
|
}
|
|
38
62
|
/**
|
|
39
63
|
* Payload interface for publishing cache invalidation events.
|
|
@@ -47,6 +71,7 @@ export interface CacheInvalidationPayload {
|
|
|
47
71
|
timestamp: Date;
|
|
48
72
|
originSessionId?: string;
|
|
49
73
|
recordData?: string;
|
|
74
|
+
sequence?: number;
|
|
50
75
|
}
|
|
51
76
|
/**
|
|
52
77
|
* What the subscription filter needs off the WS connection.
|
|
@@ -75,8 +100,9 @@ export interface CacheInvalidationFilterContext {
|
|
|
75
100
|
* see the class docblock below.
|
|
76
101
|
*
|
|
77
102
|
* `GetUserPermisions` is an in-memory match of the entity's permission rows against the user's
|
|
78
|
-
* roles,
|
|
79
|
-
*
|
|
103
|
+
* roles, memoized per `(payload, entityName, roleFingerprint)` by the active
|
|
104
|
+
* {@link BaseCacheInvalidationBroadcastProvider} so $N$ connected subscribers sharing $R$ role
|
|
105
|
+
* combinations only run `GetUserPermisions` $R$ times per event.
|
|
80
106
|
*/
|
|
81
107
|
export declare function CacheInvalidationFilter(data: {
|
|
82
108
|
payload: CacheInvalidationPayload;
|
|
@@ -112,6 +138,9 @@ export declare function ReadIsRowFiltered(entity: {
|
|
|
112
138
|
* The event as one subscriber may see it. A subscriber whose read of the entity is row-filtered gets the entity, the action and
|
|
113
139
|
* the time, and neither the key nor the row: "something in this entity changed", which the client already takes as a
|
|
114
140
|
* whole-entity invalidation (a null key on `remote-invalidate`). Everyone else gets the event as published.
|
|
141
|
+
*
|
|
142
|
+
* Memoized per `(payload, entity, roleFingerprint)` via the active broadcast provider so $N$ subscribers
|
|
143
|
+
* sharing $R$ role buckets only allocate and evaluate `ReadIsRowFiltered` $R$ times per event.
|
|
115
144
|
*/
|
|
116
145
|
export declare function ShapeCacheInvalidationEvent(payload: CacheInvalidationPayload, user: RoleHolder | undefined, entity: {
|
|
117
146
|
Permissions: ReadonlyArray<ReadPermissionRow>;
|
|
@@ -126,32 +155,23 @@ export declare class CacheInvalidationResolver {
|
|
|
126
155
|
* Subscription that broadcasts cache invalidation events to connected clients, so cross-server
|
|
127
156
|
* cache invalidation reaches browsers.
|
|
128
157
|
*
|
|
129
|
-
* Delivery is filtered
|
|
130
|
-
*
|
|
131
|
-
* other session and tenant.
|
|
132
|
-
*
|
|
133
|
-
* Because that narrowing stops well short of row level, `RecordData` is only populated for entities a
|
|
134
|
-
* deployment has opted in through `cacheSettings.recordDataBroadcastEntities` — see
|
|
135
|
-
* {@link MayBroadcastRecordData}, applied at both publish sites.
|
|
136
|
-
*
|
|
137
|
-
* `EntityName`, `PrimaryKeyValues`, `Action` and `Timestamp` ARE still broadcast to every
|
|
138
|
-
* session, and that is a disclosure, not a safe residue. An earlier version of this comment
|
|
139
|
-
* called them "safe to broadcast" on the grounds that reading the record still goes through
|
|
140
|
-
* the access-controlled path — true of the row's CONTENTS, and beside the point for the
|
|
141
|
-
* metadata itself. A session with no relationship to a record still learns that it exists,
|
|
142
|
-
* its stable key, and every time it changes; across entities it learns the cadence and volume
|
|
143
|
-
* of another tenant's activity.
|
|
144
|
-
*
|
|
145
|
-
* The key is kept for a subscriber who could read the row anyway, because consumers need it to
|
|
146
|
-
* re-read the record they were told about (see `ResolveEntityEventKey` in @memberjunction/core),
|
|
147
|
-
* and the coarse "something in this entity changed" forces whole-entity invalidation on the
|
|
148
|
-
* hottest write paths. It is withheld, with the row, from a subscriber whose every read of the
|
|
149
|
-
* entity goes through a row-level security filter ({@link ReadIsRowFiltered}): a filter the
|
|
150
|
-
* subscription cannot evaluate per event stands between them and the row, so they learn only
|
|
151
|
-
* that a row of the entity changed, and their caches refresh the entity as a whole. That is the
|
|
152
|
-
* same in-memory role match as the entity-level filter, once more per subscriber per event.
|
|
158
|
+
* Delivery is filtered by ENTITY-level read permission (see {@link CacheInvalidationFilter})
|
|
159
|
+
* and shaped per role-fingerprint bucket (see {@link ShapeCacheInvalidationEvent}).
|
|
153
160
|
*/
|
|
154
161
|
cacheInvalidation(// case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
155
162
|
payload: CacheInvalidationPayload, context: CacheInvalidationFilterContext | undefined): CacheInvalidationNotification;
|
|
163
|
+
/**
|
|
164
|
+
* Returns all permission-allowed, RLS-shaped cache invalidation events strictly after
|
|
165
|
+
* `sinceSequence` from the server's bounded circular ring buffer.
|
|
166
|
+
*
|
|
167
|
+
* Invoked by `GraphQLDataProvider` when an HTTP response's `X-MJ-Cache-Seq` header or a
|
|
168
|
+
* WebSocket reconnect reveals missed invalidation sequence numbers.
|
|
169
|
+
*/
|
|
170
|
+
GetCacheInvalidationsSince(sinceSequence: number, context: CacheInvalidationFilterContext | undefined): CacheInvalidationCatchUpResult;
|
|
171
|
+
/**
|
|
172
|
+
* Negotiates a client broadcast connection (URL, signed token, and authorized role-bucket groups)
|
|
173
|
+
* for the active {@link BaseCacheInvalidationBroadcastProvider}.
|
|
174
|
+
*/
|
|
175
|
+
NegotiateCacheBroadcastConnection(context: CacheInvalidationFilterContext | undefined): Promise<CacheBroadcastConnectionToken>;
|
|
156
176
|
}
|
|
157
177
|
//# sourceMappingURL=CacheInvalidationResolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheInvalidationResolver.d.ts","sourceRoot":"","sources":["../../src/generic/CacheInvalidationResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CacheInvalidationResolver.d.ts","sourceRoot":"","sources":["../../src/generic/CacheInvalidationResolver.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
|
|
14
|
-
import {
|
|
13
|
+
import 'reflect-metadata';
|
|
14
|
+
import { Arg, Ctx, Field, Int, ObjectType, Query, Resolver, Root, Subscription } from 'type-graphql';
|
|
15
|
+
import { Metadata, RecordChangeFieldSecurityProjector, RecordChangesEntityName } from '@memberjunction/core';
|
|
16
|
+
import { CacheInvalidationBroadcastManager, } from '../broadcast/index.js';
|
|
15
17
|
export const CACHE_INVALIDATION_TOPIC = 'CACHE_INVALIDATION';
|
|
16
18
|
/**
|
|
17
19
|
* Entities whose rows may ride along with an invalidation event. Empty until the server entry point
|
|
@@ -44,23 +46,57 @@ export function ConfigureRecordDataBroadcast(entities) {
|
|
|
44
46
|
*
|
|
45
47
|
* The subscription below is filtered only by ENTITY-level read permission, so anything included
|
|
46
48
|
* here is disclosed to every signed-in session that may read the entity at all — regardless of
|
|
47
|
-
* row-level security or any tenant scoping a consumer applies on the read
|
|
48
|
-
* this push traverses. The answer is therefore NO unless a deployment has
|
|
49
|
-
* entity in via `cacheSettings.recordDataBroadcastEntities
|
|
49
|
+
* row-level security, field-level security, or any tenant scoping a consumer applies on the read
|
|
50
|
+
* path, none of which this push traverses. The answer is therefore NO unless a deployment has
|
|
51
|
+
* explicitly opted the entity in via `cacheSettings.recordDataBroadcastEntities`, and always NO
|
|
52
|
+
* for an entity under field-level security (its own flag or an IS-A ancestor's), and for
|
|
53
|
+
* `MJ: Record Changes`, whatever the allowlist says: the row would carry columns (or, for Record
|
|
54
|
+
* Changes, other entities' values) some of those sessions may not read.
|
|
50
55
|
*
|
|
51
56
|
* Callers that get `false` simply omit `recordData`; the event still carries the entity name and
|
|
52
57
|
* primary key, so clients evict and re-fetch through the normal access-controlled read path.
|
|
53
58
|
*
|
|
54
59
|
* Matching is exact (trimmed, case-insensitive) rather than substring: a loose match would let an
|
|
55
60
|
* allowlisted name drag in every entity whose name contains it.
|
|
61
|
+
*
|
|
62
|
+
* @param entityInfo The entity's metadata, when the caller holds it. Otherwise it is looked up by
|
|
63
|
+
* name, so the field-security refusal applies either way.
|
|
56
64
|
*/
|
|
57
|
-
export function MayBroadcastRecordData(entityName) {
|
|
65
|
+
export function MayBroadcastRecordData(entityName, entityInfo) {
|
|
58
66
|
if (allowedRecordDataEntities.length === 0)
|
|
59
67
|
return false;
|
|
68
|
+
if (fieldSecurityApplies(entityName, entityInfo))
|
|
69
|
+
return false;
|
|
70
|
+
if (isRecordChanges(entityName, entityInfo))
|
|
71
|
+
return false;
|
|
60
72
|
if (allowedRecordDataEntities.includes('*'))
|
|
61
73
|
return true;
|
|
62
74
|
return allowedRecordDataEntities.includes(entityName.trim().toLowerCase());
|
|
63
75
|
}
|
|
76
|
+
/** Whether field-level security applies to the entity, resolving it by name when not supplied. */
|
|
77
|
+
function fieldSecurityApplies(entityName, entityInfo) {
|
|
78
|
+
const info = entityInfo ?? lookUpEntity(entityName);
|
|
79
|
+
return Boolean(info?.FieldLevelSecurityApplies);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Whether the entity is the Record Changes audit trail. Its rows carry other entities' values in
|
|
83
|
+
* `ChangesJSON` and `FullRecordJSON`, which are projected per reader, so a row is never broadcast
|
|
84
|
+
* even though field-level security is not switched on for the audit entity itself.
|
|
85
|
+
*/
|
|
86
|
+
function isRecordChanges(entityName, entityInfo) {
|
|
87
|
+
if (entityInfo)
|
|
88
|
+
return RecordChangeFieldSecurityProjector.IsRecordChangesEntity(entityInfo);
|
|
89
|
+
return entityName.trim().toLowerCase() === RecordChangesEntityName.toLowerCase();
|
|
90
|
+
}
|
|
91
|
+
/** The entity by name from the process's metadata, or undefined when none is loaded. */
|
|
92
|
+
function lookUpEntity(entityName) {
|
|
93
|
+
try {
|
|
94
|
+
return new Metadata().EntityByName(entityName) ?? undefined; // global-provider-ok: metadata lookup for a process-wide broadcast gate
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
64
100
|
let CacheInvalidationNotification = class CacheInvalidationNotification {
|
|
65
101
|
};
|
|
66
102
|
__decorate([
|
|
@@ -91,10 +127,70 @@ __decorate([
|
|
|
91
127
|
Field(() => String, { nullable: true }),
|
|
92
128
|
__metadata("design:type", String)
|
|
93
129
|
], CacheInvalidationNotification.prototype, "RecordData", void 0);
|
|
130
|
+
__decorate([
|
|
131
|
+
Field(() => Int, { nullable: true }),
|
|
132
|
+
__metadata("design:type", Number)
|
|
133
|
+
], CacheInvalidationNotification.prototype, "Sequence", void 0);
|
|
94
134
|
CacheInvalidationNotification = __decorate([
|
|
95
135
|
ObjectType()
|
|
96
136
|
], CacheInvalidationNotification);
|
|
97
137
|
export { CacheInvalidationNotification };
|
|
138
|
+
let CacheInvalidationCatchUpResult = class CacheInvalidationCatchUpResult {
|
|
139
|
+
};
|
|
140
|
+
__decorate([
|
|
141
|
+
Field(() => Boolean),
|
|
142
|
+
__metadata("design:type", Boolean)
|
|
143
|
+
], CacheInvalidationCatchUpResult.prototype, "RequiresFullRefresh", void 0);
|
|
144
|
+
__decorate([
|
|
145
|
+
Field(() => Int),
|
|
146
|
+
__metadata("design:type", Number)
|
|
147
|
+
], CacheInvalidationCatchUpResult.prototype, "CurrentSequence", void 0);
|
|
148
|
+
__decorate([
|
|
149
|
+
Field(() => String),
|
|
150
|
+
__metadata("design:type", String)
|
|
151
|
+
], CacheInvalidationCatchUpResult.prototype, "ServerProcessID", void 0);
|
|
152
|
+
__decorate([
|
|
153
|
+
Field(() => [CacheInvalidationNotification]),
|
|
154
|
+
__metadata("design:type", Array)
|
|
155
|
+
], CacheInvalidationCatchUpResult.prototype, "Events", void 0);
|
|
156
|
+
CacheInvalidationCatchUpResult = __decorate([
|
|
157
|
+
ObjectType()
|
|
158
|
+
], CacheInvalidationCatchUpResult);
|
|
159
|
+
export { CacheInvalidationCatchUpResult };
|
|
160
|
+
let CacheBroadcastConnectionToken = class CacheBroadcastConnectionToken {
|
|
161
|
+
};
|
|
162
|
+
__decorate([
|
|
163
|
+
Field(() => String),
|
|
164
|
+
__metadata("design:type", String)
|
|
165
|
+
], CacheBroadcastConnectionToken.prototype, "Provider", void 0);
|
|
166
|
+
__decorate([
|
|
167
|
+
Field(() => String),
|
|
168
|
+
__metadata("design:type", String)
|
|
169
|
+
], CacheBroadcastConnectionToken.prototype, "Url", void 0);
|
|
170
|
+
__decorate([
|
|
171
|
+
Field(() => String, { nullable: true }),
|
|
172
|
+
__metadata("design:type", String)
|
|
173
|
+
], CacheBroadcastConnectionToken.prototype, "Token", void 0);
|
|
174
|
+
__decorate([
|
|
175
|
+
Field(() => [String]),
|
|
176
|
+
__metadata("design:type", Array)
|
|
177
|
+
], CacheBroadcastConnectionToken.prototype, "Groups", void 0);
|
|
178
|
+
__decorate([
|
|
179
|
+
Field(() => String),
|
|
180
|
+
__metadata("design:type", String)
|
|
181
|
+
], CacheBroadcastConnectionToken.prototype, "ExpiresAt", void 0);
|
|
182
|
+
__decorate([
|
|
183
|
+
Field(() => String),
|
|
184
|
+
__metadata("design:type", String)
|
|
185
|
+
], CacheBroadcastConnectionToken.prototype, "ServerProcessID", void 0);
|
|
186
|
+
__decorate([
|
|
187
|
+
Field(() => Int),
|
|
188
|
+
__metadata("design:type", Number)
|
|
189
|
+
], CacheBroadcastConnectionToken.prototype, "CurrentSequence", void 0);
|
|
190
|
+
CacheBroadcastConnectionToken = __decorate([
|
|
191
|
+
ObjectType()
|
|
192
|
+
], CacheBroadcastConnectionToken);
|
|
193
|
+
export { CacheBroadcastConnectionToken };
|
|
98
194
|
/**
|
|
99
195
|
* Should this subscriber hear about this event at all?
|
|
100
196
|
*
|
|
@@ -109,33 +205,17 @@ export { CacheInvalidationNotification };
|
|
|
109
205
|
* see the class docblock below.
|
|
110
206
|
*
|
|
111
207
|
* `GetUserPermisions` is an in-memory match of the entity's permission rows against the user's
|
|
112
|
-
* roles,
|
|
113
|
-
*
|
|
208
|
+
* roles, memoized per `(payload, entityName, roleFingerprint)` by the active
|
|
209
|
+
* {@link BaseCacheInvalidationBroadcastProvider} so $N$ connected subscribers sharing $R$ role
|
|
210
|
+
* combinations only run `GetUserPermisions` $R$ times per event.
|
|
114
211
|
*/
|
|
115
212
|
export function CacheInvalidationFilter(data) {
|
|
116
213
|
const user = data.context?.userPayload?.userRecord;
|
|
117
|
-
// FAIL CLOSED on identity, matching `statusUpdatesFilter`. `onConnect` rejects a socket whose
|
|
118
|
-
// token does not validate, so a subscriber with no user record should not exist; if one does,
|
|
119
|
-
// it is the case least deserving of an unfiltered firehose.
|
|
120
214
|
if (!user) {
|
|
121
215
|
return false;
|
|
122
216
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
// A pub/sub subscription filter has no per-request provider to thread: it runs on the server's
|
|
128
|
-
// own metadata, which is the one place the entity's permission rows can be answered from.
|
|
129
|
-
const entity = new Metadata().EntityByName(entityName); // global-provider-ok: subscription filter — server-wide metadata, no request-scoped provider exists here
|
|
130
|
-
// DELIVER when the entity is unknown here, deliberately — the opposite of the choice above.
|
|
131
|
-
// A name absent from metadata cannot be permission-checked, and withholding would silently
|
|
132
|
-
// stop invalidating a legitimately cacheable entity, which is a correctness bug rather than a
|
|
133
|
-
// disclosure one. All it discloses is the name and key of something this server cannot
|
|
134
|
-
// describe.
|
|
135
|
-
if (!entity) {
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
|
-
return entity.GetUserPermisions(user).CanRead;
|
|
217
|
+
return CacheInvalidationBroadcastManager.Instance.Provider.EvaluateEntityReadAccess(data.payload, user, (entityName) => new Metadata().EntityByName(entityName) // global-provider-ok: subscription filter — server-wide metadata, no request-scoped provider exists here
|
|
218
|
+
);
|
|
139
219
|
}
|
|
140
220
|
/**
|
|
141
221
|
* Is this user's read of the entity row-filtered? True when every read the user holds on the entity comes through a permission
|
|
@@ -147,38 +227,18 @@ export function CacheInvalidationFilter(data) {
|
|
|
147
227
|
* The same in-memory match `GetUserPermisions` does, with no I/O, so it can run per subscriber per event.
|
|
148
228
|
*/
|
|
149
229
|
export function ReadIsRowFiltered(entity, user) {
|
|
150
|
-
|
|
151
|
-
let filteredReads = 0;
|
|
152
|
-
for (const row of entity.Permissions) {
|
|
153
|
-
if (!row.CanRead)
|
|
154
|
-
continue;
|
|
155
|
-
const isDeny = row.IsDeny ?? (row.Type ?? 'Allow').trim().toLowerCase() === 'deny';
|
|
156
|
-
if (isDeny)
|
|
157
|
-
continue;
|
|
158
|
-
if (!roles.has((row.RoleID ?? '').trim().toLowerCase()))
|
|
159
|
-
continue;
|
|
160
|
-
if (!row.ReadRLSFilterID)
|
|
161
|
-
return false;
|
|
162
|
-
filteredReads += 1;
|
|
163
|
-
}
|
|
164
|
-
return filteredReads > 0;
|
|
230
|
+
return CacheInvalidationBroadcastManager.Instance.Provider.ReadIsRowFiltered(entity, user);
|
|
165
231
|
}
|
|
166
232
|
/**
|
|
167
233
|
* The event as one subscriber may see it. A subscriber whose read of the entity is row-filtered gets the entity, the action and
|
|
168
234
|
* the time, and neither the key nor the row: "something in this entity changed", which the client already takes as a
|
|
169
235
|
* whole-entity invalidation (a null key on `remote-invalidate`). Everyone else gets the event as published.
|
|
236
|
+
*
|
|
237
|
+
* Memoized per `(payload, entity, roleFingerprint)` via the active broadcast provider so $N$ subscribers
|
|
238
|
+
* sharing $R$ role buckets only allocate and evaluate `ReadIsRowFiltered` $R$ times per event.
|
|
170
239
|
*/
|
|
171
240
|
export function ShapeCacheInvalidationEvent(payload, user, entity) {
|
|
172
|
-
|
|
173
|
-
return {
|
|
174
|
-
EntityName: payload.entityName,
|
|
175
|
-
PrimaryKeyValues: withholdKey ? undefined : (payload.primaryKeyValues ?? undefined),
|
|
176
|
-
Action: payload.action,
|
|
177
|
-
SourceServerID: payload.sourceServerId,
|
|
178
|
-
Timestamp: payload.timestamp,
|
|
179
|
-
OriginSessionID: payload.originSessionId ?? undefined,
|
|
180
|
-
RecordData: withholdKey ? undefined : (payload.recordData ?? undefined),
|
|
181
|
-
};
|
|
241
|
+
return CacheInvalidationBroadcastManager.Instance.Provider.ShapeEventForSubscriber(payload, user, entity);
|
|
182
242
|
}
|
|
183
243
|
/** @deprecated Use {@link CacheInvalidationFilter}. */
|
|
184
244
|
export function cacheInvalidationFilter(data) {
|
|
@@ -189,36 +249,36 @@ let CacheInvalidationResolver = class CacheInvalidationResolver {
|
|
|
189
249
|
* Subscription that broadcasts cache invalidation events to connected clients, so cross-server
|
|
190
250
|
* cache invalidation reaches browsers.
|
|
191
251
|
*
|
|
192
|
-
* Delivery is filtered
|
|
193
|
-
*
|
|
194
|
-
* other session and tenant.
|
|
195
|
-
*
|
|
196
|
-
* Because that narrowing stops well short of row level, `RecordData` is only populated for entities a
|
|
197
|
-
* deployment has opted in through `cacheSettings.recordDataBroadcastEntities` — see
|
|
198
|
-
* {@link MayBroadcastRecordData}, applied at both publish sites.
|
|
199
|
-
*
|
|
200
|
-
* `EntityName`, `PrimaryKeyValues`, `Action` and `Timestamp` ARE still broadcast to every
|
|
201
|
-
* session, and that is a disclosure, not a safe residue. An earlier version of this comment
|
|
202
|
-
* called them "safe to broadcast" on the grounds that reading the record still goes through
|
|
203
|
-
* the access-controlled path — true of the row's CONTENTS, and beside the point for the
|
|
204
|
-
* metadata itself. A session with no relationship to a record still learns that it exists,
|
|
205
|
-
* its stable key, and every time it changes; across entities it learns the cadence and volume
|
|
206
|
-
* of another tenant's activity.
|
|
207
|
-
*
|
|
208
|
-
* The key is kept for a subscriber who could read the row anyway, because consumers need it to
|
|
209
|
-
* re-read the record they were told about (see `ResolveEntityEventKey` in @memberjunction/core),
|
|
210
|
-
* and the coarse "something in this entity changed" forces whole-entity invalidation on the
|
|
211
|
-
* hottest write paths. It is withheld, with the row, from a subscriber whose every read of the
|
|
212
|
-
* entity goes through a row-level security filter ({@link ReadIsRowFiltered}): a filter the
|
|
213
|
-
* subscription cannot evaluate per event stands between them and the row, so they learn only
|
|
214
|
-
* that a row of the entity changed, and their caches refresh the entity as a whole. That is the
|
|
215
|
-
* same in-memory role match as the entity-level filter, once more per subscriber per event.
|
|
252
|
+
* Delivery is filtered by ENTITY-level read permission (see {@link CacheInvalidationFilter})
|
|
253
|
+
* and shaped per role-fingerprint bucket (see {@link ShapeCacheInvalidationEvent}).
|
|
216
254
|
*/
|
|
217
255
|
cacheInvalidation(payload, context) {
|
|
218
256
|
const user = context?.userPayload?.userRecord;
|
|
219
|
-
|
|
220
|
-
const entity = payload?.entityName ?
|
|
221
|
-
return
|
|
257
|
+
const provider = CacheInvalidationBroadcastManager.Instance.Provider;
|
|
258
|
+
const entity = payload?.entityName ? provider.ResolveEntityForPayload(payload) : null;
|
|
259
|
+
return provider.ShapeEventForSubscriber(payload, user, entity);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Returns all permission-allowed, RLS-shaped cache invalidation events strictly after
|
|
263
|
+
* `sinceSequence` from the server's bounded circular ring buffer.
|
|
264
|
+
*
|
|
265
|
+
* Invoked by `GraphQLDataProvider` when an HTTP response's `X-MJ-Cache-Seq` header or a
|
|
266
|
+
* WebSocket reconnect reveals missed invalidation sequence numbers.
|
|
267
|
+
*/
|
|
268
|
+
GetCacheInvalidationsSince(sinceSequence, context) {
|
|
269
|
+
const user = context?.userPayload?.userRecord;
|
|
270
|
+
return CacheInvalidationBroadcastManager.Instance.Provider.GetChangesSince(sinceSequence, user);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Negotiates a client broadcast connection (URL, signed token, and authorized role-bucket groups)
|
|
274
|
+
* for the active {@link BaseCacheInvalidationBroadcastProvider}.
|
|
275
|
+
*/
|
|
276
|
+
async NegotiateCacheBroadcastConnection(context) {
|
|
277
|
+
const user = context?.userPayload?.userRecord;
|
|
278
|
+
if (!user) {
|
|
279
|
+
throw new Error('Authentication required to negotiate cache broadcast connection.');
|
|
280
|
+
}
|
|
281
|
+
return CacheInvalidationBroadcastManager.Instance.Provider.NegotiateClientConnection(user);
|
|
222
282
|
}
|
|
223
283
|
};
|
|
224
284
|
__decorate([
|
|
@@ -232,6 +292,21 @@ __decorate([
|
|
|
232
292
|
__metadata("design:paramtypes", [Object, Object]),
|
|
233
293
|
__metadata("design:returntype", CacheInvalidationNotification)
|
|
234
294
|
], CacheInvalidationResolver.prototype, "cacheInvalidation", null);
|
|
295
|
+
__decorate([
|
|
296
|
+
Query(() => CacheInvalidationCatchUpResult),
|
|
297
|
+
__param(0, Arg('sinceSequence', () => Int)),
|
|
298
|
+
__param(1, Ctx()),
|
|
299
|
+
__metadata("design:type", Function),
|
|
300
|
+
__metadata("design:paramtypes", [Number, Object]),
|
|
301
|
+
__metadata("design:returntype", CacheInvalidationCatchUpResult)
|
|
302
|
+
], CacheInvalidationResolver.prototype, "GetCacheInvalidationsSince", null);
|
|
303
|
+
__decorate([
|
|
304
|
+
Query(() => CacheBroadcastConnectionToken),
|
|
305
|
+
__param(0, Ctx()),
|
|
306
|
+
__metadata("design:type", Function),
|
|
307
|
+
__metadata("design:paramtypes", [Object]),
|
|
308
|
+
__metadata("design:returntype", Promise)
|
|
309
|
+
], CacheInvalidationResolver.prototype, "NegotiateCacheBroadcastConnection", null);
|
|
235
310
|
CacheInvalidationResolver = __decorate([
|
|
236
311
|
Resolver()
|
|
237
312
|
], CacheInvalidationResolver);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheInvalidationResolver.js","sourceRoot":"","sources":["../../src/generic/CacheInvalidationResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"CacheInvalidationResolver.js","sourceRoot":"","sources":["../../src/generic/CacheInvalidationResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrphanedConversationDetailReconciler.d.ts","sourceRoot":"","sources":["../../src/generic/OrphanedConversationDetailReconciler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGxE;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAgB,CAAC;AAiBpD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,oCAAoC,CACtD,QAAQ,EAAE,iBAAiB,EAC3B,WAAW,EAAE,QAAQ,EACrB,OAAO,GAAE,MAA+B,GACzC,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"OrphanedConversationDetailReconciler.d.ts","sourceRoot":"","sources":["../../src/generic/OrphanedConversationDetailReconciler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGxE;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAgB,CAAC;AAiBpD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,oCAAoC,CACtD,QAAQ,EAAE,iBAAiB,EAC3B,WAAW,EAAE,QAAQ,EACrB,OAAO,GAAE,MAA+B,GACzC,OAAO,CAAC,MAAM,CAAC,CAoGjB"}
|
|
@@ -87,6 +87,8 @@ export async function ReconcileOrphanedConversationDetails(provider, contextUser
|
|
|
87
87
|
continue;
|
|
88
88
|
}
|
|
89
89
|
const writable = await provider.GetEntityObject('MJ: Conversation Details', owner);
|
|
90
|
+
// Closing an agent's reply is the server's write: unmarked, the gate refuses any change to what a reply says.
|
|
91
|
+
writable.MarkServerAuthoredReply();
|
|
90
92
|
if (!(await writable.Load(detail.ID))) {
|
|
91
93
|
LogError(`[OrphanDetailReconciler] Could not load detail ${detail.ID} for write`);
|
|
92
94
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrphanedConversationDetailReconciler.js","sourceRoot":"","sources":["../../src/generic/OrphanedConversationDetailReconciler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"OrphanedConversationDetailReconciler.js","sourceRoot":"","sources":["../../src/generic/OrphanedConversationDetailReconciler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { PubSubEngine } from 'type-graphql';
|
|
2
2
|
import { BaseSingleton } from '@memberjunction/global';
|
|
3
|
+
/**
|
|
4
|
+
* Wraps a TypeGraphQL `PubSubEngine` so that publishes to {@link PUSH_STATUS_UPDATES_TOPIC}
|
|
5
|
+
* carrying a specific `sessionId` (`sessionId !== '*'`) are dynamically routed in $O(1)$ to
|
|
6
|
+
* `PUSH_STATUS_UPDATES:session:<sessionId>` instead of waking every connected browser tab.
|
|
7
|
+
* Wildcard (`sessionId === '*'`) updates continue to publish on {@link PUSH_STATUS_UPDATES_TOPIC}.
|
|
8
|
+
*/
|
|
9
|
+
export declare function CreateSessionRoutingPubSub(pubSub: PubSubEngine): PubSubEngine;
|
|
3
10
|
/**
|
|
4
11
|
* Singleton manager that holds a reference to the type-graphql PubSubEngine,
|
|
5
12
|
* allowing any server-side code (not just resolvers with @PubSub() injection)
|
|
@@ -12,6 +19,7 @@ export declare class PubSubManager extends BaseSingleton<PubSubManager> {
|
|
|
12
19
|
/**
|
|
13
20
|
* Sets the PubSubEngine instance. Should be called once during server startup
|
|
14
21
|
* after buildSchemaSync creates the PubSub instance.
|
|
22
|
+
* Automatically installs $O(1)$ dynamic session routing for `PUSH_STATUS_UPDATES`.
|
|
15
23
|
*/
|
|
16
24
|
SetPubSubEngine(pubSub: PubSubEngine): void;
|
|
17
25
|
/**
|
|
@@ -20,6 +28,8 @@ export declare class PubSubManager extends BaseSingleton<PubSubManager> {
|
|
|
20
28
|
get PubSubEngine(): PubSubEngine | null;
|
|
21
29
|
/**
|
|
22
30
|
* Publishes a payload to the specified topic via the PubSubEngine.
|
|
31
|
+
* For `CACHE_INVALIDATION`, automatically stamps a monotonic sequence number and
|
|
32
|
+
* records the event in the active {@link BaseCacheInvalidationBroadcastProvider}'s ring buffer.
|
|
23
33
|
* No-op if the PubSubEngine has not been configured yet.
|
|
24
34
|
*/
|
|
25
35
|
Publish(topic: string, payload: Record<string, unknown>): void;
|
|
@@ -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"}
|