@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
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* - **Full page** (`pageLength >= maxRows`): more rows may exist — returns `null` to
|
|
16
16
|
* signal that a `COUNT(*)` is required to know the true total.
|
|
17
17
|
*/
|
|
18
|
-
export function
|
|
18
|
+
export function ExactTotalFromPage(
|
|
19
19
|
startRow: number,
|
|
20
20
|
pageLength: number,
|
|
21
21
|
maxRows: number | null,
|
|
@@ -29,13 +29,22 @@ export function exactTotalFromPage(
|
|
|
29
29
|
return null;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
/** @deprecated Use {@link ExactTotalFromPage}. */
|
|
33
|
+
export function exactTotalFromPage(
|
|
34
|
+
startRow: number,
|
|
35
|
+
pageLength: number,
|
|
36
|
+
maxRows: number | null,
|
|
37
|
+
): number | null {
|
|
38
|
+
return ExactTotalFromPage(startRow, pageLength, maxRows);
|
|
39
|
+
}
|
|
40
|
+
|
|
32
41
|
/**
|
|
33
42
|
* Reads the total row count from a `COUNT(*)` recordset (`[{ TotalRowCount }]`),
|
|
34
43
|
* falling back to `fallback` when the count is absent, non-numeric, or negative — so
|
|
35
44
|
* an unexpected count shape never yields a misleading total. `fallback` should be a
|
|
36
45
|
* safe lower bound (e.g. `startRow + rowsReturned`).
|
|
37
46
|
*/
|
|
38
|
-
export function
|
|
47
|
+
export function ResolveAdhocTotalRowCount(
|
|
39
48
|
countRows: ReadonlyArray<{ TotalRowCount?: unknown }> | null | undefined,
|
|
40
49
|
fallback: number,
|
|
41
50
|
): number {
|
|
@@ -48,3 +57,11 @@ export function resolveAdhocTotalRowCount(
|
|
|
48
57
|
}
|
|
49
58
|
return fallback;
|
|
50
59
|
}
|
|
60
|
+
|
|
61
|
+
/** @deprecated Use {@link ResolveAdhocTotalRowCount}. */
|
|
62
|
+
export function resolveAdhocTotalRowCount(
|
|
63
|
+
countRows: ReadonlyArray<{ TotalRowCount?: unknown }> | null | undefined,
|
|
64
|
+
fallback: number,
|
|
65
|
+
): number {
|
|
66
|
+
return ResolveAdhocTotalRowCount(countRows, fallback);
|
|
67
|
+
}
|
|
@@ -12,38 +12,38 @@ export type ArtifactDeliveryMode = 'Inline' | 'ToolsOnly';
|
|
|
12
12
|
|
|
13
13
|
export interface ArtifactRoutingInput {
|
|
14
14
|
/** The Artifact Type's DefaultDeliveryMode. */
|
|
15
|
-
|
|
15
|
+
TypeDefault: ArtifactDeliveryMode;
|
|
16
16
|
/** Per-instance opt-out — `true` forces tools regardless of typeDefault. */
|
|
17
|
-
|
|
17
|
+
ForceToolsOnly: boolean;
|
|
18
18
|
/** MIME type of the artifact content (e.g. 'image/png'). */
|
|
19
|
-
mimeType: string;
|
|
19
|
+
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
|
|
20
20
|
/** Size of the content in bytes. */
|
|
21
|
-
|
|
21
|
+
SizeBytes: number;
|
|
22
22
|
/** Maximum inline size in bytes; over this, even Inline-default artifacts go to tools. */
|
|
23
|
-
|
|
23
|
+
InlineSizeCap: number;
|
|
24
24
|
/** Predicate: does the active model driver support the given MIME modality inline? */
|
|
25
|
-
|
|
25
|
+
ModelSupportsModality: (mimeType: string) => boolean;
|
|
26
26
|
/** Model name used in error messages — never used to make decisions. */
|
|
27
|
-
|
|
27
|
+
ModelName: string;
|
|
28
28
|
/** Artifact type name used in error messages. */
|
|
29
|
-
|
|
29
|
+
ArtifactTypeName: string;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
export type ArtifactRoutingDecision =
|
|
33
|
-
| { delivery: 'inline' }
|
|
34
|
-
| { delivery: 'tools';
|
|
35
|
-
| { delivery: 'error'; message: string };
|
|
33
|
+
| { delivery: 'inline' } // 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
|
|
34
|
+
| { delivery: 'tools'; Annotation?: 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
|
|
35
|
+
| { delivery: 'error'; message: 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
|
|
36
36
|
|
|
37
37
|
export function RouteArtifact(input: ArtifactRoutingInput): ArtifactRoutingDecision {
|
|
38
38
|
const {
|
|
39
|
-
typeDefault,
|
|
40
|
-
forceToolsOnly,
|
|
39
|
+
TypeDefault: typeDefault,
|
|
40
|
+
ForceToolsOnly: forceToolsOnly,
|
|
41
41
|
mimeType,
|
|
42
|
-
sizeBytes,
|
|
43
|
-
inlineSizeCap,
|
|
44
|
-
modelSupportsModality,
|
|
45
|
-
modelName,
|
|
46
|
-
artifactTypeName,
|
|
42
|
+
SizeBytes: sizeBytes,
|
|
43
|
+
InlineSizeCap: inlineSizeCap,
|
|
44
|
+
ModelSupportsModality: modelSupportsModality,
|
|
45
|
+
ModelName: modelName,
|
|
46
|
+
ArtifactTypeName: artifactTypeName,
|
|
47
47
|
} = input;
|
|
48
48
|
|
|
49
49
|
// Path 1: ToolsOnly default or per-instance opt-out — always tools.
|
|
@@ -71,7 +71,7 @@ export function RouteArtifact(input: ArtifactRoutingInput): ArtifactRoutingDecis
|
|
|
71
71
|
if (sizeBytes >= inlineSizeCap) {
|
|
72
72
|
return {
|
|
73
73
|
delivery: 'tools',
|
|
74
|
-
|
|
74
|
+
Annotation: `Artifact type "${artifactTypeName}" is configured for Inline delivery but content size (${sizeBytes} bytes) exceeds the inline cap (${inlineSizeCap} bytes); delivered via tools instead.`,
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
77
|
|
|
@@ -81,13 +81,13 @@ export interface MeetingRecordingRegistrationConfig {
|
|
|
81
81
|
* The `MJ: File Storage Providers` id whose accounts target the egress sink (where LiveKit wrote the
|
|
82
82
|
* MP4). Falls back to `process.env.MJ_MEETING_RECORDING_STORAGE_PROVIDER`.
|
|
83
83
|
*/
|
|
84
|
-
|
|
84
|
+
SinkStorageProviderID?: string;
|
|
85
85
|
/**
|
|
86
86
|
* OPTIONAL canonical provider id — when set AND different from the sink, the MP4 is copied into it and
|
|
87
87
|
* the Files row points there (the "copy into Box" option). Falls back to
|
|
88
88
|
* `process.env.MJ_MEETING_RECORDING_CANONICAL_STORAGE_PROVIDER`. OFF by default.
|
|
89
89
|
*/
|
|
90
|
-
|
|
90
|
+
CanonicalStorageProviderID?: string;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
/**
|
|
@@ -100,7 +100,7 @@ export interface MeetingRecordingRegistrationConfig {
|
|
|
100
100
|
* @param provider The metadata provider servicing this request.
|
|
101
101
|
* @param config Optional config overrides (otherwise read from env).
|
|
102
102
|
*/
|
|
103
|
-
export async function
|
|
103
|
+
export async function RegisterMeetingRecordingFile(
|
|
104
104
|
egress: MeetingRecordingEgressResult,
|
|
105
105
|
contextUser: UserInfo,
|
|
106
106
|
provider: IMetadataProvider,
|
|
@@ -115,7 +115,7 @@ export async function registerMeetingRecordingFile(
|
|
|
115
115
|
};
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
const sinkProviderID = config?.
|
|
118
|
+
const sinkProviderID = config?.SinkStorageProviderID ?? process.env.MJ_MEETING_RECORDING_STORAGE_PROVIDER;
|
|
119
119
|
if (!sinkProviderID) {
|
|
120
120
|
return {
|
|
121
121
|
Success: false,
|
|
@@ -138,7 +138,7 @@ export async function registerMeetingRecordingFile(
|
|
|
138
138
|
};
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
-
const conversationID = await
|
|
141
|
+
const conversationID = await ResolveMeetingConversation(egress, contextUser, provider);
|
|
142
142
|
if (!conversationID) {
|
|
143
143
|
return { Success: false, ErrorMessage: 'Could not resolve or create the Meeting-Room Conversation for the recording.' };
|
|
144
144
|
}
|
|
@@ -175,6 +175,16 @@ export async function registerMeetingRecordingFile(
|
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
+
/** @deprecated Use {@link RegisterMeetingRecordingFile}. */
|
|
179
|
+
export async function registerMeetingRecordingFile(
|
|
180
|
+
egress: MeetingRecordingEgressResult,
|
|
181
|
+
contextUser: UserInfo,
|
|
182
|
+
provider: IMetadataProvider,
|
|
183
|
+
config?: MeetingRecordingRegistrationConfig,
|
|
184
|
+
): Promise<MeetingRecordingRegistrationResult> {
|
|
185
|
+
return RegisterMeetingRecordingFile(egress, contextUser, provider, config);
|
|
186
|
+
}
|
|
187
|
+
|
|
178
188
|
/**
|
|
179
189
|
* Best-effort correlation when a recording STARTS: stamps `Conversation.EgressID` onto the room's
|
|
180
190
|
* Meeting-Room Conversation (if it already exists) so a live recording is tracked against the room. If the
|
|
@@ -187,7 +197,7 @@ export async function registerMeetingRecordingFile(
|
|
|
187
197
|
* @param provider The metadata provider.
|
|
188
198
|
* @returns `true` when an existing conversation was stamped, else `false`.
|
|
189
199
|
*/
|
|
190
|
-
export async function
|
|
200
|
+
export async function CorrelateRecordingStart(roomName: string, egressID: string, contextUser: UserInfo, provider: IMetadataProvider): Promise<boolean> {
|
|
191
201
|
try {
|
|
192
202
|
const conversationID = await findConversationByRoomName(roomName, contextUser, provider);
|
|
193
203
|
if (!conversationID) {
|
|
@@ -210,12 +220,17 @@ export async function correlateRecordingStart(roomName: string, egressID: string
|
|
|
210
220
|
}
|
|
211
221
|
}
|
|
212
222
|
|
|
223
|
+
/** @deprecated Use {@link CorrelateRecordingStart}. */
|
|
224
|
+
export async function correlateRecordingStart(roomName: string, egressID: string, contextUser: UserInfo, provider: IMetadataProvider): Promise<boolean> {
|
|
225
|
+
return CorrelateRecordingStart(roomName, egressID, contextUser, provider);
|
|
226
|
+
}
|
|
227
|
+
|
|
213
228
|
/**
|
|
214
229
|
* Resolves the Meeting-Room Conversation for a completed recording: prefer matching by `EgressID` (set on
|
|
215
230
|
* start), fall back to the room name (`ExternalID` + `Type`), else create one following the transcript
|
|
216
231
|
* sink's pattern (scoped `Application` so it stays out of the normal chat list).
|
|
217
232
|
*/
|
|
218
|
-
export async function
|
|
233
|
+
export async function ResolveMeetingConversation(
|
|
219
234
|
egress: MeetingRecordingEgressResult,
|
|
220
235
|
contextUser: UserInfo,
|
|
221
236
|
provider: IMetadataProvider,
|
|
@@ -231,6 +246,15 @@ export async function resolveMeetingConversation(
|
|
|
231
246
|
return createMeetingConversation(egress.RoomName, contextUser, provider);
|
|
232
247
|
}
|
|
233
248
|
|
|
249
|
+
/** @deprecated Use {@link ResolveMeetingConversation}. */
|
|
250
|
+
export async function resolveMeetingConversation(
|
|
251
|
+
egress: MeetingRecordingEgressResult,
|
|
252
|
+
contextUser: UserInfo,
|
|
253
|
+
provider: IMetadataProvider,
|
|
254
|
+
): Promise<string | null> {
|
|
255
|
+
return ResolveMeetingConversation(egress, contextUser, provider);
|
|
256
|
+
}
|
|
257
|
+
|
|
234
258
|
/** Finds a non-archived Meeting-Room Conversation by its `EgressID`. */
|
|
235
259
|
async function findConversationByEgressID(egressID: string, contextUser: UserInfo, provider: IMetadataProvider): Promise<string | null> {
|
|
236
260
|
if (!egressID) {
|
|
@@ -310,7 +334,7 @@ async function resolveFileLocation(
|
|
|
310
334
|
config?: MeetingRecordingRegistrationConfig,
|
|
311
335
|
): Promise<FileLocationResult> {
|
|
312
336
|
const outputLocation = egress.OutputLocation!;
|
|
313
|
-
const canonicalProviderID = config?.
|
|
337
|
+
const canonicalProviderID = config?.CanonicalStorageProviderID ?? process.env.MJ_MEETING_RECORDING_CANONICAL_STORAGE_PROVIDER;
|
|
314
338
|
|
|
315
339
|
// Default (v1): point directly at the sink output — playback streams straight from it, no byte copy.
|
|
316
340
|
if (!canonicalProviderID || canonicalProviderID === sinkProviderID) {
|
|
@@ -319,7 +343,7 @@ async function resolveFileLocation(
|
|
|
319
343
|
|
|
320
344
|
// OPTIONAL "copy into Box": a separate canonical provider IS configured and differs from the sink —
|
|
321
345
|
// read the bytes from the sink and upload them into the canonical provider, then point there.
|
|
322
|
-
const canonicalKey = await
|
|
346
|
+
const canonicalKey = await CopyEgressOutputToCanonical(outputLocation, sinkAccountID, canonicalProviderID, contextUser);
|
|
323
347
|
if (!canonicalKey.Success) {
|
|
324
348
|
return { Success: false, ErrorMessage: canonicalKey.ErrorMessage, ProviderID: '', ProviderKey: '' };
|
|
325
349
|
}
|
|
@@ -338,7 +362,7 @@ interface CanonicalCopyResult {
|
|
|
338
362
|
* into Box" option). Reads the bytes via the sink driver's `GetObject({ fullPath })` and re-uploads them
|
|
339
363
|
* into the canonical provider via `FileStorageEngine.UploadFile`. Returns the canonical `ProviderKey`.
|
|
340
364
|
*/
|
|
341
|
-
export async function
|
|
365
|
+
export async function CopyEgressOutputToCanonical(
|
|
342
366
|
outputLocation: string,
|
|
343
367
|
sinkAccountID: string,
|
|
344
368
|
canonicalProviderID: string,
|
|
@@ -369,6 +393,16 @@ export async function copyEgressOutputToCanonical(
|
|
|
369
393
|
return { Success: true, ProviderKey: uploaded.StoragePath };
|
|
370
394
|
}
|
|
371
395
|
|
|
396
|
+
/** @deprecated Use {@link CopyEgressOutputToCanonical}. */
|
|
397
|
+
export async function copyEgressOutputToCanonical(
|
|
398
|
+
outputLocation: string,
|
|
399
|
+
sinkAccountID: string,
|
|
400
|
+
canonicalProviderID: string,
|
|
401
|
+
contextUser: UserInfo,
|
|
402
|
+
): Promise<CanonicalCopyResult> {
|
|
403
|
+
return CopyEgressOutputToCanonical(outputLocation, sinkAccountID, canonicalProviderID, contextUser);
|
|
404
|
+
}
|
|
405
|
+
|
|
372
406
|
/** Creates the `MJ: Files` row pointing at the recording (no byte copy in the default v1 path). */
|
|
373
407
|
async function createRecordingFileRow(
|
|
374
408
|
egress: MeetingRecordingEgressResult,
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* @example deriveSidecarPath('realtime-recordings/sess-1/recording.wav') === 'realtime-recordings/sess-1/peaks.json'
|
|
16
16
|
* @example deriveSidecarPath('recording.wav') === 'peaks.json'
|
|
17
17
|
*/
|
|
18
|
-
export function
|
|
18
|
+
export function DeriveSidecarPath(providerKey: string | null | undefined): string | null {
|
|
19
19
|
if (!providerKey) {
|
|
20
20
|
return null;
|
|
21
21
|
}
|
|
@@ -23,6 +23,11 @@ export function deriveSidecarPath(providerKey: string | null | undefined): strin
|
|
|
23
23
|
return lastSlash >= 0 ? `${providerKey.slice(0, lastSlash)}/peaks.json` : 'peaks.json';
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
/** @deprecated Use {@link DeriveSidecarPath}. */
|
|
27
|
+
export function deriveSidecarPath(providerKey: string | null | undefined): string | null {
|
|
28
|
+
return DeriveSidecarPath(providerKey);
|
|
29
|
+
}
|
|
30
|
+
|
|
26
31
|
/** Generous ceiling on the number of peaks returned — matches the capture-side cap. */
|
|
27
32
|
export const MAX_PEAKS = 4096;
|
|
28
33
|
|
|
@@ -35,7 +40,7 @@ export const MAX_PEAKS = 4096;
|
|
|
35
40
|
* @param bytes The raw sidecar bytes (e.g. from a storage `GetObject`).
|
|
36
41
|
* @returns Sanitized `0..1` peaks, or `undefined`.
|
|
37
42
|
*/
|
|
38
|
-
export function
|
|
43
|
+
export function ParsePeaksSidecar(bytes: Buffer): number[] | undefined {
|
|
39
44
|
try {
|
|
40
45
|
const parsed: unknown = JSON.parse(bytes.toString('utf8'));
|
|
41
46
|
if (!Array.isArray(parsed) || parsed.length === 0) {
|
|
@@ -50,3 +55,8 @@ export function parsePeaksSidecar(bytes: Buffer): number[] | undefined {
|
|
|
50
55
|
return undefined;
|
|
51
56
|
}
|
|
52
57
|
}
|
|
58
|
+
|
|
59
|
+
/** @deprecated Use {@link ParsePeaksSidecar}. */
|
|
60
|
+
export function parsePeaksSidecar(bytes: Buffer): number[] | undefined {
|
|
61
|
+
return ParsePeaksSidecar(bytes);
|
|
62
|
+
}
|
|
@@ -11,7 +11,7 @@ export class EntityCRUDHandler {
|
|
|
11
11
|
/**
|
|
12
12
|
* Create a new entity
|
|
13
13
|
*/
|
|
14
|
-
static async
|
|
14
|
+
static async CreateEntity(entityName: string, data: any, user: UserInfo): Promise<{ success: boolean, entity?: any, error?: string, details?: any, validationErrors?: any[] }> {
|
|
15
15
|
try {
|
|
16
16
|
// Get entity object
|
|
17
17
|
const md = new Metadata(); // global-provider-ok: REST endpoint — no per-request provider injection in REST middleware yet
|
|
@@ -77,11 +77,16 @@ export class EntityCRUDHandler {
|
|
|
77
77
|
return { success: false, error: error?.message || 'Unknown error' };
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
|
+
|
|
81
|
+
/** @deprecated Use {@link CreateEntity}. */
|
|
82
|
+
static async createEntity(entityName: string, data: any, user: UserInfo): Promise<{ success: boolean, entity?: any, error?: string, details?: any, validationErrors?: any[] }> {
|
|
83
|
+
return this.CreateEntity(entityName, data, user);
|
|
84
|
+
}
|
|
80
85
|
|
|
81
86
|
/**
|
|
82
87
|
* Read an entity by ID
|
|
83
88
|
*/
|
|
84
|
-
static async
|
|
89
|
+
static async GetEntity(entityName: string, id: string | number, relatedEntities: string[] = null, user: UserInfo): Promise<{ success: boolean, entity?: any, error?: string }> {
|
|
85
90
|
try {
|
|
86
91
|
// Get entity object
|
|
87
92
|
const md = new Metadata(); // global-provider-ok: REST endpoint — no per-request provider injection in REST middleware yet
|
|
@@ -116,11 +121,16 @@ export class EntityCRUDHandler {
|
|
|
116
121
|
return { success: false, error: error?.message || 'Unknown error' };
|
|
117
122
|
}
|
|
118
123
|
}
|
|
124
|
+
|
|
125
|
+
/** @deprecated Use {@link GetEntity}. */
|
|
126
|
+
static async getEntity(entityName: string, id: string | number, relatedEntities: string[] = null, user: UserInfo): Promise<{ success: boolean, entity?: any, error?: string }> {
|
|
127
|
+
return this.GetEntity(entityName, id, relatedEntities, user);
|
|
128
|
+
}
|
|
119
129
|
|
|
120
130
|
/**
|
|
121
131
|
* Update an existing entity
|
|
122
132
|
*/
|
|
123
|
-
static async
|
|
133
|
+
static async UpdateEntity(entityName: string, id: string | number, data: any, user: UserInfo): Promise<{ success: boolean, entity?: any, error?: string, details?: any, validationErrors?: any[] }> {
|
|
124
134
|
try {
|
|
125
135
|
// Get entity object
|
|
126
136
|
const md = new Metadata(); // global-provider-ok: REST endpoint — no per-request provider injection in REST middleware yet
|
|
@@ -203,11 +213,16 @@ export class EntityCRUDHandler {
|
|
|
203
213
|
return { success: false, error: error?.message || 'Unknown error' };
|
|
204
214
|
}
|
|
205
215
|
}
|
|
216
|
+
|
|
217
|
+
/** @deprecated Use {@link UpdateEntity}. */
|
|
218
|
+
static async updateEntity(entityName: string, id: string | number, data: any, user: UserInfo): Promise<{ success: boolean, entity?: any, error?: string, details?: any, validationErrors?: any[] }> {
|
|
219
|
+
return this.UpdateEntity(entityName, id, data, user);
|
|
220
|
+
}
|
|
206
221
|
|
|
207
222
|
/**
|
|
208
223
|
* Delete an entity
|
|
209
224
|
*/
|
|
210
|
-
static async
|
|
225
|
+
static async DeleteEntity(entityName: string, id: string | number, options: EntityDeleteOptions, user: UserInfo): Promise<{ success: boolean, error?: string, details?: any }> {
|
|
211
226
|
try {
|
|
212
227
|
// Get entity object
|
|
213
228
|
const md = new Metadata(); // global-provider-ok: REST endpoint — no per-request provider injection in REST middleware yet
|
|
@@ -252,6 +267,11 @@ export class EntityCRUDHandler {
|
|
|
252
267
|
return { success: false, error: error?.message || 'Unknown error' };
|
|
253
268
|
}
|
|
254
269
|
}
|
|
270
|
+
|
|
271
|
+
/** @deprecated Use {@link DeleteEntity}. */
|
|
272
|
+
static async deleteEntity(entityName: string, id: string | number, options: EntityDeleteOptions, user: UserInfo): Promise<{ success: boolean, error?: string, details?: any }> {
|
|
273
|
+
return this.DeleteEntity(entityName, id, options, user);
|
|
274
|
+
}
|
|
255
275
|
|
|
256
276
|
/**
|
|
257
277
|
* Build the record key from the `:id` path segment. A single-column key (any column name) is
|
|
@@ -23,10 +23,10 @@ import { LogError, Metadata, UserInfo } from '@memberjunction/core';
|
|
|
23
23
|
import { MJFileEntity } from '@memberjunction/core-entities';
|
|
24
24
|
import { FileStorageEngine } from '@memberjunction/storage';
|
|
25
25
|
import type { FileStorageBase, ByteRange } from '@memberjunction/storage';
|
|
26
|
-
import {
|
|
26
|
+
import { GetSystemUser } from '../auth/index.js';
|
|
27
27
|
import { MediaAccessKeyManager } from './MediaAccessKeys.js';
|
|
28
28
|
import { UploadTokenManager } from './UploadTokenManager.js';
|
|
29
|
-
import {
|
|
29
|
+
import { ParseRange, ParseRangeHeaderLoose } from './mediaRange.js';
|
|
30
30
|
|
|
31
31
|
/** A located bytes source for a file: the driver + the provider key to read. */
|
|
32
32
|
interface FileBytesSource {
|
|
@@ -41,7 +41,7 @@ interface FileBytesSource {
|
|
|
41
41
|
* - `GET /media/:fileId` and `GET /media/:fileId/:filename` (Range streaming)
|
|
42
42
|
* - `POST /media/upload-stage` (Raw binary upload staging)
|
|
43
43
|
*/
|
|
44
|
-
export function
|
|
44
|
+
export function CreateMediaStreamRouter(): Router {
|
|
45
45
|
const router = express.Router();
|
|
46
46
|
|
|
47
47
|
router.post(
|
|
@@ -61,6 +61,11 @@ export function createMediaStreamRouter(): Router {
|
|
|
61
61
|
return router;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
/** @deprecated Use {@link CreateMediaStreamRouter}. */
|
|
65
|
+
export function createMediaStreamRouter(): Router {
|
|
66
|
+
return CreateMediaStreamRouter();
|
|
67
|
+
}
|
|
68
|
+
|
|
64
69
|
/**
|
|
65
70
|
* Authenticated raw binary upload staging handler (`POST /media/upload-stage`).
|
|
66
71
|
*
|
|
@@ -203,7 +208,7 @@ function verifyMediaToken(token: string, fileId: string): { fileId: string; user
|
|
|
203
208
|
* provider indistinguishable from a deleted file.
|
|
204
209
|
*/
|
|
205
210
|
async function resolveFileBytesSource(fileId: string): Promise<FileBytesSource | null> {
|
|
206
|
-
const systemUser: UserInfo = await
|
|
211
|
+
const systemUser: UserInfo = await GetSystemUser();
|
|
207
212
|
|
|
208
213
|
// The /media route runs pre-auth on the server's own provider; access was already authorized
|
|
209
214
|
// at token-mint time, so this load only locates the bytes.
|
|
@@ -261,7 +266,7 @@ async function streamOrBuffer(req: Request, res: Response, source: FileBytesSour
|
|
|
261
266
|
|
|
262
267
|
/** True-streaming path: `GetObjectStream` + pipe, with 206 when a Range was honored. */
|
|
263
268
|
async function serveViaStream(res: Response, source: FileBytesSource, rangeHeader: string | undefined): Promise<void> {
|
|
264
|
-
const range = rangeHeader ?
|
|
269
|
+
const range = rangeHeader ? ParseRangeHeaderLoose(rangeHeader) : undefined;
|
|
265
270
|
// Omit End for an open-ended range so the driver streams to EOF (per ByteRange semantics).
|
|
266
271
|
const streamRange: ByteRange | undefined = range
|
|
267
272
|
? (range.end == null ? { Start: range.start } : { Start: range.start, End: range.end })
|
|
@@ -315,7 +320,7 @@ async function serveViaBuffer(res: Response, source: FileBytesSource, rangeHeade
|
|
|
315
320
|
return;
|
|
316
321
|
}
|
|
317
322
|
|
|
318
|
-
const range =
|
|
323
|
+
const range = ParseRange(rangeHeader, total);
|
|
319
324
|
if (!range) {
|
|
320
325
|
// Unsatisfiable range — per RFC 7233, 416 + Content-Range with the total size.
|
|
321
326
|
res.setHeader('Content-Range', `bytes */${total}`);
|
|
@@ -33,11 +33,11 @@ const ENTITY_OAUTH_AUTHORIZATION_STATES = 'MJ: O Auth Authorization States';
|
|
|
33
33
|
*/
|
|
34
34
|
export interface OAuthCallbackHandlerOptions {
|
|
35
35
|
/** Base URL for this MJAPI instance (for redirects) */
|
|
36
|
-
publicUrl: string;
|
|
36
|
+
publicUrl: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it
|
|
37
37
|
/** URL to redirect to after successful authorization */
|
|
38
|
-
successRedirectUrl?: string;
|
|
38
|
+
successRedirectUrl?: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it
|
|
39
39
|
/** URL to redirect to after failed authorization */
|
|
40
|
-
errorRedirectUrl?: string;
|
|
40
|
+
errorRedirectUrl?: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it
|
|
41
41
|
/**
|
|
42
42
|
* Origins a caller-supplied `frontendReturnUrl` is allowed to point at, so the OAuth callback
|
|
43
43
|
* cannot be turned into an open redirect from the trusted MJAPI origin. Normally wired to
|
|
@@ -54,7 +54,7 @@ export interface OAuthCallbackHandlerOptions {
|
|
|
54
54
|
* dependency on configuration loading — importing the config module validates the whole config
|
|
55
55
|
* as a side effect, which makes this handler unimportable in any context without one.
|
|
56
56
|
*/
|
|
57
|
-
allowedFrontendOrigins: string[];
|
|
57
|
+
allowedFrontendOrigins: string[]; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
/**
|
|
@@ -863,16 +863,26 @@ export class OAuthCallbackHandler {
|
|
|
863
863
|
/**
|
|
864
864
|
* Gets the router for unauthenticated callback endpoint.
|
|
865
865
|
*/
|
|
866
|
-
public
|
|
866
|
+
public GetCallbackRouter(): express.Router {
|
|
867
867
|
return this.callbackRouter;
|
|
868
868
|
}
|
|
869
869
|
|
|
870
|
+
/** @deprecated Use {@link GetCallbackRouter}. */
|
|
871
|
+
public getCallbackRouter(): express.Router {
|
|
872
|
+
return this.GetCallbackRouter();
|
|
873
|
+
}
|
|
874
|
+
|
|
870
875
|
/**
|
|
871
876
|
* Gets the router for authenticated OAuth endpoints.
|
|
872
877
|
*/
|
|
873
|
-
public
|
|
878
|
+
public GetAuthenticatedRouter(): express.Router {
|
|
874
879
|
return this.authenticatedRouter;
|
|
875
880
|
}
|
|
881
|
+
|
|
882
|
+
/** @deprecated Use {@link GetAuthenticatedRouter}. */
|
|
883
|
+
public getAuthenticatedRouter(): express.Router {
|
|
884
|
+
return this.GetAuthenticatedRouter();
|
|
885
|
+
}
|
|
876
886
|
}
|
|
877
887
|
|
|
878
888
|
/**
|
|
@@ -881,7 +891,7 @@ export class OAuthCallbackHandler {
|
|
|
881
891
|
* @param options - Handler configuration
|
|
882
892
|
* @returns Object with callback and authenticated routers
|
|
883
893
|
*/
|
|
884
|
-
export function
|
|
894
|
+
export function CreateOAuthCallbackHandler(options: OAuthCallbackHandlerOptions): {
|
|
885
895
|
callbackRouter: express.Router;
|
|
886
896
|
authenticatedRouter: express.Router;
|
|
887
897
|
} {
|
|
@@ -891,3 +901,11 @@ export function createOAuthCallbackHandler(options: OAuthCallbackHandlerOptions)
|
|
|
891
901
|
authenticatedRouter: handler.getAuthenticatedRouter()
|
|
892
902
|
};
|
|
893
903
|
}
|
|
904
|
+
|
|
905
|
+
/** @deprecated Use {@link CreateOAuthCallbackHandler}. */
|
|
906
|
+
export function createOAuthCallbackHandler(options: OAuthCallbackHandlerOptions): {
|
|
907
|
+
callbackRouter: express.Router;
|
|
908
|
+
authenticatedRouter: express.Router;
|
|
909
|
+
} {
|
|
910
|
+
return CreateOAuthCallbackHandler(options);
|
|
911
|
+
}
|
|
@@ -16,7 +16,7 @@ export interface RESTEndpointHandlerOptions {
|
|
|
16
16
|
* If provided, only these entities will be accessible through the REST API
|
|
17
17
|
* Supports wildcards using '*' (e.g., 'User*' matches 'User', 'UserRole', etc.)
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
IncludeEntities?: string[];
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Array of entity names to exclude from the API (case-insensitive)
|
|
@@ -24,20 +24,20 @@ export interface RESTEndpointHandlerOptions {
|
|
|
24
24
|
* Supports wildcards using '*' (e.g., 'Secret*' matches 'Secret', 'SecretKey', etc.)
|
|
25
25
|
* Note: Exclude patterns always override include patterns
|
|
26
26
|
*/
|
|
27
|
-
|
|
27
|
+
ExcludeEntities?: string[];
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* Array of schema names to include in the API (case-insensitive)
|
|
31
31
|
* If provided, only entities in these schemas will be accessible through the REST API
|
|
32
32
|
*/
|
|
33
|
-
|
|
33
|
+
IncludeSchemas?: string[];
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Array of schema names to exclude from the API (case-insensitive)
|
|
37
37
|
* Entities in these schemas will not be accessible through the REST API
|
|
38
38
|
* Note: Exclude patterns always override include patterns
|
|
39
39
|
*/
|
|
40
|
-
|
|
40
|
+
ExcludeSchemas?: string[];
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/**
|
|
@@ -85,21 +85,21 @@ export class RESTEndpointHandler {
|
|
|
85
85
|
const schemaName = entity.SchemaName.toLowerCase();
|
|
86
86
|
|
|
87
87
|
// 1. Check schema exclusions first (these take highest precedence)
|
|
88
|
-
if (this.options.
|
|
89
|
-
if (this.options.
|
|
88
|
+
if (this.options.ExcludeSchemas && this.options.ExcludeSchemas.length > 0) {
|
|
89
|
+
if (this.options.ExcludeSchemas.some(schema => schema.toLowerCase() === schemaName)) {
|
|
90
90
|
return false;
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
// 2. Check entity exclusions next (these override entity inclusions)
|
|
95
|
-
if (this.options.
|
|
95
|
+
if (this.options.ExcludeEntities && this.options.ExcludeEntities.length > 0) {
|
|
96
96
|
// Check for direct match
|
|
97
|
-
if (this.options.
|
|
97
|
+
if (this.options.ExcludeEntities.includes(name)) {
|
|
98
98
|
return false;
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
// Check for wildcard matches
|
|
102
|
-
for (const pattern of this.options.
|
|
102
|
+
for (const pattern of this.options.ExcludeEntities) {
|
|
103
103
|
if (pattern.includes('*')) {
|
|
104
104
|
const regex = new RegExp('^' + pattern.toLowerCase().replace(/\*/g, '.*') + '$');
|
|
105
105
|
if (regex.test(name)) {
|
|
@@ -110,21 +110,21 @@ export class RESTEndpointHandler {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
// 3. Check schema inclusions (if specified, only entities from these schemas are allowed)
|
|
113
|
-
if (this.options.
|
|
114
|
-
if (!this.options.
|
|
113
|
+
if (this.options.IncludeSchemas && this.options.IncludeSchemas.length > 0) {
|
|
114
|
+
if (!this.options.IncludeSchemas.some(schema => schema.toLowerCase() === schemaName)) {
|
|
115
115
|
return false;
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
// 4. Check entity inclusions
|
|
120
|
-
if (this.options.
|
|
120
|
+
if (this.options.IncludeEntities && this.options.IncludeEntities.length > 0) {
|
|
121
121
|
// Check for direct match
|
|
122
|
-
if (this.options.
|
|
122
|
+
if (this.options.IncludeEntities.includes(name)) {
|
|
123
123
|
return true;
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
// Check for wildcard matches
|
|
127
|
-
for (const pattern of this.options.
|
|
127
|
+
for (const pattern of this.options.IncludeEntities) {
|
|
128
128
|
if (pattern.includes('*')) {
|
|
129
129
|
const regex = new RegExp('^' + pattern.toLowerCase().replace(/\*/g, '.*') + '$');
|
|
130
130
|
if (regex.test(name)) {
|
|
@@ -804,7 +804,12 @@ export class RESTEndpointHandler {
|
|
|
804
804
|
/**
|
|
805
805
|
* Get the Express router with all configured routes
|
|
806
806
|
*/
|
|
807
|
-
public
|
|
807
|
+
public GetRouter(): express.Router {
|
|
808
808
|
return this.router;
|
|
809
809
|
}
|
|
810
|
+
|
|
811
|
+
/** @deprecated Use {@link GetRouter}. */
|
|
812
|
+
public getRouter(): express.Router {
|
|
813
|
+
return this.GetRouter();
|
|
814
|
+
}
|
|
810
815
|
}
|
|
@@ -8,7 +8,7 @@ import { LogError, LogStatus } from '@memberjunction/core';
|
|
|
8
8
|
* BEFORE any request body parsing occurs. This prevents anonymous/unauthorized callers
|
|
9
9
|
* from causing body-parser memory allocations.
|
|
10
10
|
*/
|
|
11
|
-
export function
|
|
11
|
+
export function RequireTicket(req: Request, res: Response, next: NextFunction): void {
|
|
12
12
|
const ticketId = (req.query['ticket'] as string) || '';
|
|
13
13
|
if (!ticketId) {
|
|
14
14
|
res.status(401).json({ error: 'Unauthorized: missing ticket' });
|
|
@@ -26,6 +26,11 @@ export function requireTicket(req: Request, res: Response, next: NextFunction):
|
|
|
26
26
|
next();
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
/** @deprecated Use {@link RequireTicket}. */
|
|
30
|
+
export function requireTicket(req: Request, res: Response, next: NextFunction): void {
|
|
31
|
+
return RequireTicket(req, res, next);
|
|
32
|
+
}
|
|
33
|
+
|
|
29
34
|
/**
|
|
30
35
|
* Builds the Express router handling the Realtime WebRTC SDP exchange:
|
|
31
36
|
* `POST /realtime/sdp-exchange?ticket=<ticketId>`
|
|
@@ -36,12 +41,12 @@ export function requireTicket(req: Request, res: Response, next: NextFunction):
|
|
|
36
41
|
* BEFORE body parsing, delegates to `driver.ExchangeWebRtcSdp` to exchange the SDP offer for an
|
|
37
42
|
* answer with upstream using the server's API key, and returns the answer SDP.
|
|
38
43
|
*/
|
|
39
|
-
export function
|
|
44
|
+
export function CreateRealtimeSdpBrokerRouter(): Router {
|
|
40
45
|
const router = express.Router();
|
|
41
46
|
|
|
42
47
|
router.post(
|
|
43
48
|
'/',
|
|
44
|
-
|
|
49
|
+
RequireTicket,
|
|
45
50
|
express.json({ limit: '2mb' }),
|
|
46
51
|
async (req: Request, res: Response): Promise<void> => {
|
|
47
52
|
const entry = res.locals.ticketEntry as RealtimeProxyTicketEntry;
|
|
@@ -95,7 +100,12 @@ export function createRealtimeSdpBrokerRouter(): Router {
|
|
|
95
100
|
return router;
|
|
96
101
|
}
|
|
97
102
|
|
|
103
|
+
/** @deprecated Use {@link CreateRealtimeSdpBrokerRouter}. */
|
|
104
|
+
export function createRealtimeSdpBrokerRouter(): Router {
|
|
105
|
+
return CreateRealtimeSdpBrokerRouter();
|
|
106
|
+
}
|
|
107
|
+
|
|
98
108
|
/**
|
|
99
109
|
* @deprecated Use `createRealtimeSdpBrokerRouter` instead.
|
|
100
110
|
*/
|
|
101
|
-
export const createOpenAILiveBrokerRouter =
|
|
111
|
+
export const createOpenAILiveBrokerRouter = CreateRealtimeSdpBrokerRouter;
|