@memberjunction/server 6.2.0-edge.0 → 6.2.0-edge.1
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/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/ReturningVisitorRecap.d.ts +2 -0
- package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -1
- package/dist/agentSessions/ReturningVisitorRecap.js +5 -1
- package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
- package/dist/agentSessions/SessionManager.js +2 -2
- package/dist/agentSessions/remoteBrowserGoalEngine.d.ts +8 -0
- package/dist/agentSessions/remoteBrowserGoalEngine.d.ts.map +1 -1
- package/dist/agentSessions/remoteBrowserGoalEngine.js +21 -5
- package/dist/agentSessions/remoteBrowserGoalEngine.js.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.d.ts +2 -0
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +5 -1
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/index.d.ts +20 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +20 -10
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.d.ts +8 -0
- package/dist/auth/initializeProviders.d.ts.map +1 -1
- package/dist/auth/initializeProviders.js +21 -5
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts +9 -0
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +22 -10
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.d.ts +17 -15
- package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +65 -51
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/magicLink/index.d.ts +2 -2
- package/dist/auth/magicLink/index.d.ts.map +1 -1
- package/dist/auth/magicLink/index.js +2 -2
- package/dist/auth/magicLink/index.js.map +1 -1
- package/dist/auth/magicLink/magicLinkCore.d.ts +54 -33
- package/dist/auth/magicLink/magicLinkCore.d.ts.map +1 -1
- package/dist/auth/magicLink/magicLinkCore.js +61 -61
- package/dist/auth/magicLink/magicLinkCore.js.map +1 -1
- package/dist/auth/magicLink/redeemLanding.d.ts +4 -0
- package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
- package/dist/auth/magicLink/redeemLanding.js +12 -4
- package/dist/auth/magicLink/redeemLanding.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +4 -4
- package/dist/auth/principals.d.ts +2 -0
- package/dist/auth/principals.d.ts.map +1 -1
- package/dist/auth/principals.js +6 -2
- package/dist/auth/principals.js.map +1 -1
- package/dist/cache.d.ts +2 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +3 -1
- package/dist/cache.js.map +1 -1
- package/dist/config.d.ts +346 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -4
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +20 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -19
- package/dist/context.js.map +1 -1
- package/dist/directives/Public.d.ts +2 -0
- package/dist/directives/Public.d.ts.map +1 -1
- package/dist/directives/Public.js +3 -1
- package/dist/directives/Public.js.map +1 -1
- package/dist/directives/RequireSystemUser.d.ts +2 -0
- package/dist/directives/RequireSystemUser.d.ts.map +1 -1
- package/dist/directives/RequireSystemUser.js +3 -1
- package/dist/directives/RequireSystemUser.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +11 -0
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +48 -0
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +94 -4
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +122 -3
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/DeleteOptionsInput.d.ts +8 -1
- package/dist/generic/DeleteOptionsInput.d.ts.map +1 -1
- package/dist/generic/DeleteOptionsInput.js +1 -1
- package/dist/generic/DeleteOptionsInput.js.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.d.ts +3 -1
- package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.js +8 -4
- package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
- package/dist/generic/PushStatusResolver.d.ts +10 -1
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +11 -3
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +5 -1
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +15 -8
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -9
- package/dist/index.js.map +1 -1
- package/dist/integration/CustomColumnPromoter.d.ts +2 -0
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +5 -1
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/integration/EntityMapLifecycle.d.ts +4 -0
- package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
- package/dist/integration/EntityMapLifecycle.js +10 -2
- package/dist/integration/EntityMapLifecycle.js.map +1 -1
- package/dist/logging/NoLog.d.ts +4 -0
- package/dist/logging/NoLog.d.ts.map +1 -1
- package/dist/logging/NoLog.js +10 -2
- package/dist/logging/NoLog.js.map +1 -1
- package/dist/logging/StartupLogger.d.ts +2 -0
- package/dist/logging/StartupLogger.d.ts.map +1 -1
- package/dist/logging/StartupLogger.js +5 -1
- package/dist/logging/StartupLogger.js.map +1 -1
- package/dist/logging/bootAudit.d.ts +11 -7
- package/dist/logging/bootAudit.d.ts.map +1 -1
- package/dist/logging/bootAudit.js +15 -7
- package/dist/logging/bootAudit.js.map +1 -1
- package/dist/logging/boundaryLogPayload.d.ts +4 -0
- package/dist/logging/boundaryLogPayload.d.ts.map +1 -1
- package/dist/logging/boundaryLogPayload.js +5 -1
- package/dist/logging/boundaryLogPayload.js.map +1 -1
- package/dist/logging/secretRedactor.d.ts +2 -0
- package/dist/logging/secretRedactor.d.ts.map +1 -1
- package/dist/logging/secretRedactor.js +8 -4
- package/dist/logging/secretRedactor.js.map +1 -1
- package/dist/logging/shortenForLog.d.ts +2 -0
- package/dist/logging/shortenForLog.d.ts.map +1 -1
- package/dist/logging/shortenForLog.js +7 -3
- package/dist/logging/shortenForLog.js.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.d.ts +2 -0
- package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.js +8 -6
- package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
- package/dist/metadataRefreshSignal.d.ts +19 -0
- package/dist/metadataRefreshSignal.d.ts.map +1 -0
- package/dist/metadataRefreshSignal.js +45 -0
- package/dist/metadataRefreshSignal.js.map +1 -0
- package/dist/middleware/MJTenantFilterMiddleware.js +4 -4
- package/dist/multiTenancy/index.d.ts +8 -0
- package/dist/multiTenancy/index.d.ts.map +1 -1
- package/dist/multiTenancy/index.js +21 -5
- package/dist/multiTenancy/index.js.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.d.ts +5 -0
- package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.js +14 -10
- package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.d.ts +6 -6
- package/dist/realtimeWidget/WidgetSessionService.js +27 -27
- package/dist/realtimeWidget/host-identity.d.ts +5 -1
- package/dist/realtimeWidget/host-identity.d.ts.map +1 -1
- package/dist/realtimeWidget/host-identity.js +11 -3
- package/dist/realtimeWidget/host-identity.js.map +1 -1
- package/dist/realtimeWidget/index.d.ts +2 -2
- package/dist/realtimeWidget/index.d.ts.map +1 -1
- package/dist/realtimeWidget/index.js +2 -2
- package/dist/realtimeWidget/index.js.map +1 -1
- package/dist/realtimeWidget/visitorIdentity.d.ts +21 -1
- package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
- package/dist/realtimeWidget/visitorIdentity.js +16 -4
- package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts +48 -0
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +38 -10
- package/dist/realtimeWidget/widgetCore.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts +10 -6
- package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +14 -6
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +3 -3
- package/dist/resolvers/FileResolver.js +3 -3
- package/dist/resolvers/GeoResolver.d.ts +2 -2
- package/dist/resolvers/GeoResolver.js +4 -4
- package/dist/resolvers/GetDataResolver.d.ts +14 -0
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +43 -15
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +2 -2
- package/dist/resolvers/ListOperationsResolver.d.ts +20 -0
- package/dist/resolvers/ListOperationsResolver.d.ts.map +1 -1
- package/dist/resolvers/ListOperationsResolver.js +68 -28
- package/dist/resolvers/ListOperationsResolver.js.map +1 -1
- package/dist/resolvers/MCPResolver.d.ts +11 -1
- package/dist/resolvers/MCPResolver.d.ts.map +1 -1
- package/dist/resolvers/MCPResolver.js +7 -3
- package/dist/resolvers/MCPResolver.js.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +3 -3
- package/dist/resolvers/RealtimeClientSessionResolver.js +3 -3
- package/dist/resolvers/RemoteBrowserActionResolver.js +5 -5
- package/dist/resolvers/RunAIAgentResolver.d.ts +10 -4
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +69 -38
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +2 -2
- package/dist/resolvers/RunTestResolver.js +5 -5
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts +8 -4
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +5 -5
- package/dist/resolvers/TaskGraphFrameResolver.d.ts +8 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.js +6 -2
- package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
- package/dist/resolvers/adhoc-query-helpers.d.ts +6 -0
- package/dist/resolvers/adhoc-query-helpers.d.ts.map +1 -1
- package/dist/resolvers/adhoc-query-helpers.js +10 -2
- package/dist/resolvers/adhoc-query-helpers.js.map +1 -1
- package/dist/resolvers/artifact-routing.d.ts +8 -8
- package/dist/resolvers/artifact-routing.js +2 -2
- package/dist/resolvers/artifact-routing.js.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.d.ts +10 -2
- package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.js +24 -8
- package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
- package/dist/resolvers/peaksSidecar.d.ts +4 -0
- package/dist/resolvers/peaksSidecar.d.ts.map +1 -1
- package/dist/resolvers/peaksSidecar.js +10 -2
- package/dist/resolvers/peaksSidecar.js.map +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts +28 -0
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +20 -4
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/MediaStreamHandler.d.ts +2 -0
- package/dist/rest/MediaStreamHandler.d.ts.map +1 -1
- package/dist/rest/MediaStreamHandler.js +10 -6
- package/dist/rest/MediaStreamHandler.js.map +1 -1
- package/dist/rest/OAuthCallbackHandler.d.ts +9 -0
- package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
- package/dist/rest/OAuthCallbackHandler.js +15 -3
- package/dist/rest/OAuthCallbackHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts +6 -4
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +15 -11
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/RealtimeSdpBrokerHandler.d.ts +5 -1
- package/dist/rest/RealtimeSdpBrokerHandler.d.ts.map +1 -1
- package/dist/rest/RealtimeSdpBrokerHandler.js +12 -4
- package/dist/rest/RealtimeSdpBrokerHandler.js.map +1 -1
- package/dist/rest/SignatureWebhookHandler.d.ts +2 -0
- package/dist/rest/SignatureWebhookHandler.d.ts.map +1 -1
- package/dist/rest/SignatureWebhookHandler.js +5 -1
- package/dist/rest/SignatureWebhookHandler.js.map +1 -1
- package/dist/rest/UploadTokenManager.d.ts +24 -8
- package/dist/rest/UploadTokenManager.d.ts.map +1 -1
- package/dist/rest/UploadTokenManager.js +53 -21
- package/dist/rest/UploadTokenManager.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +20 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +20 -4
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/mediaRange.d.ts +4 -0
- package/dist/rest/mediaRange.d.ts.map +1 -1
- package/dist/rest/mediaRange.js +10 -2
- package/dist/rest/mediaRange.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +4 -0
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +13 -7
- package/dist/rest/setupRESTEndpoints.js.map +1 -1
- package/dist/serverExtensionReservedRoots.d.ts +2 -0
- package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
- package/dist/serverExtensionReservedRoots.js +5 -1
- package/dist/serverExtensionReservedRoots.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts +13 -8
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +16 -15
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -3
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +6 -0
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +13 -5
- package/dist/util.js.map +1 -1
- package/package.json +92 -92
- package/src/__tests__/DeleteOptionsInput.wireShape.test.ts +62 -0
- package/src/__tests__/FileResolverPeaks.test.ts +13 -13
- package/src/__tests__/ListOperationsResolver.test.ts +17 -17
- package/src/__tests__/MediaStreamHandler.test.ts +28 -28
- package/src/__tests__/NoLog.test.ts +11 -11
- package/src/__tests__/PrimaryKeyAlwaysMapped.test.ts +10 -10
- package/src/__tests__/RESTEndpointHandler.test.ts +14 -14
- package/src/__tests__/RealtimeBridgeResolver.test.ts +4 -2
- package/src/__tests__/RealtimeSdpBrokerHandler.test.ts +6 -6
- package/src/__tests__/RefreshAdoptsNewColumns.test.ts +8 -8
- package/src/__tests__/RemoteBrowserGoalEngine.test.ts +18 -18
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +228 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +129 -0
- package/src/__tests__/TaskGraphFrameResolver.test.ts +2 -2
- package/src/__tests__/WidgetSessionService.test.ts +8 -4
- package/src/__tests__/adhoc-query-helpers.test.ts +21 -21
- package/src/__tests__/bootAudit.test.ts +11 -11
- package/src/__tests__/boundaryLogPayload.test.ts +6 -6
- package/src/__tests__/cacheInvalidationRecordData.test.ts +177 -0
- package/src/__tests__/databaseAbstraction.test.ts +12 -6
- package/src/__tests__/getDataTokenRedaction.test.ts +7 -7
- package/src/__tests__/initializeProviders.refresh.test.ts +4 -4
- package/src/__tests__/magicLink.test.ts +73 -134
- package/src/__tests__/magicLinkService.consume.test.ts +224 -0
- package/src/__tests__/meetingRecordingRegistration.test.ts +12 -12
- package/src/__tests__/metadataRefreshSignal.test.ts +78 -0
- package/src/__tests__/multiTenancy.security.test.ts +40 -40
- package/src/__tests__/multiTenancy.test.ts +18 -18
- package/src/__tests__/newUsers.test.ts +24 -23
- package/src/__tests__/principals.test.ts +22 -22
- package/src/__tests__/pushStatusResolver.filter.test.ts +8 -8
- package/src/__tests__/secretRedactor.failOpen.test.ts +12 -12
- package/src/__tests__/secretRedactor.test.ts +12 -12
- package/src/__tests__/serverExtensionReservedRoots.test.ts +7 -7
- package/src/__tests__/subscriptionRedaction.test.ts +5 -5
- package/src/__tests__/unifiedAuth.test.ts +15 -9
- package/src/__tests__/visitorIdentity.resolve.test.ts +6 -6
- package/src/__tests__/widget.test.ts +45 -45
- package/src/__tests__/widgetGuestElevation.test.ts +7 -7
- package/src/__tests__/widgetHostIdentity.test.ts +14 -14
- package/src/agentSessions/ReturningVisitorRecap.ts +12 -1
- package/src/agentSessions/SessionManager.ts +2 -2
- package/src/agentSessions/remoteBrowserGoalEngine.ts +30 -5
- package/src/auth/AuthProviderCatalogRouter.ts +6 -1
- package/src/auth/__tests__/backward-compatibility.test.ts +3 -3
- package/src/auth/index.ts +43 -28
- package/src/auth/initializeProviders.ts +25 -5
- package/src/auth/magicLink/MagicLinkRouter.ts +28 -10
- package/src/auth/magicLink/MagicLinkService.ts +71 -52
- package/src/auth/magicLink/index.ts +7 -7
- package/src/auth/magicLink/magicLinkCore.ts +96 -64
- package/src/auth/magicLink/redeemLanding.ts +14 -4
- package/src/auth/magicLink/types.ts +54 -54
- package/src/auth/newUsers.ts +1 -1
- package/src/auth/principals.ts +11 -2
- package/src/cache.ts +4 -1
- package/src/config.ts +37 -4
- package/src/context.ts +37 -24
- package/src/directives/Public.ts +4 -1
- package/src/directives/RequireSystemUser.ts +4 -1
- package/src/generated/graphql-schemas/__mj.ts +37 -0
- package/src/generic/CacheInvalidationResolver.ts +148 -4
- package/src/generic/DeleteOptionsInput.ts +9 -2
- package/src/generic/FireAndForgetHeartbeat.ts +19 -14
- package/src/generic/PushStatusResolver.ts +21 -7
- package/src/generic/ResolverBase.ts +16 -8
- package/src/generic/RunViewResolver.ts +22 -22
- package/src/generic/__tests__/FireAndForgetHeartbeat.test.ts +7 -7
- package/src/index.ts +35 -9
- package/src/integration/CustomColumnPromoter.ts +6 -1
- package/src/integration/EntityMapLifecycle.ts +20 -2
- package/src/logging/NoLog.ts +16 -2
- package/src/logging/StartupLogger.ts +6 -1
- package/src/logging/bootAudit.ts +26 -16
- package/src/logging/boundaryLogPayload.ts +8 -1
- package/src/logging/secretRedactor.ts +14 -9
- package/src/logging/shortenForLog.ts +8 -3
- package/src/logging/variablesLoggingMiddleware.ts +9 -6
- package/src/metadataRefreshSignal.ts +45 -0
- package/src/middleware/MJTenantFilterMiddleware.ts +4 -4
- package/src/multiTenancy/index.ts +29 -5
- package/src/realtimeWidget/WidgetRouter.ts +15 -10
- package/src/realtimeWidget/WidgetSessionService.ts +76 -76
- package/src/realtimeWidget/host-identity.ts +24 -10
- package/src/realtimeWidget/index.ts +3 -3
- package/src/realtimeWidget/visitorIdentity.ts +39 -8
- package/src/realtimeWidget/widgetCore.ts +75 -10
- package/src/realtimeWidget/widgetGuestElevation.ts +25 -12
- package/src/resolvers/AdhocQueryResolver.ts +3 -3
- package/src/resolvers/AgentSessionResolver.ts +3 -3
- package/src/resolvers/ColorResolver.ts +6 -6
- package/src/resolvers/ComponentRegistryResolver.ts +36 -36
- package/src/resolvers/EntityCommunicationsResolver.ts +4 -4
- package/src/resolvers/ExecuteRemoteOperationResolver.ts +9 -9
- package/src/resolvers/FileResolver.ts +42 -42
- package/src/resolvers/GeoResolver.ts +4 -4
- package/src/resolvers/GetDataResolver.ts +50 -15
- package/src/resolvers/IntegrationDiscoveryResolver.ts +2 -2
- package/src/resolvers/ListOperationsResolver.ts +78 -28
- package/src/resolvers/MCPResolver.ts +30 -15
- package/src/resolvers/QueryResolver.ts +13 -13
- package/src/resolvers/RealtimeBridgeResolver.ts +3 -3
- package/src/resolvers/RealtimeClientSessionResolver.ts +3 -3
- package/src/resolvers/RemoteBrowserActionResolver.ts +5 -5
- package/src/resolvers/RunAIAgentResolver.ts +113 -72
- package/src/resolvers/RunAIPromptResolver.ts +22 -22
- package/src/resolvers/RunTemplateResolver.ts +4 -4
- package/src/resolvers/RunTestResolver.ts +25 -25
- package/src/resolvers/SqlLoggingConfigResolver.ts +56 -56
- package/src/resolvers/TaskGraphFrameResolver.ts +37 -28
- package/src/resolvers/TelemetryResolver.ts +79 -79
- package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +40 -38
- package/src/resolvers/__tests__/artifact-routing.test.ts +23 -23
- package/src/resolvers/adhoc-query-helpers.ts +19 -2
- package/src/resolvers/artifact-routing.ts +19 -19
- package/src/resolvers/meetingRecordingRegistration.ts +44 -10
- package/src/resolvers/peaksSidecar.ts +12 -2
- package/src/rest/EntityCRUDHandler.ts +24 -4
- package/src/rest/MediaStreamHandler.ts +11 -6
- package/src/rest/OAuthCallbackHandler.ts +25 -7
- package/src/rest/RESTEndpointHandler.ts +20 -15
- package/src/rest/RealtimeSdpBrokerHandler.ts +14 -4
- package/src/rest/SignatureWebhookHandler.ts +6 -1
- package/src/rest/UploadTokenManager.ts +66 -30
- package/src/rest/ViewOperationsHandler.ts +24 -4
- package/src/rest/mediaRange.ts +16 -6
- package/src/rest/setupRESTEndpoints.ts +24 -12
- package/src/serverExtensionReservedRoots.ts +6 -1
- package/src/services/TaskGraphActionRunner.ts +16 -15
- package/src/types.ts +21 -16
- package/src/util.ts +16 -6
|
@@ -21,7 +21,7 @@ import { SignatureEngine } from '@memberjunction/esignature/server';
|
|
|
21
21
|
* Build an Express router exposing the eSignature webhook. Mount it unauthenticated:
|
|
22
22
|
* `app.use('/esignature', createSignatureWebhookHandler())`.
|
|
23
23
|
*/
|
|
24
|
-
export function
|
|
24
|
+
export function CreateSignatureWebhookHandler(): express.Router {
|
|
25
25
|
const router = express.Router();
|
|
26
26
|
|
|
27
27
|
// Capture the raw body so drivers that HMAC-verify over the exact bytes can do so.
|
|
@@ -36,6 +36,11 @@ export function createSignatureWebhookHandler(): express.Router {
|
|
|
36
36
|
return router;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
/** @deprecated Use {@link CreateSignatureWebhookHandler}. */
|
|
40
|
+
export function createSignatureWebhookHandler(): express.Router {
|
|
41
|
+
return CreateSignatureWebhookHandler();
|
|
42
|
+
}
|
|
43
|
+
|
|
39
44
|
/** Stash the raw request bytes on the request for signature verification by the driver. */
|
|
40
45
|
function captureRawBody(req: express.Request, _res: express.Response, buf: Buffer): void {
|
|
41
46
|
(req as RawBodyRequest).rawBody = buf;
|
|
@@ -22,15 +22,15 @@ import { randomBytes } from 'node:crypto';
|
|
|
22
22
|
* An ephemeral in-memory staged upload record.
|
|
23
23
|
*/
|
|
24
24
|
export interface StagedUploadEntry {
|
|
25
|
-
token: string;
|
|
26
|
-
|
|
27
|
-
fileName: string;
|
|
28
|
-
mimeType: string;
|
|
29
|
-
|
|
30
|
-
userId: string;
|
|
31
|
-
|
|
32
|
-
expiresAt: number;
|
|
33
|
-
|
|
25
|
+
token: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined
|
|
26
|
+
Buffer: Buffer;
|
|
27
|
+
fileName: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined
|
|
28
|
+
mimeType: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined
|
|
29
|
+
ContentLength: number;
|
|
30
|
+
userId: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined
|
|
31
|
+
CreatedAt: number;
|
|
32
|
+
expiresAt: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined
|
|
33
|
+
Timer: NodeJS.Timeout;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
/**
|
|
@@ -47,10 +47,46 @@ export class UploadTokenManager extends BaseSingleton<UploadTokenManager> {
|
|
|
47
47
|
private readonly _staged = new Map<string, StagedUploadEntry>();
|
|
48
48
|
private _totalMemoryBytes = 0;
|
|
49
49
|
|
|
50
|
-
public
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
public
|
|
50
|
+
public DefaultTtlSeconds = 300;
|
|
51
|
+
|
|
52
|
+
/** @deprecated Use {@link DefaultTtlSeconds}. */
|
|
53
|
+
public get defaultTtlSeconds() {
|
|
54
|
+
return this.DefaultTtlSeconds;
|
|
55
|
+
}
|
|
56
|
+
/** @deprecated Use {@link DefaultTtlSeconds}. */
|
|
57
|
+
public set defaultTtlSeconds(value) {
|
|
58
|
+
this.DefaultTtlSeconds = value;
|
|
59
|
+
} // 5 minutes
|
|
60
|
+
public MaxFileSizeBytes = 100 * 1024 * 1024;
|
|
61
|
+
|
|
62
|
+
/** @deprecated Use {@link MaxFileSizeBytes}. */
|
|
63
|
+
public get maxFileSizeBytes() {
|
|
64
|
+
return this.MaxFileSizeBytes;
|
|
65
|
+
}
|
|
66
|
+
/** @deprecated Use {@link MaxFileSizeBytes}. */
|
|
67
|
+
public set maxFileSizeBytes(value) {
|
|
68
|
+
this.MaxFileSizeBytes = value;
|
|
69
|
+
} // 100 MB
|
|
70
|
+
public MaxUserMemoryBytes = 150 * 1024 * 1024;
|
|
71
|
+
|
|
72
|
+
/** @deprecated Use {@link MaxUserMemoryBytes}. */
|
|
73
|
+
public get maxUserMemoryBytes() {
|
|
74
|
+
return this.MaxUserMemoryBytes;
|
|
75
|
+
}
|
|
76
|
+
/** @deprecated Use {@link MaxUserMemoryBytes}. */
|
|
77
|
+
public set maxUserMemoryBytes(value) {
|
|
78
|
+
this.MaxUserMemoryBytes = value;
|
|
79
|
+
} // 150 MB per user
|
|
80
|
+
public MaxPoolMemoryBytes = 500 * 1024 * 1024;
|
|
81
|
+
|
|
82
|
+
/** @deprecated Use {@link MaxPoolMemoryBytes}. */
|
|
83
|
+
public get maxPoolMemoryBytes() {
|
|
84
|
+
return this.MaxPoolMemoryBytes;
|
|
85
|
+
}
|
|
86
|
+
/** @deprecated Use {@link MaxPoolMemoryBytes}. */
|
|
87
|
+
public set maxPoolMemoryBytes(value) {
|
|
88
|
+
this.MaxPoolMemoryBytes = value;
|
|
89
|
+
} // 500 MB
|
|
54
90
|
|
|
55
91
|
// Public constructor required by BaseSingleton
|
|
56
92
|
public constructor() {
|
|
@@ -68,7 +104,7 @@ export class UploadTokenManager extends BaseSingleton<UploadTokenManager> {
|
|
|
68
104
|
let total = 0;
|
|
69
105
|
for (const entry of this._staged.values()) {
|
|
70
106
|
if (UUIDsEqual(entry.userId, userId)) {
|
|
71
|
-
total += entry.
|
|
107
|
+
total += entry.ContentLength;
|
|
72
108
|
}
|
|
73
109
|
}
|
|
74
110
|
return total;
|
|
@@ -88,27 +124,27 @@ export class UploadTokenManager extends BaseSingleton<UploadTokenManager> {
|
|
|
88
124
|
}): string {
|
|
89
125
|
const size = params.buffer.length;
|
|
90
126
|
|
|
91
|
-
if (size > this.
|
|
127
|
+
if (size > this.MaxFileSizeBytes) {
|
|
92
128
|
throw new Error(
|
|
93
|
-
`Staged upload exceeds maximum allowed file size of ${Math.round(this.
|
|
129
|
+
`Staged upload exceeds maximum allowed file size of ${Math.round(this.MaxFileSizeBytes / (1024 * 1024))}MB (received ${Math.round(size / (1024 * 1024))}MB).`
|
|
94
130
|
);
|
|
95
131
|
}
|
|
96
132
|
|
|
97
133
|
const userCurrentBytes = this.GetUserMemoryBytes(params.userId);
|
|
98
|
-
if (userCurrentBytes + size > this.
|
|
134
|
+
if (userCurrentBytes + size > this.MaxUserMemoryBytes) {
|
|
99
135
|
throw new Error(
|
|
100
|
-
`Per-user upload memory quota reached (${Math.round(userCurrentBytes / (1024 * 1024))}MB / ${Math.round(this.
|
|
136
|
+
`Per-user upload memory quota reached (${Math.round(userCurrentBytes / (1024 * 1024))}MB / ${Math.round(this.MaxUserMemoryBytes / (1024 * 1024))}MB used). Please wait for active uploads to finalize.`
|
|
101
137
|
);
|
|
102
138
|
}
|
|
103
139
|
|
|
104
|
-
if (this._totalMemoryBytes + size > this.
|
|
140
|
+
if (this._totalMemoryBytes + size > this.MaxPoolMemoryBytes) {
|
|
105
141
|
throw new Error(
|
|
106
|
-
`Staged upload memory capacity reached (${Math.round(this._totalMemoryBytes / (1024 * 1024))}MB / ${Math.round(this.
|
|
142
|
+
`Staged upload memory capacity reached (${Math.round(this._totalMemoryBytes / (1024 * 1024))}MB / ${Math.round(this.MaxPoolMemoryBytes / (1024 * 1024))}MB used). Please try again shortly.`
|
|
107
143
|
);
|
|
108
144
|
}
|
|
109
145
|
|
|
110
146
|
const token = 'upt_' + randomBytes(32).toString('hex');
|
|
111
|
-
const ttl = params.ttlSeconds || this.
|
|
147
|
+
const ttl = params.ttlSeconds || this.DefaultTtlSeconds;
|
|
112
148
|
const now = Date.now();
|
|
113
149
|
const expiresAt = now + ttl * 1000;
|
|
114
150
|
|
|
@@ -123,14 +159,14 @@ export class UploadTokenManager extends BaseSingleton<UploadTokenManager> {
|
|
|
123
159
|
|
|
124
160
|
const entry: StagedUploadEntry = {
|
|
125
161
|
token,
|
|
126
|
-
|
|
162
|
+
Buffer: params.buffer,
|
|
127
163
|
fileName: params.fileName,
|
|
128
164
|
mimeType: params.mimeType,
|
|
129
|
-
|
|
165
|
+
ContentLength: size,
|
|
130
166
|
userId: params.userId,
|
|
131
|
-
|
|
167
|
+
CreatedAt: now,
|
|
132
168
|
expiresAt,
|
|
133
|
-
timer,
|
|
169
|
+
Timer: timer,
|
|
134
170
|
};
|
|
135
171
|
|
|
136
172
|
this._staged.set(token, entry);
|
|
@@ -168,10 +204,10 @@ export class UploadTokenManager extends BaseSingleton<UploadTokenManager> {
|
|
|
168
204
|
this.Evict(token);
|
|
169
205
|
|
|
170
206
|
return {
|
|
171
|
-
buffer: entry.
|
|
207
|
+
buffer: entry.Buffer,
|
|
172
208
|
fileName: entry.fileName,
|
|
173
209
|
mimeType: entry.mimeType,
|
|
174
|
-
contentLength: entry.
|
|
210
|
+
contentLength: entry.ContentLength,
|
|
175
211
|
};
|
|
176
212
|
}
|
|
177
213
|
|
|
@@ -184,9 +220,9 @@ export class UploadTokenManager extends BaseSingleton<UploadTokenManager> {
|
|
|
184
220
|
return false;
|
|
185
221
|
}
|
|
186
222
|
|
|
187
|
-
clearTimeout(entry.
|
|
223
|
+
clearTimeout(entry.Timer);
|
|
188
224
|
this._staged.delete(token);
|
|
189
|
-
this._totalMemoryBytes = Math.max(0, this._totalMemoryBytes - entry.
|
|
225
|
+
this._totalMemoryBytes = Math.max(0, this._totalMemoryBytes - entry.ContentLength);
|
|
190
226
|
return true;
|
|
191
227
|
}
|
|
192
228
|
|
|
@@ -203,7 +239,7 @@ export class UploadTokenManager extends BaseSingleton<UploadTokenManager> {
|
|
|
203
239
|
/** Clears all active staged uploads. */
|
|
204
240
|
public Clear(): void {
|
|
205
241
|
for (const [, entry] of this._staged) {
|
|
206
|
-
clearTimeout(entry.
|
|
242
|
+
clearTimeout(entry.Timer);
|
|
207
243
|
}
|
|
208
244
|
this._staged.clear();
|
|
209
245
|
this._totalMemoryBytes = 0;
|
|
@@ -11,7 +11,7 @@ export class ViewOperationsHandler {
|
|
|
11
11
|
/**
|
|
12
12
|
* Run a view and return results
|
|
13
13
|
*/
|
|
14
|
-
static async
|
|
14
|
+
static async RunView(params: RunViewParams, user: UserInfo): Promise<{ success: boolean, result?: RunViewResult, error?: string }> {
|
|
15
15
|
try {
|
|
16
16
|
// Validate entity exists
|
|
17
17
|
const md = new Metadata(); // global-provider-ok: REST endpoint — no per-request provider injection in REST middleware yet
|
|
@@ -45,11 +45,16 @@ export class ViewOperationsHandler {
|
|
|
45
45
|
return { success: false, error: (error as Error)?.message || 'Unknown error' };
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
+
|
|
49
|
+
/** @deprecated Use {@link RunView}. */
|
|
50
|
+
static async runView(params: RunViewParams, user: UserInfo): Promise<{ success: boolean, result?: RunViewResult, error?: string }> {
|
|
51
|
+
return this.RunView(params, user);
|
|
52
|
+
}
|
|
48
53
|
|
|
49
54
|
/**
|
|
50
55
|
* Run multiple views in batch
|
|
51
56
|
*/
|
|
52
|
-
static async
|
|
57
|
+
static async RunViews(paramsArray: RunViewParams[], user: UserInfo): Promise<{ success: boolean, results?: RunViewResult[], error?: string }> {
|
|
53
58
|
try {
|
|
54
59
|
// Validate and sanitize each set of parameters
|
|
55
60
|
const md = new Metadata(); // global-provider-ok: REST endpoint — no per-request provider injection in REST middleware yet
|
|
@@ -86,11 +91,16 @@ export class ViewOperationsHandler {
|
|
|
86
91
|
return { success: false, error: (error as Error)?.message || 'Unknown error' };
|
|
87
92
|
}
|
|
88
93
|
}
|
|
94
|
+
|
|
95
|
+
/** @deprecated Use {@link RunViews}. */
|
|
96
|
+
static async runViews(paramsArray: RunViewParams[], user: UserInfo): Promise<{ success: boolean, results?: RunViewResult[], error?: string }> {
|
|
97
|
+
return this.RunViews(paramsArray, user);
|
|
98
|
+
}
|
|
89
99
|
|
|
90
100
|
/**
|
|
91
101
|
* List entities with optional filtering
|
|
92
102
|
*/
|
|
93
|
-
static async
|
|
103
|
+
static async ListEntities(params: RunViewParams, user: UserInfo): Promise<RunViewResult> {
|
|
94
104
|
try {
|
|
95
105
|
// Check entity exists and user has permission
|
|
96
106
|
const md = new Metadata(); // global-provider-ok: REST endpoint — no per-request provider injection in REST middleware yet
|
|
@@ -115,11 +125,16 @@ export class ViewOperationsHandler {
|
|
|
115
125
|
throw error;
|
|
116
126
|
}
|
|
117
127
|
}
|
|
128
|
+
|
|
129
|
+
/** @deprecated Use {@link ListEntities}. */
|
|
130
|
+
static async listEntities(params: RunViewParams, user: UserInfo): Promise<RunViewResult> {
|
|
131
|
+
return this.ListEntities(params, user);
|
|
132
|
+
}
|
|
118
133
|
|
|
119
134
|
/**
|
|
120
135
|
* Get available views for an entity
|
|
121
136
|
*/
|
|
122
|
-
static async
|
|
137
|
+
static async GetEntityViews(entityName: string, user: UserInfo): Promise<{ success: boolean, views?: any[], error?: string }> {
|
|
123
138
|
try {
|
|
124
139
|
// Validate entity exists
|
|
125
140
|
const md = new Metadata(); // global-provider-ok: REST endpoint — no per-request provider injection in REST middleware yet
|
|
@@ -171,6 +186,11 @@ export class ViewOperationsHandler {
|
|
|
171
186
|
return { success: false, error: (error as Error)?.message || 'Unknown error' };
|
|
172
187
|
}
|
|
173
188
|
}
|
|
189
|
+
|
|
190
|
+
/** @deprecated Use {@link GetEntityViews}. */
|
|
191
|
+
static async getEntityViews(entityName: string, user: UserInfo): Promise<{ success: boolean, views?: any[], error?: string }> {
|
|
192
|
+
return this.GetEntityViews(entityName, user);
|
|
193
|
+
}
|
|
174
194
|
|
|
175
195
|
/**
|
|
176
196
|
* Sanitize and validate RunViewParams
|
package/src/rest/mediaRange.ts
CHANGED
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
|
|
16
16
|
/** A parsed, validated `Range` request against a known total size. */
|
|
17
17
|
export interface ParsedRange {
|
|
18
|
-
start: number;
|
|
19
|
-
end: number;
|
|
18
|
+
start: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined
|
|
19
|
+
end: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
/**
|
|
@@ -24,8 +24,8 @@ export interface ParsedRange {
|
|
|
24
24
|
* for an open-ended `bytes=start-` request, matching `ByteRange`'s "omit End = EOF".
|
|
25
25
|
*/
|
|
26
26
|
export interface ParsedOpenRange {
|
|
27
|
-
start: number;
|
|
28
|
-
end?: number;
|
|
27
|
+
start: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined
|
|
28
|
+
end?: number; // case-violation-ok-legacy-back-compat: optional, and the old name is also read off a value the checker cannot type; renaming it stays assignable and silently yields undefined
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
/**
|
|
@@ -34,7 +34,7 @@ export interface ParsedOpenRange {
|
|
|
34
34
|
* suffix-only (those we leave to the driver as a full read). `end` is left undefined when
|
|
35
35
|
* open-ended (`bytes=start-`) so the driver streams to EOF.
|
|
36
36
|
*/
|
|
37
|
-
export function
|
|
37
|
+
export function ParseRangeHeaderLoose(rangeHeader: string): ParsedOpenRange | undefined {
|
|
38
38
|
const match = /^bytes=(\d+)-(\d*)$/.exec(rangeHeader.trim());
|
|
39
39
|
if (!match) {
|
|
40
40
|
return undefined;
|
|
@@ -53,12 +53,17 @@ export function parseRangeHeaderLoose(rangeHeader: string): ParsedOpenRange | un
|
|
|
53
53
|
return { start, end };
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
/** @deprecated Use {@link ParseRangeHeaderLoose}. */
|
|
57
|
+
export function parseRangeHeaderLoose(rangeHeader: string): ParsedOpenRange | undefined {
|
|
58
|
+
return ParseRangeHeaderLoose(rangeHeader);
|
|
59
|
+
}
|
|
60
|
+
|
|
56
61
|
/**
|
|
57
62
|
* Parses a single-range `bytes=start-end` header against a known total (buffer path),
|
|
58
63
|
* clamping `end` to the last byte. Returns undefined when unsatisfiable (→ 416) or
|
|
59
64
|
* malformed/multi-range.
|
|
60
65
|
*/
|
|
61
|
-
export function
|
|
66
|
+
export function ParseRange(rangeHeader: string, total: number): ParsedRange | undefined {
|
|
62
67
|
const match = /^bytes=(\d+)-(\d*)$/.exec(rangeHeader.trim());
|
|
63
68
|
if (!match) {
|
|
64
69
|
return undefined;
|
|
@@ -74,3 +79,8 @@ export function parseRange(rangeHeader: string, total: number): ParsedRange | un
|
|
|
74
79
|
}
|
|
75
80
|
return { start, end };
|
|
76
81
|
}
|
|
82
|
+
|
|
83
|
+
/** @deprecated Use {@link ParseRange}. */
|
|
84
|
+
export function parseRange(rangeHeader: string, total: number): ParsedRange | undefined {
|
|
85
|
+
return ParseRange(rangeHeader, total);
|
|
86
|
+
}
|
|
@@ -3,7 +3,10 @@ import BodyParser from 'body-parser';
|
|
|
3
3
|
import { LogStatusEx } from '@memberjunction/core';
|
|
4
4
|
import { RESTEndpointHandler } from './RESTEndpointHandler.js';
|
|
5
5
|
|
|
6
|
-
export const
|
|
6
|
+
export const REST_API_BASE_PATH = '/api/v1';
|
|
7
|
+
|
|
8
|
+
/** @deprecated Use {@link REST_API_BASE_PATH}. */
|
|
9
|
+
export const ___REST_API_BASE_PATH = REST_API_BASE_PATH;
|
|
7
10
|
|
|
8
11
|
/**
|
|
9
12
|
* Configuration options for REST API endpoints
|
|
@@ -12,14 +15,14 @@ export interface RESTApiOptions {
|
|
|
12
15
|
/**
|
|
13
16
|
* Whether to enable REST API endpoints (default: false)
|
|
14
17
|
*/
|
|
15
|
-
enabled: boolean;
|
|
18
|
+
enabled: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub
|
|
16
19
|
|
|
17
20
|
/**
|
|
18
21
|
* Array of entity names to include in the API (case-insensitive)
|
|
19
22
|
* If provided, only these entities will be accessible through the REST API
|
|
20
23
|
* Supports wildcards using '*' (e.g., 'User*' matches 'User', 'UserRole', etc.)
|
|
21
24
|
*/
|
|
22
|
-
includeEntities?: string[];
|
|
25
|
+
includeEntities?: string[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub
|
|
23
26
|
|
|
24
27
|
/**
|
|
25
28
|
* Array of entity names to exclude from the API (case-insensitive)
|
|
@@ -27,20 +30,20 @@ export interface RESTApiOptions {
|
|
|
27
30
|
* Supports wildcards using '*' (e.g., 'Secret*' matches 'Secret', 'SecretKey', etc.)
|
|
28
31
|
* Note: Exclude patterns always override include patterns
|
|
29
32
|
*/
|
|
30
|
-
excludeEntities?: string[];
|
|
33
|
+
excludeEntities?: string[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub
|
|
31
34
|
|
|
32
35
|
/**
|
|
33
36
|
* Array of schema names to include in the API (case-insensitive)
|
|
34
37
|
* If provided, only entities in these schemas will be accessible through the REST API
|
|
35
38
|
*/
|
|
36
|
-
includeSchemas?: string[];
|
|
39
|
+
includeSchemas?: string[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub
|
|
37
40
|
|
|
38
41
|
/**
|
|
39
42
|
* Array of schema names to exclude from the API (case-insensitive)
|
|
40
43
|
* Entities in these schemas will not be accessible through the REST API
|
|
41
44
|
* Note: Exclude patterns always override include patterns
|
|
42
45
|
*/
|
|
43
|
-
excludeSchemas?: string[];
|
|
46
|
+
excludeSchemas?: string[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub
|
|
44
47
|
}
|
|
45
48
|
|
|
46
49
|
/**
|
|
@@ -56,7 +59,7 @@ export const DEFAULT_REST_API_OPTIONS: RESTApiOptions = {
|
|
|
56
59
|
* @param options Configuration options for REST API
|
|
57
60
|
* @param authMiddleware Optional authentication middleware to use
|
|
58
61
|
*/
|
|
59
|
-
export function
|
|
62
|
+
export function SetupRESTEndpoints(
|
|
60
63
|
app: express.Application,
|
|
61
64
|
options?: Partial<RESTApiOptions>,
|
|
62
65
|
authMiddleware?: express.RequestHandler
|
|
@@ -71,14 +74,14 @@ export function setupRESTEndpoints(
|
|
|
71
74
|
return;
|
|
72
75
|
}
|
|
73
76
|
|
|
74
|
-
const basePath =
|
|
77
|
+
const basePath = REST_API_BASE_PATH;
|
|
75
78
|
|
|
76
79
|
// Create REST endpoint handler with entity and schema filters
|
|
77
80
|
const restHandler = new RESTEndpointHandler({
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
81
|
+
IncludeEntities: config.includeEntities ? config.includeEntities.map(e => e.toLowerCase()) : undefined,
|
|
82
|
+
ExcludeEntities: config.excludeEntities ? config.excludeEntities.map(e => e.toLowerCase()) : undefined,
|
|
83
|
+
IncludeSchemas: config.includeSchemas ? config.includeSchemas.map(s => s.toLowerCase()) : undefined,
|
|
84
|
+
ExcludeSchemas: config.excludeSchemas ? config.excludeSchemas.map(s => s.toLowerCase()) : undefined
|
|
82
85
|
});
|
|
83
86
|
|
|
84
87
|
// Mount REST API at the specified base path with authentication
|
|
@@ -90,4 +93,13 @@ export function setupRESTEndpoints(
|
|
|
90
93
|
}
|
|
91
94
|
|
|
92
95
|
LogStatusEx({ message: `REST API endpoints have been set up at ${basePath}`, verboseOnly: true });
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** @deprecated Use {@link SetupRESTEndpoints}. */
|
|
99
|
+
export function setupRESTEndpoints(
|
|
100
|
+
app: express.Application,
|
|
101
|
+
options?: Partial<RESTApiOptions>,
|
|
102
|
+
authMiddleware?: express.RequestHandler
|
|
103
|
+
): void {
|
|
104
|
+
return SetupRESTEndpoints(app, options, authMiddleware);
|
|
93
105
|
}
|
|
@@ -40,7 +40,7 @@ export const CORE_CONSTANT_RESERVED_SERVER_EXTENSION_ROOTS: readonly string[] =
|
|
|
40
40
|
* static `/graphql` baseline) is still protected. `/` as graphqlRootPath is
|
|
41
41
|
* already reserved as the server root and does not prefix-match every path.
|
|
42
42
|
*/
|
|
43
|
-
export function
|
|
43
|
+
export function CoreReservedServerExtensionRoots(graphqlRootPath: string): string[] {
|
|
44
44
|
const graphql = typeof graphqlRootPath === 'string' ? graphqlRootPath.trim() : '';
|
|
45
45
|
return [
|
|
46
46
|
...(graphql ? [graphql] : []),
|
|
@@ -48,3 +48,8 @@ export function coreReservedServerExtensionRoots(graphqlRootPath: string): strin
|
|
|
48
48
|
...CORE_STATIC_RESERVED_SERVER_EXTENSION_ROOTS,
|
|
49
49
|
];
|
|
50
50
|
}
|
|
51
|
+
|
|
52
|
+
/** @deprecated Use {@link CoreReservedServerExtensionRoots}. */
|
|
53
|
+
export function coreReservedServerExtensionRoots(graphqlRootPath: string): string[] {
|
|
54
|
+
return CoreReservedServerExtensionRoots(graphqlRootPath);
|
|
55
|
+
}
|
|
@@ -75,25 +75,26 @@ export class TaskGraphActionRunner implements TaskActionRunner {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
/**
|
|
78
|
-
* Rebuilds the action's parameters from the task's
|
|
78
|
+
* Rebuilds the action's parameters from the task's input, one parameter per key.
|
|
79
79
|
*
|
|
80
|
-
* **
|
|
81
|
-
*
|
|
82
|
-
* marked as not-logged
|
|
83
|
-
* value, which is the honest consequence of choosing not to persist it, and the
|
|
84
|
-
* dispatch is opt-in per binding rather than the default.
|
|
80
|
+
* For a **durable entity-action** graph the input was written by `RedactParamsToRecord`
|
|
81
|
+
* (`@memberjunction/actions-base`) at deferral time, so its values have been through redaction:
|
|
82
|
+
* a parameter the binding marked as not-logged arrives absent rather than secret — the action
|
|
83
|
+
* sees a missing value, which is the honest consequence of choosing not to persist it, and the
|
|
84
|
+
* reason durable dispatch is opt-in per binding rather than the default. Every other graph's
|
|
85
|
+
* input is whatever its spec authored. This method re-applies no redaction rule in either case.
|
|
85
86
|
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
87
|
+
* `InputPayload` already carries the dependency outputs: the dispatcher merges them underneath
|
|
88
|
+
* the task's own input (`mergedPayload`) before calling this runner, so a node's explicit
|
|
89
|
+
* parameters win and a step with an input mapping gets exactly the parameters it declared.
|
|
90
|
+
* `DependencyOutputs` is keyed by upstream task ID, not by parameter name, so it is deliberately
|
|
91
|
+
* not read here — spreading it would hand the action one extra parameter per dependency, named
|
|
92
|
+
* by a GUID and holding that task's whole output.
|
|
88
93
|
*/
|
|
89
94
|
private buildParams(params: TaskActionRunParams): ActionParam[] {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
merged[name] = value;
|
|
95
|
+
if (!params.InputPayload || typeof params.InputPayload !== 'object') {
|
|
96
|
+
return [];
|
|
93
97
|
}
|
|
94
|
-
|
|
95
|
-
Object.assign(merged, params.InputPayload as Record<string, unknown>);
|
|
96
|
-
}
|
|
97
|
-
return Object.entries(merged).map(([Name, Value]) => ({ Name, Value, Type: 'Input' }));
|
|
98
|
+
return Object.entries(params.InputPayload as Record<string, unknown>).map(([Name, Value]) => ({ Name, Value, Type: 'Input' }));
|
|
98
99
|
}
|
|
99
100
|
}
|
package/src/types.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { AggregateExpression, CompositeKey, DatabaseProviderBase, UserInfo } fro
|
|
|
2
2
|
import { MJUserViewEntityExtended } from '@memberjunction/core-entities';
|
|
3
3
|
import { GraphQLSchema } from 'graphql';
|
|
4
4
|
import sql from 'mssql';
|
|
5
|
-
import {
|
|
5
|
+
import { GetSystemUser } from './auth/index.js';
|
|
6
6
|
import { MJEvent, MJEventType, MJGlobal } from '@memberjunction/global';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -57,18 +57,18 @@ export type AppContext = {
|
|
|
57
57
|
};
|
|
58
58
|
|
|
59
59
|
export class ProviderInfo {
|
|
60
|
-
provider: DatabaseProviderBase;
|
|
61
|
-
type: 'Admin' | 'Read-Write' | 'Read-Only' | 'Other';
|
|
60
|
+
provider: DatabaseProviderBase; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
61
|
+
type: 'Admin' | 'Read-Write' | 'Read-Only' | 'Other'; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
export class DataSourceInfo {
|
|
65
|
-
dataSource: sql.ConnectionPool;
|
|
66
|
-
host: string;
|
|
67
|
-
port: number;
|
|
68
|
-
instance?: string;
|
|
69
|
-
database: string;
|
|
70
|
-
userName: string;
|
|
71
|
-
type: "Admin" | "Read-Write" | "Read-Only" | "Other";
|
|
65
|
+
dataSource: sql.ConnectionPool; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
66
|
+
host: string; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
67
|
+
port: number; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
68
|
+
instance?: string; // case-violation-ok-legacy-back-compat: an accessor cannot be optional, so a stub would turn this into a required member
|
|
69
|
+
database: string; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
70
|
+
userName: string; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
71
|
+
type: "Admin" | "Read-Write" | "Read-Only" | "Other"; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
72
72
|
|
|
73
73
|
constructor(init: {dataSource: sql.ConnectionPool, type: "Admin" | "Read-Write" | "Read-Only" | "Other", host: string, port: number, database: string, userName: string} ) {
|
|
74
74
|
this.dataSource = init.dataSource;
|
|
@@ -125,20 +125,20 @@ export type RunViewGenericParams = {
|
|
|
125
125
|
|
|
126
126
|
|
|
127
127
|
export class MJServerEvent {
|
|
128
|
-
type: 'setupComplete' | 'requestReceived' | 'requestCompleted' | 'requestFailed';
|
|
129
|
-
dataSources: DataSourceInfo[];
|
|
130
|
-
userPayload: UserPayload;
|
|
131
|
-
systemUser: UserInfo;
|
|
128
|
+
type: 'setupComplete' | 'requestReceived' | 'requestCompleted' | 'requestFailed'; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
129
|
+
dataSources: DataSourceInfo[]; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
130
|
+
userPayload: UserPayload; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
131
|
+
systemUser: UserInfo; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
export const MJ_SERVER_EVENT_CODE = 'MJ_SERVER_EVENT';
|
|
135
135
|
|
|
136
|
-
export async function
|
|
136
|
+
export async function RaiseEvent(type: MJServerEvent['type'], dataSources: DataSourceInfo[], userPayload: UserPayload, component?: any) {
|
|
137
137
|
const event = new MJServerEvent();
|
|
138
138
|
event.type = type;
|
|
139
139
|
event.dataSources = dataSources;
|
|
140
140
|
event.userPayload = userPayload;
|
|
141
|
-
event.systemUser = await
|
|
141
|
+
event.systemUser = await GetSystemUser();
|
|
142
142
|
|
|
143
143
|
const mje = new MJEvent();
|
|
144
144
|
mje.args = event;
|
|
@@ -146,4 +146,9 @@ export async function raiseEvent(type: MJServerEvent['type'], dataSources: DataS
|
|
|
146
146
|
mje.event = MJEventType.ComponentEvent;
|
|
147
147
|
mje.eventCode = MJ_SERVER_EVENT_CODE;
|
|
148
148
|
MJGlobal.Instance.RaiseEvent(mje);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** @deprecated Use {@link RaiseEvent}. */
|
|
152
|
+
export async function raiseEvent(type: MJServerEvent['type'], dataSources: DataSourceInfo[], userPayload: UserPayload, component?: any) {
|
|
153
|
+
return RaiseEvent(type, dataSources, userPayload, component);
|
|
149
154
|
}
|
package/src/util.ts
CHANGED
|
@@ -23,7 +23,7 @@ type StreamCallback = (jsonObject: any) => void;
|
|
|
23
23
|
* @param {StreamCallback} [streamCallback] - Optional callback for handling streaming JSON objects.
|
|
24
24
|
* @returns {Promise<any[]>} - A promise that resolves to an array of all JSON objects received during the streaming process.
|
|
25
25
|
*/
|
|
26
|
-
export async function
|
|
26
|
+
export async function SendPostRequest(url: string, payload: any, useCompression: boolean, headers: Record<string, string> | null, streamCallback?: StreamCallback): Promise<any[]> {
|
|
27
27
|
return new Promise(async (resolve, reject) => {
|
|
28
28
|
try {
|
|
29
29
|
const { protocol, hostname, port, pathname } = new URL(url);
|
|
@@ -144,6 +144,11 @@ export async function sendPostRequest(url: string, payload: any, useCompression:
|
|
|
144
144
|
);
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
+
/** @deprecated Use {@link SendPostRequest}. */
|
|
148
|
+
export async function sendPostRequest(url: string, payload: any, useCompression: boolean, headers: Record<string, string> | null, streamCallback?: StreamCallback): Promise<any[]> {
|
|
149
|
+
return SendPostRequest(url, payload, useCompression, headers, streamCallback);
|
|
150
|
+
}
|
|
151
|
+
|
|
147
152
|
|
|
148
153
|
/**
|
|
149
154
|
* Returns the read-only data source if it exists, otherwise returns the read-write data source if options is not provided or if options.allowFallbackToReadWrite is true.
|
|
@@ -154,14 +159,14 @@ export async function sendPostRequest(url: string, payload: any, useCompression:
|
|
|
154
159
|
export function GetReadOnlyDataSource(dataSources: DataSourceInfo[], options?: {allowFallbackToReadWrite: boolean}): sql.ConnectionPool & { query: (sql: string, params?: any) => Promise<any[]> } {
|
|
155
160
|
const readOnlyDataSource = dataSources.find((ds) => ds.type === 'Read-Only');
|
|
156
161
|
if (readOnlyDataSource) {
|
|
157
|
-
return
|
|
162
|
+
return ExtendConnectionPoolWithQuery(readOnlyDataSource.dataSource);
|
|
158
163
|
}
|
|
159
164
|
else if (!options || options.allowFallbackToReadWrite) {
|
|
160
165
|
// default behavior for backward compatibility prior to MJ 2.22.3 where we introduced this functionality was to have a single
|
|
161
166
|
// connection, so for back-compatability, if we don't have a read-only data source, we'll fall back to the read-write data source
|
|
162
167
|
const readWriteDataSource = dataSources.find((ds) => ds.type === 'Read-Write');
|
|
163
168
|
if (readWriteDataSource) {
|
|
164
|
-
return
|
|
169
|
+
return ExtendConnectionPoolWithQuery(readWriteDataSource.dataSource);
|
|
165
170
|
}
|
|
166
171
|
}
|
|
167
172
|
throw new Error('No suitable data source found');
|
|
@@ -220,7 +225,7 @@ export async function sendPostRequest(url: string, payload: any, useCompression:
|
|
|
220
225
|
export function GetReadWriteDataSource(dataSources: DataSourceInfo[]): sql.ConnectionPool & { query: (sql: string, params?: any) => Promise<any[]> } {
|
|
221
226
|
const readWriteDataSource = dataSources.find((ds) => ds.type === 'Read-Write');
|
|
222
227
|
if (readWriteDataSource) {
|
|
223
|
-
return
|
|
228
|
+
return ExtendConnectionPoolWithQuery(readWriteDataSource.dataSource);
|
|
224
229
|
}
|
|
225
230
|
throw new Error('No suitable read-write data source found');
|
|
226
231
|
}
|
|
@@ -229,7 +234,7 @@ export async function sendPostRequest(url: string, payload: any, useCompression:
|
|
|
229
234
|
* Extends a ConnectionPool with a query method that returns results in the format expected by generated code
|
|
230
235
|
* This provides backwards compatibility with code that expects TypeORM-style query results
|
|
231
236
|
*/
|
|
232
|
-
export function
|
|
237
|
+
export function ExtendConnectionPoolWithQuery(pool: sql.ConnectionPool): sql.ConnectionPool & { query: (sql: string, params?: any) => Promise<any[]> } {
|
|
233
238
|
const extendedPool = pool as any;
|
|
234
239
|
extendedPool.query = async (sqlQuery: string, parameters?: any): Promise<any[]> => {
|
|
235
240
|
const request = new sql.Request(pool);
|
|
@@ -248,4 +253,9 @@ export async function sendPostRequest(url: string, payload: any, useCompression:
|
|
|
248
253
|
return result.recordset || [];
|
|
249
254
|
};
|
|
250
255
|
return extendedPool;
|
|
251
|
-
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/** @deprecated Use {@link ExtendConnectionPoolWithQuery}. */
|
|
259
|
+
export function extendConnectionPoolWithQuery(pool: sql.ConnectionPool): sql.ConnectionPool & { query: (sql: string, params?: any) => Promise<any[]> } {
|
|
260
|
+
return ExtendConnectionPoolWithQuery(pool);
|
|
261
|
+
}
|