@memberjunction/server 6.1.4 → 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/exampleNewUserSubClass.js +2 -1
- package/dist/auth/exampleNewUserSubClass.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 +293 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -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 +266 -4
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +1304 -0
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +8 -2
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +7 -3
- package/dist/generic/CacheInvalidationResolver.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 +27 -1
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +64 -6
- 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 +29 -6
- 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/FetchEntityVectorsResolver.js +2 -2
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- 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/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +2 -1
- package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +3 -3
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +37 -0
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +101 -11
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- 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 +74 -42
- 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/SearchEntitiesResolver.d.ts.map +1 -1
- package/dist/resolvers/SearchEntitiesResolver.js +3 -1
- package/dist/resolvers/SearchEntitiesResolver.js.map +1 -1
- package/dist/resolvers/SearchKnowledgeResolver.d.ts +1 -0
- package/dist/resolvers/SearchKnowledgeResolver.d.ts.map +1 -1
- package/dist/resolvers/SearchKnowledgeResolver.js +5 -0
- package/dist/resolvers/SearchKnowledgeResolver.js.map +1 -1
- package/dist/resolvers/SearchKnowledgeSystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/SearchKnowledgeSystemUserResolver.js +1 -0
- package/dist/resolvers/SearchKnowledgeSystemUserResolver.js.map +1 -1
- 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/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +53 -4
- package/dist/resolvers/TransactionGroupResolver.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/MJStorageBlobStore.d.ts +41 -0
- package/dist/services/MJStorageBlobStore.d.ts.map +1 -0
- package/dist/services/MJStorageBlobStore.js +160 -0
- package/dist/services/MJStorageBlobStore.js.map +1 -0
- 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 +12 -3
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +19 -8
- package/dist/util.js.map +1 -1
- package/package.json +92 -92
- 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__/RealtimeClientSessionResolver.test.ts +229 -0
- 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__/ResolverBase.isaPromotionCreate.test.ts +412 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +228 -0
- package/src/__tests__/SearchEntitiesResolver.readOnlyFallback.test.ts +78 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +129 -0
- package/src/__tests__/TaskGraphFrameResolver.test.ts +2 -2
- package/src/__tests__/TransactionGroupResolver.refusals.test.ts +290 -0
- 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__/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/exampleNewUserSubClass.ts +2 -2
- 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 +14 -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 +933 -5
- package/src/generic/CacheInvalidationResolver.ts +12 -4
- package/src/generic/FireAndForgetHeartbeat.ts +19 -14
- package/src/generic/PushStatusResolver.ts +21 -7
- package/src/generic/ResolverBase.ts +66 -5
- package/src/generic/RunViewResolver.ts +22 -22
- package/src/generic/__tests__/FireAndForgetHeartbeat.test.ts +7 -7
- package/src/index.ts +34 -7
- 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/FetchEntityVectorsResolver.ts +2 -2
- 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/QuerySystemUserResolver.ts +2 -1
- package/src/resolvers/RealtimeBridgeResolver.ts +3 -3
- package/src/resolvers/RealtimeClientSessionResolver.ts +126 -13
- package/src/resolvers/RemoteBrowserActionResolver.ts +5 -5
- package/src/resolvers/RunAIAgentResolver.ts +118 -76
- package/src/resolvers/RunAIPromptResolver.ts +22 -22
- package/src/resolvers/RunTemplateResolver.ts +4 -4
- package/src/resolvers/RunTestResolver.ts +25 -25
- package/src/resolvers/SearchEntitiesResolver.ts +3 -1
- package/src/resolvers/SearchKnowledgeResolver.ts +4 -0
- package/src/resolvers/SearchKnowledgeSystemUserResolver.ts +1 -0
- package/src/resolvers/SqlLoggingConfigResolver.ts +56 -56
- package/src/resolvers/TaskGraphFrameResolver.ts +37 -28
- package/src/resolvers/TelemetryResolver.ts +79 -79
- package/src/resolvers/TransactionGroupResolver.ts +57 -4
- 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/MJStorageBlobStore.ts +209 -0
- package/src/services/TaskGraphActionRunner.ts +16 -15
- package/src/types.ts +21 -16
- package/src/util.ts +22 -9
|
@@ -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;
|
|
@@ -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
|
+
}
|