@oneuptime/common 12.0.5 → 12.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AIRun.ts +33 -0
- package/Models/DatabaseModels/DataSource.ts +744 -0
- package/Models/DatabaseModels/Index.ts +3 -0
- package/Models/DatabaseModels/ProjectCallSMSConfig.ts +10 -2
- package/Models/DatabaseModels/User.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
- package/Models/DatabaseModels/UserSession.ts +2 -0
- package/Models/DatabaseModels/UserTotpAuth.ts +6 -4
- package/Models/DatabaseModels/UserWebAuthn.ts +5 -3
- package/Server/API/AIInsightAPI.ts +47 -4
- package/Server/API/AIInvestigationAPI.ts +25 -0
- package/Server/API/DashboardAPI.ts +176 -492
- package/Server/API/DataSourceAPI.ts +268 -0
- package/Server/API/StatusPageAPI.ts +11 -1
- package/Server/API/UserAPI.ts +119 -0
- package/Server/Infrastructure/ClickhouseConfig.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.ts +24 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.ts +76 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Infrastructure/Queue.ts +26 -0
- package/Server/Infrastructure/QueueWorker.ts +17 -0
- package/Server/Middleware/TelemetryIngest.ts +8 -3
- package/Server/Services/AIInsightService.ts +132 -12
- package/Server/Services/AIRunService.ts +34 -0
- package/Server/Services/AIService.ts +17 -2
- package/Server/Services/AlertService.ts +38 -32
- package/Server/Services/AnalyticsDatabaseService.ts +8 -4
- package/Server/Services/DataSourceService.ts +200 -0
- package/Server/Services/HostService.ts +92 -0
- package/Server/Services/IncidentService.ts +45 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/MonitorService.ts +49 -0
- package/Server/Services/MonitorStatusService.ts +166 -0
- package/Server/Services/OpenTelemetryIngestService.ts +255 -184
- package/Server/Services/RumSessionPinService.ts +7 -21
- package/Server/Services/StatusPageSubscriberService.ts +13 -0
- package/Server/Services/UserService.ts +280 -9
- package/Server/Static/Vendor/README.md +62 -0
- package/Server/Static/Vendor/fonts/InterVariable.woff2 +0 -0
- package/Server/Static/Vendor/highlight/highlight.min.js +1244 -0
- package/Server/Static/Vendor/highlight/languages/apache.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/bash.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/c.min.js +41 -0
- package/Server/Static/Vendor/highlight/languages/cpp.min.js +47 -0
- package/Server/Static/Vendor/highlight/languages/csharp.min.js +49 -0
- package/Server/Static/Vendor/highlight/languages/css.min.js +31 -0
- package/Server/Static/Vendor/highlight/languages/diff.min.js +9 -0
- package/Server/Static/Vendor/highlight/languages/dns.min.js +11 -0
- package/Server/Static/Vendor/highlight/languages/dockerfile.min.js +8 -0
- package/Server/Static/Vendor/highlight/languages/go.min.js +20 -0
- package/Server/Static/Vendor/highlight/languages/graphql.min.js +12 -0
- package/Server/Static/Vendor/highlight/languages/http.min.js +14 -0
- package/Server/Static/Vendor/highlight/languages/ini.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/java.min.js +38 -0
- package/Server/Static/Vendor/highlight/languages/javascript.min.js +81 -0
- package/Server/Static/Vendor/highlight/languages/json.min.js +8 -0
- package/Server/Static/Vendor/highlight/languages/kotlin.min.js +46 -0
- package/Server/Static/Vendor/highlight/languages/lua.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/makefile.min.js +14 -0
- package/Server/Static/Vendor/highlight/languages/nginx.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/perl.min.js +41 -0
- package/Server/Static/Vendor/highlight/languages/php.min.js +59 -0
- package/Server/Static/Vendor/highlight/languages/powershell.min.js +39 -0
- package/Server/Static/Vendor/highlight/languages/python.min.js +42 -0
- package/Server/Static/Vendor/highlight/languages/r.min.js +26 -0
- package/Server/Static/Vendor/highlight/languages/ruby.min.js +54 -0
- package/Server/Static/Vendor/highlight/languages/rust.min.js +27 -0
- package/Server/Static/Vendor/highlight/languages/scala.min.js +28 -0
- package/Server/Static/Vendor/highlight/languages/sql.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/swift.min.js +68 -0
- package/Server/Static/Vendor/highlight/languages/typescript.min.js +99 -0
- package/Server/Static/Vendor/highlight/languages/xml.min.js +29 -0
- package/Server/Static/Vendor/highlight/languages/yaml.min.js +28 -0
- package/Server/Static/Vendor/highlight/styles/github-dark.min.css +10 -0
- package/Server/Static/Vendor/highlight/styles/vs2015.min.css +1 -0
- package/Server/Static/Vendor/tailwind/tailwind-3.4.5.js +21028 -0
- package/Server/Types/Database/Permissions/BasePermission.ts +7 -0
- package/Server/Types/Database/Permissions/DeletePermission.ts +2 -0
- package/Server/Types/Database/Permissions/ReadPermission.ts +3 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +101 -16
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +2 -2
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +90 -11
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +1 -0
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +1 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.ts +125 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +25 -15
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +256 -57
- package/Server/Utils/AI/SRE/Insights/InsightStore.ts +76 -18
- package/Server/Utils/AI/SRE/InvestigationTldr.ts +352 -0
- package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +7 -2
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +1793 -0
- package/Server/Utils/Dashboard/PublicDashboardViewConfig.ts +65 -0
- package/Server/Utils/DataSource/ConnectorRegistry.ts +53 -0
- package/Server/Utils/DataSource/Connectors/ClickHouseConnector.ts +338 -0
- package/Server/Utils/DataSource/Connectors/ElasticsearchConnector.ts +717 -0
- package/Server/Utils/DataSource/Connectors/LokiConnector.ts +606 -0
- package/Server/Utils/DataSource/Connectors/MySqlConnector.ts +307 -0
- package/Server/Utils/DataSource/Connectors/PostgresConnector.ts +260 -0
- package/Server/Utils/DataSource/Connectors/PrometheusConnector.ts +555 -0
- package/Server/Utils/DataSource/Connectors/RestApiConnector.ts +597 -0
- package/Server/Utils/DataSource/Connectors/SqlServerConnector.ts +318 -0
- package/Server/Utils/DataSource/EgressGuard.ts +446 -0
- package/Server/Utils/DataSource/HttpFetch.ts +221 -0
- package/Server/Utils/DataSource/SqlQueryGuard.ts +383 -0
- package/Server/Utils/DataSource/SqlResultShaper.ts +372 -0
- package/Server/Utils/DataSource/Types.ts +93 -0
- package/Server/Utils/Database/PostgresErrorTranslator.ts +172 -17
- package/Server/Utils/InProcessMemo.ts +141 -0
- package/Server/Utils/InstanceHealth/TelemetryIngestion.ts +628 -0
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +58 -0
- package/Server/Utils/Monitor/MonitorResource.ts +14 -0
- package/Server/Utils/Response.ts +12 -1
- package/Server/Utils/SSRFProtection.ts +237 -0
- package/Server/Utils/StartServer.ts +8 -0
- package/Server/Utils/StatusPageSubscriberWebhook.ts +30 -0
- package/Server/Utils/Telemetry/CaptureSpan.ts +30 -18
- package/Server/Utils/Telemetry/IngestionTimestamp.ts +75 -0
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +99 -7
- package/Server/Utils/Telemetry/Telemetry.ts +112 -1
- package/Server/Utils/Telemetry.ts +104 -3
- package/Server/Utils/VendorAssets.ts +165 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +28 -5
- package/Server/Utils/Workspace/Slack/Slack.ts +5 -0
- package/Server/Views/Partials/Head.ejs +21 -7
- package/Tests/App/AdminDashboard/AdminProjectsIdFilter.test.tsx +207 -0
- package/Tests/App/AdminDashboard/AdminUsersIdFilter.test.tsx +216 -0
- package/Tests/App/Dashboard/AIInsightViewActions.test.tsx +422 -0
- package/Tests/App/Dashboard/AddWidgetModal.test.tsx +10 -3
- package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +387 -0
- package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +199 -0
- package/Tests/App/Dashboard/DataSourceChartSyntheticConfig.test.tsx +736 -0
- package/Tests/App/Dashboard/DataSourceQueryEditor.test.tsx +868 -0
- package/Tests/App/Dashboard/DataSourceWidgetCatalog.test.ts +440 -0
- package/Tests/App/Dashboard/DataSourceWidgetFetching.test.tsx +2109 -0
- package/Tests/App/Dashboard/DataSourceWidgetViews.test.tsx +726 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +447 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +514 -3
- package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +391 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +326 -0
- package/Tests/App/Dashboard/SideMenuHarness.tsx +187 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +6 -1
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +1858 -0
- package/Tests/Models/DatabaseModels/DataSourceModelSecrets.test.ts +70 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +187 -0
- package/Tests/Server/API/DashboardPublicDataSourceStrip.test.ts +686 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +585 -823
- package/Tests/Server/API/DataSourceAPIRoutes.test.ts +486 -0
- package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +291 -0
- package/Tests/Server/API/UserAuthenticationAPI.test.ts +641 -0
- package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +441 -0
- package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +140 -0
- package/Tests/Server/Services/AIInsightService.test.ts +266 -11
- package/Tests/Server/Services/AIRunAnalysisTldrPersistence.test.ts +160 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +4 -0
- package/Tests/Server/Services/AlertMetricResourceAttributes.test.ts +352 -0
- package/Tests/Server/Services/DataSourceServiceSettings.test.ts +244 -0
- package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +397 -0
- package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +41 -2
- package/Tests/Server/Services/IncidentMetricResourceAttributes.test.ts +408 -0
- package/Tests/Server/Services/MonitorStatusServiceDeleteReferenceCleanup.test.ts +351 -0
- package/Tests/Server/Services/MonitorStatusServiceValidation.test.ts +171 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +398 -0
- package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +19 -0
- package/Tests/Server/Services/ProjectCallSMSConfigCredentialUniqueness.test.ts +305 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +36 -1
- package/Tests/Server/Services/RumSessionPinUniqueViolationRecovery.test.ts +163 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +973 -0
- package/Tests/Server/Types/Database/ObjectIdColumnQuery.test.ts +262 -0
- package/Tests/Server/Types/Database/Permissions/TenantPermission.test.ts +358 -0
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +2 -2
- package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +6 -1
- package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +121 -4
- package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +361 -10
- package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +292 -0
- package/Tests/Server/Utils/AI/InvestigationTldr.test.ts +623 -0
- package/Tests/Server/Utils/AI/InvestigationTldrWiring.test.ts +98 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +857 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardViewConfig.test.ts +480 -0
- package/Tests/Server/Utils/DataSource/ClickHouseConnector.test.ts +759 -0
- package/Tests/Server/Utils/DataSource/ConnectorRegistry.test.ts +37 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +645 -0
- package/Tests/Server/Utils/DataSource/ElasticsearchConnector.test.ts +1206 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +616 -0
- package/Tests/Server/Utils/DataSource/LokiConnector.test.ts +970 -0
- package/Tests/Server/Utils/DataSource/MySqlConnector.test.ts +935 -0
- package/Tests/Server/Utils/DataSource/PostgresConnector.test.ts +854 -0
- package/Tests/Server/Utils/DataSource/PrometheusConnector.test.ts +881 -0
- package/Tests/Server/Utils/DataSource/RestApiConnector.test.ts +1020 -0
- package/Tests/Server/Utils/DataSource/SqlQueryGuard.test.ts +425 -0
- package/Tests/Server/Utils/DataSource/SqlResultShaper.test.ts +555 -0
- package/Tests/Server/Utils/DataSource/SqlServerConnector.test.ts +934 -0
- package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +228 -7
- package/Tests/Server/Utils/InProcessMemo.test.ts +292 -0
- package/Tests/Server/Utils/InstanceHealth/TelemetryIngestion.test.ts +960 -0
- package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +103 -0
- package/Tests/Server/Utils/Monitor/MonitorMetricResourceAttributes.test.ts +336 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +521 -0
- package/Tests/Server/Utils/ResponseRenderAnalytics.test.ts +143 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +193 -0
- package/Tests/Server/Utils/StatusPageSubscriberWebhook.test.ts +101 -0
- package/Tests/Server/Utils/TailwindBuildCopy.test.ts +225 -0
- package/Tests/Server/Utils/Telemetry/ResourceHeartbeatL1Memo.test.ts +355 -0
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +128 -0
- package/Tests/Server/Utils/Telemetry/TelemetryUtilAttributeKeys.test.ts +381 -0
- package/Tests/Server/Utils/Telemetry.test.ts +87 -0
- package/Tests/Server/Utils/VendorAssetIntegrity.test.ts +343 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +671 -0
- package/Tests/Server/Views/OfflineRender.test.ts +297 -0
- package/Tests/Types/Dashboard/DataSourceComponentTypes.test.ts +618 -0
- package/Tests/Types/DateClickhouseFormat.test.ts +192 -0
- package/Tests/Types/Password.test.ts +363 -0
- package/Tests/UI/Components/ConfirmModal.test.tsx +7 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +53 -0
- package/Tests/UI/Components/Modal.test.tsx +281 -1
- package/Tests/UI/Components/ObjectIdFilterPipeline.test.tsx +396 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupNavigator.test.tsx +1147 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +116 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/Utils/Analytics.test.ts +23 -0
- package/Tests/Utils/Dashboard/Components/DashboardDataSourceComponents.test.ts +640 -0
- package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +138 -0
- package/Tests/Utils/DataSource/DataSourceValueReducer.test.ts +526 -0
- package/Tests/Utils/Metrics/MetricResourceAttributeUtil.test.ts +691 -0
- package/Tests/Utils/StatusPage/GroupHierarchyView.test.ts +1452 -0
- package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +931 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +288 -0
- package/Tests/Utils/Telemetry/IngestionTimestamp.test.ts +170 -0
- package/Types/AI/AIInsightEvidence.ts +6 -0
- package/Types/Analytics/RevenueEvent.ts +31 -0
- package/Types/Dashboard/DashboardComponentType.ts +31 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.ts +27 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.ts +32 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.ts +30 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.ts +55 -0
- package/Types/DataSource/DataSourceLimits.ts +62 -0
- package/Types/DataSource/DataSourceQueryConfig.ts +41 -0
- package/Types/DataSource/DataSourceTableResult.ts +38 -0
- package/Types/DataSource/DataSourceType.ts +213 -0
- package/Types/Date.ts +43 -3
- package/Types/Password.ts +64 -0
- package/Types/Permission.ts +46 -0
- package/Types/UserAuthenticationStatus.ts +34 -0
- package/UI/Components/Button/Button.tsx +1 -1
- package/UI/Components/ErrorBoundary.tsx +459 -108
- package/UI/Components/Icon/Icon.tsx +10 -9
- package/UI/Components/Modal/ConfirmModal.tsx +6 -1
- package/UI/Components/Modal/Modal.tsx +267 -35
- package/UI/Components/Modal/ModalFooter.tsx +6 -1
- package/UI/Components/MoreMenu/MoreMenu.tsx +19 -4
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +6 -1
- package/UI/Components/StatusPage/ResourceGrid.tsx +314 -0
- package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +808 -0
- package/UI/Components/StatusPage/ResourceList.tsx +570 -0
- package/UI/Styles/Theme.css +18 -0
- package/UI/Utils/API/RequestOptions.ts +7 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +1 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +1 -0
- package/UI/Utils/TestDataSource.ts +61 -0
- package/UI/esbuild-config.js +45 -0
- package/Utils/Analytics.ts +15 -0
- package/Utils/Dashboard/Components/DashboardDataSourceChartComponent.ts +88 -0
- package/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.ts +123 -0
- package/Utils/Dashboard/Components/DashboardDataSourceShared.ts +16 -0
- package/Utils/Dashboard/Components/DashboardDataSourceTableComponent.ts +72 -0
- package/Utils/Dashboard/Components/DashboardDataSourceValueComponent.ts +126 -0
- package/Utils/Dashboard/Components/Index.ts +28 -0
- package/Utils/DataSource/DataSourceQueryText.ts +94 -0
- package/Utils/DataSource/DataSourceValueReducer.ts +156 -0
- package/Utils/Metrics/MetricResourceAttributeUtil.ts +380 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +8 -6
- package/Utils/StatusPage/GroupHierarchyView.ts +931 -0
- package/Utils/StatusPage/ResourceExplorer.ts +853 -0
- package/build/dist/Models/DatabaseModels/AIRun.js +34 -0
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DataSource.js +774 -0
- package/build/dist/Models/DatabaseModels/DataSource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +14 -4
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +2 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSession.js +2 -0
- package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js +6 -4
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +5 -3
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +34 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +23 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +119 -433
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DataSourceAPI.js +173 -0
- package/build/dist/Server/API/DataSourceAPI.js.map +1 -0
- package/build/dist/Server/API/StatusPageAPI.js +11 -1
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +94 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +49 -0
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js +64 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +27 -0
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +13 -0
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +8 -3
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIInsightService.js +110 -10
- package/build/dist/Server/Services/AIInsightService.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +34 -0
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +16 -2
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +28 -35
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +8 -4
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DataSourceService.js +159 -0
- package/build/dist/Server/Services/DataSourceService.js.map +1 -0
- package/build/dist/Server/Services/HostService.js +74 -0
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +35 -24
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +45 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusService.js +129 -0
- package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +222 -159
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +7 -15
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +10 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +241 -10
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +6 -0
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/DeletePermission.js +1 -0
- package/build/dist/Server/Types/Database/Permissions/DeletePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +2 -0
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +68 -12
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +2 -2
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +68 -8
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +1 -0
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +1 -0
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js +97 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +17 -15
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +178 -54
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +65 -16
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js +303 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +1261 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js +47 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js +42 -0
- package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js +187 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js +493 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js +399 -0
- package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js +195 -0
- package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js +149 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js +362 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js +342 -0
- package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js +186 -0
- package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +305 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +134 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js +331 -0
- package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/SqlResultShaper.js +280 -0
- package/build/dist/Server/Utils/DataSource/SqlResultShaper.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Types.js +2 -0
- package/build/dist/Server/Utils/DataSource/Types.js.map +1 -0
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +103 -9
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
- package/build/dist/Server/Utils/InProcessMemo.js +113 -0
- package/build/dist/Server/Utils/InProcessMemo.js.map +1 -0
- package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js +406 -0
- package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +34 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +14 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +9 -1
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +192 -0
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +7 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +24 -0
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +25 -11
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js +32 -0
- package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +92 -5
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +92 -6
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +93 -6
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +121 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +5 -0
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/Analytics/RevenueEvent.js +26 -0
- package/build/dist/Types/Analytics/RevenueEvent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +27 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js +16 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceLimits.js +47 -0
- package/build/dist/Types/DataSource/DataSourceLimits.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceQueryConfig.js +10 -0
- package/build/dist/Types/DataSource/DataSourceQueryConfig.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceTableResult.js +14 -0
- package/build/dist/Types/DataSource/DataSourceTableResult.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceType.js +183 -0
- package/build/dist/Types/DataSource/DataSourceType.js.map +1 -0
- package/build/dist/Types/Date.js +38 -3
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Password.js +56 -0
- package/build/dist/Types/Password.js.map +1 -0
- package/build/dist/Types/Permission.js +42 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/UserAuthenticationStatus.js +2 -0
- package/build/dist/Types/UserAuthenticationStatus.js.map +1 -0
- package/build/dist/UI/Components/ErrorBoundary.js +388 -72
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +10 -4
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +178 -19
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +3 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +9 -6
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +7 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js +119 -0
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +354 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceList.js +203 -0
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -0
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +1 -6
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +3 -8
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/TestDataSource.js +39 -0
- package/build/dist/UI/Utils/TestDataSource.js.map +1 -0
- package/build/dist/Utils/Analytics.js +4 -0
- package/build/dist/Utils/Analytics.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js +79 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js +111 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js +15 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js +62 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js +112 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/DataSource/DataSourceQueryText.js +64 -0
- package/build/dist/Utils/DataSource/DataSourceQueryText.js.map +1 -0
- package/build/dist/Utils/DataSource/DataSourceValueReducer.js +124 -0
- package/build/dist/Utils/DataSource/DataSourceValueReducer.js.map +1 -0
- package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js +281 -0
- package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +8 -6
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupHierarchyView.js +560 -0
- package/build/dist/Utils/StatusPage/GroupHierarchyView.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js +519 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -0
- package/jest.config.json +1 -0
- package/package.json +5 -1
- package/tsconfig.json +12 -10
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import { DATA_SOURCE_CONNECT_TIMEOUT_IN_MS, DATA_SOURCE_MAX_TABLE_ROWS, DATA_SOURCE_MAX_TIME_SERIES_ROWS, DATA_SOURCE_QUERY_TIMEOUT_IN_MS, } from "../../../../Types/DataSource/DataSourceLimits";
|
|
2
|
+
import DataSourceType from "../../../../Types/DataSource/DataSourceType";
|
|
3
|
+
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
4
|
+
import DataSourceEgressGuard from "../EgressGuard";
|
|
5
|
+
import DataSourceHttpFetch from "../HttpFetch";
|
|
6
|
+
import SqlResultShaper from "../SqlResultShaper";
|
|
7
|
+
const ABSOLUTE_URL_REGEX = /^https?:\/\//i;
|
|
8
|
+
// Pure base-10 index, for traversing arrays in a rowsPath.
|
|
9
|
+
const ARRAY_INDEX_REGEX = /^\d+$/;
|
|
10
|
+
function describeJsonValue(value) {
|
|
11
|
+
if (value === undefined) {
|
|
12
|
+
return "undefined (the field is missing)";
|
|
13
|
+
}
|
|
14
|
+
if (value === null) {
|
|
15
|
+
return "null";
|
|
16
|
+
}
|
|
17
|
+
if (Array.isArray(value)) {
|
|
18
|
+
return "an array";
|
|
19
|
+
}
|
|
20
|
+
if (typeof value === "object") {
|
|
21
|
+
return "an object";
|
|
22
|
+
}
|
|
23
|
+
return `a ${typeof value}`;
|
|
24
|
+
}
|
|
25
|
+
function readOptionalString(descriptor, key) {
|
|
26
|
+
const value = descriptor[key];
|
|
27
|
+
if (value === undefined) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
31
|
+
throw new BadDataException(`Request descriptor field "${key}" must be a non-empty string, but found ${describeJsonValue(value)}.`);
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
function validatePath(value) {
|
|
36
|
+
if (value === undefined) {
|
|
37
|
+
return "/";
|
|
38
|
+
}
|
|
39
|
+
if (typeof value !== "string") {
|
|
40
|
+
throw new BadDataException(`Request descriptor field "path" must be a string, but found ${describeJsonValue(value)}.`);
|
|
41
|
+
}
|
|
42
|
+
if (ABSOLUTE_URL_REGEX.test(value)) {
|
|
43
|
+
throw new BadDataException('Request descriptor field "path" must be a relative path on the data source base URL — absolute http(s):// URLs are not allowed.');
|
|
44
|
+
}
|
|
45
|
+
if (!value.startsWith("/")) {
|
|
46
|
+
throw new BadDataException(`Request descriptor field "path" must start with "/" (got "${value}").`);
|
|
47
|
+
}
|
|
48
|
+
if (value.startsWith("//")) {
|
|
49
|
+
throw new BadDataException('Request descriptor field "path" must not start with "//" — protocol-relative URLs are not allowed.');
|
|
50
|
+
}
|
|
51
|
+
/*
|
|
52
|
+
* Reject ".." path segments (including percent-encoded variants that URL
|
|
53
|
+
* normalization would collapse) so the request cannot climb above the
|
|
54
|
+
* configured base URL's path prefix. Backslashes count as segment
|
|
55
|
+
* separators too: WHATWG URL parsing treats "\" as "/" in http(s) URLs,
|
|
56
|
+
* so "/a\..\x" would otherwise smuggle a ".." past a slash-only split.
|
|
57
|
+
*/
|
|
58
|
+
const segments = value
|
|
59
|
+
.replace(/%2e/gi, ".")
|
|
60
|
+
.replace(/%5c/gi, "\\")
|
|
61
|
+
.split(/[/\\?#]/);
|
|
62
|
+
if (segments.includes("..")) {
|
|
63
|
+
throw new BadDataException('Request descriptor field "path" must not contain ".." segments.');
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
function validateMethod(value) {
|
|
68
|
+
if (value === undefined) {
|
|
69
|
+
return "GET";
|
|
70
|
+
}
|
|
71
|
+
if (typeof value !== "string") {
|
|
72
|
+
throw new BadDataException(`Request descriptor field "method" must be "GET" or "POST", but found ${describeJsonValue(value)}.`);
|
|
73
|
+
}
|
|
74
|
+
const normalized = value.toUpperCase();
|
|
75
|
+
if (normalized !== "GET" && normalized !== "POST") {
|
|
76
|
+
throw new BadDataException(`Request descriptor field "method" must be "GET" or "POST" (got "${value}").`);
|
|
77
|
+
}
|
|
78
|
+
return normalized;
|
|
79
|
+
}
|
|
80
|
+
function normalizeBody(value) {
|
|
81
|
+
if (value === undefined) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
if (typeof value === "string") {
|
|
85
|
+
return value;
|
|
86
|
+
}
|
|
87
|
+
if (value !== null && typeof value === "object") {
|
|
88
|
+
return JSON.stringify(value);
|
|
89
|
+
}
|
|
90
|
+
throw new BadDataException(`Request descriptor field "body" must be a JSON object or a string, but found ${describeJsonValue(value)}.`);
|
|
91
|
+
}
|
|
92
|
+
function validateLabelFields(value) {
|
|
93
|
+
if (value === undefined) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
if (!Array.isArray(value)) {
|
|
97
|
+
throw new BadDataException(`Request descriptor field "labelFields" must be an array of strings, but found ${describeJsonValue(value)}.`);
|
|
98
|
+
}
|
|
99
|
+
const fields = value;
|
|
100
|
+
for (const field of fields) {
|
|
101
|
+
if (typeof field !== "string" || field.trim() === "") {
|
|
102
|
+
throw new BadDataException(`Request descriptor field "labelFields" must contain only non-empty strings, but found ${describeJsonValue(field)}.`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return fields;
|
|
106
|
+
}
|
|
107
|
+
/*
|
|
108
|
+
* Parse and validate the widget query text into a request descriptor.
|
|
109
|
+
* Throws BadDataException with the specific field that is wrong.
|
|
110
|
+
*/
|
|
111
|
+
export function parseRequestDescriptor(queryText) {
|
|
112
|
+
if (!queryText || queryText.trim() === "") {
|
|
113
|
+
throw new BadDataException('Query is required. Provide a JSON request descriptor like { "path": "/api/stats", "rowsPath": "data.items" }.');
|
|
114
|
+
}
|
|
115
|
+
let parsed = undefined;
|
|
116
|
+
try {
|
|
117
|
+
parsed = JSON.parse(queryText);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
throw new BadDataException(`Query must be valid JSON (a request descriptor object): ${error instanceof Error ? error.message : String(error)}`);
|
|
121
|
+
}
|
|
122
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
123
|
+
throw new BadDataException(`Query must be a JSON object describing the request, but found ${describeJsonValue(parsed)}.`);
|
|
124
|
+
}
|
|
125
|
+
const raw = parsed;
|
|
126
|
+
return {
|
|
127
|
+
path: validatePath(raw["path"]),
|
|
128
|
+
method: validateMethod(raw["method"]),
|
|
129
|
+
body: normalizeBody(raw["body"]),
|
|
130
|
+
rowsPath: readOptionalString(raw, "rowsPath"),
|
|
131
|
+
timestampField: readOptionalString(raw, "timestampField"),
|
|
132
|
+
valueField: readOptionalString(raw, "valueField"),
|
|
133
|
+
seriesField: readOptionalString(raw, "seriesField"),
|
|
134
|
+
labelFields: validateLabelFields(raw["labelFields"]),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/*
|
|
138
|
+
* Replace dashboard time macros in the request path or body. Unlike the SQL
|
|
139
|
+
* variant, $__startTime / $__endTime interpolate as raw ISO-8601 strings
|
|
140
|
+
* WITHOUT quotes — in a REST descriptor the macro usually sits inside an
|
|
141
|
+
* already-quoted JSON string or a query parameter. Millisecond macros are
|
|
142
|
+
* replaced first so $__startTime cannot corrupt $__startTimeMs.
|
|
143
|
+
*/
|
|
144
|
+
export function applyRestTimeMacros(text, startDate, endDate) {
|
|
145
|
+
return text
|
|
146
|
+
.replace(/\$__startTimeMs\b/g, startDate.getTime().toString())
|
|
147
|
+
.replace(/\$__endTimeMs\b/g, endDate.getTime().toString())
|
|
148
|
+
.replace(/\$__startTime\b/g, startDate.toISOString())
|
|
149
|
+
.replace(/\$__endTime\b/g, endDate.toISOString());
|
|
150
|
+
}
|
|
151
|
+
/*
|
|
152
|
+
* Navigate the response payload down a dot path ("data.items") to the rows
|
|
153
|
+
* array. Numeric segments index into arrays. The resolved value must be an
|
|
154
|
+
* array whose every element is a JSON object; anything else throws a
|
|
155
|
+
* BadDataException naming what was actually found.
|
|
156
|
+
*/
|
|
157
|
+
export function extractRowsByPath(payload, rowsPath) {
|
|
158
|
+
const pathLabel = rowsPath ? `"${rowsPath}"` : "the response root";
|
|
159
|
+
let current = payload;
|
|
160
|
+
if (rowsPath) {
|
|
161
|
+
const segments = rowsPath.split(".");
|
|
162
|
+
for (const segment of segments) {
|
|
163
|
+
if (segment === "") {
|
|
164
|
+
throw new BadDataException(`Request descriptor field "rowsPath" (${rowsPath}) contains an empty segment.`);
|
|
165
|
+
}
|
|
166
|
+
if (Array.isArray(current) && ARRAY_INDEX_REGEX.test(segment)) {
|
|
167
|
+
const list = current;
|
|
168
|
+
current = list[Number(segment)];
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (current === null ||
|
|
172
|
+
typeof current !== "object" ||
|
|
173
|
+
Array.isArray(current)) {
|
|
174
|
+
throw new BadDataException(`Could not read "${segment}" of rowsPath ${pathLabel}: expected an object at that point of the response, but found ${describeJsonValue(current)}.`);
|
|
175
|
+
}
|
|
176
|
+
current = current[segment];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (!Array.isArray(current)) {
|
|
180
|
+
throw new BadDataException(`Expected ${pathLabel} to be an array of rows, but found ${describeJsonValue(current)}. Set "rowsPath" to the dot path of the rows array (for example "data.items").`);
|
|
181
|
+
}
|
|
182
|
+
const rows = current;
|
|
183
|
+
for (let index = 0; index < rows.length; index++) {
|
|
184
|
+
const row = rows[index];
|
|
185
|
+
if (row === null || typeof row !== "object" || Array.isArray(row)) {
|
|
186
|
+
throw new BadDataException(`Expected every row at ${pathLabel} to be a JSON object, but the row at index ${index} is ${describeJsonValue(row)}.`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return rows;
|
|
190
|
+
}
|
|
191
|
+
function joinUrl(baseUrl, path) {
|
|
192
|
+
// path always starts with "/" (descriptor validation), base loses its "/".
|
|
193
|
+
const trimmedBase = baseUrl.replace(/\/+$/, "");
|
|
194
|
+
return `${trimmedBase}${path}`;
|
|
195
|
+
}
|
|
196
|
+
export default class RestApiConnector {
|
|
197
|
+
constructor(fetchFunction) {
|
|
198
|
+
this.dataSourceType = DataSourceType.RestApi;
|
|
199
|
+
this.fetchFunction =
|
|
200
|
+
fetchFunction ||
|
|
201
|
+
((request) => {
|
|
202
|
+
return DataSourceHttpFetch.fetch(request);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
async testConnection(settings) {
|
|
206
|
+
const baseUrl = this.getBaseUrl(settings);
|
|
207
|
+
try {
|
|
208
|
+
await DataSourceEgressGuard.assertUrlAllowed(baseUrl);
|
|
209
|
+
const response = await this.fetchFunction({
|
|
210
|
+
method: "GET",
|
|
211
|
+
url: baseUrl,
|
|
212
|
+
headers: DataSourceHttpFetch.buildAuthHeaders(settings),
|
|
213
|
+
timeoutInMs: DATA_SOURCE_CONNECT_TIMEOUT_IN_MS,
|
|
214
|
+
});
|
|
215
|
+
if (response.statusCode < 200 || response.statusCode >= 300) {
|
|
216
|
+
throw new BadDataException(`Data source responded with HTTP ${response.statusCode} — expected a 2xx status. Check the URL and credentials.`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
throw new BadDataException(this.sanitizeThrownError(error, settings));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async queryTimeSeries(settings, query, window) {
|
|
224
|
+
const descriptor = parseRequestDescriptor(query);
|
|
225
|
+
if (!descriptor.timestampField || !descriptor.valueField) {
|
|
226
|
+
throw new BadDataException('Time-series REST API queries require "timestampField" and "valueField" in the request descriptor so rows can be mapped to chart points.');
|
|
227
|
+
}
|
|
228
|
+
const payload = await this.executeRequest(settings, descriptor, window);
|
|
229
|
+
const allRows = extractRowsByPath(payload, descriptor.rowsPath);
|
|
230
|
+
const truncated = allRows.length > DATA_SOURCE_MAX_TIME_SERIES_ROWS;
|
|
231
|
+
const rows = truncated
|
|
232
|
+
? allRows.slice(0, DATA_SOURCE_MAX_TIME_SERIES_ROWS)
|
|
233
|
+
: allRows;
|
|
234
|
+
const data = [];
|
|
235
|
+
for (const row of rows) {
|
|
236
|
+
const timestamp = SqlResultShaper.coerceTimestamp(row[descriptor.timestampField]);
|
|
237
|
+
const value = this.coerceFiniteNumber(row[descriptor.valueField]);
|
|
238
|
+
if (timestamp === null || value === null) {
|
|
239
|
+
continue; // skip unplottable rows rather than failing the chart.
|
|
240
|
+
}
|
|
241
|
+
const point = { timestamp: timestamp, value: value };
|
|
242
|
+
const attributes = this.buildAttributes(descriptor, row);
|
|
243
|
+
if (attributes) {
|
|
244
|
+
point["attributes"] = attributes;
|
|
245
|
+
}
|
|
246
|
+
data.push(point);
|
|
247
|
+
}
|
|
248
|
+
return { data: data, truncated: truncated };
|
|
249
|
+
}
|
|
250
|
+
async queryTable(settings, query, window) {
|
|
251
|
+
const descriptor = parseRequestDescriptor(query);
|
|
252
|
+
const payload = await this.executeRequest(settings, descriptor, window);
|
|
253
|
+
const rows = extractRowsByPath(payload, descriptor.rowsPath);
|
|
254
|
+
/*
|
|
255
|
+
* Rows go through the shared shaper as-is: nested objects become Json
|
|
256
|
+
* columns via coerceCell rather than being flattened.
|
|
257
|
+
*/
|
|
258
|
+
return SqlResultShaper.rowsToTable(rows, {
|
|
259
|
+
maxRows: DATA_SOURCE_MAX_TABLE_ROWS,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
async executeRequest(settings, descriptor, window) {
|
|
263
|
+
const baseUrl = this.getBaseUrl(settings);
|
|
264
|
+
const path = applyRestTimeMacros(descriptor.path, window.startDate, window.endDate);
|
|
265
|
+
const body = descriptor.body === undefined
|
|
266
|
+
? undefined
|
|
267
|
+
: applyRestTimeMacros(descriptor.body, window.startDate, window.endDate);
|
|
268
|
+
const url = joinUrl(baseUrl, path);
|
|
269
|
+
try {
|
|
270
|
+
/*
|
|
271
|
+
* Guard here as well as inside DataSourceHttpFetch: the fetch seam is
|
|
272
|
+
* injectable, and the connector contract requires egress validation
|
|
273
|
+
* before every connection regardless of transport.
|
|
274
|
+
*/
|
|
275
|
+
await DataSourceEgressGuard.assertUrlAllowed(url);
|
|
276
|
+
const request = {
|
|
277
|
+
method: descriptor.method,
|
|
278
|
+
url: url,
|
|
279
|
+
headers: DataSourceHttpFetch.buildAuthHeaders(settings),
|
|
280
|
+
body: body,
|
|
281
|
+
timeoutInMs: DATA_SOURCE_QUERY_TIMEOUT_IN_MS,
|
|
282
|
+
};
|
|
283
|
+
const response = await this.fetchFunction(request);
|
|
284
|
+
if (response.bodyJson === undefined) {
|
|
285
|
+
throw new BadDataException(`Data source did not return JSON (HTTP ${response.statusCode}). Response starts with: ${response.bodyText.substring(0, 200)}`);
|
|
286
|
+
}
|
|
287
|
+
return response.bodyJson;
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
throw new BadDataException(this.sanitizeThrownError(error, settings));
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
getBaseUrl(settings) {
|
|
294
|
+
if (!settings.url || settings.url.trim() === "") {
|
|
295
|
+
throw new BadDataException("REST API data source has no URL configured. Set the base URL in the data source settings.");
|
|
296
|
+
}
|
|
297
|
+
return settings.url.trim();
|
|
298
|
+
}
|
|
299
|
+
/*
|
|
300
|
+
* Errors can echo credentials (a debug endpoint reflecting the
|
|
301
|
+
* Authorization header into the response body excerpt, a driver message
|
|
302
|
+
* quoting basic-auth) — redact every secret before the message can reach
|
|
303
|
+
* an API response.
|
|
304
|
+
*/
|
|
305
|
+
sanitizeThrownError(error, settings) {
|
|
306
|
+
return SqlResultShaper.sanitizeError(error, SqlResultShaper.collectSecrets(settings));
|
|
307
|
+
}
|
|
308
|
+
coerceFiniteNumber(value) {
|
|
309
|
+
if (typeof value === "number") {
|
|
310
|
+
return Number.isFinite(value) ? value : null;
|
|
311
|
+
}
|
|
312
|
+
if (typeof value === "bigint") {
|
|
313
|
+
const numeric = Number(value);
|
|
314
|
+
return Number.isFinite(numeric) ? numeric : null;
|
|
315
|
+
}
|
|
316
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
317
|
+
const numeric = Number(value);
|
|
318
|
+
return Number.isFinite(numeric) ? numeric : null;
|
|
319
|
+
}
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
buildAttributes(descriptor, row) {
|
|
323
|
+
const attributes = {};
|
|
324
|
+
let hasAttributes = false;
|
|
325
|
+
if (descriptor.seriesField) {
|
|
326
|
+
attributes["series"] = this.formatLabelValue(row[descriptor.seriesField]);
|
|
327
|
+
hasAttributes = true;
|
|
328
|
+
}
|
|
329
|
+
if (descriptor.labelFields) {
|
|
330
|
+
for (const field of descriptor.labelFields) {
|
|
331
|
+
attributes[field] = this.formatLabelValue(row[field]);
|
|
332
|
+
hasAttributes = true;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return hasAttributes ? attributes : undefined;
|
|
336
|
+
}
|
|
337
|
+
formatLabelValue(value) {
|
|
338
|
+
const cell = SqlResultShaper.coerceCell(value);
|
|
339
|
+
return cell === null ? "(unset)" : String(cell);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=RestApiConnector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RestApiConnector.js","sourceRoot":"","sources":["../../../../../../Server/Utils/DataSource/Connectors/RestApiConnector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import * as mssql from "mssql";
|
|
2
|
+
import { DATA_SOURCE_CONNECT_TIMEOUT_IN_MS, DATA_SOURCE_MAX_TABLE_ROWS, DATA_SOURCE_MAX_TIME_SERIES_ROWS, DATA_SOURCE_QUERY_TIMEOUT_IN_MS, } from "../../../../Types/DataSource/DataSourceLimits";
|
|
3
|
+
import DataSourceType from "../../../../Types/DataSource/DataSourceType";
|
|
4
|
+
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
5
|
+
import DataSourceEgressGuard from "../EgressGuard";
|
|
6
|
+
import SqlQueryGuard from "../SqlQueryGuard";
|
|
7
|
+
import SqlResultShaper from "../SqlResultShaper";
|
|
8
|
+
/*
|
|
9
|
+
* Default factory adapting the real mssql driver (default export = the
|
|
10
|
+
* pure-JS tedious driver — never msnodesqlv8/ODBC) onto the seam above.
|
|
11
|
+
* Each request() call returns a FRESH mssql.Request, so the SET ROWCOUNT
|
|
12
|
+
* batch and the user's query run as separate requests on one transaction.
|
|
13
|
+
*/
|
|
14
|
+
const defaultPoolFactory = (config) => {
|
|
15
|
+
const pool = new mssql.ConnectionPool(config);
|
|
16
|
+
return {
|
|
17
|
+
connect: async () => {
|
|
18
|
+
await pool.connect();
|
|
19
|
+
},
|
|
20
|
+
close: async () => {
|
|
21
|
+
await pool.close();
|
|
22
|
+
},
|
|
23
|
+
transaction: () => {
|
|
24
|
+
const transaction = new mssql.Transaction(pool);
|
|
25
|
+
return {
|
|
26
|
+
begin: async () => {
|
|
27
|
+
await transaction.begin();
|
|
28
|
+
},
|
|
29
|
+
rollback: async () => {
|
|
30
|
+
await transaction.rollback();
|
|
31
|
+
},
|
|
32
|
+
request: () => {
|
|
33
|
+
const request = new mssql.Request(transaction);
|
|
34
|
+
return {
|
|
35
|
+
batch: (sql) => {
|
|
36
|
+
return request.batch(sql);
|
|
37
|
+
},
|
|
38
|
+
query: async (sql) => {
|
|
39
|
+
const result = await request.query(sql);
|
|
40
|
+
return {
|
|
41
|
+
recordset: result.recordset
|
|
42
|
+
? Array.from(result.recordset)
|
|
43
|
+
: undefined,
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
export default class SqlServerConnector {
|
|
53
|
+
constructor(poolFactory) {
|
|
54
|
+
this.dataSourceType = DataSourceType.MicrosoftSqlServer;
|
|
55
|
+
this.poolFactory = poolFactory || defaultPoolFactory;
|
|
56
|
+
}
|
|
57
|
+
async testConnection(settings) {
|
|
58
|
+
/*
|
|
59
|
+
* Cheap probe through the exact same guarded path a real query takes:
|
|
60
|
+
* egress guard, connect, transaction, SELECT 1, rollback, close.
|
|
61
|
+
*/
|
|
62
|
+
await this.executeReadOnlySql(settings, "SELECT 1", 1);
|
|
63
|
+
}
|
|
64
|
+
async queryTimeSeries(settings, query, window) {
|
|
65
|
+
const rows = await this.runGuardedQuery(settings, query, window, DATA_SOURCE_MAX_TIME_SERIES_ROWS);
|
|
66
|
+
return SqlResultShaper.rowsToTimeSeries(rows, {
|
|
67
|
+
maxRows: DATA_SOURCE_MAX_TIME_SERIES_ROWS,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async queryTable(settings, query, window) {
|
|
71
|
+
const rows = await this.runGuardedQuery(settings, query, window, DATA_SOURCE_MAX_TABLE_ROWS);
|
|
72
|
+
return SqlResultShaper.rowsToTable(rows, {
|
|
73
|
+
maxRows: DATA_SOURCE_MAX_TABLE_ROWS,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
getSecrets(settings) {
|
|
77
|
+
return [
|
|
78
|
+
settings.password,
|
|
79
|
+
settings.apiToken,
|
|
80
|
+
settings.databaseHost,
|
|
81
|
+
settings.username,
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
buildPoolConfig(settings) {
|
|
85
|
+
var _a, _b, _c;
|
|
86
|
+
const isSslEnabled = ((_a = settings.additionalOptions) === null || _a === void 0 ? void 0 : _a["sslEnabled"]) === true;
|
|
87
|
+
/*
|
|
88
|
+
* With TLS on, certificate verification stays ON unless the operator
|
|
89
|
+
* explicitly opted out for a self-signed cert
|
|
90
|
+
* (sslRejectUnauthorized === false → trust the server certificate).
|
|
91
|
+
* With TLS off the flag is irrelevant; tedious still wants
|
|
92
|
+
* trustServerCertificate true so it skips pointless verification.
|
|
93
|
+
*/
|
|
94
|
+
const trustServerCertificate = isSslEnabled
|
|
95
|
+
? ((_b = settings.additionalOptions) === null || _b === void 0 ? void 0 : _b["sslRejectUnauthorized"]) === false
|
|
96
|
+
: true;
|
|
97
|
+
return {
|
|
98
|
+
server: settings.databaseHost,
|
|
99
|
+
port: (_c = settings.databasePort) !== null && _c !== void 0 ? _c : 1433,
|
|
100
|
+
database: settings.databaseName,
|
|
101
|
+
user: settings.username,
|
|
102
|
+
password: settings.password,
|
|
103
|
+
connectionTimeout: DATA_SOURCE_CONNECT_TIMEOUT_IN_MS,
|
|
104
|
+
requestTimeout: DATA_SOURCE_QUERY_TIMEOUT_IN_MS,
|
|
105
|
+
pool: { max: 1, min: 0, idleTimeoutMillis: 30000 },
|
|
106
|
+
options: {
|
|
107
|
+
encrypt: isSslEnabled,
|
|
108
|
+
trustServerCertificate: trustServerCertificate,
|
|
109
|
+
appName: "OneUptime-DataSource",
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/*
|
|
114
|
+
* Apply the dashboard time macros, run the T-SQL-aware read-only
|
|
115
|
+
* classifier (the enforcement layer for SQL Server — see header), then
|
|
116
|
+
* execute. The classified text is EXACTLY the executed text: nothing is
|
|
117
|
+
* appended or embedded, so there is no gap between what was checked and
|
|
118
|
+
* what runs (SET ROWCOUNT goes out as its own connector-owned batch).
|
|
119
|
+
*/
|
|
120
|
+
async runGuardedQuery(settings, query, window, maxRows) {
|
|
121
|
+
const finalSql = SqlQueryGuard.applyTimeMacros(query, window.startDate, window.endDate);
|
|
122
|
+
SqlQueryGuard.assertReadOnlyQuery(finalSql);
|
|
123
|
+
return this.executeReadOnlySql(settings, finalSql, maxRows + 1);
|
|
124
|
+
}
|
|
125
|
+
/*
|
|
126
|
+
* Egress-validate the host, connect a single-connection pool, and run
|
|
127
|
+
* `sql` inside an always-rolled-back transaction with a server-side
|
|
128
|
+
* SET ROWCOUNT row cap. Teardown (rollback, then close) always runs and
|
|
129
|
+
* each step is individually guarded so a wedged server cannot turn
|
|
130
|
+
* cleanup into an unhandled rejection.
|
|
131
|
+
*/
|
|
132
|
+
async executeReadOnlySql(settings, sql, rowFetchLimit) {
|
|
133
|
+
if (!settings.databaseHost) {
|
|
134
|
+
throw new BadDataException("Microsoft SQL Server data source is missing a database host. Set the host in the data source settings.");
|
|
135
|
+
}
|
|
136
|
+
/*
|
|
137
|
+
* SSRF guard — must pass BEFORE any socket is opened towards the
|
|
138
|
+
* configured host.
|
|
139
|
+
*/
|
|
140
|
+
await DataSourceEgressGuard.assertHostnameAllowed(settings.databaseHost);
|
|
141
|
+
const pool = this.poolFactory(this.buildPoolConfig(settings));
|
|
142
|
+
let transaction = undefined;
|
|
143
|
+
let isTransactionBegun = false;
|
|
144
|
+
try {
|
|
145
|
+
await pool.connect();
|
|
146
|
+
transaction = pool.transaction();
|
|
147
|
+
await transaction.begin();
|
|
148
|
+
isTransactionBegun = true;
|
|
149
|
+
/*
|
|
150
|
+
* Hard server-side row cap: SET ROWCOUNT stops the server after this
|
|
151
|
+
* many rows (callers pass cap+1 so truncation stays detectable) and
|
|
152
|
+
* wins over a larger user-supplied TOP. It is session-scoped, so it
|
|
153
|
+
* applies to the user's query, which runs next on this connection.
|
|
154
|
+
*/
|
|
155
|
+
await transaction.request().batch(`SET ROWCOUNT ${rowFetchLimit}`);
|
|
156
|
+
const result = await transaction.request().query(sql);
|
|
157
|
+
return result.recordset || [];
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
if (error instanceof BadDataException) {
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
throw new BadDataException(SqlResultShaper.sanitizeError(error, this.getSecrets(settings)));
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
if (transaction && isTransactionBegun) {
|
|
167
|
+
try {
|
|
168
|
+
await transaction.rollback();
|
|
169
|
+
}
|
|
170
|
+
catch (_a) {
|
|
171
|
+
/*
|
|
172
|
+
* Best effort — SQL Server rolls an abandoned transaction back
|
|
173
|
+
* itself when the connection goes away.
|
|
174
|
+
*/
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
await pool.close();
|
|
179
|
+
}
|
|
180
|
+
catch (_b) {
|
|
181
|
+
/* Best effort — nothing more can be done with a wedged pool. */
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=SqlServerConnector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SqlServerConnector.js","sourceRoot":"","sources":["../../../../../../Server/Utils/DataSource/Connectors/SqlServerConnector.ts"],"names":[],"mappings":"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"}
|