@memberjunction/server 6.2.0-edge.6 → 6.2.0-edge.8
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 +69 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/BridgeHostInstance.d.ts +8 -3
- package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -1
- package/dist/agentSessions/BridgeHostInstance.js +14 -4
- package/dist/agentSessions/BridgeHostInstance.js.map +1 -1
- package/dist/agentSessions/HandoffOfferExpiry.d.ts +10 -0
- package/dist/agentSessions/HandoffOfferExpiry.d.ts.map +1 -0
- package/dist/agentSessions/HandoffOfferExpiry.js +18 -0
- package/dist/agentSessions/HandoffOfferExpiry.js.map +1 -0
- package/dist/agentSessions/ReturningVisitorRecap.js +1 -0
- package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +31 -8
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +85 -41
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +14 -4
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +28 -4
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/agentSessions/conversationBrowsers.d.ts +61 -0
- package/dist/agentSessions/conversationBrowsers.d.ts.map +1 -0
- package/dist/agentSessions/conversationBrowsers.js +118 -0
- package/dist/agentSessions/conversationBrowsers.js.map +1 -0
- package/dist/agentSessions/sessionDeadline.d.ts +43 -0
- package/dist/agentSessions/sessionDeadline.d.ts.map +1 -0
- package/dist/agentSessions/sessionDeadline.js +68 -0
- package/dist/agentSessions/sessionDeadline.js.map +1 -0
- package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
- package/dist/auth/APIKeyScopeAuth.js +5 -4
- package/dist/auth/APIKeyScopeAuth.js.map +1 -1
- package/dist/auth/loginEmailResolution.d.ts +41 -0
- package/dist/auth/loginEmailResolution.d.ts.map +1 -0
- package/dist/auth/loginEmailResolution.js +47 -0
- package/dist/auth/loginEmailResolution.js.map +1 -0
- package/dist/auth/magicLink/MagicLinkKeys.d.ts +50 -2
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +129 -12
- package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts +3 -0
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +23 -5
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.d.ts +39 -5
- package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +221 -9
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/magicLink/index.d.ts +1 -1
- package/dist/auth/magicLink/index.d.ts.map +1 -1
- package/dist/auth/magicLink/index.js +1 -1
- package/dist/auth/magicLink/index.js.map +1 -1
- package/dist/auth/magicLink/redeemLanding.d.ts +2 -2
- package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
- package/dist/auth/magicLink/redeemLanding.js +7 -4
- package/dist/auth/magicLink/redeemLanding.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +27 -3
- package/dist/auth/magicLink/types.d.ts.map +1 -1
- package/dist/auth/magicLink/types.js +0 -4
- package/dist/auth/magicLink/types.js.map +1 -1
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +1 -0
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/backgroundSweepConfigUnits.d.ts +231 -0
- package/dist/backgroundSweepConfigUnits.d.ts.map +1 -0
- package/dist/backgroundSweepConfigUnits.js +180 -0
- package/dist/backgroundSweepConfigUnits.js.map +1 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -1
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +2 -1
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -1
- package/dist/config.d.ts +906 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +59 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +41 -12
- package/dist/context.js.map +1 -1
- package/dist/coreRoutes.d.ts +3 -1
- package/dist/coreRoutes.d.ts.map +1 -1
- package/dist/coreRoutes.js +6 -4
- package/dist/coreRoutes.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +1072 -5
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +10174 -4618
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts +11 -0
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +27 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +50 -5
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +329 -132
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +4 -0
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +47 -7
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/globalCors.d.ts.map +1 -1
- package/dist/globalCors.js +1 -0
- package/dist/globalCors.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +201 -43
- package/dist/index.js.map +1 -1
- package/dist/integration/ConnectionPause.d.ts +121 -0
- package/dist/integration/ConnectionPause.d.ts.map +1 -0
- package/dist/integration/ConnectionPause.js +183 -0
- package/dist/integration/ConnectionPause.js.map +1 -0
- package/dist/integration/CustomColumnPromoter.d.ts +72 -6
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +87 -46
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/integration/EntityMapLifecycle.d.ts +78 -4
- package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
- package/dist/integration/EntityMapLifecycle.js +199 -5
- package/dist/integration/EntityMapLifecycle.js.map +1 -1
- package/dist/integration/InactiveRowWarnings.d.ts +31 -0
- package/dist/integration/InactiveRowWarnings.d.ts.map +1 -1
- package/dist/integration/InactiveRowWarnings.js +29 -0
- package/dist/integration/InactiveRowWarnings.js.map +1 -1
- package/dist/integration/ObjectNamesByID.d.ts +28 -0
- package/dist/integration/ObjectNamesByID.d.ts.map +1 -0
- package/dist/integration/ObjectNamesByID.js +87 -0
- package/dist/integration/ObjectNamesByID.js.map +1 -0
- package/dist/integration/PostRestartIntrospect.d.ts +26 -0
- package/dist/integration/PostRestartIntrospect.d.ts.map +1 -0
- package/dist/integration/PostRestartIntrospect.js +27 -0
- package/dist/integration/PostRestartIntrospect.js.map +1 -0
- package/dist/integration/RSUPostRestartProgress.d.ts +176 -0
- package/dist/integration/RSUPostRestartProgress.d.ts.map +1 -0
- package/dist/integration/RSUPostRestartProgress.js +323 -0
- package/dist/integration/RSUPostRestartProgress.js.map +1 -0
- package/dist/integration/RSUProgressBridge.d.ts +41 -2
- package/dist/integration/RSUProgressBridge.d.ts.map +1 -1
- package/dist/integration/RSUProgressBridge.js +84 -1
- package/dist/integration/RSUProgressBridge.js.map +1 -1
- package/dist/integration/RunArtifactAuthorization.d.ts +39 -0
- package/dist/integration/RunArtifactAuthorization.d.ts.map +1 -0
- package/dist/integration/RunArtifactAuthorization.js +45 -0
- package/dist/integration/RunArtifactAuthorization.js.map +1 -0
- package/dist/integration/SchemaRefreshLaunch.d.ts +9 -0
- package/dist/integration/SchemaRefreshLaunch.d.ts.map +1 -1
- package/dist/integration/SchemaRefreshLaunch.js +3 -2
- package/dist/integration/SchemaRefreshLaunch.js.map +1 -1
- package/dist/integration/ScopedFieldsForBuild.d.ts +46 -0
- package/dist/integration/ScopedFieldsForBuild.d.ts.map +1 -0
- package/dist/integration/ScopedFieldsForBuild.js +91 -0
- package/dist/integration/ScopedFieldsForBuild.js.map +1 -0
- package/dist/integration/TargetConfigGuard.d.ts +40 -0
- package/dist/integration/TargetConfigGuard.d.ts.map +1 -0
- package/dist/integration/TargetConfigGuard.js +40 -0
- package/dist/integration/TargetConfigGuard.js.map +1 -0
- package/dist/logging/StartupLogger.d.ts +50 -0
- package/dist/logging/StartupLogger.d.ts.map +1 -1
- package/dist/logging/StartupLogger.js +15 -22
- package/dist/logging/StartupLogger.js.map +1 -1
- package/dist/middleware/BaseServerMiddleware.d.ts +21 -3
- package/dist/middleware/BaseServerMiddleware.d.ts.map +1 -1
- package/dist/middleware/BaseServerMiddleware.js +4 -2
- package/dist/middleware/BaseServerMiddleware.js.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.js +2 -3
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
- package/dist/realtimeSessions/sessionAccess.d.ts +15 -0
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +22 -0
- package/dist/realtimeSessions/sessionAccess.js.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.js +2 -0
- package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
- package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
- package/dist/realtimeWidget/visitorIdentity.js +1 -0
- package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +4 -7
- package/dist/realtimeWidget/widgetCore.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +1 -0
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/requestOrigin.d.ts +22 -0
- package/dist/requestOrigin.d.ts.map +1 -0
- package/dist/requestOrigin.js +60 -0
- package/dist/requestOrigin.js.map +1 -0
- package/dist/resolvers/AgentRunStatusPublisher.d.ts +10 -0
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.js +18 -2
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
- package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/AgentSessionResolver.js +6 -2
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.d.ts +1 -1
- package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.js +61 -16
- package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.js +2 -0
- package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
- package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts +6 -0
- package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts.map +1 -1
- package/dist/resolvers/ExecuteRemoteOperationResolver.js +30 -7
- package/dist/resolvers/ExecuteRemoteOperationResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +34 -13
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/InfoResolver.js +1 -1
- package/dist/resolvers/InfoResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +401 -11
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +2690 -1305
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/MCPResolver.d.ts.map +1 -1
- package/dist/resolvers/MCPResolver.js +13 -2
- package/dist/resolvers/MCPResolver.js.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts +38 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +181 -88
- package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +1 -0
- package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +6 -0
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +36 -5
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts +62 -10
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +217 -34
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +24 -8
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +185 -67
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts +5 -3
- package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +19 -18
- package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +3 -1
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +7 -8
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/TagGovernanceResolver.d.ts +12 -0
- package/dist/resolvers/TagGovernanceResolver.d.ts.map +1 -1
- package/dist/resolvers/TagGovernanceResolver.js +84 -0
- package/dist/resolvers/TagGovernanceResolver.js.map +1 -1
- package/dist/resolvers/TelemetryResolver.d.ts +13 -8
- package/dist/resolvers/TelemetryResolver.d.ts.map +1 -1
- package/dist/resolvers/TelemetryResolver.js +40 -9
- package/dist/resolvers/TelemetryResolver.js.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.js +2 -0
- package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
- package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -1
- package/dist/resolvers/meetings/meetingMutations.js +34 -4
- package/dist/resolvers/meetings/meetingMutations.js.map +1 -1
- package/dist/rest/MediaAccessKeys.d.ts.map +1 -1
- package/dist/rest/MediaAccessKeys.js +6 -2
- package/dist/rest/MediaAccessKeys.js.map +1 -1
- package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
- package/dist/rest/OAuthCallbackHandler.js +11 -5
- package/dist/rest/OAuthCallbackHandler.js.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.d.ts +3 -3
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.js +2 -4
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +2 -1
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +3 -1
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +11 -2
- package/dist/rest/setupRESTEndpoints.js.map +1 -1
- package/dist/services/DurableEntityActionTaskSubmitter.d.ts.map +1 -1
- package/dist/services/DurableEntityActionTaskSubmitter.js +6 -1
- package/dist/services/DurableEntityActionTaskSubmitter.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +2 -26
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/TaskGraphAgentRunner.d.ts +6 -0
- package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphAgentRunner.js +38 -0
- package/dist/services/TaskGraphAgentRunner.js.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +1 -0
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/services/WorkQueueHostService.d.ts +2 -1
- package/dist/services/WorkQueueHostService.d.ts.map +1 -1
- package/dist/services/WorkQueueHostService.js +19 -4
- package/dist/services/WorkQueueHostService.js.map +1 -1
- package/dist/services/workQueueConfig.d.ts +2 -2
- package/dist/services/workQueueConfig.js +5 -5
- package/dist/services/workQueueConfig.js.map +1 -1
- package/dist/sharedCache.js +1 -1
- package/dist/sharedCache.js.map +1 -1
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +55 -2
- package/dist/util.js.map +1 -1
- package/package.json +107 -100
- package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
- package/src/__tests__/ActiveOperations.test.ts +68 -0
- package/src/__tests__/AgentSessionResolver.ownership.test.ts +13 -0
- package/src/__tests__/AssertTargetConfigs.test.ts +75 -0
- package/src/__tests__/BatchApplyParity.test.ts +109 -0
- package/src/__tests__/BridgeHostInstance.test.ts +42 -0
- package/src/__tests__/CollectInactiveRowWarnings.test.ts +115 -0
- package/src/__tests__/ConnectionPause.test.ts +192 -0
- package/src/__tests__/ConnectionPauseResolver.test.ts +166 -0
- package/src/__tests__/ConnectionPauseSave.test.ts +143 -0
- package/src/__tests__/CustomColumnPromoterCompletion.test.ts +142 -0
- package/src/__tests__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
- package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
- package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
- package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
- package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -0
- package/src/__tests__/HandoffOfferExpiry.test.ts +40 -0
- package/src/__tests__/IntegrationRunArtifactAuthorization.test.ts +126 -0
- package/src/__tests__/MagicLinkKeys.test.ts +102 -0
- package/src/__tests__/MediaAccessKeys.test.ts +57 -10
- package/src/__tests__/NewArrivalsDefaultDisabled.test.ts +50 -0
- package/src/__tests__/ObjectNamesByID.test.ts +176 -0
- package/src/__tests__/PostRestartMapsInCatalogScope.test.ts +146 -0
- package/src/__tests__/QuerySystemUserResolver.childRows.test.ts +80 -0
- package/src/__tests__/QuerySystemUserResolver.collision.test.ts +200 -0
- package/src/__tests__/QuerySystemUserResolver.permissions.test.ts +132 -0
- package/src/__tests__/RSUPostRestartProgress.test.ts +343 -0
- package/src/__tests__/RSUProgressBridge.test.ts +188 -5
- package/src/__tests__/RSUStartupSweepWiring.test.ts +30 -0
- package/src/__tests__/ReactivateRefreshMessage.test.ts +10 -3
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +22 -0
- package/src/__tests__/{RefreshAdoptsNewColumns.test.ts → RefreshReportsNewColumns.test.ts} +25 -16
- package/src/__tests__/RemoteBrowserActionRecovery.test.ts +287 -0
- package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +3 -0
- package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +6 -4
- package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
- package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +327 -26
- package/src/__tests__/ResolverBase.diagnosticSenderRegistrations.test.ts +26 -0
- package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +53 -2
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +60 -0
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +4 -0
- package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
- package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +2 -0
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +2 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +87 -12
- package/src/__tests__/RunAIAgentResolver.streaming.test.ts +28 -4
- package/src/__tests__/SchemaEvolutionCustomColumns.test.ts +119 -0
- package/src/__tests__/SchemaRefreshLaunch.test.ts +24 -2
- package/src/__tests__/ScopedFieldsForBuild.test.ts +192 -0
- package/src/__tests__/SessionJanitor.test.ts +195 -4
- package/src/__tests__/SessionManager.test.ts +69 -0
- package/src/__tests__/TagGovernanceAndAutotagResolvers.test.ts +261 -0
- package/src/__tests__/TagGovernanceResolver.test.ts +60 -2
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
- package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
- package/src/__tests__/ViewOperationsHandler.test.ts +2 -5
- package/src/__tests__/WorkQueueHostService.test.ts +25 -7
- package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
- package/src/__tests__/contextRequestOrigin.test.ts +105 -0
- package/src/__tests__/conversationBrowsers.test.ts +62 -0
- package/src/__tests__/globalCors.test.ts +12 -0
- package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
- package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
- package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
- package/src/__tests__/realtimeRecordingHandler.test.ts +7 -2
- package/src/__tests__/realtimeSessions/sessionAccess.test.ts +79 -1
- package/src/__tests__/requestOrigin.test.ts +104 -0
- package/src/__tests__/review-capture-valid-token-log.test.ts +98 -0
- package/src/__tests__/runStreams.fieldSecurity.test.ts +5 -5
- package/src/__tests__/securityHardeningPr6034.test.ts +120 -0
- package/src/__tests__/sessionDeadline.test.ts +51 -0
- package/src/__tests__/sharedCache.test.ts +11 -0
- package/src/__tests__/unifiedAuth.test.ts +73 -1
- package/src/agentSessions/BridgeHostInstance.ts +20 -5
- package/src/agentSessions/HandoffOfferExpiry.ts +18 -0
- package/src/agentSessions/ReturningVisitorRecap.ts +1 -0
- package/src/agentSessions/SessionJanitor.ts +92 -42
- package/src/agentSessions/SessionManager.ts +38 -8
- package/src/agentSessions/conversationBrowsers.ts +143 -0
- package/src/agentSessions/sessionDeadline.ts +81 -0
- package/src/auth/APIKeyScopeAuth.ts +5 -4
- package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
- package/src/auth/loginEmailResolution.ts +67 -0
- package/src/auth/magicLink/MagicLinkKeys.ts +146 -14
- package/src/auth/magicLink/MagicLinkRouter.ts +33 -6
- package/src/auth/magicLink/MagicLinkService.ts +250 -10
- package/src/auth/magicLink/index.ts +1 -1
- package/src/auth/magicLink/redeemLanding.ts +7 -4
- package/src/auth/magicLink/types.ts +28 -3
- package/src/auth/newUsers.ts +1 -0
- package/src/backgroundSweepConfigUnits.ts +213 -0
- package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +2 -1
- package/src/config.ts +69 -0
- package/src/context.ts +46 -15
- package/src/coreRoutes.ts +14 -7
- package/src/generated/graphql-schemas/__mj.ts +10360 -6479
- package/src/generic/OrphanedConversationDetailReconciler.ts +32 -1
- package/src/generic/ResolverBase.ts +422 -143
- package/src/generic/RunViewResolver.ts +96 -49
- package/src/globalCors.ts +1 -0
- package/src/index.ts +246 -44
- package/src/integration/ConnectionPause.ts +222 -0
- package/src/integration/CustomColumnPromoter.ts +123 -53
- package/src/integration/EntityMapLifecycle.ts +229 -6
- package/src/integration/InactiveRowWarnings.ts +50 -0
- package/src/integration/ObjectNamesByID.ts +97 -0
- package/src/integration/PostRestartIntrospect.ts +49 -0
- package/src/integration/RSUPostRestartProgress.ts +359 -0
- package/src/integration/RSUProgressBridge.ts +85 -2
- package/src/integration/RunArtifactAuthorization.ts +65 -0
- package/src/integration/SchemaRefreshLaunch.ts +12 -2
- package/src/integration/ScopedFieldsForBuild.ts +113 -0
- package/src/integration/TargetConfigGuard.ts +71 -0
- package/src/logging/StartupLogger.ts +24 -0
- package/src/middleware/BaseServerMiddleware.ts +20 -3
- package/src/realtimeSessions/ownedRealtimeSession.ts +2 -6
- package/src/realtimeSessions/sessionAccess.ts +30 -0
- package/src/realtimeWidget/WidgetSessionService.ts +2 -0
- package/src/realtimeWidget/visitorIdentity.ts +1 -0
- package/src/realtimeWidget/widgetCore.ts +4 -8
- package/src/realtimeWidget/widgetGuestElevation.ts +1 -0
- package/src/requestOrigin.ts +64 -0
- package/src/resolvers/AgentRunStatusPublisher.ts +27 -2
- package/src/resolvers/AgentSessionResolver.ts +6 -2
- package/src/resolvers/AutotagPipelineResolver.ts +59 -14
- package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
- package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
- package/src/resolvers/GetDataResolver.ts +35 -13
- package/src/resolvers/InfoResolver.ts +1 -1
- package/src/resolvers/IntegrationDiscoveryResolver.ts +1522 -203
- package/src/resolvers/MCPResolver.ts +15 -2
- package/src/resolvers/QuerySystemUserResolver.ts +211 -100
- package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +40 -7
- package/src/resolvers/RemoteBrowserActionResolver.ts +242 -32
- package/src/resolvers/RunAIAgentResolver.ts +265 -86
- package/src/resolvers/RunAIPromptResolver.ts +18 -18
- package/src/resolvers/RunTemplateResolver.ts +3 -1
- package/src/resolvers/SqlLoggingConfigResolver.ts +7 -9
- package/src/resolvers/TagGovernanceResolver.ts +65 -0
- package/src/resolvers/TelemetryResolver.ts +44 -9
- package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
- package/src/resolvers/meetingRecordingRegistration.ts +2 -0
- package/src/resolvers/meetings/meetingMutations.ts +37 -7
- package/src/rest/MediaAccessKeys.ts +6 -2
- package/src/rest/OAuthCallbackHandler.ts +13 -5
- package/src/rest/RealtimeRecordingHandler.ts +5 -9
- package/src/rest/ViewOperationsHandler.ts +2 -1
- package/src/rest/setupRESTEndpoints.ts +11 -2
- package/src/services/DurableEntityActionTaskSubmitter.ts +10 -2
- package/src/services/TaskGraphActionRunner.ts +2 -23
- package/src/services/TaskGraphAgentRunner.ts +43 -0
- package/src/services/TaskGraphContinuationDeliverer.ts +1 -0
- package/src/services/WorkQueueHostService.ts +26 -4
- package/src/services/workQueueConfig.ts +5 -5
- package/src/sharedCache.ts +1 -1
- package/src/types.ts +18 -0
- package/src/util.ts +55 -3
- package/src/services/TaskOrchestration-Integration.md +0 -188
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Resolver, Mutation, Ctx, Arg, ObjectType, Field } from 'type-graphql';
|
|
2
2
|
import { AppContext } from '../types.js';
|
|
3
3
|
import { IMetadataProvider, LogError, LogStatus, Metadata, RunView, UserInfo } from '@memberjunction/core';
|
|
4
|
+
import { IsValidUUID, EscapeSQLString } from '@memberjunction/global';
|
|
4
5
|
import { MJContentProcessRunEntity } from '@memberjunction/core-entities';
|
|
5
6
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
6
7
|
import { ActionEngineServer } from '@memberjunction/actions';
|
|
@@ -32,6 +33,7 @@ export class AutotagPipelineResolver extends ResolverBase {
|
|
|
32
33
|
async RunAutotagPipeline(
|
|
33
34
|
@Arg('contentSourceIDs', () => [String], { nullable: true }) contentSourceIDs: string[] | undefined,
|
|
34
35
|
@Arg('forceReprocess', { nullable: true }) forceReprocess: boolean | undefined,
|
|
36
|
+
@Arg('pipelineRunID', { nullable: true }) clientPipelineRunID: string | undefined,
|
|
35
37
|
@Ctx() { userPayload, providers }: AppContext = {} as AppContext
|
|
36
38
|
): Promise<AutotagPipelineResult> {
|
|
37
39
|
try {
|
|
@@ -40,14 +42,37 @@ export class AutotagPipelineResolver extends ResolverBase {
|
|
|
40
42
|
return { Success: false, Status: 'Error', ErrorMessage: 'Unable to determine current user' };
|
|
41
43
|
}
|
|
42
44
|
|
|
43
|
-
const pipelineRunID = uuidv4();
|
|
44
|
-
LogStatus(`RunAutotagPipeline: starting pipeline ${pipelineRunID}`);
|
|
45
|
-
|
|
46
45
|
// Capture the per-request provider snapshot before returning so the fire-and-forget
|
|
47
46
|
// background job binds to the same connection the caller used. Without this, the
|
|
48
47
|
// background job would silently use the global default — wrong for multi-tenant.
|
|
49
|
-
const provider =
|
|
50
|
-
|
|
48
|
+
const provider: IMetadataProvider = GetReadWriteProvider(providers, { allowFallbackToReadOnly: true }) ?? Metadata.Provider;
|
|
49
|
+
|
|
50
|
+
let pipelineRunID: string;
|
|
51
|
+
if (clientPipelineRunID != null) {
|
|
52
|
+
if (!IsValidUUID(clientPipelineRunID)) {
|
|
53
|
+
return { Success: false, Status: 'Error', ErrorMessage: 'Invalid pipelineRunID format' };
|
|
54
|
+
}
|
|
55
|
+
const rv = RunView.FromMetadataProvider(provider);
|
|
56
|
+
const existing = await rv.RunView<{ ID: string }>({
|
|
57
|
+
EntityName: 'MJ: Content Process Runs',
|
|
58
|
+
ExtraFilter: `ID='${EscapeSQLString(clientPipelineRunID)}'`,
|
|
59
|
+
Fields: ['ID'],
|
|
60
|
+
ResultType: 'simple',
|
|
61
|
+
MaxRows: 1,
|
|
62
|
+
SkipTotalRowCount: true,
|
|
63
|
+
}, currentUser);
|
|
64
|
+
if (!existing.Success) {
|
|
65
|
+
return { Success: false, Status: 'Error', ErrorMessage: existing.ErrorMessage || 'Failed to validate pipelineRunID' };
|
|
66
|
+
}
|
|
67
|
+
if (existing.Results.length > 0) {
|
|
68
|
+
return { Success: false, Status: 'Error', ErrorMessage: `Pipeline run ${clientPipelineRunID} already exists` };
|
|
69
|
+
}
|
|
70
|
+
pipelineRunID = clientPipelineRunID;
|
|
71
|
+
} else {
|
|
72
|
+
pipelineRunID = uuidv4();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
LogStatus(`RunAutotagPipeline: starting pipeline ${pipelineRunID}`);
|
|
51
76
|
|
|
52
77
|
// Fire-and-forget: start the pipeline in the background and return immediately
|
|
53
78
|
this.runPipelineInBackground(pipelineRunID, currentUser, provider, contentSourceIDs, forceReprocess);
|
|
@@ -101,9 +126,19 @@ export class AutotagPipelineResolver extends ResolverBase {
|
|
|
101
126
|
// and keeps the process run record in sync
|
|
102
127
|
this.publishProgress(pipelineRunID, 'autotag', 0, 0, startTime, 'Running autotaggers...');
|
|
103
128
|
|
|
129
|
+
let lastTotal = 0;
|
|
130
|
+
let lastProcessed = 0;
|
|
131
|
+
let lastLabel = 'Scanning & extracting content from sources...';
|
|
132
|
+
|
|
104
133
|
const progressCallback = (processed: number, total: number, currentItem?: string) => {
|
|
105
|
-
|
|
106
|
-
|
|
134
|
+
lastProcessed = processed;
|
|
135
|
+
lastTotal = total;
|
|
136
|
+
if (currentItem) {
|
|
137
|
+
lastLabel = currentItem;
|
|
138
|
+
} else if (total > 0) {
|
|
139
|
+
lastLabel = `${processed}/${total} items`;
|
|
140
|
+
}
|
|
141
|
+
this.publishProgress(pipelineRunID, 'autotag', total, processed, startTime, lastLabel);
|
|
107
142
|
this.updateProcessRunProgress(processRun, processed, total);
|
|
108
143
|
};
|
|
109
144
|
|
|
@@ -121,12 +156,21 @@ export class AutotagPipelineResolver extends ResolverBase {
|
|
|
121
156
|
actionParams.push({ Name: 'ForceReprocess', Value: 1, Type: 'Input' });
|
|
122
157
|
}
|
|
123
158
|
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
159
|
+
const heartbeatTimer = setInterval(() => {
|
|
160
|
+
this.publishProgress(pipelineRunID, 'autotag', lastTotal, lastProcessed, startTime, lastLabel);
|
|
161
|
+
}, 3000);
|
|
162
|
+
|
|
163
|
+
let result;
|
|
164
|
+
try {
|
|
165
|
+
result = await ActionEngineServer.Instance.RunAction({
|
|
166
|
+
Action: action,
|
|
167
|
+
ContextUser: currentUser,
|
|
168
|
+
Filters: [],
|
|
169
|
+
Params: actionParams
|
|
170
|
+
});
|
|
171
|
+
} finally {
|
|
172
|
+
clearInterval(heartbeatTimer);
|
|
173
|
+
}
|
|
130
174
|
|
|
131
175
|
// Stage: vectorize complete
|
|
132
176
|
this.publishProgress(pipelineRunID, 'vectorize', 100, 90, startTime, 'Vectorizing content...');
|
|
@@ -170,7 +214,8 @@ export class AutotagPipelineResolver extends ResolverBase {
|
|
|
170
214
|
EntityName: 'MJ: Content Sources',
|
|
171
215
|
Fields: ['ID'],
|
|
172
216
|
ResultType: 'simple',
|
|
173
|
-
MaxRows: 1
|
|
217
|
+
MaxRows: 1,
|
|
218
|
+
SkipTotalRowCount: true
|
|
174
219
|
}, currentUser);
|
|
175
220
|
if (result.Success && result.Results.length > 0) {
|
|
176
221
|
sourceID = result.Results[0].ID;
|
|
@@ -235,6 +235,7 @@ export class ConversationRunEventsResolver {
|
|
|
235
235
|
EntityName: 'MJ: Conversation Details',
|
|
236
236
|
ExtraFilter: `ID='${this.escape(conversationDetailID)}'`,
|
|
237
237
|
MaxRows: 1,
|
|
238
|
+
SkipTotalRowCount: true,
|
|
238
239
|
ResultType: 'entity_object',
|
|
239
240
|
BypassCache: true,
|
|
240
241
|
},
|
|
@@ -259,6 +260,7 @@ export class ConversationRunEventsResolver {
|
|
|
259
260
|
ExtraFilter: `ConversationDetailID='${this.escape(conversationDetailID)}'`,
|
|
260
261
|
OrderBy: '__mj_CreatedAt DESC',
|
|
261
262
|
MaxRows: 1,
|
|
263
|
+
SkipTotalRowCount: true,
|
|
262
264
|
Fields: RUN_FIELDS,
|
|
263
265
|
ResultType: 'simple',
|
|
264
266
|
BypassCache: true,
|
|
@@ -12,13 +12,13 @@ const REMOTE_OP_PROGRESS_TOPIC = 'RemoteOperationProgress';
|
|
|
12
12
|
/** Input for the generic Remote Operation transport mutation. */
|
|
13
13
|
@InputType()
|
|
14
14
|
export class ExecuteRemoteOperationInput {
|
|
15
|
-
@Field()
|
|
15
|
+
@Field(() => String)
|
|
16
16
|
operationKey: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
17
17
|
|
|
18
|
-
@Field()
|
|
18
|
+
@Field(() => String)
|
|
19
19
|
inputJSON: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
20
20
|
|
|
21
|
-
@Field()
|
|
21
|
+
@Field(() => String)
|
|
22
22
|
invokeMode: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
23
23
|
|
|
24
24
|
/**
|
|
@@ -28,16 +28,24 @@ export class ExecuteRemoteOperationInput {
|
|
|
28
28
|
*/
|
|
29
29
|
@Field(() => String, { nullable: true })
|
|
30
30
|
progressChannelId?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Optional structural contract fingerprint emitted by CodeGen (or supplied by the caller).
|
|
34
|
+
* When provided, the server rejects requests whose fingerprint diverges from the server's
|
|
35
|
+
* active operation contract with `ResultCode = 'CONTRACT_MISMATCH'`.
|
|
36
|
+
*/
|
|
37
|
+
@Field(() => String, { nullable: true })
|
|
38
|
+
contractFingerprint?: string; // case-violation-ok-legacy-back-compat: matches camelCase GraphQL input field convention on ExecuteRemoteOperationInput
|
|
31
39
|
}
|
|
32
40
|
|
|
33
41
|
/** A single streamed progress envelope delivered over the `RemoteOperationProgress` subscription. */
|
|
34
42
|
@ObjectType()
|
|
35
43
|
export class RemoteOperationProgressNotification {
|
|
36
|
-
@Field()
|
|
44
|
+
@Field(() => String)
|
|
37
45
|
ChannelId: string;
|
|
38
46
|
|
|
39
47
|
/** JSON-serialized {@link RemoteOpProgress}. */
|
|
40
|
-
@Field()
|
|
48
|
+
@Field(() => String)
|
|
41
49
|
ProgressJSON: string;
|
|
42
50
|
}
|
|
43
51
|
|
|
@@ -71,7 +79,7 @@ export class ExecuteRemoteOperationResultType {
|
|
|
71
79
|
export class ExecuteRemoteOperationResolver extends ResolverBase {
|
|
72
80
|
@Mutation(() => ExecuteRemoteOperationResultType)
|
|
73
81
|
async ExecuteRemoteOperation(
|
|
74
|
-
@Arg('input') input: ExecuteRemoteOperationInput,
|
|
82
|
+
@Arg('input', () => ExecuteRemoteOperationInput) input: ExecuteRemoteOperationInput,
|
|
75
83
|
@Ctx() ctx: AppContext,
|
|
76
84
|
@PubSub() pubSub: PubSubEngine,
|
|
77
85
|
): Promise<ExecuteRemoteOperationResultType> {
|
|
@@ -111,9 +119,24 @@ export class ExecuteRemoteOperationResolver extends ResolverBase {
|
|
|
111
119
|
return fail(invokability.ResultCode ?? 'OPERATION_UNAVAILABLE', invokability.Reason ?? `Operation '${key}' is unavailable`);
|
|
112
120
|
}
|
|
113
121
|
|
|
114
|
-
|
|
122
|
+
// (5) Contract fingerprint gate: when the client sends a contractFingerprint, verify it against
|
|
123
|
+
// the active server operation's ContractFingerprint (or metadata-derived fingerprint) so stale
|
|
124
|
+
// client bundles fail loudly with CONTRACT_MISMATCH rather than mis-deserializing.
|
|
125
|
+
const clientFingerprint = input.contractFingerprint?.trim();
|
|
126
|
+
if (clientFingerprint) {
|
|
127
|
+
const expectedFingerprint =
|
|
128
|
+
opDecl?.ContractFingerprint ?? RemoteOperationEngineBase.Instance.GetContractFingerprint(key);
|
|
129
|
+
if (expectedFingerprint && clientFingerprint !== expectedFingerprint) {
|
|
130
|
+
return fail(
|
|
131
|
+
'CONTRACT_MISMATCH',
|
|
132
|
+
`Contract fingerprint mismatch for operation '${key}' (client='${clientFingerprint}', server='${expectedFingerprint}')`,
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
let parsedInput: object | string | number | boolean | null;
|
|
115
138
|
try {
|
|
116
|
-
parsedInput = input.inputJSON ? JSON.parse(input.inputJSON) : {};
|
|
139
|
+
parsedInput = input.inputJSON ? (JSON.parse(input.inputJSON) as object | string | number | boolean | null) : {};
|
|
117
140
|
} catch (e) {
|
|
118
141
|
return fail('INVALID_INPUT_JSON', `Invalid input JSON: ${e instanceof Error ? e.message : String(e)}`);
|
|
119
142
|
}
|
|
@@ -127,7 +150,16 @@ export class ExecuteRemoteOperationResolver extends ResolverBase {
|
|
|
127
150
|
: undefined;
|
|
128
151
|
|
|
129
152
|
// Route through the per-request provider (server in-process path; runs the op's Authorize + InternalExecute).
|
|
130
|
-
const result = await provider.RouteOperation(key, parsedInput, {
|
|
153
|
+
const result = await provider.RouteOperation(key, parsedInput, {
|
|
154
|
+
user,
|
|
155
|
+
mode: input.invokeMode as RemoteOpInvokeMode,
|
|
156
|
+
onProgress,
|
|
157
|
+
contractFingerprint: clientFingerprint,
|
|
158
|
+
requestOrigin: ctx.RequestOrigin,
|
|
159
|
+
clientIp: ctx.ClientIp,
|
|
160
|
+
sessionId: ctx.userPayload?.sessionId,
|
|
161
|
+
apiKeyHash: ctx.userPayload?.apiKeyHash,
|
|
162
|
+
});
|
|
131
163
|
|
|
132
164
|
return {
|
|
133
165
|
success: result.Success,
|
|
@@ -6,6 +6,7 @@ import { QueryCompositionEngine } from '@memberjunction/generic-database-provide
|
|
|
6
6
|
import { RequireSystemUser } from '../directives/RequireSystemUser.js';
|
|
7
7
|
import { NoLog } from '../logging/NoLog.js';
|
|
8
8
|
import { v4 as uuidv4 } from 'uuid';
|
|
9
|
+
import { createHash, timingSafeEqual } from 'node:crypto';
|
|
9
10
|
import { GetReadOnlyDataSource, GetReadOnlyProvider } from '../util.js';
|
|
10
11
|
import { GetDbType } from '../index.js';
|
|
11
12
|
import { GetSystemUser } from '../auth/index.js';
|
|
@@ -125,9 +126,9 @@ export class GetDataResolver {
|
|
|
125
126
|
});
|
|
126
127
|
LogStatus(`GetData invoked: ${input.Queries.length} queries`);
|
|
127
128
|
|
|
128
|
-
// validate the token
|
|
129
|
+
// validate the token (never echo the raw token into error messages or logs — Token is @NoLog)
|
|
129
130
|
if (!IsTokenValid(input.Token)) {
|
|
130
|
-
throw new Error(
|
|
131
|
+
throw new Error('Access token is not valid or has expired');
|
|
131
132
|
}
|
|
132
133
|
|
|
133
134
|
// Use the read-only connection for executing queries
|
|
@@ -296,6 +297,26 @@ export class GetDataAccessToken {
|
|
|
296
297
|
const __accessTokens: GetDataAccessToken[] = [];
|
|
297
298
|
const __defaultTokenLifeSpan = 1000 * 60 * 5; // 5 minutes
|
|
298
299
|
|
|
300
|
+
/**
|
|
301
|
+
* Non-short-circuiting constant-time scan over active access tokens: hashes the presented token
|
|
302
|
+
* once and compares against every stored token digest with `timingSafeEqual` without breaking early,
|
|
303
|
+
* so neither prefix similarity, token length, nor array index leaks through timing.
|
|
304
|
+
*/
|
|
305
|
+
function findMatchingAccessTokenIndex(token: string): number {
|
|
306
|
+
if (typeof token !== 'string' || token.length === 0) {
|
|
307
|
+
return -1;
|
|
308
|
+
}
|
|
309
|
+
const targetDigest = createHash('sha256').update(token).digest();
|
|
310
|
+
let matchedIndex = -1;
|
|
311
|
+
for (let i = 0; i < __accessTokens.length; i++) {
|
|
312
|
+
const candidateDigest = createHash('sha256').update(__accessTokens[i].Token).digest();
|
|
313
|
+
if (timingSafeEqual(candidateDigest, targetDigest)) {
|
|
314
|
+
matchedIndex = i;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return matchedIndex;
|
|
318
|
+
}
|
|
319
|
+
|
|
299
320
|
/**
|
|
300
321
|
* Removes every token whose `ExpiresAt` has already passed (and its `TokenUses`
|
|
301
322
|
* log along with it). Without this sweep `__accessTokens` grows forever — nothing
|
|
@@ -339,7 +360,7 @@ export function RegisterAccessToken(token?: string, lifeSpan: number = __default
|
|
|
339
360
|
|
|
340
361
|
if (TokenExists(tokenToUse)) {
|
|
341
362
|
// should never happen if we used the uuidv4() function but could happen if someone tries to use a custom token
|
|
342
|
-
throw new Error(
|
|
363
|
+
throw new Error('Access token already exists');
|
|
343
364
|
}
|
|
344
365
|
|
|
345
366
|
const newToken = new GetDataAccessToken();
|
|
@@ -356,12 +377,12 @@ export function registerAccessToken(token?: string, lifeSpan: number = __default
|
|
|
356
377
|
return RegisterAccessToken(token, lifeSpan, requestorPayload);
|
|
357
378
|
}
|
|
358
379
|
export function DeleteAccessToken(token: string) {
|
|
359
|
-
const index =
|
|
380
|
+
const index = findMatchingAccessTokenIndex(token);
|
|
360
381
|
if (index >= 0) {
|
|
361
382
|
__accessTokens.splice(index, 1);
|
|
362
383
|
}
|
|
363
384
|
else {
|
|
364
|
-
throw new Error(
|
|
385
|
+
throw new Error('Access token does not exist');
|
|
365
386
|
}
|
|
366
387
|
}
|
|
367
388
|
|
|
@@ -370,7 +391,7 @@ export function deleteAccessToken(token: string) {
|
|
|
370
391
|
return DeleteAccessToken(token);
|
|
371
392
|
}
|
|
372
393
|
export function TokenExists(token: string) {
|
|
373
|
-
return
|
|
394
|
+
return findMatchingAccessTokenIndex(token) >= 0;
|
|
374
395
|
}
|
|
375
396
|
|
|
376
397
|
/** @deprecated Use {@link TokenExists}. */
|
|
@@ -378,9 +399,9 @@ export function tokenExists(token: string) {
|
|
|
378
399
|
return TokenExists(token);
|
|
379
400
|
}
|
|
380
401
|
export function IsTokenValid(token: string) {
|
|
381
|
-
const
|
|
382
|
-
if (
|
|
383
|
-
return
|
|
402
|
+
const index = findMatchingAccessTokenIndex(token);
|
|
403
|
+
if (index >= 0) {
|
|
404
|
+
return __accessTokens[index].ExpiresAt > new Date();
|
|
384
405
|
}
|
|
385
406
|
return false;
|
|
386
407
|
}
|
|
@@ -390,15 +411,16 @@ export function isTokenValid(token: string) {
|
|
|
390
411
|
return IsTokenValid(token);
|
|
391
412
|
}
|
|
392
413
|
export function RecordTokenUse(token: string, usePayload: any) {
|
|
393
|
-
const
|
|
394
|
-
if (
|
|
414
|
+
const index = findMatchingAccessTokenIndex(token);
|
|
415
|
+
if (index >= 0) {
|
|
416
|
+
const t = __accessTokens[index];
|
|
395
417
|
if (!t.TokenUses) {
|
|
396
418
|
t.TokenUses = [];
|
|
397
419
|
}
|
|
398
|
-
t.TokenUses.push({ Token:
|
|
420
|
+
t.TokenUses.push({ Token: t.Token, UsedAt: new Date(), UsePayload: usePayload });
|
|
399
421
|
}
|
|
400
422
|
else {
|
|
401
|
-
throw new Error(
|
|
423
|
+
throw new Error('Access token does not exist');
|
|
402
424
|
}
|
|
403
425
|
}
|
|
404
426
|
|
|
@@ -42,7 +42,7 @@ export class InfoResolver {
|
|
|
42
42
|
Version: packageJson.version,
|
|
43
43
|
IsSystemUser: Boolean(context.userPayload.isSystemUser),
|
|
44
44
|
Platform: os.platform(),
|
|
45
|
-
Arch: os.
|
|
45
|
+
Arch: os.arch(),
|
|
46
46
|
CpuModel: os.cpus()?.[0].model,
|
|
47
47
|
Hostname: os.hostname(),
|
|
48
48
|
};
|