@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
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AggregateExpression, CompositeKey, DatabaseProviderBase, UserInfo } from '@memberjunction/core';
|
|
1
|
+
import { AggregateExpression, CompositeKey, DatabaseProviderBase, UserInfo, ViewPropertyValues } from '@memberjunction/core';
|
|
2
2
|
import { MJUserViewEntityExtended } from '@memberjunction/core-entities';
|
|
3
3
|
import { GraphQLSchema } from 'graphql';
|
|
4
4
|
import sql from 'mssql';
|
|
@@ -29,6 +29,18 @@ export type UserPayload = {
|
|
|
29
29
|
* redemption; do not treat `undefined` as `false`.
|
|
30
30
|
*/
|
|
31
31
|
emailVerified?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Set only on a payload elevated by `ElevateUserPayload`: the principal the elevated user stands in for (a public
|
|
34
|
+
* widget guest). The run's own records are written as `userRecord`, but the guest's conversation is written as
|
|
35
|
+
* this user, because only a conversation's owner (or a grantee) may write its messages (MJ#4791).
|
|
36
|
+
*/
|
|
37
|
+
ElevatedFrom?: UserInfo;
|
|
38
|
+
/**
|
|
39
|
+
* The caller's IANA time zone, from the request's `x-mj-timezone` header, when it names a zone
|
|
40
|
+
* this runtime knows. Undefined when the header is absent or invalid; callers then use UTC. The
|
|
41
|
+
* view and query resolvers pass it on as `RunViewParams.TimeZone` / `RunQueryParams.TimeZone`.
|
|
42
|
+
*/
|
|
43
|
+
TimeZone?: string;
|
|
32
44
|
};
|
|
33
45
|
/**
|
|
34
46
|
* AppContext is the context object that is passed to all resolvers.
|
|
@@ -121,6 +133,16 @@ export type RunViewGenericParams = {
|
|
|
121
133
|
* Propagated to `RunViewParams.IncludeBinaryFields`.
|
|
122
134
|
*/
|
|
123
135
|
includeBinaryFields?: boolean;
|
|
136
|
+
/**
|
|
137
|
+
* Optional registered Alternate Base View logical Name (from `EntityAlternateBaseView.Name`)
|
|
138
|
+
* for this entity. Propagated to `RunViewParams.AlternateBaseView`.
|
|
139
|
+
*/
|
|
140
|
+
alternateBaseView?: string;
|
|
141
|
+
/**
|
|
142
|
+
* The client's values for a stored view's properties. Propagated to `RunViewParams.Properties`.
|
|
143
|
+
* There is deliberately no server-properties field: those are set only by server code.
|
|
144
|
+
*/
|
|
145
|
+
properties?: ViewPropertyValues;
|
|
124
146
|
};
|
|
125
147
|
export declare class MJServerEvent {
|
|
126
148
|
type: 'setupComplete' | 'requestReceived' | 'requestCompleted' | 'requestFailed';
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAwExE,MAAM,OAAO,YAAY;CAGxB;AAED,MAAM,OAAO,cAAc;IASzB,YAAY,IAA4J;QACtK,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAAA,CAAC;AA6DF,MAAM,OAAO,aAAa;CAKzB;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAA2B,EAAE,WAA6B,EAAE,WAAwB,EAAE,SAAe;IACpI,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;IAClC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,KAAK,CAAC,UAAU,GAAG,MAAM,aAAa,EAAE,CAAC;IAEzC,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;IAC1B,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;IACjB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,cAAc,CAAC;IACvC,GAAG,CAAC,SAAS,GAAG,oBAAoB,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAA2B,EAAE,WAA6B,EAAE,WAAwB,EAAE,SAAe;IACpI,OAAO,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAC/D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/server",
|
|
3
|
-
"version": "6.2.0-edge.
|
|
3
|
+
"version": "6.2.0-edge.6",
|
|
4
4
|
"description": "MemberJunction: This project provides API access via GraphQL to the common data store.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./src/index.ts",
|
|
@@ -19,101 +19,101 @@
|
|
|
19
19
|
"@as-integrations/express5": "^1.0.0",
|
|
20
20
|
"@graphql-tools/schema": "^10.0.38",
|
|
21
21
|
"@graphql-tools/utils": "^11.0.0",
|
|
22
|
-
"@memberjunction/actions": "6.2.0-edge.
|
|
23
|
-
"@memberjunction/actions-apollo": "6.2.0-edge.
|
|
24
|
-
"@memberjunction/actions-base": "6.2.0-edge.
|
|
25
|
-
"@memberjunction/actions-bizapps-accounting": "6.2.0-edge.
|
|
26
|
-
"@memberjunction/actions-bizapps-crm": "6.2.0-edge.
|
|
27
|
-
"@memberjunction/actions-bizapps-formbuilders": "6.2.0-edge.
|
|
28
|
-
"@memberjunction/actions-bizapps-lms": "6.2.0-edge.
|
|
29
|
-
"@memberjunction/actions-bizapps-social": "6.2.0-edge.
|
|
30
|
-
"@memberjunction/actions-peopledatalabs": "6.2.0-edge.
|
|
31
|
-
"@memberjunction/ai": "6.2.0-edge.
|
|
32
|
-
"@memberjunction/ai-agent-manager": "6.2.0-edge.
|
|
33
|
-
"@memberjunction/ai-agent-manager-actions": "6.2.0-edge.
|
|
34
|
-
"@memberjunction/ai-agents": "6.2.0-edge.
|
|
35
|
-
"@memberjunction/ai-bridge-base": "6.2.0-edge.
|
|
36
|
-
"@memberjunction/ai-bridge-ringcentral": "6.2.0-edge.
|
|
37
|
-
"@memberjunction/ai-bridge-server": "6.2.0-edge.
|
|
38
|
-
"@memberjunction/ai-bridge-teams": "6.2.0-edge.
|
|
39
|
-
"@memberjunction/ai-bridge-twilio": "6.2.0-edge.
|
|
40
|
-
"@memberjunction/ai-bridge-vonage": "6.2.0-edge.
|
|
41
|
-
"@memberjunction/ai-core-plus": "6.2.0-edge.
|
|
42
|
-
"@memberjunction/ai-engine-base": "6.2.0-edge.
|
|
43
|
-
"@memberjunction/ai-mcp-client": "6.2.0-edge.
|
|
44
|
-
"@memberjunction/ai-prompts": "6.2.0-edge.
|
|
45
|
-
"@memberjunction/ai-provider-bundle": "6.2.0-edge.
|
|
46
|
-
"@memberjunction/ai-vector-dupe": "6.2.0-edge.
|
|
47
|
-
"@memberjunction/ai-vector-sync": "6.2.0-edge.
|
|
48
|
-
"@memberjunction/ai-vectordb": "6.2.0-edge.
|
|
49
|
-
"@memberjunction/ai-vectors-pinecone": "6.2.0-edge.
|
|
50
|
-
"@memberjunction/aiengine": "6.2.0-edge.
|
|
51
|
-
"@memberjunction/api-keys": "6.2.0-edge.
|
|
52
|
-
"@memberjunction/auth-providers": "6.2.0-edge.
|
|
53
|
-
"@memberjunction/clustering-engine": "6.2.0-edge.
|
|
54
|
-
"@memberjunction/codegen-lib": "6.2.0-edge.
|
|
55
|
-
"@memberjunction/communication-engine": "6.2.0-edge.
|
|
56
|
-
"@memberjunction/communication-ms-graph": "6.2.0-edge.
|
|
57
|
-
"@memberjunction/communication-sendgrid": "6.2.0-edge.
|
|
58
|
-
"@memberjunction/communication-types": "6.2.0-edge.
|
|
59
|
-
"@memberjunction/component-registry-client-sdk": "6.2.0-edge.
|
|
60
|
-
"@memberjunction/computer-use": "6.2.0-edge.
|
|
61
|
-
"@memberjunction/computer-use-engine": "6.2.0-edge.
|
|
62
|
-
"@memberjunction/config": "6.2.0-edge.
|
|
63
|
-
"@memberjunction/core": "6.2.0-edge.
|
|
64
|
-
"@memberjunction/core-actions": "6.2.0-edge.
|
|
65
|
-
"@memberjunction/core-entities": "6.2.0-edge.
|
|
66
|
-
"@memberjunction/core-entities-server": "6.2.0-edge.
|
|
67
|
-
"@memberjunction/credentials": "6.2.0-edge.
|
|
68
|
-
"@memberjunction/data-context": "6.2.0-edge.
|
|
69
|
-
"@memberjunction/data-context-server": "6.2.0-edge.
|
|
70
|
-
"@memberjunction/doc-utils": "6.2.0-edge.
|
|
71
|
-
"@memberjunction/encryption": "6.2.0-edge.
|
|
72
|
-
"@memberjunction/entity-communications-base": "6.2.0-edge.
|
|
73
|
-
"@memberjunction/entity-communications-server": "6.2.0-edge.
|
|
74
|
-
"@memberjunction/esignature": "6.2.0-edge.
|
|
75
|
-
"@memberjunction/external-change-detection": "6.2.0-edge.
|
|
76
|
-
"@memberjunction/generic-database-provider": "6.2.0-edge.
|
|
77
|
-
"@memberjunction/global": "6.2.0-edge.
|
|
78
|
-
"@memberjunction/graphql-dataprovider": "6.2.0-edge.
|
|
79
|
-
"@memberjunction/integration-engine": "6.2.0-edge.
|
|
80
|
-
"@memberjunction/integration-engine-base": "6.2.0-edge.
|
|
81
|
-
"@memberjunction/integration-progress-artifacts": "6.2.0-edge.
|
|
82
|
-
"@memberjunction/integration-schema-builder": "6.2.0-edge.
|
|
83
|
-
"@memberjunction/interactive-component-types": "6.2.0-edge.
|
|
84
|
-
"@memberjunction/lists": "6.2.0-edge.
|
|
85
|
-
"@memberjunction/lists-base": "6.2.0-edge.
|
|
86
|
-
"@memberjunction/livekit-room-server": "6.2.0-edge.
|
|
87
|
-
"@memberjunction/network-utils": "6.2.0-edge.
|
|
88
|
-
"@memberjunction/notifications": "6.2.0-edge.
|
|
89
|
-
"@memberjunction/postgresql-dataprovider": "6.2.0-edge.
|
|
90
|
-
"@memberjunction/queue": "6.2.0-edge.
|
|
91
|
-
"@memberjunction/record-cloning": "6.2.0-edge.
|
|
92
|
-
"@memberjunction/record-comparison": "6.2.0-edge.
|
|
93
|
-
"@memberjunction/redis-provider": "6.2.0-edge.
|
|
94
|
-
"@memberjunction/remote-browser-base": "6.2.0-edge.
|
|
95
|
-
"@memberjunction/remote-browser-cdp": "6.2.0-edge.
|
|
96
|
-
"@memberjunction/remote-browser-selfhost": "6.2.0-edge.
|
|
97
|
-
"@memberjunction/remote-browser-server": "6.2.0-edge.
|
|
98
|
-
"@memberjunction/scheduling-actions": "6.2.0-edge.
|
|
99
|
-
"@memberjunction/scheduling-base-types": "6.2.0-edge.
|
|
100
|
-
"@memberjunction/scheduling-engine": "6.2.0-edge.
|
|
101
|
-
"@memberjunction/scheduling-engine-base": "6.2.0-edge.
|
|
102
|
-
"@memberjunction/schema-engine": "6.2.0-edge.
|
|
103
|
-
"@memberjunction/search-engine": "6.2.0-edge.
|
|
104
|
-
"@memberjunction/server-extensions-core": "6.2.0-edge.
|
|
105
|
-
"@memberjunction/sql-dialect": "6.2.0-edge.
|
|
106
|
-
"@memberjunction/sql-parser": "6.2.0-edge.
|
|
107
|
-
"@memberjunction/sqlserver-dataprovider": "6.2.0-edge.
|
|
108
|
-
"@memberjunction/storage": "6.2.0-edge.
|
|
109
|
-
"@memberjunction/tag-engine": "6.2.0-edge.
|
|
110
|
-
"@memberjunction/tag-engine-base": "6.2.0-edge.
|
|
111
|
-
"@memberjunction/task-graph": "6.2.0-edge.
|
|
112
|
-
"@memberjunction/templates": "6.2.0-edge.
|
|
113
|
-
"@memberjunction/testing-engine": "6.2.0-edge.
|
|
114
|
-
"@memberjunction/testing-engine-base": "6.2.0-edge.
|
|
115
|
-
"@memberjunction/version-history": "6.2.0-edge.
|
|
116
|
-
"@memberjunction/work-queue-engine": "6.2.0-edge.
|
|
22
|
+
"@memberjunction/actions": "6.2.0-edge.6",
|
|
23
|
+
"@memberjunction/actions-apollo": "6.2.0-edge.6",
|
|
24
|
+
"@memberjunction/actions-base": "6.2.0-edge.6",
|
|
25
|
+
"@memberjunction/actions-bizapps-accounting": "6.2.0-edge.6",
|
|
26
|
+
"@memberjunction/actions-bizapps-crm": "6.2.0-edge.6",
|
|
27
|
+
"@memberjunction/actions-bizapps-formbuilders": "6.2.0-edge.6",
|
|
28
|
+
"@memberjunction/actions-bizapps-lms": "6.2.0-edge.6",
|
|
29
|
+
"@memberjunction/actions-bizapps-social": "6.2.0-edge.6",
|
|
30
|
+
"@memberjunction/actions-peopledatalabs": "6.2.0-edge.6",
|
|
31
|
+
"@memberjunction/ai": "6.2.0-edge.6",
|
|
32
|
+
"@memberjunction/ai-agent-manager": "6.2.0-edge.6",
|
|
33
|
+
"@memberjunction/ai-agent-manager-actions": "6.2.0-edge.6",
|
|
34
|
+
"@memberjunction/ai-agents": "6.2.0-edge.6",
|
|
35
|
+
"@memberjunction/ai-bridge-base": "6.2.0-edge.6",
|
|
36
|
+
"@memberjunction/ai-bridge-ringcentral": "6.2.0-edge.6",
|
|
37
|
+
"@memberjunction/ai-bridge-server": "6.2.0-edge.6",
|
|
38
|
+
"@memberjunction/ai-bridge-teams": "6.2.0-edge.6",
|
|
39
|
+
"@memberjunction/ai-bridge-twilio": "6.2.0-edge.6",
|
|
40
|
+
"@memberjunction/ai-bridge-vonage": "6.2.0-edge.6",
|
|
41
|
+
"@memberjunction/ai-core-plus": "6.2.0-edge.6",
|
|
42
|
+
"@memberjunction/ai-engine-base": "6.2.0-edge.6",
|
|
43
|
+
"@memberjunction/ai-mcp-client": "6.2.0-edge.6",
|
|
44
|
+
"@memberjunction/ai-prompts": "6.2.0-edge.6",
|
|
45
|
+
"@memberjunction/ai-provider-bundle": "6.2.0-edge.6",
|
|
46
|
+
"@memberjunction/ai-vector-dupe": "6.2.0-edge.6",
|
|
47
|
+
"@memberjunction/ai-vector-sync": "6.2.0-edge.6",
|
|
48
|
+
"@memberjunction/ai-vectordb": "6.2.0-edge.6",
|
|
49
|
+
"@memberjunction/ai-vectors-pinecone": "6.2.0-edge.6",
|
|
50
|
+
"@memberjunction/aiengine": "6.2.0-edge.6",
|
|
51
|
+
"@memberjunction/api-keys": "6.2.0-edge.6",
|
|
52
|
+
"@memberjunction/auth-providers": "6.2.0-edge.6",
|
|
53
|
+
"@memberjunction/clustering-engine": "6.2.0-edge.6",
|
|
54
|
+
"@memberjunction/codegen-lib": "6.2.0-edge.6",
|
|
55
|
+
"@memberjunction/communication-engine": "6.2.0-edge.6",
|
|
56
|
+
"@memberjunction/communication-ms-graph": "6.2.0-edge.6",
|
|
57
|
+
"@memberjunction/communication-sendgrid": "6.2.0-edge.6",
|
|
58
|
+
"@memberjunction/communication-types": "6.2.0-edge.6",
|
|
59
|
+
"@memberjunction/component-registry-client-sdk": "6.2.0-edge.6",
|
|
60
|
+
"@memberjunction/computer-use": "6.2.0-edge.6",
|
|
61
|
+
"@memberjunction/computer-use-engine": "6.2.0-edge.6",
|
|
62
|
+
"@memberjunction/config": "6.2.0-edge.6",
|
|
63
|
+
"@memberjunction/core": "6.2.0-edge.6",
|
|
64
|
+
"@memberjunction/core-actions": "6.2.0-edge.6",
|
|
65
|
+
"@memberjunction/core-entities": "6.2.0-edge.6",
|
|
66
|
+
"@memberjunction/core-entities-server": "6.2.0-edge.6",
|
|
67
|
+
"@memberjunction/credentials": "6.2.0-edge.6",
|
|
68
|
+
"@memberjunction/data-context": "6.2.0-edge.6",
|
|
69
|
+
"@memberjunction/data-context-server": "6.2.0-edge.6",
|
|
70
|
+
"@memberjunction/doc-utils": "6.2.0-edge.6",
|
|
71
|
+
"@memberjunction/encryption": "6.2.0-edge.6",
|
|
72
|
+
"@memberjunction/entity-communications-base": "6.2.0-edge.6",
|
|
73
|
+
"@memberjunction/entity-communications-server": "6.2.0-edge.6",
|
|
74
|
+
"@memberjunction/esignature": "6.2.0-edge.6",
|
|
75
|
+
"@memberjunction/external-change-detection": "6.2.0-edge.6",
|
|
76
|
+
"@memberjunction/generic-database-provider": "6.2.0-edge.6",
|
|
77
|
+
"@memberjunction/global": "6.2.0-edge.6",
|
|
78
|
+
"@memberjunction/graphql-dataprovider": "6.2.0-edge.6",
|
|
79
|
+
"@memberjunction/integration-engine": "6.2.0-edge.6",
|
|
80
|
+
"@memberjunction/integration-engine-base": "6.2.0-edge.6",
|
|
81
|
+
"@memberjunction/integration-progress-artifacts": "6.2.0-edge.6",
|
|
82
|
+
"@memberjunction/integration-schema-builder": "6.2.0-edge.6",
|
|
83
|
+
"@memberjunction/interactive-component-types": "6.2.0-edge.6",
|
|
84
|
+
"@memberjunction/lists": "6.2.0-edge.6",
|
|
85
|
+
"@memberjunction/lists-base": "6.2.0-edge.6",
|
|
86
|
+
"@memberjunction/livekit-room-server": "6.2.0-edge.6",
|
|
87
|
+
"@memberjunction/network-utils": "6.2.0-edge.6",
|
|
88
|
+
"@memberjunction/notifications": "6.2.0-edge.6",
|
|
89
|
+
"@memberjunction/postgresql-dataprovider": "6.2.0-edge.6",
|
|
90
|
+
"@memberjunction/queue": "6.2.0-edge.6",
|
|
91
|
+
"@memberjunction/record-cloning": "6.2.0-edge.6",
|
|
92
|
+
"@memberjunction/record-comparison": "6.2.0-edge.6",
|
|
93
|
+
"@memberjunction/redis-provider": "6.2.0-edge.6",
|
|
94
|
+
"@memberjunction/remote-browser-base": "6.2.0-edge.6",
|
|
95
|
+
"@memberjunction/remote-browser-cdp": "6.2.0-edge.6",
|
|
96
|
+
"@memberjunction/remote-browser-selfhost": "6.2.0-edge.6",
|
|
97
|
+
"@memberjunction/remote-browser-server": "6.2.0-edge.6",
|
|
98
|
+
"@memberjunction/scheduling-actions": "6.2.0-edge.6",
|
|
99
|
+
"@memberjunction/scheduling-base-types": "6.2.0-edge.6",
|
|
100
|
+
"@memberjunction/scheduling-engine": "6.2.0-edge.6",
|
|
101
|
+
"@memberjunction/scheduling-engine-base": "6.2.0-edge.6",
|
|
102
|
+
"@memberjunction/schema-engine": "6.2.0-edge.6",
|
|
103
|
+
"@memberjunction/search-engine": "6.2.0-edge.6",
|
|
104
|
+
"@memberjunction/server-extensions-core": "6.2.0-edge.6",
|
|
105
|
+
"@memberjunction/sql-dialect": "6.2.0-edge.6",
|
|
106
|
+
"@memberjunction/sql-parser": "6.2.0-edge.6",
|
|
107
|
+
"@memberjunction/sqlserver-dataprovider": "6.2.0-edge.6",
|
|
108
|
+
"@memberjunction/storage": "6.2.0-edge.6",
|
|
109
|
+
"@memberjunction/tag-engine": "6.2.0-edge.6",
|
|
110
|
+
"@memberjunction/tag-engine-base": "6.2.0-edge.6",
|
|
111
|
+
"@memberjunction/task-graph": "6.2.0-edge.6",
|
|
112
|
+
"@memberjunction/templates": "6.2.0-edge.6",
|
|
113
|
+
"@memberjunction/testing-engine": "6.2.0-edge.6",
|
|
114
|
+
"@memberjunction/testing-engine-base": "6.2.0-edge.6",
|
|
115
|
+
"@memberjunction/version-history": "6.2.0-edge.6",
|
|
116
|
+
"@memberjunction/work-queue-engine": "6.2.0-edge.6",
|
|
117
117
|
"@octokit/auth-app": "^7.1.5",
|
|
118
118
|
"@octokit/rest": "^21.1.1",
|
|
119
119
|
"@types/compression": "^1.8.1",
|
|
@@ -150,10 +150,10 @@
|
|
|
150
150
|
"uuid": "^13.0.0",
|
|
151
151
|
"ws": "^8.19.0",
|
|
152
152
|
"zod": "^3.25.0",
|
|
153
|
-
"@memberjunction/theme-engine": "6.2.0-edge.
|
|
153
|
+
"@memberjunction/theme-engine": "6.2.0-edge.6"
|
|
154
154
|
},
|
|
155
155
|
"devDependencies": {
|
|
156
|
-
"@memberjunction/conversations-runtime": "6.2.0-edge.
|
|
156
|
+
"@memberjunction/conversations-runtime": "6.2.0-edge.6",
|
|
157
157
|
"@types/express": "^5.0.6",
|
|
158
158
|
"pkgroll": "2.23.0",
|
|
159
159
|
"rimraf": "6.1.2",
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
// type-graphql decorators call `Reflect.getMetadata`; the polyfill must load before the resolver.
|
|
2
|
+
import 'reflect-metadata';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Field-level security and identity on `RunEntityAction`.
|
|
6
|
+
*
|
|
7
|
+
* - **Identity.** The record an entity action runs on is loaded for the CALLER. Loaded with no
|
|
8
|
+
* user, it fell back to the provider's current user (the system user on a server), which is
|
|
9
|
+
* full width and ignores the caller's row-level security as well.
|
|
10
|
+
* - **Output.** `ResultData` echoes the run's parameters back to the caller. The record bound as
|
|
11
|
+
* `'Entity Object Data'` (a plain copy of its field values) and any entity object among the
|
|
12
|
+
* parameters are projected for the caller; values of unknown shape are left alone.
|
|
13
|
+
*
|
|
14
|
+
* `RunAction` output gets the same backstop: entity objects are sent as their values projected for
|
|
15
|
+
* the caller, and plain objects shaped like a row of a field-secured entity lose the caller's
|
|
16
|
+
* denied keys.
|
|
17
|
+
*/
|
|
18
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
19
|
+
|
|
20
|
+
vi.mock('type-graphql', () => {
|
|
21
|
+
const noopDecorator = () => () => undefined;
|
|
22
|
+
return {
|
|
23
|
+
Resolver: noopDecorator, Mutation: noopDecorator, Query: noopDecorator, Subscription: noopDecorator,
|
|
24
|
+
ObjectType: noopDecorator, InputType: noopDecorator, Field: noopDecorator, Arg: noopDecorator,
|
|
25
|
+
Args: noopDecorator, Ctx: noopDecorator, PubSub: noopDecorator, Root: noopDecorator,
|
|
26
|
+
Directive: noopDecorator, Authorized: noopDecorator, UseMiddleware: noopDecorator,
|
|
27
|
+
createUnionType: () => class {},
|
|
28
|
+
AuthorizationError: class AuthorizationError extends Error {},
|
|
29
|
+
Float: class {}, Int: class {}, ID: class {},
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const hoisted = vi.hoisted(() => ({
|
|
34
|
+
runEntityAction: vi.fn(),
|
|
35
|
+
runAction: vi.fn(),
|
|
36
|
+
entityActions: [] as unknown[],
|
|
37
|
+
actionParams: [] as unknown[],
|
|
38
|
+
}));
|
|
39
|
+
|
|
40
|
+
vi.mock('@memberjunction/actions', () => ({
|
|
41
|
+
ActionEngineServer: {
|
|
42
|
+
Instance: {
|
|
43
|
+
get ActionParams() { return hoisted.actionParams; },
|
|
44
|
+
Actions: [{ ID: 'AC000000-0000-4000-8000-000000000001', Name: 'Return Rows' }],
|
|
45
|
+
Config: vi.fn(async () => undefined),
|
|
46
|
+
RunAction: hoisted.runAction,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
EntityActionEngineServer: {
|
|
50
|
+
Instance: {
|
|
51
|
+
Config: vi.fn(async () => undefined),
|
|
52
|
+
get EntityActions() { return hoisted.entityActions; },
|
|
53
|
+
RunEntityAction: hoisted.runEntityAction,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
}));
|
|
57
|
+
|
|
58
|
+
import { BaseEntity, EntityInfo, UserInfo } from '@memberjunction/core';
|
|
59
|
+
import { ActionResolver, type EntityActionInput, type RunActionInput } from '../resolvers/ActionResolver.js';
|
|
60
|
+
import type { AppContext } from '../types.js';
|
|
61
|
+
import { EMPLOYEES_ENTITY_ID, EmployeeEntity, FullWidthEmployeeRow, HRUser, INTERN_ROLE_ID, Intern, SECRET_SALARY } from './fieldSecurityFixtures.js';
|
|
62
|
+
|
|
63
|
+
const ENTITY_ACTION_ID = 'EA000000-0000-4000-8000-000000000001';
|
|
64
|
+
const RECORD_PARAM_ID = 'AP000000-0000-4000-8000-000000000001';
|
|
65
|
+
|
|
66
|
+
class EmployeeObject extends BaseEntity {}
|
|
67
|
+
|
|
68
|
+
/** An entity object holding every column: what a load with no user produces on a server. */
|
|
69
|
+
async function fullWidthEntityObject(entityInfo: EntityInfo): Promise<BaseEntity> {
|
|
70
|
+
const entity = new EmployeeObject(entityInfo);
|
|
71
|
+
await entity.LoadFromData(FullWidthEmployeeRow());
|
|
72
|
+
return entity;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function context(entityInfo: EntityInfo, getEntityObject: ReturnType<typeof vi.fn>): AppContext {
|
|
76
|
+
const provider = { Entities: [entityInfo], EntityByID: () => undefined, GetEntityObject: getEntityObject };
|
|
77
|
+
return {
|
|
78
|
+
providers: [{ type: 'Read-Only', provider }],
|
|
79
|
+
userPayload: { userRecord: Intern(), email: 'intern-1@test.com' },
|
|
80
|
+
} as unknown as AppContext;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const input = (): EntityActionInput => ({
|
|
84
|
+
EntityActionID: ENTITY_ACTION_ID,
|
|
85
|
+
InvocationType: 'SingleRecord',
|
|
86
|
+
EntityName: 'Employees',
|
|
87
|
+
PrimaryKey: { KeyValuePairs: [{ Key: 'ID', Value: 'emp-1' }] },
|
|
88
|
+
} as unknown as EntityActionInput);
|
|
89
|
+
|
|
90
|
+
let entityInfo: EntityInfo;
|
|
91
|
+
let getEntityObject: ReturnType<typeof vi.fn>;
|
|
92
|
+
|
|
93
|
+
beforeEach(async () => {
|
|
94
|
+
vi.clearAllMocks();
|
|
95
|
+
entityInfo = EmployeeEntity();
|
|
96
|
+
getEntityObject = vi.fn(async () => ({ InnerLoad: vi.fn(async () => true) }));
|
|
97
|
+
hoisted.entityActions.length = 0;
|
|
98
|
+
hoisted.entityActions.push({
|
|
99
|
+
ID: ENTITY_ACTION_ID,
|
|
100
|
+
EntityID: EMPLOYEES_ENTITY_ID,
|
|
101
|
+
Params: [{ ActionParamID: RECORD_PARAM_ID, ValueType: 'Entity Object Data' }],
|
|
102
|
+
});
|
|
103
|
+
hoisted.actionParams.length = 0;
|
|
104
|
+
hoisted.actionParams.push({ ID: RECORD_PARAM_ID, Name: 'Record' });
|
|
105
|
+
hoisted.runEntityAction.mockResolvedValue({ Success: true, Message: 'ok', Params: [] });
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
describe('RunEntityAction: the record is loaded for the caller', () => {
|
|
109
|
+
it('REGRESSION: loads the bound record with the caller as its user', async () => {
|
|
110
|
+
await new ActionResolver().RunEntityAction(input(), context(entityInfo, getEntityObject));
|
|
111
|
+
expect(getEntityObject).toHaveBeenCalledWith('Employees', expect.objectContaining({ ID: 'intern-1' }));
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('refuses to run on a record the caller cannot load, with no hint whether it exists', async () => {
|
|
115
|
+
getEntityObject.mockResolvedValue({ InnerLoad: vi.fn(async () => false) });
|
|
116
|
+
const result = await new ActionResolver().RunEntityAction(input(), context(entityInfo, getEntityObject));
|
|
117
|
+
expect(result.Success).toBe(false);
|
|
118
|
+
expect(result.Message).toContain('Record not found or access denied');
|
|
119
|
+
expect(hoisted.runEntityAction).not.toHaveBeenCalled();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe('RunEntityAction: echoed parameters are projected for the caller', () => {
|
|
124
|
+
it("REGRESSION: the 'Entity Object Data' parameter never carries a denied value", async () => {
|
|
125
|
+
const params = [{ Name: 'Record', Value: FullWidthEmployeeRow(), Type: 'Input' }];
|
|
126
|
+
hoisted.runEntityAction.mockResolvedValue({ Success: true, Message: 'ok', Params: params, RunParams: { Params: params } });
|
|
127
|
+
|
|
128
|
+
const result = await new ActionResolver().RunEntityAction(input(), context(entityInfo, getEntityObject));
|
|
129
|
+
|
|
130
|
+
expect(result.Success).toBe(true);
|
|
131
|
+
expect(result.ResultData).not.toContain(String(SECRET_SALARY));
|
|
132
|
+
expect(JSON.parse(result.ResultData!).Params[0].Value).toEqual({ ID: 'emp-1', Name: 'Ada', Notes: 'n' });
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('REGRESSION: an entity object among the parameters is sent as its projected field values', async () => {
|
|
136
|
+
const params = [{ Name: 'Entity', Value: await fullWidthEntityObject(entityInfo), Type: 'Input' }];
|
|
137
|
+
hoisted.runEntityAction.mockResolvedValue({ Success: true, Message: 'ok', Params: params, RunParams: { Params: params } });
|
|
138
|
+
|
|
139
|
+
const result = await new ActionResolver().RunEntityAction(input(), context(entityInfo, getEntityObject));
|
|
140
|
+
|
|
141
|
+
expect(result.ResultData).not.toContain(String(SECRET_SALARY));
|
|
142
|
+
expect(JSON.parse(result.ResultData!).Params[0].Value).toMatchObject({ ID: 'emp-1', Name: 'Ada' });
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('REGRESSION: an entity object of an entity the caller cannot read is sent as null, not as its other fields', async () => {
|
|
146
|
+
const unreadable = EmployeeEntity();
|
|
147
|
+
unreadable.Permissions.splice(0, unreadable.Permissions.length, ...unreadable.Permissions.filter(p => p.RoleID !== INTERN_ROLE_ID));
|
|
148
|
+
const object = await fullWidthEntityObject(unreadable);
|
|
149
|
+
const params = [
|
|
150
|
+
{ Name: 'One', Value: object, Type: 'Output' },
|
|
151
|
+
{ Name: 'Many', Value: [object], Type: 'Output' },
|
|
152
|
+
];
|
|
153
|
+
hoisted.runEntityAction.mockResolvedValue({ Success: true, Message: 'ok', Params: params, RunParams: { Params: params } });
|
|
154
|
+
|
|
155
|
+
const result = await new ActionResolver().RunEntityAction(input(), context(entityInfo, getEntityObject));
|
|
156
|
+
|
|
157
|
+
const sent = JSON.parse(result.ResultData!) as { Params: { Value: unknown }[]; RunParams: { Params: { Value: unknown }[] } };
|
|
158
|
+
expect(sent.Params[0].Value).toBeNull();
|
|
159
|
+
expect(sent.Params[1].Value).toEqual([null]);
|
|
160
|
+
expect(sent.RunParams.Params[0].Value).toBeNull();
|
|
161
|
+
expect(result.ResultData).not.toContain('Ada');
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('leaves a parameter of unknown shape alone', async () => {
|
|
165
|
+
const params = [{ Name: 'Other', Value: { Salary: 1 }, Type: 'Output' }];
|
|
166
|
+
hoisted.runEntityAction.mockResolvedValue({ Success: true, Message: 'ok', Params: params });
|
|
167
|
+
|
|
168
|
+
const result = await new ActionResolver().RunEntityAction(input(), context(entityInfo, getEntityObject));
|
|
169
|
+
|
|
170
|
+
expect(JSON.parse(result.ResultData!).Params[0].Value).toEqual({ Salary: 1 });
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
// ─── RunAction: general action output ────────────────────────────────────────
|
|
175
|
+
|
|
176
|
+
const ACTION_ID = 'AC000000-0000-4000-8000-000000000001';
|
|
177
|
+
|
|
178
|
+
/** An Owner may run any action, so these tests reach the output without the authorization lookup. */
|
|
179
|
+
function owner(user: UserInfo): UserInfo {
|
|
180
|
+
user.Type = 'Owner';
|
|
181
|
+
return user;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function runActionContext(entity: EntityInfo, user: UserInfo): AppContext {
|
|
185
|
+
const provider = { Entities: [entity], EntityByID: () => undefined };
|
|
186
|
+
return {
|
|
187
|
+
providers: [{ type: 'Read-Write', provider }],
|
|
188
|
+
userPayload: { userRecord: user, email: user.Email },
|
|
189
|
+
} as unknown as AppContext;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async function runActionReturning(value: unknown, user: UserInfo): Promise<unknown> {
|
|
193
|
+
hoisted.runAction.mockResolvedValue({ Success: true, Message: 'ok', Params: [{ Name: 'Rows', Type: 'Output', Value: value }] });
|
|
194
|
+
const result = await new ActionResolver().RunAction({ ActionID: ACTION_ID } as RunActionInput, runActionContext(entityInfo, user));
|
|
195
|
+
expect(result.Success).toBe(true);
|
|
196
|
+
return JSON.parse(result.ResultData!)[0].Value;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
describe('RunAction: output parameters are projected for the caller', () => {
|
|
200
|
+
it('REGRESSION: a system-loaded entity object is sent as its projected values to a restricted caller', async () => {
|
|
201
|
+
const value: BaseEntity = await fullWidthEntityObject(entityInfo);
|
|
202
|
+
expect(await runActionReturning(value, owner(Intern()))).toEqual({ ID: 'emp-1', Name: 'Ada', Notes: 'n' });
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('REGRESSION: the same entity object keeps the field for a caller allowed to read it', async () => {
|
|
206
|
+
const value: BaseEntity = await fullWidthEntityObject(entityInfo);
|
|
207
|
+
expect(await runActionReturning(value, owner(HRUser()))).toMatchObject({ ID: 'emp-1', Salary: SECRET_SALARY });
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('REGRESSION: a GetAll()-shaped row of a field-secured entity loses the denied field', async () => {
|
|
211
|
+
const value = await runActionReturning([FullWidthEmployeeRow()], owner(Intern()));
|
|
212
|
+
expect(value).toEqual([{ ID: 'emp-1', Name: 'Ada', Notes: 'n' }]);
|
|
213
|
+
expect(JSON.stringify(value)).not.toContain(String(SECRET_SALARY));
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it('leaves a non-entity-shaped object untouched', async () => {
|
|
217
|
+
expect(await runActionReturning({ Salary: 1, Total: 2 }, owner(Intern()))).toEqual({ Salary: 1, Total: 2 });
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it("REGRESSION: an entity object of an entity the caller cannot read is not exposed", async () => {
|
|
221
|
+
const unreadable = EmployeeEntity();
|
|
222
|
+
unreadable.Permissions.splice(0, unreadable.Permissions.length, ...unreadable.Permissions.filter(p => p.RoleID !== INTERN_ROLE_ID));
|
|
223
|
+
const object = await fullWidthEntityObject(unreadable);
|
|
224
|
+
hoisted.runAction.mockResolvedValue({ Success: true, Message: 'ok', Params: [
|
|
225
|
+
{ Name: 'One', Type: 'Output', Value: object },
|
|
226
|
+
{ Name: 'Many', Type: 'Output', Value: [object] },
|
|
227
|
+
] });
|
|
228
|
+
const result = await new ActionResolver().RunAction({ ActionID: ACTION_ID } as RunActionInput, runActionContext(unreadable, owner(Intern())));
|
|
229
|
+
// Exactly the shape this output had before entity objects were projected: the single object's
|
|
230
|
+
// Value dropped, the array's item nulled (and, as ever, the list serialized index-keyed).
|
|
231
|
+
expect(JSON.parse(result.ResultData!)).toEqual({ 0: { Name: 'One', Type: 'Output' }, 1: { Name: 'Many', Type: 'Output', Value: [null] } });
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
it('sends the full row to a caller denied nothing', async () => {
|
|
235
|
+
expect(await runActionReturning([FullWidthEmployeeRow()], owner(HRUser()))).toEqual([FullWidthEmployeeRow()]);
|
|
236
|
+
});
|
|
237
|
+
});
|