adonisjs-server-stats 1.5.4 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +351 -171
- package/dist/configure.d.ts.map +1 -1
- package/dist/core/api-client.d.ts +73 -0
- package/dist/core/api-client.d.ts.map +1 -0
- package/dist/core/config-utils.d.ts +109 -0
- package/dist/core/config-utils.d.ts.map +1 -0
- package/dist/core/constants.d.ts +11 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/dashboard-api.d.ts +65 -0
- package/dist/core/dashboard-api.d.ts.map +1 -0
- package/dist/core/dashboard-data-controller.d.ts +157 -0
- package/dist/core/dashboard-data-controller.d.ts.map +1 -0
- package/dist/core/debug-data-controller.d.ts +89 -0
- package/dist/core/debug-data-controller.d.ts.map +1 -0
- package/dist/core/feature-detect.d.ts +67 -0
- package/dist/core/feature-detect.d.ts.map +1 -0
- package/dist/core/formatters.d.ts +189 -0
- package/dist/core/formatters.d.ts.map +1 -0
- package/dist/core/history-buffer.d.ts +23 -0
- package/dist/core/history-buffer.d.ts.map +1 -0
- package/dist/core/icons.d.ts +36 -0
- package/dist/core/icons.d.ts.map +1 -0
- package/dist/core/index.d.ts +39 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +1961 -0
- package/dist/core/internals-utils.d.ts +71 -0
- package/dist/core/internals-utils.d.ts.map +1 -0
- package/dist/core/job-utils.d.ts +45 -0
- package/dist/core/job-utils.d.ts.map +1 -0
- package/dist/core/log-utils.d.ts +34 -0
- package/dist/core/log-utils.d.ts.map +1 -0
- package/dist/core/metrics.d.ts +41 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/pagination.d.ts +128 -0
- package/dist/core/pagination.d.ts.map +1 -0
- package/dist/core/query-utils.d.ts +35 -0
- package/dist/core/query-utils.d.ts.map +1 -0
- package/dist/core/resizable-columns.d.ts +18 -0
- package/dist/core/resizable-columns.d.ts.map +1 -0
- package/dist/core/routes.d.ts +12 -0
- package/dist/core/routes.d.ts.map +1 -0
- package/dist/core/server-stats-controller.d.ts +106 -0
- package/dist/core/server-stats-controller.d.ts.map +1 -0
- package/dist/core/sparkline.d.ts +80 -0
- package/dist/core/sparkline.d.ts.map +1 -0
- package/dist/core/theme.d.ts +42 -0
- package/dist/core/theme.d.ts.map +1 -0
- package/dist/core/trace-utils.d.ts +62 -0
- package/dist/core/trace-utils.d.ts.map +1 -0
- package/dist/core/transmit-adapter.d.ts +59 -0
- package/dist/core/transmit-adapter.d.ts.map +1 -0
- package/dist/core/types.d.ts +619 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/react/CacheSection-DGxMDlWK.js +146 -0
- package/dist/react/CacheTab-CnVW5PLs.js +123 -0
- package/dist/react/ConfigContent-CnsEI4j3.js +397 -0
- package/dist/react/ConfigSection-DPcrfqXY.js +11 -0
- package/dist/react/ConfigTab-BSWq_o2p.js +15 -0
- package/dist/react/CustomPaneTab-xjkYwTvH.js +104 -0
- package/dist/react/DataTable-YyShr5B-.js +55 -0
- package/dist/react/EmailsSection-CSyTg1aX.js +262 -0
- package/dist/react/EmailsTab-Dh2YSa_f.js +131 -0
- package/dist/react/EventsSection-C1pbJDfW.js +86 -0
- package/dist/react/EventsTab-eCh02cdd.js +63 -0
- package/dist/react/FilterBar-DQRXpWrb.js +50 -0
- package/dist/react/InternalsContent-DBzsI0CG.js +346 -0
- package/dist/react/InternalsSection-t7ihcWO-.js +32 -0
- package/dist/react/InternalsTab-Oij0A2fN.js +30 -0
- package/dist/react/JobsSection-CLAin5vU.js +187 -0
- package/dist/react/JobsTab-Dl5nrj2z.js +141 -0
- package/dist/react/LogsSection-C1p81fXO.js +212 -0
- package/dist/react/LogsTab-D-kR7PjX.js +88 -0
- package/dist/react/OverviewSection-nm3xdACz.js +539 -0
- package/dist/react/Pagination-BkmzUDY8.js +64 -0
- package/dist/react/QueriesSection-DB12HMfQ.js +461 -0
- package/dist/react/QueriesTab-fyBB1u_Y.js +90 -0
- package/dist/react/RequestsSection-DTqB81ac.js +209 -0
- package/dist/react/RoutesSection-DJWa4NPV.js +74 -0
- package/dist/react/RoutesTab-D3l8TOpu.js +74 -0
- package/dist/react/TimelineSection-C4d-jRX1.js +158 -0
- package/dist/react/TimelineTab-C5TFaSmQ.js +193 -0
- package/dist/react/WaterfallChart-Cj73WdfM.js +100 -0
- package/dist/react/core/api-client.d.ts +73 -0
- package/dist/react/core/api-client.d.ts.map +1 -0
- package/dist/react/core/config-utils.d.ts +109 -0
- package/dist/react/core/config-utils.d.ts.map +1 -0
- package/dist/react/core/constants.d.ts +11 -0
- package/dist/react/core/constants.d.ts.map +1 -0
- package/dist/react/core/dashboard-api.d.ts +65 -0
- package/dist/react/core/dashboard-api.d.ts.map +1 -0
- package/dist/react/core/dashboard-data-controller.d.ts +157 -0
- package/dist/react/core/dashboard-data-controller.d.ts.map +1 -0
- package/dist/react/core/debug-data-controller.d.ts +89 -0
- package/dist/react/core/debug-data-controller.d.ts.map +1 -0
- package/dist/react/core/feature-detect.d.ts +67 -0
- package/dist/react/core/feature-detect.d.ts.map +1 -0
- package/dist/react/core/formatters.d.ts +189 -0
- package/dist/react/core/formatters.d.ts.map +1 -0
- package/dist/react/core/history-buffer.d.ts +23 -0
- package/dist/react/core/history-buffer.d.ts.map +1 -0
- package/dist/react/core/icons.d.ts +36 -0
- package/dist/react/core/icons.d.ts.map +1 -0
- package/dist/react/core/index.d.ts +39 -0
- package/dist/react/core/index.d.ts.map +1 -0
- package/dist/react/core/internals-utils.d.ts +71 -0
- package/dist/react/core/internals-utils.d.ts.map +1 -0
- package/dist/react/core/job-utils.d.ts +45 -0
- package/dist/react/core/job-utils.d.ts.map +1 -0
- package/dist/react/core/log-utils.d.ts +34 -0
- package/dist/react/core/log-utils.d.ts.map +1 -0
- package/dist/react/core/metrics.d.ts +41 -0
- package/dist/react/core/metrics.d.ts.map +1 -0
- package/dist/react/core/pagination.d.ts +128 -0
- package/dist/react/core/pagination.d.ts.map +1 -0
- package/dist/react/core/query-utils.d.ts +35 -0
- package/dist/react/core/query-utils.d.ts.map +1 -0
- package/dist/react/core/resizable-columns.d.ts +18 -0
- package/dist/react/core/resizable-columns.d.ts.map +1 -0
- package/dist/react/core/routes.d.ts +12 -0
- package/dist/react/core/routes.d.ts.map +1 -0
- package/dist/react/core/server-stats-controller.d.ts +106 -0
- package/dist/react/core/server-stats-controller.d.ts.map +1 -0
- package/dist/react/core/sparkline.d.ts +80 -0
- package/dist/react/core/sparkline.d.ts.map +1 -0
- package/dist/react/core/theme.d.ts +42 -0
- package/dist/react/core/theme.d.ts.map +1 -0
- package/dist/react/core/trace-utils.d.ts +62 -0
- package/dist/react/core/trace-utils.d.ts.map +1 -0
- package/dist/react/core/transmit-adapter.d.ts +59 -0
- package/dist/react/core/transmit-adapter.d.ts.map +1 -0
- package/dist/react/core/types.d.ts +619 -0
- package/dist/react/core/types.d.ts.map +1 -0
- package/dist/react/index-UdTfSvtO.js +1074 -0
- package/dist/react/index.js +18 -0
- package/dist/react/react/components/Dashboard/DashboardPage.d.ts +17 -0
- package/dist/react/react/components/Dashboard/DashboardPage.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/CacheSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/CacheSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/ConfigSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/ConfigSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/EmailsSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/EmailsSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/EventsSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/EventsSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/InternalsSection.d.ts +14 -0
- package/dist/react/react/components/Dashboard/sections/InternalsSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/JobsSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/JobsSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/LogsSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/LogsSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/OverviewSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/OverviewSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/QueriesSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/QueriesSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/RequestsSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/RequestsSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/RoutesSection.d.ts +7 -0
- package/dist/react/react/components/Dashboard/sections/RoutesSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/sections/TimelineSection.d.ts +9 -0
- package/dist/react/react/components/Dashboard/sections/TimelineSection.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/shared/DataTable.d.ts +27 -0
- package/dist/react/react/components/Dashboard/shared/DataTable.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/shared/FilterBar.d.ts +17 -0
- package/dist/react/react/components/Dashboard/shared/FilterBar.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/shared/Pagination.d.ts +13 -0
- package/dist/react/react/components/Dashboard/shared/Pagination.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/shared/TimeRangeSelector.d.ts +12 -0
- package/dist/react/react/components/Dashboard/shared/TimeRangeSelector.d.ts.map +1 -0
- package/dist/react/react/components/Dashboard/shared/WaterfallChart.d.ts +16 -0
- package/dist/react/react/components/Dashboard/shared/WaterfallChart.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/DebugPanel.d.ts +16 -0
- package/dist/react/react/components/DebugPanel/DebugPanel.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/CacheTab.d.ts +8 -0
- package/dist/react/react/components/DebugPanel/tabs/CacheTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/ConfigTab.d.ts +8 -0
- package/dist/react/react/components/DebugPanel/tabs/ConfigTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/CustomPaneTab.d.ts +14 -0
- package/dist/react/react/components/DebugPanel/tabs/CustomPaneTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/EmailsTab.d.ts +7 -0
- package/dist/react/react/components/DebugPanel/tabs/EmailsTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/EventsTab.d.ts +7 -0
- package/dist/react/react/components/DebugPanel/tabs/EventsTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/InternalsTab.d.ts +12 -0
- package/dist/react/react/components/DebugPanel/tabs/InternalsTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/JobsTab.d.ts +9 -0
- package/dist/react/react/components/DebugPanel/tabs/JobsTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/LogsTab.d.ts +7 -0
- package/dist/react/react/components/DebugPanel/tabs/LogsTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/QueriesTab.d.ts +7 -0
- package/dist/react/react/components/DebugPanel/tabs/QueriesTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/RoutesTab.d.ts +8 -0
- package/dist/react/react/components/DebugPanel/tabs/RoutesTab.d.ts.map +1 -0
- package/dist/react/react/components/DebugPanel/tabs/TimelineTab.d.ts +7 -0
- package/dist/react/react/components/DebugPanel/tabs/TimelineTab.d.ts.map +1 -0
- package/dist/react/react/components/StatsBar/MetricCard.d.ts +21 -0
- package/dist/react/react/components/StatsBar/MetricCard.d.ts.map +1 -0
- package/dist/react/react/components/StatsBar/Sparkline.d.ts +15 -0
- package/dist/react/react/components/StatsBar/Sparkline.d.ts.map +1 -0
- package/dist/react/react/components/StatsBar/StatsBar.d.ts +22 -0
- package/dist/react/react/components/StatsBar/StatsBar.d.ts.map +1 -0
- package/dist/react/react/components/shared/Badge.d.ts +32 -0
- package/dist/react/react/components/shared/Badge.d.ts.map +1 -0
- package/dist/react/react/components/shared/ConfigContent.d.ts +13 -0
- package/dist/react/react/components/shared/ConfigContent.d.ts.map +1 -0
- package/dist/react/react/components/shared/InternalsContent.d.ts +10 -0
- package/dist/react/react/components/shared/InternalsContent.d.ts.map +1 -0
- package/dist/react/react/components/shared/JsonViewer.d.ts +12 -0
- package/dist/react/react/components/shared/JsonViewer.d.ts.map +1 -0
- package/dist/react/react/components/shared/ThemeToggle.d.ts +13 -0
- package/dist/react/react/components/shared/ThemeToggle.d.ts.map +1 -0
- package/dist/react/react/components/shared/Tooltip.d.ts +16 -0
- package/dist/react/react/components/shared/Tooltip.d.ts.map +1 -0
- package/dist/react/react/hooks/useApiClient.d.ts +10 -0
- package/dist/react/react/hooks/useApiClient.d.ts.map +1 -0
- package/dist/react/react/hooks/useDashboardApiBase.d.ts +19 -0
- package/dist/react/react/hooks/useDashboardApiBase.d.ts.map +1 -0
- package/dist/react/react/hooks/useDashboardData.d.ts +27 -0
- package/dist/react/react/hooks/useDashboardData.d.ts.map +1 -0
- package/dist/react/react/hooks/useDebugData.d.ts +17 -0
- package/dist/react/react/hooks/useDebugData.d.ts.map +1 -0
- package/dist/react/react/hooks/useFeatures.d.ts +13 -0
- package/dist/react/react/hooks/useFeatures.d.ts.map +1 -0
- package/dist/react/react/hooks/useResizableTable.d.ts +13 -0
- package/dist/react/react/hooks/useResizableTable.d.ts.map +1 -0
- package/dist/react/react/hooks/useServerStats.d.ts +21 -0
- package/dist/react/react/hooks/useServerStats.d.ts.map +1 -0
- package/dist/react/react/hooks/useTheme.d.ts +12 -0
- package/dist/react/react/hooks/useTheme.d.ts.map +1 -0
- package/dist/react/react/index.d.ts +14 -0
- package/dist/react/react/index.d.ts.map +1 -0
- package/dist/react/style.css +1 -0
- package/dist/react/useApiClient-BVtNCmnL.js +9 -0
- package/dist/react/useDashboardApiBase-Bi36pJ2L.js +14 -0
- package/dist/react/useResizableTable-CNJmACdt.js +13 -0
- package/dist/src/collectors/app_collector.d.ts.map +1 -1
- package/dist/src/collectors/app_collector.js +30 -2
- package/dist/src/collectors/auto_detect.d.ts +31 -0
- package/dist/src/collectors/auto_detect.d.ts.map +1 -0
- package/dist/src/collectors/auto_detect.js +120 -0
- package/dist/src/collectors/collector.d.ts +17 -0
- package/dist/src/collectors/collector.d.ts.map +1 -1
- package/dist/src/collectors/db_pool_collector.d.ts.map +1 -1
- package/dist/src/collectors/db_pool_collector.js +35 -1
- package/dist/src/collectors/http_collector.d.ts +4 -3
- package/dist/src/collectors/http_collector.d.ts.map +1 -1
- package/dist/src/collectors/http_collector.js +28 -11
- package/dist/src/collectors/index.d.ts +2 -0
- package/dist/src/collectors/index.d.ts.map +1 -1
- package/dist/src/collectors/index.js +1 -0
- package/dist/src/collectors/log_collector.d.ts +11 -4
- package/dist/src/collectors/log_collector.d.ts.map +1 -1
- package/dist/src/collectors/log_collector.js +51 -5
- package/dist/src/collectors/process_collector.d.ts.map +1 -1
- package/dist/src/collectors/process_collector.js +4 -0
- package/dist/src/collectors/queue_collector.d.ts.map +1 -1
- package/dist/src/collectors/queue_collector.js +55 -1
- package/dist/src/collectors/redis_collector.d.ts.map +1 -1
- package/dist/src/collectors/redis_collector.js +42 -3
- package/dist/src/collectors/system_collector.d.ts.map +1 -1
- package/dist/src/collectors/system_collector.js +4 -0
- package/dist/src/controller/api_controller.d.ts +101 -0
- package/dist/src/controller/api_controller.d.ts.map +1 -0
- package/dist/src/controller/api_controller.js +131 -0
- package/dist/src/controller/debug_controller.d.ts +19 -10
- package/dist/src/controller/debug_controller.d.ts.map +1 -1
- package/dist/src/controller/debug_controller.js +118 -101
- package/dist/src/core/theme.d.ts +42 -0
- package/dist/src/core/theme.d.ts.map +1 -0
- package/dist/src/core/theme.js +115 -0
- package/dist/src/dashboard/chart_aggregator.d.ts.map +1 -1
- package/dist/src/dashboard/chart_aggregator.js +3 -2
- package/dist/src/dashboard/dashboard_controller.d.ts +10 -14
- package/dist/src/dashboard/dashboard_controller.d.ts.map +1 -1
- package/dist/src/dashboard/dashboard_controller.js +132 -250
- package/dist/src/dashboard/dashboard_store.d.ts +62 -19
- package/dist/src/dashboard/dashboard_store.d.ts.map +1 -1
- package/dist/src/dashboard/dashboard_store.js +242 -53
- package/dist/src/dashboard/integrations/cache_inspector.d.ts +19 -1
- package/dist/src/dashboard/integrations/cache_inspector.d.ts.map +1 -1
- package/dist/src/dashboard/integrations/config_inspector.d.ts +1 -1
- package/dist/src/dashboard/integrations/config_inspector.d.ts.map +1 -1
- package/dist/src/dashboard/integrations/config_inspector.js +3 -2
- package/dist/src/dashboard/integrations/queue_inspector.d.ts +55 -10
- package/dist/src/dashboard/integrations/queue_inspector.d.ts.map +1 -1
- package/dist/src/dashboard/integrations/queue_inspector.js +70 -24
- package/dist/src/dashboard/migrator.d.ts +5 -0
- package/dist/src/dashboard/migrator.d.ts.map +1 -1
- package/dist/src/dashboard/migrator.js +44 -9
- package/dist/src/dashboard/models/stats_event.d.ts +1 -1
- package/dist/src/dashboard/models/stats_event.d.ts.map +1 -1
- package/dist/src/dashboard/models/stats_log.d.ts +1 -1
- package/dist/src/dashboard/models/stats_log.d.ts.map +1 -1
- package/dist/src/dashboard/models/stats_query.d.ts +1 -1
- package/dist/src/dashboard/models/stats_query.d.ts.map +1 -1
- package/dist/src/dashboard/models/stats_saved_filter.d.ts +1 -1
- package/dist/src/dashboard/models/stats_saved_filter.d.ts.map +1 -1
- package/dist/src/dashboard/models/stats_trace.d.ts +2 -1
- package/dist/src/dashboard/models/stats_trace.d.ts.map +1 -1
- package/dist/src/data/data_access.d.ts +105 -0
- package/dist/src/data/data_access.d.ts.map +1 -0
- package/dist/src/data/data_access.js +310 -0
- package/dist/src/data/index.d.ts +3 -0
- package/dist/src/data/index.d.ts.map +1 -0
- package/dist/src/data/index.js +1 -0
- package/dist/src/debug/debug_store.d.ts +20 -1
- package/dist/src/debug/debug_store.d.ts.map +1 -1
- package/dist/src/debug/debug_store.js +43 -15
- package/dist/src/debug/email_collector.d.ts +6 -2
- package/dist/src/debug/email_collector.d.ts.map +1 -1
- package/dist/src/debug/email_collector.js +3 -0
- package/dist/src/debug/event_collector.d.ts +6 -2
- package/dist/src/debug/event_collector.d.ts.map +1 -1
- package/dist/src/debug/event_collector.js +12 -8
- package/dist/src/debug/query_collector.d.ts +6 -2
- package/dist/src/debug/query_collector.d.ts.map +1 -1
- package/dist/src/debug/query_collector.js +3 -0
- package/dist/src/debug/ring_buffer.d.ts +1 -0
- package/dist/src/debug/ring_buffer.d.ts.map +1 -1
- package/dist/src/debug/ring_buffer.js +5 -2
- package/dist/src/debug/route_inspector.d.ts +2 -2
- package/dist/src/debug/route_inspector.d.ts.map +1 -1
- package/dist/src/debug/route_inspector.js +4 -3
- package/dist/src/debug/trace_collector.d.ts +7 -3
- package/dist/src/debug/trace_collector.d.ts.map +1 -1
- package/dist/src/debug/trace_collector.js +7 -5
- package/dist/src/debug/types.d.ts +107 -2
- package/dist/src/debug/types.d.ts.map +1 -1
- package/dist/src/debug/types.js +1 -1
- package/dist/src/define_config.d.ts +49 -5
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js +361 -4
- package/dist/src/edge/bootstrap.d.ts +17 -0
- package/dist/src/edge/bootstrap.d.ts.map +1 -0
- package/dist/src/edge/bootstrap.js +29 -0
- package/dist/src/edge/client/dashboard.js +2 -3619
- package/dist/src/edge/client/debug-panel-deferred.js +1 -0
- package/dist/src/edge/client/debug-panel.js +1 -2140
- package/dist/src/edge/client/stats-bar.js +1 -801
- package/dist/src/edge/client-vue/dashboard.js +5 -0
- package/dist/src/edge/client-vue/debug-panel-deferred.js +4 -0
- package/dist/src/edge/client-vue/debug-panel.js +4 -0
- package/dist/src/edge/client-vue/stats-bar.js +4 -0
- package/dist/src/edge/plugin.d.ts +35 -2
- package/dist/src/edge/plugin.d.ts.map +1 -1
- package/dist/src/edge/plugin.js +30 -66
- package/dist/src/edge/types.d.ts +46 -0
- package/dist/src/edge/types.d.ts.map +1 -0
- package/dist/src/edge/types.js +4 -0
- package/dist/src/edge/views/dashboard.edge +1 -358
- package/dist/src/edge/views/debug-panel.edge +2 -154
- package/dist/src/edge/views/stats-bar.edge +15 -48
- package/dist/src/engine/stats_engine.d.ts +18 -0
- package/dist/src/engine/stats_engine.d.ts.map +1 -1
- package/dist/src/engine/stats_engine.js +45 -2
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/log_stream/log_stream_provider.d.ts.map +1 -1
- package/dist/src/log_stream/log_stream_provider.js +21 -4
- package/dist/src/log_stream/log_stream_service.d.ts +8 -1
- package/dist/src/log_stream/log_stream_service.d.ts.map +1 -1
- package/dist/src/log_stream/log_stream_service.js +27 -3
- package/dist/src/middleware/request_tracking_middleware.d.ts +1 -1
- package/dist/src/middleware/request_tracking_middleware.d.ts.map +1 -1
- package/dist/src/middleware/request_tracking_middleware.js +21 -6
- package/dist/src/prometheus/prometheus_collector.d.ts +2 -1
- package/dist/src/prometheus/prometheus_collector.d.ts.map +1 -1
- package/dist/src/provider/server_stats_provider.d.ts +100 -0
- package/dist/src/provider/server_stats_provider.d.ts.map +1 -1
- package/dist/src/provider/server_stats_provider.js +460 -104
- package/dist/src/routes/access_middleware.d.ts +2 -1
- package/dist/src/routes/access_middleware.d.ts.map +1 -1
- package/dist/src/routes/access_middleware.js +7 -1
- package/dist/src/routes/index.d.ts +4 -0
- package/dist/src/routes/index.d.ts.map +1 -0
- package/dist/src/routes/index.js +1 -0
- package/dist/src/routes/register_routes.d.ts +103 -0
- package/dist/src/routes/register_routes.d.ts.map +1 -0
- package/dist/src/routes/register_routes.js +356 -0
- package/dist/src/routes/router_types.d.ts +29 -0
- package/dist/src/routes/router_types.d.ts.map +1 -0
- package/dist/src/routes/router_types.js +1 -0
- package/dist/src/stubs/config.stub +12 -32
- package/dist/src/styles/components.css +1048 -0
- package/dist/src/{edge/client → styles}/dashboard.css +299 -736
- package/dist/src/{edge/client → styles}/debug-panel.css +117 -633
- package/dist/src/{edge/client → styles}/stats-bar.css +28 -10
- package/dist/src/styles/tokens.css +153 -0
- package/dist/src/styles/utilities.css +75 -0
- package/dist/src/types.d.ts +119 -16
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/app_import.d.ts +23 -0
- package/dist/src/utils/app_import.d.ts.map +1 -0
- package/dist/src/utils/app_import.js +44 -0
- package/dist/src/utils/json_helpers.d.ts +2 -2
- package/dist/src/utils/json_helpers.d.ts.map +1 -1
- package/dist/src/utils/logger.d.ts +17 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +27 -0
- package/dist/src/utils/mail_helpers.d.ts +1 -1
- package/dist/src/utils/mail_helpers.d.ts.map +1 -1
- package/dist/src/utils/mail_helpers.js +1 -1
- package/dist/vue/CacheSection-C788Yfai.js +149 -0
- package/dist/vue/CacheTab-BPisYYiQ.js +104 -0
- package/dist/vue/ConfigSection-CRzYxqW2.js +576 -0
- package/dist/vue/ConfigTab-C8cafGUj.js +361 -0
- package/dist/vue/CustomPaneTab-BJxT5Dp7.js +172 -0
- package/dist/vue/EmailsSection-C8JFMtW7.js +206 -0
- package/dist/vue/EmailsTab-DhFhoNmU.js +157 -0
- package/dist/vue/EventsSection-C4wXUgxG.js +107 -0
- package/dist/vue/EventsTab-DQ4Nd6AK.js +97 -0
- package/dist/vue/FilterBar.vue_vue_type_script_setup_true_lang-ClJ37hhT.js +62 -0
- package/dist/vue/InternalsSection-BJUXE-5F.js +468 -0
- package/dist/vue/InternalsTab-DEMjqtlw.js +471 -0
- package/dist/vue/JobsSection-CsKWTjgN.js +187 -0
- package/dist/vue/JobsTab-BCvhOARO.js +117 -0
- package/dist/vue/JsonViewer.vue_vue_type_script_setup_true_lang-Vsqar1zx.js +67 -0
- package/dist/vue/LogsSection-BFVjSZ24.js +227 -0
- package/dist/vue/LogsTab-DpEQ7euu.js +122 -0
- package/dist/vue/OverviewSection-CbMdAido.js +849 -0
- package/dist/vue/PaginationControls.vue_vue_type_script_setup_true_lang-CuN7g_8Z.js +50 -0
- package/dist/vue/QueriesSection-BPiv7u3r.js +429 -0
- package/dist/vue/QueriesTab-C8_7oprC.js +107 -0
- package/dist/vue/RequestsSection-LtImH4rD.js +243 -0
- package/dist/vue/RoutesSection-CrxOxmzx.js +106 -0
- package/dist/vue/RoutesTab-Dz0MkZuF.js +80 -0
- package/dist/vue/TimelineSection-DLxMW2J_.js +186 -0
- package/dist/vue/TimelineTab-Db6lKKsD.js +250 -0
- package/dist/vue/WaterfallChart.vue_vue_type_script_setup_true_lang-tZ13cNj1.js +118 -0
- package/dist/vue/components/Dashboard/DashboardPage.vue.d.ts +18 -0
- package/dist/vue/components/Dashboard/DashboardPage.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/CacheSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/CacheSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/ConfigSection.vue.d.ts +3 -0
- package/dist/vue/components/Dashboard/sections/ConfigSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/EmailsSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/EmailsSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/EventsSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/EventsSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/InternalsSection.vue.d.ts +3 -0
- package/dist/vue/components/Dashboard/sections/InternalsSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/JobsSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/JobsSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/LogsSection.vue.d.ts +3 -0
- package/dist/vue/components/Dashboard/sections/LogsSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/OverviewSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/OverviewSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/QueriesSection.vue.d.ts +45 -0
- package/dist/vue/components/Dashboard/sections/QueriesSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/RequestsSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/RequestsSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/RoutesSection.vue.d.ts +5 -0
- package/dist/vue/components/Dashboard/sections/RoutesSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/sections/TimelineSection.vue.d.ts +11 -0
- package/dist/vue/components/Dashboard/sections/TimelineSection.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/shared/FilterBar.vue.d.ts +29 -0
- package/dist/vue/components/Dashboard/shared/FilterBar.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/shared/PaginationControls.vue.d.ts +12 -0
- package/dist/vue/components/Dashboard/shared/PaginationControls.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/shared/TimeRangeSelector.vue.d.ts +11 -0
- package/dist/vue/components/Dashboard/shared/TimeRangeSelector.vue.d.ts.map +1 -0
- package/dist/vue/components/Dashboard/shared/WaterfallChart.vue.d.ts +10 -0
- package/dist/vue/components/Dashboard/shared/WaterfallChart.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/DebugPanel.vue.d.ts +21 -0
- package/dist/vue/components/DebugPanel/DebugPanel.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/CacheTab.vue.d.ts +12 -0
- package/dist/vue/components/DebugPanel/tabs/CacheTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/ConfigTab.vue.d.ts +11 -0
- package/dist/vue/components/DebugPanel/tabs/ConfigTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/CustomPaneTab.vue.d.ts +11 -0
- package/dist/vue/components/DebugPanel/tabs/CustomPaneTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/EmailsTab.vue.d.ts +12 -0
- package/dist/vue/components/DebugPanel/tabs/EmailsTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/EventsTab.vue.d.ts +12 -0
- package/dist/vue/components/DebugPanel/tabs/EventsTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/InternalsTab.vue.d.ts +11 -0
- package/dist/vue/components/DebugPanel/tabs/InternalsTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/JobsTab.vue.d.ts +13 -0
- package/dist/vue/components/DebugPanel/tabs/JobsTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/LogsTab.vue.d.ts +15 -0
- package/dist/vue/components/DebugPanel/tabs/LogsTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/QueriesTab.vue.d.ts +12 -0
- package/dist/vue/components/DebugPanel/tabs/QueriesTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/RoutesTab.vue.d.ts +12 -0
- package/dist/vue/components/DebugPanel/tabs/RoutesTab.vue.d.ts.map +1 -0
- package/dist/vue/components/DebugPanel/tabs/TimelineTab.vue.d.ts +15 -0
- package/dist/vue/components/DebugPanel/tabs/TimelineTab.vue.d.ts.map +1 -0
- package/dist/vue/components/StatsBar/MetricCard.vue.d.ts +19 -0
- package/dist/vue/components/StatsBar/MetricCard.vue.d.ts.map +1 -0
- package/dist/vue/components/StatsBar/Sparkline.vue.d.ts +17 -0
- package/dist/vue/components/StatsBar/Sparkline.vue.d.ts.map +1 -0
- package/dist/vue/components/StatsBar/StatsBar.vue.d.ts +22 -0
- package/dist/vue/components/StatsBar/StatsBar.vue.d.ts.map +1 -0
- package/dist/vue/components/shared/JsonViewer.vue.d.ts +13 -0
- package/dist/vue/components/shared/JsonViewer.vue.d.ts.map +1 -0
- package/dist/vue/components/shared/ThemeToggle.vue.d.ts +8 -0
- package/dist/vue/components/shared/ThemeToggle.vue.d.ts.map +1 -0
- package/dist/vue/composables/useApiClient.d.ts +9 -0
- package/dist/vue/composables/useApiClient.d.ts.map +1 -0
- package/dist/vue/composables/useDashboardData.d.ts +53 -0
- package/dist/vue/composables/useDashboardData.d.ts.map +1 -0
- package/dist/vue/composables/useDebugData.d.ts +25 -0
- package/dist/vue/composables/useDebugData.d.ts.map +1 -0
- package/dist/vue/composables/useFeatures.d.ts +80 -0
- package/dist/vue/composables/useFeatures.d.ts.map +1 -0
- package/dist/vue/composables/useResizableTable.d.ts +16 -0
- package/dist/vue/composables/useResizableTable.d.ts.map +1 -0
- package/dist/vue/composables/useServerStats.d.ts +104 -0
- package/dist/vue/composables/useServerStats.d.ts.map +1 -0
- package/dist/vue/composables/useTheme.d.ts +6 -0
- package/dist/vue/composables/useTheme.d.ts.map +1 -0
- package/dist/vue/index-qCQpBftQ.js +1233 -0
- package/dist/vue/index.d.ts +10 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +11 -0
- package/dist/vue/style.css +1 -0
- package/dist/vue/useApiClient-BQQ9CF-q.js +10 -0
- package/dist/vue/useResizableTable-BoivAevK.js +17 -0
- package/package.json +72 -10
- package/dist/src/dashboard/dashboard_routes.d.ts +0 -16
- package/dist/src/dashboard/dashboard_routes.d.ts.map +0 -1
- package/dist/src/dashboard/dashboard_routes.js +0 -77
- package/dist/src/routes/debug_routes.d.ts +0 -14
- package/dist/src/routes/debug_routes.d.ts.map +0 -1
- package/dist/src/routes/debug_routes.js +0 -42
- package/dist/src/routes/stats_routes.d.ts +0 -14
- package/dist/src/routes/stats_routes.d.ts.map +0 -1
- package/dist/src/routes/stats_routes.js +0 -27
|
@@ -1,4 +1,34 @@
|
|
|
1
1
|
import type { ApplicationService } from '@adonisjs/core/types';
|
|
2
|
+
/** Minimal interface for a BullMQ Job as accessed by the inspector. */
|
|
3
|
+
interface BullMQJob {
|
|
4
|
+
id: string | number;
|
|
5
|
+
name: string;
|
|
6
|
+
data: Record<string, unknown> | null;
|
|
7
|
+
opts: Record<string, unknown>;
|
|
8
|
+
timestamp: number;
|
|
9
|
+
processedOn: number | null;
|
|
10
|
+
finishedOn: number | null;
|
|
11
|
+
failedReason: string | null;
|
|
12
|
+
stacktrace: string[];
|
|
13
|
+
returnvalue: unknown;
|
|
14
|
+
attemptsMade: number;
|
|
15
|
+
progress: number | object;
|
|
16
|
+
delay?: number;
|
|
17
|
+
getState(): Promise<string>;
|
|
18
|
+
retry(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
/** Minimal interface for a BullMQ Queue as accessed by the inspector. */
|
|
21
|
+
interface BullMQQueue {
|
|
22
|
+
getJobCounts(...statuses: string[]): Promise<Record<string, number>>;
|
|
23
|
+
getJobs(statuses: string[], start: number, end: number): Promise<(BullMQJob | null)[]>;
|
|
24
|
+
getJob(id: string): Promise<BullMQJob | null>;
|
|
25
|
+
}
|
|
26
|
+
/** Minimal interface for the @rlanz/bull-queue manager. */
|
|
27
|
+
interface QueueManager {
|
|
28
|
+
get?(name: string): BullMQQueue | null;
|
|
29
|
+
getOrSet?(name: string): BullMQQueue;
|
|
30
|
+
getJobCounts?(...statuses: string[]): Promise<Record<string, number>>;
|
|
31
|
+
}
|
|
2
32
|
export interface QueueOverview {
|
|
3
33
|
/** Total jobs currently being processed. */
|
|
4
34
|
active: number;
|
|
@@ -16,12 +46,14 @@ export interface QueueOverview {
|
|
|
16
46
|
export interface QueueJobSummary {
|
|
17
47
|
/** Bull job ID. */
|
|
18
48
|
id: string;
|
|
19
|
-
/**
|
|
49
|
+
/** Human-readable job name (cleaned from file URLs). */
|
|
20
50
|
name: string;
|
|
21
51
|
/** Current job status. */
|
|
22
52
|
status: 'active' | 'waiting' | 'delayed' | 'completed' | 'failed' | 'paused';
|
|
23
53
|
/** Job payload (data). */
|
|
24
|
-
data:
|
|
54
|
+
data: Record<string, unknown> | null;
|
|
55
|
+
/** Alias for `data` — used by some frontends. */
|
|
56
|
+
payload: Record<string, unknown> | null;
|
|
25
57
|
/** Number of attempts so far. */
|
|
26
58
|
attempts: number;
|
|
27
59
|
/** Maximum allowed attempts. */
|
|
@@ -32,6 +64,8 @@ export interface QueueJobSummary {
|
|
|
32
64
|
failedReason: string | null;
|
|
33
65
|
/** When the job was added (Unix timestamp ms). */
|
|
34
66
|
createdAt: number;
|
|
67
|
+
/** Alias for `createdAt` — BullMQ compat. */
|
|
68
|
+
timestamp: number;
|
|
35
69
|
/** When processing started (Unix timestamp ms), or null. */
|
|
36
70
|
processedAt: number | null;
|
|
37
71
|
/** When the job finished (Unix timestamp ms), or null. */
|
|
@@ -43,9 +77,9 @@ export interface QueueJobDetail extends QueueJobSummary {
|
|
|
43
77
|
/** Full stack trace if the job failed. */
|
|
44
78
|
stackTrace: string[];
|
|
45
79
|
/** Return value from the job handler, if any. */
|
|
46
|
-
returnValue:
|
|
80
|
+
returnValue: unknown;
|
|
47
81
|
/** Job options (delay, priority, repeat, etc.). */
|
|
48
|
-
opts: Record<string,
|
|
82
|
+
opts: Record<string, unknown>;
|
|
49
83
|
}
|
|
50
84
|
export interface QueueJobListResult {
|
|
51
85
|
/** Jobs for the requested page. */
|
|
@@ -63,7 +97,7 @@ type JobStatus = 'active' | 'waiting' | 'delayed' | 'completed' | 'failed' | 'pa
|
|
|
63
97
|
*/
|
|
64
98
|
export declare class QueueInspector {
|
|
65
99
|
private queueManager;
|
|
66
|
-
constructor(queueManager:
|
|
100
|
+
constructor(queueManager: QueueManager);
|
|
67
101
|
/**
|
|
68
102
|
* Detect whether `@rlanz/bull-queue` is available in the application container.
|
|
69
103
|
*/
|
|
@@ -75,11 +109,11 @@ export declare class QueueInspector {
|
|
|
75
109
|
/**
|
|
76
110
|
* List jobs filtered by status with pagination.
|
|
77
111
|
*
|
|
78
|
-
* @param status Job status to filter by.
|
|
112
|
+
* @param status Job status to filter by, or `'all'` for every status.
|
|
79
113
|
* @param page Page number (1-based).
|
|
80
114
|
* @param perPage Jobs per page.
|
|
81
115
|
*/
|
|
82
|
-
listJobs(status?: JobStatus, page?: number, perPage?: number): Promise<QueueJobListResult>;
|
|
116
|
+
listJobs(status?: JobStatus | 'all', page?: number, perPage?: number): Promise<QueueJobListResult>;
|
|
83
117
|
/**
|
|
84
118
|
* Get full detail for a single job by ID.
|
|
85
119
|
*/
|
|
@@ -91,12 +125,23 @@ export declare class QueueInspector {
|
|
|
91
125
|
*/
|
|
92
126
|
retryJob(id: string): Promise<boolean>;
|
|
93
127
|
/**
|
|
94
|
-
* Get the underlying
|
|
128
|
+
* Get the underlying BullMQ Queue instance from the queue manager.
|
|
95
129
|
*
|
|
96
|
-
* `@rlanz/bull-queue` exposes
|
|
97
|
-
* or via `.useQueue()`. We try both patterns for compatibility.
|
|
130
|
+
* `@rlanz/bull-queue` exposes queues via `.get(name)` or `.getOrSet(name)`.
|
|
98
131
|
*/
|
|
99
132
|
private getQueue;
|
|
133
|
+
/**
|
|
134
|
+
* Infer a job's status from its internal fields (avoids async getState() call).
|
|
135
|
+
*/
|
|
136
|
+
private inferStatus;
|
|
137
|
+
/**
|
|
138
|
+
* Extract a human-readable job name from a raw Bull job name.
|
|
139
|
+
*
|
|
140
|
+
* `@rlanz/bull-queue` often stores the full file URL as the job name
|
|
141
|
+
* (e.g. `file:///Users/…/app/jobs/send_email.ts`). We extract just
|
|
142
|
+
* the class-style name from the filename.
|
|
143
|
+
*/
|
|
144
|
+
private static cleanJobName;
|
|
100
145
|
/**
|
|
101
146
|
* Format a Bull job into our summary shape.
|
|
102
147
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue_inspector.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/integrations/queue_inspector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAM9D,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAA;IAEd,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAA;IAEf,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAA;IAEf,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAA;IAEjB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAA;IAEd,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,mBAAmB;IACnB,EAAE,EAAE,MAAM,CAAA;IAEV,
|
|
1
|
+
{"version":3,"file":"queue_inspector.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/integrations/queue_inspector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const ALL_STATUSES = ['active', 'waiting', 'delayed', 'completed', 'failed', 'paused'];
|
|
1
2
|
/**
|
|
2
3
|
* Inspects Bull Queue jobs, counts, and allows retrying failed jobs.
|
|
3
4
|
*
|
|
@@ -15,7 +16,7 @@ export class QueueInspector {
|
|
|
15
16
|
*/
|
|
16
17
|
static async isAvailable(app) {
|
|
17
18
|
try {
|
|
18
|
-
await app.container.make('queue');
|
|
19
|
+
await app.container.make('rlanz/queue');
|
|
19
20
|
return true;
|
|
20
21
|
}
|
|
21
22
|
catch {
|
|
@@ -55,28 +56,34 @@ export class QueueInspector {
|
|
|
55
56
|
/**
|
|
56
57
|
* List jobs filtered by status with pagination.
|
|
57
58
|
*
|
|
58
|
-
* @param status Job status to filter by.
|
|
59
|
+
* @param status Job status to filter by, or `'all'` for every status.
|
|
59
60
|
* @param page Page number (1-based).
|
|
60
61
|
* @param perPage Jobs per page.
|
|
61
62
|
*/
|
|
62
|
-
async listJobs(status = '
|
|
63
|
+
async listJobs(status = 'all', page = 1, perPage = 25) {
|
|
63
64
|
try {
|
|
64
65
|
const queue = this.getQueue();
|
|
65
66
|
if (!queue)
|
|
66
67
|
return { jobs: [], total: 0 };
|
|
67
68
|
const start = (page - 1) * perPage;
|
|
68
69
|
const end = start + perPage - 1;
|
|
70
|
+
const statuses = status === 'all' ? ALL_STATUSES : [status];
|
|
69
71
|
const [rawJobs, counts] = await Promise.all([
|
|
70
|
-
queue.getJobs(
|
|
71
|
-
queue.getJobCounts(
|
|
72
|
+
queue.getJobs(statuses, start, end),
|
|
73
|
+
queue.getJobCounts(...ALL_STATUSES),
|
|
72
74
|
]);
|
|
73
75
|
const jobs = (rawJobs ?? [])
|
|
74
76
|
.filter((job) => job !== null && job !== undefined)
|
|
75
|
-
.map((job) =>
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
.map((job) => {
|
|
78
|
+
const jobState = this.inferStatus(job) ?? (status === 'all' ? 'completed' : status);
|
|
79
|
+
return this.formatJobSummary(job, jobState);
|
|
80
|
+
});
|
|
81
|
+
// Sort by creation time descending (newest first)
|
|
82
|
+
jobs.sort((a, b) => b.createdAt - a.createdAt);
|
|
83
|
+
const total = status === 'all'
|
|
84
|
+
? ALL_STATUSES.reduce((sum, s) => sum + (counts[s] ?? 0), 0)
|
|
85
|
+
: (counts[status] ?? 0);
|
|
86
|
+
return { jobs, total };
|
|
80
87
|
}
|
|
81
88
|
catch {
|
|
82
89
|
return { jobs: [], total: 0 };
|
|
@@ -132,22 +139,21 @@ export class QueueInspector {
|
|
|
132
139
|
// Private helpers
|
|
133
140
|
// ---------------------------------------------------------------------------
|
|
134
141
|
/**
|
|
135
|
-
* Get the underlying
|
|
142
|
+
* Get the underlying BullMQ Queue instance from the queue manager.
|
|
136
143
|
*
|
|
137
|
-
* `@rlanz/bull-queue` exposes
|
|
138
|
-
* or via `.useQueue()`. We try both patterns for compatibility.
|
|
144
|
+
* `@rlanz/bull-queue` exposes queues via `.get(name)` or `.getOrSet(name)`.
|
|
139
145
|
*/
|
|
140
146
|
getQueue() {
|
|
141
147
|
try {
|
|
142
|
-
// @rlanz/bull-queue
|
|
143
|
-
if (this.queueManager.
|
|
144
|
-
return this.queueManager.
|
|
148
|
+
// @rlanz/bull-queue: .get(name) returns the BullMQ Queue instance
|
|
149
|
+
if (typeof this.queueManager.get === 'function') {
|
|
150
|
+
return this.queueManager.get('default') ?? null;
|
|
145
151
|
}
|
|
146
|
-
//
|
|
147
|
-
if (typeof this.queueManager.
|
|
148
|
-
return this.queueManager.
|
|
152
|
+
// Fallback: .getOrSet(name) lazily creates the queue if needed
|
|
153
|
+
if (typeof this.queueManager.getOrSet === 'function') {
|
|
154
|
+
return this.queueManager.getOrSet('default');
|
|
149
155
|
}
|
|
150
|
-
//
|
|
156
|
+
// Last resort: the manager itself is already a Queue instance
|
|
151
157
|
if (typeof this.queueManager.getJobCounts === 'function') {
|
|
152
158
|
return this.queueManager;
|
|
153
159
|
}
|
|
@@ -157,23 +163,63 @@ export class QueueInspector {
|
|
|
157
163
|
return null;
|
|
158
164
|
}
|
|
159
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Infer a job's status from its internal fields (avoids async getState() call).
|
|
168
|
+
*/
|
|
169
|
+
inferStatus(job) {
|
|
170
|
+
if (job.failedReason || job.stacktrace?.length)
|
|
171
|
+
return 'failed';
|
|
172
|
+
if (job.finishedOn)
|
|
173
|
+
return 'completed';
|
|
174
|
+
if (job.processedOn)
|
|
175
|
+
return 'active';
|
|
176
|
+
if (job.delay && job.delay > 0 && !job.processedOn)
|
|
177
|
+
return 'delayed';
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Extract a human-readable job name from a raw Bull job name.
|
|
182
|
+
*
|
|
183
|
+
* `@rlanz/bull-queue` often stores the full file URL as the job name
|
|
184
|
+
* (e.g. `file:///Users/…/app/jobs/send_email.ts`). We extract just
|
|
185
|
+
* the class-style name from the filename.
|
|
186
|
+
*/
|
|
187
|
+
static cleanJobName(raw) {
|
|
188
|
+
if (!raw || raw === '__default__')
|
|
189
|
+
return 'default';
|
|
190
|
+
// Strip file:// URLs down to the filename
|
|
191
|
+
if (raw.startsWith('file://') || raw.startsWith('/')) {
|
|
192
|
+
const filename = raw.split('/').pop() ?? raw;
|
|
193
|
+
// Remove extension and convert snake_case/kebab-case to PascalCase
|
|
194
|
+
const base = filename.replace(/\.(ts|js|mjs|cjs)$/, '');
|
|
195
|
+
return base
|
|
196
|
+
.split(/[-_]/)
|
|
197
|
+
.map((s) => s.charAt(0).toUpperCase() + s.slice(1))
|
|
198
|
+
.join('');
|
|
199
|
+
}
|
|
200
|
+
return raw;
|
|
201
|
+
}
|
|
160
202
|
/**
|
|
161
203
|
* Format a Bull job into our summary shape.
|
|
162
204
|
*/
|
|
163
205
|
formatJobSummary(job, status) {
|
|
164
206
|
const processedAt = job.processedOn ?? null;
|
|
165
207
|
const finishedAt = job.finishedOn ?? null;
|
|
166
|
-
const duration = processedAt
|
|
208
|
+
const duration = processedAt !== null && finishedAt !== null ? finishedAt - processedAt : null;
|
|
209
|
+
const createdAt = job.timestamp ?? 0;
|
|
210
|
+
const data = job.data ?? null;
|
|
167
211
|
return {
|
|
168
212
|
id: String(job.id),
|
|
169
|
-
name: job.name ?? 'unknown',
|
|
213
|
+
name: QueueInspector.cleanJobName(job.name ?? 'unknown'),
|
|
170
214
|
status,
|
|
171
|
-
data
|
|
215
|
+
data,
|
|
216
|
+
payload: data,
|
|
172
217
|
attempts: job.attemptsMade ?? 0,
|
|
173
218
|
maxAttempts: job.opts?.attempts ?? 1,
|
|
174
219
|
progress: job.progress ?? 0,
|
|
175
220
|
failedReason: job.failedReason ?? null,
|
|
176
|
-
createdAt
|
|
221
|
+
createdAt,
|
|
222
|
+
timestamp: createdAt,
|
|
177
223
|
processedAt,
|
|
178
224
|
finishedAt,
|
|
179
225
|
duration,
|
|
@@ -5,6 +5,9 @@ import type { Knex } from 'knex';
|
|
|
5
5
|
* Uses raw SQL (not Lucid migrations) so we never pollute the host
|
|
6
6
|
* application's migration history. Each `CREATE TABLE` / `CREATE INDEX`
|
|
7
7
|
* uses `IF NOT EXISTS` so the function is idempotent.
|
|
8
|
+
*
|
|
9
|
+
* Yields to the event loop between each table so the server can
|
|
10
|
+
* continue processing HTTP requests during migration.
|
|
8
11
|
*/
|
|
9
12
|
export declare function autoMigrate(db: Knex): Promise<void>;
|
|
10
13
|
/**
|
|
@@ -13,6 +16,8 @@ export declare function autoMigrate(db: Knex): Promise<void>;
|
|
|
13
16
|
* Foreign-key cascades on `server_stats_requests` handle the child
|
|
14
17
|
* tables (queries, events, traces). Standalone tables (logs, emails,
|
|
15
18
|
* metrics, saved_filters) are pruned individually.
|
|
19
|
+
*
|
|
20
|
+
* Yields between each DELETE so the event loop stays responsive.
|
|
16
21
|
*/
|
|
17
22
|
export declare function runRetentionCleanup(db: Knex, retentionDays: number): Promise<void>;
|
|
18
23
|
//# sourceMappingURL=migrator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../../src/dashboard/migrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../../src/dashboard/migrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAahC;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAoJzD;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BxF"}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yield control back to the event loop so Node.js can process pending
|
|
3
|
+
* I/O (incoming HTTP requests, timers, etc.).
|
|
4
|
+
*
|
|
5
|
+
* `better-sqlite3` is fully synchronous — when Knex wraps it, each
|
|
6
|
+
* `await db.raw(...)` resolves via the microtask queue, never actually
|
|
7
|
+
* yielding to the I/O phase. Without explicit yields, 25+ sequential
|
|
8
|
+
* migration statements block the event loop for their entire duration.
|
|
9
|
+
*/
|
|
10
|
+
const yieldToEventLoop = () => new Promise((resolve) => setImmediate(resolve));
|
|
1
11
|
/**
|
|
2
12
|
* Auto-migrate all dashboard SQLite tables.
|
|
3
13
|
*
|
|
4
14
|
* Uses raw SQL (not Lucid migrations) so we never pollute the host
|
|
5
15
|
* application's migration history. Each `CREATE TABLE` / `CREATE INDEX`
|
|
6
16
|
* uses `IF NOT EXISTS` so the function is idempotent.
|
|
17
|
+
*
|
|
18
|
+
* Yields to the event loop between each table so the server can
|
|
19
|
+
* continue processing HTTP requests during migration.
|
|
7
20
|
*/
|
|
8
21
|
export async function autoMigrate(db) {
|
|
9
22
|
// -- server_stats_requests --------------------------------------------------
|
|
@@ -21,6 +34,7 @@ export async function autoMigrate(db) {
|
|
|
21
34
|
`);
|
|
22
35
|
await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_requests_created ON server_stats_requests(created_at)`);
|
|
23
36
|
await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_requests_url ON server_stats_requests(url)`);
|
|
37
|
+
await yieldToEventLoop();
|
|
24
38
|
// -- server_stats_queries ---------------------------------------------------
|
|
25
39
|
await db.raw(`
|
|
26
40
|
CREATE TABLE IF NOT EXISTS server_stats_queries (
|
|
@@ -40,6 +54,7 @@ export async function autoMigrate(db) {
|
|
|
40
54
|
await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_queries_created ON server_stats_queries(created_at)`);
|
|
41
55
|
await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_queries_normalized ON server_stats_queries(sql_normalized)`);
|
|
42
56
|
await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_queries_request ON server_stats_queries(request_id)`);
|
|
57
|
+
await yieldToEventLoop();
|
|
43
58
|
// -- server_stats_events ----------------------------------------------------
|
|
44
59
|
await db.raw(`
|
|
45
60
|
CREATE TABLE IF NOT EXISTS server_stats_events (
|
|
@@ -51,6 +66,7 @@ export async function autoMigrate(db) {
|
|
|
51
66
|
)
|
|
52
67
|
`);
|
|
53
68
|
await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_events_created ON server_stats_events(created_at)`);
|
|
69
|
+
await yieldToEventLoop();
|
|
54
70
|
// -- server_stats_emails ----------------------------------------------------
|
|
55
71
|
await db.raw(`
|
|
56
72
|
CREATE TABLE IF NOT EXISTS server_stats_emails (
|
|
@@ -70,6 +86,7 @@ export async function autoMigrate(db) {
|
|
|
70
86
|
)
|
|
71
87
|
`);
|
|
72
88
|
await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_emails_created ON server_stats_emails(created_at)`);
|
|
89
|
+
await yieldToEventLoop();
|
|
73
90
|
// -- server_stats_logs ------------------------------------------------------
|
|
74
91
|
await db.raw(`
|
|
75
92
|
CREATE TABLE IF NOT EXISTS server_stats_logs (
|
|
@@ -84,6 +101,7 @@ export async function autoMigrate(db) {
|
|
|
84
101
|
await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_logs_created ON server_stats_logs(created_at)`);
|
|
85
102
|
await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_logs_level ON server_stats_logs(level)`);
|
|
86
103
|
await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_logs_request ON server_stats_logs(request_id)`);
|
|
104
|
+
await yieldToEventLoop();
|
|
87
105
|
// -- server_stats_traces ----------------------------------------------------
|
|
88
106
|
await db.raw(`
|
|
89
107
|
CREATE TABLE IF NOT EXISTS server_stats_traces (
|
|
@@ -100,6 +118,7 @@ export async function autoMigrate(db) {
|
|
|
100
118
|
)
|
|
101
119
|
`);
|
|
102
120
|
await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_traces_created ON server_stats_traces(created_at)`);
|
|
121
|
+
await yieldToEventLoop();
|
|
103
122
|
// -- server_stats_metrics ---------------------------------------------------
|
|
104
123
|
await db.raw(`
|
|
105
124
|
CREATE TABLE IF NOT EXISTS server_stats_metrics (
|
|
@@ -115,6 +134,7 @@ export async function autoMigrate(db) {
|
|
|
115
134
|
)
|
|
116
135
|
`);
|
|
117
136
|
await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_metrics_bucket ON server_stats_metrics(bucket)`);
|
|
137
|
+
await yieldToEventLoop();
|
|
118
138
|
// -- server_stats_saved_filters ---------------------------------------------
|
|
119
139
|
await db.raw(`
|
|
120
140
|
CREATE TABLE IF NOT EXISTS server_stats_saved_filters (
|
|
@@ -132,15 +152,30 @@ export async function autoMigrate(db) {
|
|
|
132
152
|
* Foreign-key cascades on `server_stats_requests` handle the child
|
|
133
153
|
* tables (queries, events, traces). Standalone tables (logs, emails,
|
|
134
154
|
* metrics, saved_filters) are pruned individually.
|
|
155
|
+
*
|
|
156
|
+
* Yields between each DELETE so the event loop stays responsive.
|
|
135
157
|
*/
|
|
136
158
|
export async function runRetentionCleanup(db, retentionDays) {
|
|
137
|
-
|
|
138
|
-
//
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
159
|
+
// Use string interpolation instead of parameterized bindings.
|
|
160
|
+
// Knex + better-sqlite3 can hang on parameterized db.raw() calls,
|
|
161
|
+
// while non-parameterized queries (used in migrations) work fine.
|
|
162
|
+
// Safe here — retentionDays is always a controlled integer.
|
|
163
|
+
const days = Math.max(1, Math.floor(retentionDays));
|
|
164
|
+
const cutoff = `datetime('now', '-${days} days')`;
|
|
165
|
+
try {
|
|
166
|
+
// Cascade deletes queries, events, traces via FK ON DELETE CASCADE
|
|
167
|
+
await db.raw(`DELETE FROM server_stats_requests WHERE created_at < ${cutoff}`);
|
|
168
|
+
await yieldToEventLoop();
|
|
169
|
+
// Standalone tables
|
|
170
|
+
await db.raw(`DELETE FROM server_stats_logs WHERE created_at < ${cutoff}`);
|
|
171
|
+
await yieldToEventLoop();
|
|
172
|
+
await db.raw(`DELETE FROM server_stats_emails WHERE created_at < ${cutoff}`);
|
|
173
|
+
await yieldToEventLoop();
|
|
174
|
+
await db.raw(`DELETE FROM server_stats_metrics WHERE created_at < ${cutoff}`);
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
// Log but don't throw — retention cleanup failure shouldn't block init
|
|
178
|
+
const { log } = await import('../utils/logger.js');
|
|
179
|
+
log.warn(`dashboard: retention cleanup error — ${err?.message}`);
|
|
180
|
+
}
|
|
146
181
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats_event.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAA;AAElE,OAAO,YAAY,MAAM,oBAAoB,CAAA;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAEhE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAC/C,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAwB;IAG5B,EAAE,EAAE,MAAM,CAAA;IAGV,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAGxB,SAAS,EAAE,MAAM,CAAA;IAOjB,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"stats_event.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAA;AAElE,OAAO,YAAY,MAAM,oBAAoB,CAAA;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAEhE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAC/C,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAwB;IAG5B,EAAE,EAAE,MAAM,CAAA;IAGV,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAGxB,SAAS,EAAE,MAAM,CAAA;IAOjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAGpC,SAAS,EAAE,MAAM,CAAA;IAGjB,OAAO,EAAE,SAAS,CAAC,OAAO,YAAY,CAAC,CAAA;CAChD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats_log.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,SAAS;IAC7C,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAsB;IAG1B,EAAE,EAAE,MAAM,CAAA;IAGV,KAAK,EAAE,MAAM,CAAA;IAGb,OAAO,EAAE,MAAM,CAAA;IAGf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAOxB,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"stats_log.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,SAAS;IAC7C,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAsB;IAG1B,EAAE,EAAE,MAAM,CAAA;IAGV,KAAK,EAAE,MAAM,CAAA;IAGb,OAAO,EAAE,MAAM,CAAA;IAGf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAOxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAGpC,SAAS,EAAE,MAAM,CAAA;CAC1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats_query.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAA;AAElE,OAAO,YAAY,MAAM,oBAAoB,CAAA;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAEhE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAC/C,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAyB;IAG7B,EAAE,EAAE,MAAM,CAAA;IAGV,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAGxB,OAAO,EAAE,MAAM,CAAA;IAGf,aAAa,EAAE,MAAM,CAAA;IAOrB,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"stats_query.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAA;AAElE,OAAO,YAAY,MAAM,oBAAoB,CAAA;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAEhE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAC/C,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAyB;IAG7B,EAAE,EAAE,MAAM,CAAA;IAGV,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAGxB,OAAO,EAAE,MAAM,CAAA;IAGf,aAAa,EAAE,MAAM,CAAA;IAOrB,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAG1B,QAAQ,EAAE,MAAM,CAAA;IAGhB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAGrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAGpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAGzB,aAAa,EAAE,MAAM,CAAA;IAGrB,SAAS,EAAE,MAAM,CAAA;IAGjB,OAAO,EAAE,SAAS,CAAC,OAAO,YAAY,CAAC,CAAA;CAChD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats_saved_filter.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_saved_filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,SAAS;IACrD,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAA+B;IAGnC,EAAE,EAAE,MAAM,CAAA;IAGV,IAAI,EAAE,MAAM,CAAA;IAGZ,OAAO,EAAE,MAAM,CAAA;IAOf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"stats_saved_filter.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_saved_filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,SAAS;IACrD,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAA+B;IAGnC,EAAE,EAAE,MAAM,CAAA;IAGV,IAAI,EAAE,MAAM,CAAA;IAGZ,OAAO,EAAE,MAAM,CAAA;IAOf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAGrC,SAAS,EAAE,MAAM,CAAA;CAC1B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BaseModel } from '@adonisjs/lucid/orm';
|
|
2
2
|
import StatsRequest from './stats_request.js';
|
|
3
|
+
import type { TraceSpan } from '../../debug/types.js';
|
|
3
4
|
import type { BelongsTo } from '@adonisjs/lucid/types/relations';
|
|
4
5
|
export default class StatsTrace extends BaseModel {
|
|
5
6
|
static connection: string;
|
|
@@ -11,7 +12,7 @@ export default class StatsTrace extends BaseModel {
|
|
|
11
12
|
statusCode: number;
|
|
12
13
|
totalDuration: number;
|
|
13
14
|
spanCount: number;
|
|
14
|
-
spans:
|
|
15
|
+
spans: TraceSpan[];
|
|
15
16
|
warnings: string[] | null;
|
|
16
17
|
createdAt: string;
|
|
17
18
|
request: BelongsTo<typeof StatsRequest>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats_trace.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_trace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAA;AAElE,OAAO,YAAY,MAAM,oBAAoB,CAAA;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAEhE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAC/C,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAwB;IAG5B,EAAE,EAAE,MAAM,CAAA;IAGV,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAGxB,MAAM,EAAE,MAAM,CAAA;IAGd,GAAG,EAAE,MAAM,CAAA;IAGX,UAAU,EAAE,MAAM,CAAA;IAGlB,aAAa,EAAE,MAAM,CAAA;IAGrB,SAAS,EAAE,MAAM,CAAA;IAOjB,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"stats_trace.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_trace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAA;AAElE,OAAO,YAAY,MAAM,oBAAoB,CAAA;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAEhE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAC/C,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAwB;IAG5B,EAAE,EAAE,MAAM,CAAA;IAGV,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAGxB,MAAM,EAAE,MAAM,CAAA;IAGd,GAAG,EAAE,MAAM,CAAA;IAGX,UAAU,EAAE,MAAM,CAAA;IAGlB,aAAa,EAAE,MAAM,CAAA;IAGrB,SAAS,EAAE,MAAM,CAAA;IAOjB,KAAK,EAAE,SAAS,EAAE,CAAA;IAOlB,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAGzB,SAAS,EAAE,MAAM,CAAA;IAGjB,OAAO,EAAE,SAAS,CAAC,OAAO,YAAY,CAAC,CAAA;CAChD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { DashboardStore } from '../dashboard/dashboard_store.js';
|
|
2
|
+
import type { DebugStore } from '../debug/debug_store.js';
|
|
3
|
+
import type { QueryRecord, EventRecord, TraceRecord, RouteRecord } from '../debug/types.js';
|
|
4
|
+
export interface ListOptions {
|
|
5
|
+
page?: number;
|
|
6
|
+
perPage?: number;
|
|
7
|
+
search?: string;
|
|
8
|
+
sort?: string;
|
|
9
|
+
sortDir?: 'asc' | 'desc';
|
|
10
|
+
filters?: Record<string, unknown>;
|
|
11
|
+
/**
|
|
12
|
+
* Force the data source for this read.
|
|
13
|
+
*
|
|
14
|
+
* - `'memory'` — always read from ring buffers ({@link DebugStore}).
|
|
15
|
+
* Use this for the debug panel, which expects camelCase field names
|
|
16
|
+
* matching the {@link QueryRecord}/{@link EventRecord}/etc. interfaces.
|
|
17
|
+
* - `'auto'` (default) — use SQLite when available, fall back to memory.
|
|
18
|
+
*/
|
|
19
|
+
source?: 'memory' | 'auto';
|
|
20
|
+
}
|
|
21
|
+
export interface PaginatedResult<T = Record<string, unknown>> {
|
|
22
|
+
data: T[];
|
|
23
|
+
meta: {
|
|
24
|
+
total: number;
|
|
25
|
+
page: number;
|
|
26
|
+
perPage: number;
|
|
27
|
+
lastPage: number;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Thin abstraction layer that delegates reads to either the
|
|
32
|
+
* {@link DashboardStore} (SQLite persistence) or the {@link DebugStore}
|
|
33
|
+
* (in-memory ring buffers), depending on availability.
|
|
34
|
+
*
|
|
35
|
+
* This is intentionally *not* wired into the AdonisJS container yet
|
|
36
|
+
* -- that happens in Phase 3.
|
|
37
|
+
*/
|
|
38
|
+
export declare class DataAccess {
|
|
39
|
+
private debugStore;
|
|
40
|
+
private getDashboardStore;
|
|
41
|
+
private logPath?;
|
|
42
|
+
constructor(debugStore: DebugStore, dashboardStore: DashboardStore | null | (() => DashboardStore | null), logPath?: string);
|
|
43
|
+
/** Whether SQLite persistence is available and initialised. */
|
|
44
|
+
get hasPersistence(): boolean;
|
|
45
|
+
/** Resolve the dashboard store (may be null if not yet initialized). */
|
|
46
|
+
private get dashboardStore();
|
|
47
|
+
getQueries(opts?: ListOptions): Promise<PaginatedResult<QueryRecord>>;
|
|
48
|
+
getQuerySummary(): {
|
|
49
|
+
total: number;
|
|
50
|
+
slow: number;
|
|
51
|
+
duplicates: number;
|
|
52
|
+
avgDuration: number;
|
|
53
|
+
};
|
|
54
|
+
getEvents(opts?: ListOptions): Promise<PaginatedResult<EventRecord>>;
|
|
55
|
+
/**
|
|
56
|
+
* Paginated email list.
|
|
57
|
+
*
|
|
58
|
+
* HTML and text bodies are stripped from the list response to keep
|
|
59
|
+
* payloads lightweight. Use {@link getEmailPreview} for the full body.
|
|
60
|
+
*/
|
|
61
|
+
getEmails(opts?: ListOptions): Promise<PaginatedResult>;
|
|
62
|
+
/**
|
|
63
|
+
* Get email HTML body for preview (iframe rendering).
|
|
64
|
+
*
|
|
65
|
+
* Returns the full HTML body string, or falls back to the text body.
|
|
66
|
+
* Returns `null` when the email is not found.
|
|
67
|
+
*/
|
|
68
|
+
getEmailPreview(id: number, source?: 'memory' | 'auto'): Promise<string | null>;
|
|
69
|
+
/**
|
|
70
|
+
* Paginated trace list.
|
|
71
|
+
*
|
|
72
|
+
* Span arrays are stripped from the list response to keep payloads
|
|
73
|
+
* lightweight. Use {@link getTraceDetail} for the full span tree.
|
|
74
|
+
*/
|
|
75
|
+
getTraces(opts?: ListOptions): Promise<PaginatedResult>;
|
|
76
|
+
/**
|
|
77
|
+
* Get a single trace with full span tree.
|
|
78
|
+
*
|
|
79
|
+
* Returns `null` when the trace is not found.
|
|
80
|
+
*/
|
|
81
|
+
getTraceDetail(id: number, source?: 'memory' | 'auto'): Promise<TraceRecord | null>;
|
|
82
|
+
/**
|
|
83
|
+
* Get the registered route table.
|
|
84
|
+
*
|
|
85
|
+
* Routes are always read from the in-memory {@link DebugStore} because
|
|
86
|
+
* they are static boot-time data that is never persisted to SQLite.
|
|
87
|
+
*/
|
|
88
|
+
getRoutes(search?: string): PaginatedResult<RouteRecord>;
|
|
89
|
+
/**
|
|
90
|
+
* Paginated log entries.
|
|
91
|
+
*
|
|
92
|
+
* When the dashboard store is available, logs are read from SQLite with
|
|
93
|
+
* full server-side filtering. Otherwise, falls back to reading the last
|
|
94
|
+
* 256 KB of the application log file from the filesystem.
|
|
95
|
+
*/
|
|
96
|
+
getLogs(opts?: ListOptions): Promise<PaginatedResult>;
|
|
97
|
+
/**
|
|
98
|
+
* Read and parse the last 256 KB of the application log file.
|
|
99
|
+
*
|
|
100
|
+
* Returns an array of enriched log entry objects. If the log file
|
|
101
|
+
* does not exist or cannot be read, returns an empty array.
|
|
102
|
+
*/
|
|
103
|
+
private readLogFile;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=data_access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data_access.d.ts","sourceRoot":"","sources":["../../../src/data/data_access.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EAMf,MAAM,iCAAiC,CAAA;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EAEX,WAAW,EACX,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAM1B,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAEjC;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AAkED;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,OAAO,CAAC,CAAQ;gBAGtB,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,EACrE,OAAO,CAAC,EAAE,MAAM;IAQlB,+DAA+D;IAC/D,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,wEAAwE;IACxE,OAAO,KAAK,cAAc,GAEzB;IAMK,UAAU,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IAsB/E,eAAe,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAQrF,SAAS,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IAsB9E;;;;;OAKG;IACG,SAAS,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAwBjE;;;;;OAKG;IACG,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAYrF;;;;;OAKG;IACG,SAAS,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IA4BjE;;;;OAIG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAazF;;;;;OAKG;IACH,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC;IA8BxD;;;;;;OAMG;IACG,OAAO,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAyB/D;;;;;OAKG;YACW,WAAW;CAoC1B"}
|