adonisjs-server-stats 1.5.3 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +28 -1
- 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 +116 -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 +33 -0
- package/dist/src/collectors/http_collector.d.ts.map +1 -1
- package/dist/src/collectors/http_collector.js +25 -6
- 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 +41 -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 +14 -10
- package/dist/src/controller/debug_controller.d.ts.map +1 -1
- package/dist/src/controller/debug_controller.js +96 -102
- 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/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 +196 -43
- 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/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 +103 -0
- package/dist/src/data/data_access.d.ts.map +1 -0
- package/dist/src/data/data_access.js +305 -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 +360 -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 +14 -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 +98 -0
- package/dist/src/provider/server_stats_provider.d.ts.map +1 -1
- package/dist/src/provider/server_stats_provider.js +340 -50
- 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/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-CkrIB4-j.js +149 -0
- package/dist/vue/CacheTab-BPisYYiQ.js +104 -0
- package/dist/vue/ConfigSection-gulpOiq1.js +576 -0
- package/dist/vue/ConfigTab-C8cafGUj.js +361 -0
- package/dist/vue/CustomPaneTab-J57ED_bh.js +172 -0
- package/dist/vue/EmailsSection-BlKvQDx8.js +206 -0
- package/dist/vue/EmailsTab-DhFhoNmU.js +157 -0
- package/dist/vue/EventsSection-BdzQvIVJ.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-DOzuMrG3.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-CNN4y92u.js +227 -0
- package/dist/vue/LogsTab-CJerb22r.js +122 -0
- package/dist/vue/OverviewSection-SITNR_dA.js +849 -0
- package/dist/vue/PaginationControls.vue_vue_type_script_setup_true_lang-CuN7g_8Z.js +50 -0
- package/dist/vue/QueriesSection-BAebAHkD.js +429 -0
- package/dist/vue/QueriesTab-C8_7oprC.js +107 -0
- package/dist/vue/RequestsSection-CIR0IX39.js +243 -0
- package/dist/vue/RoutesSection-j1U2oa0g.js +106 -0
- package/dist/vue/RoutesTab-Dz0MkZuF.js +80 -0
- package/dist/vue/TimelineSection-Dw980UPg.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-COgsk_nv.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 +68 -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,5 +1,22 @@
|
|
|
1
1
|
import type { DevToolbarConfig } from '../debug/types.js';
|
|
2
2
|
import type { QueryRecord, EventRecord, EmailRecord, TraceRecord } from '../debug/types.js';
|
|
3
|
+
import type { Knex } from 'knex';
|
|
4
|
+
interface EventEmitter {
|
|
5
|
+
on(event: string, handler: (...args: unknown[]) => void): void;
|
|
6
|
+
off(event: string, handler: (...args: unknown[]) => void): void;
|
|
7
|
+
}
|
|
8
|
+
export interface RequestInput {
|
|
9
|
+
method: string;
|
|
10
|
+
url: string;
|
|
11
|
+
statusCode: number;
|
|
12
|
+
duration: number;
|
|
13
|
+
spanCount?: number;
|
|
14
|
+
warningCount?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface PersistRequestInput extends RequestInput {
|
|
17
|
+
queries: QueryRecord[];
|
|
18
|
+
trace: TraceRecord | null;
|
|
19
|
+
}
|
|
3
20
|
export interface RequestFilters {
|
|
4
21
|
method?: string;
|
|
5
22
|
url?: string;
|
|
@@ -8,6 +25,8 @@ export interface RequestFilters {
|
|
|
8
25
|
statusMax?: number;
|
|
9
26
|
durationMin?: number;
|
|
10
27
|
durationMax?: number;
|
|
28
|
+
/** General text search across method and url */
|
|
29
|
+
search?: string;
|
|
11
30
|
}
|
|
12
31
|
export interface QueryFilters {
|
|
13
32
|
method?: string;
|
|
@@ -16,11 +35,17 @@ export interface QueryFilters {
|
|
|
16
35
|
durationMin?: number;
|
|
17
36
|
durationMax?: number;
|
|
18
37
|
requestId?: number;
|
|
38
|
+
/** General text search across sql_text, model, and connection */
|
|
39
|
+
search?: string;
|
|
19
40
|
}
|
|
20
41
|
export interface EventFilters {
|
|
21
42
|
eventName?: string;
|
|
43
|
+
/** General text search across event_name */
|
|
44
|
+
search?: string;
|
|
22
45
|
}
|
|
23
46
|
export interface EmailFilters {
|
|
47
|
+
/** General text search across from_addr, to_addr, and subject */
|
|
48
|
+
search?: string;
|
|
24
49
|
from?: string;
|
|
25
50
|
to?: string;
|
|
26
51
|
subject?: string;
|
|
@@ -43,6 +68,8 @@ export interface TraceFilters {
|
|
|
43
68
|
url?: string;
|
|
44
69
|
statusMin?: number;
|
|
45
70
|
statusMax?: number;
|
|
71
|
+
/** General text search across method and url */
|
|
72
|
+
search?: string;
|
|
46
73
|
}
|
|
47
74
|
export interface PaginatedResult<T> {
|
|
48
75
|
data: T[];
|
|
@@ -66,23 +93,38 @@ export declare class DashboardStore {
|
|
|
66
93
|
private retentionTimer;
|
|
67
94
|
private chartAggregator;
|
|
68
95
|
private handlers;
|
|
96
|
+
private dbFilePath;
|
|
97
|
+
private lastCleanupAt;
|
|
69
98
|
constructor(config: DevToolbarConfig);
|
|
70
99
|
/**
|
|
71
100
|
* Initialize the SQLite connection, run migrations and retention
|
|
72
101
|
* cleanup, start chart aggregation, and wire event listeners.
|
|
73
102
|
*/
|
|
74
|
-
start(_lucidDb:
|
|
103
|
+
start(_lucidDb: unknown, emitter: EventEmitter | null, appRoot: string): Promise<void>;
|
|
75
104
|
/** Shut down timers, event listeners, and database connection. */
|
|
76
105
|
stop(): Promise<void>;
|
|
77
106
|
/** Get the raw Knex database connection (for DashboardController). */
|
|
78
|
-
getDb():
|
|
107
|
+
getDb(): Knex | null;
|
|
79
108
|
/** Whether the store is initialized and ready. */
|
|
80
109
|
isReady(): boolean;
|
|
110
|
+
/** Get SQLite storage statistics for the diagnostics endpoint. */
|
|
111
|
+
getStorageStats(): Promise<{
|
|
112
|
+
ready: boolean;
|
|
113
|
+
dbPath: string;
|
|
114
|
+
fileSizeMb: number;
|
|
115
|
+
walSizeMb: number;
|
|
116
|
+
retentionDays: number;
|
|
117
|
+
tables: Array<{
|
|
118
|
+
name: string;
|
|
119
|
+
rowCount: number;
|
|
120
|
+
}>;
|
|
121
|
+
lastCleanupAt: number | null;
|
|
122
|
+
}>;
|
|
81
123
|
/**
|
|
82
124
|
* Record a completed request. Returns the inserted row ID, or null
|
|
83
125
|
* if the request was self-excluded or an error occurred.
|
|
84
126
|
*/
|
|
85
|
-
recordRequest(
|
|
127
|
+
recordRequest(input: RequestInput): Promise<number | null>;
|
|
86
128
|
/** Batch-insert queries for a request. Filters out server_stats connection queries. */
|
|
87
129
|
recordQueries(requestId: number, queries: QueryRecord[]): Promise<void>;
|
|
88
130
|
/** Batch-insert events for a request. */
|
|
@@ -97,20 +139,20 @@ export declare class DashboardStore {
|
|
|
97
139
|
* Convenience: persist a full request with associated queries and trace.
|
|
98
140
|
* Calls recordRequest, recordQueries, and recordTrace in sequence.
|
|
99
141
|
*/
|
|
100
|
-
persistRequest(
|
|
142
|
+
persistRequest(input: PersistRequestInput): Promise<number | null>;
|
|
101
143
|
/** Paginated request history with optional filters. */
|
|
102
|
-
getRequests(page?: number, perPage?: number, filters?: RequestFilters): Promise<PaginatedResult<
|
|
144
|
+
getRequests(page?: number, perPage?: number, filters?: RequestFilters): Promise<PaginatedResult<Record<string, unknown>>>;
|
|
103
145
|
/** Paginated query history with optional filters. */
|
|
104
|
-
getQueries(page?: number, perPage?: number, filters?: QueryFilters): Promise<PaginatedResult<
|
|
146
|
+
getQueries(page?: number, perPage?: number, filters?: QueryFilters): Promise<PaginatedResult<Record<string, unknown>>>;
|
|
105
147
|
/**
|
|
106
148
|
* Grouped query patterns: aggregated by sql_normalized
|
|
107
149
|
* with count, avg/min/max/total duration.
|
|
108
150
|
*/
|
|
109
|
-
getQueriesGrouped(limit?: number, sort?: string): Promise<
|
|
151
|
+
getQueriesGrouped(limit?: number, sort?: string, search?: string): Promise<Record<string, unknown>[]>;
|
|
110
152
|
/** Paginated event history with optional filters. */
|
|
111
|
-
getEvents(page?: number, perPage?: number, filters?: EventFilters): Promise<PaginatedResult<
|
|
153
|
+
getEvents(page?: number, perPage?: number, filters?: EventFilters): Promise<PaginatedResult<Record<string, unknown>>>;
|
|
112
154
|
/** Paginated email history with optional filters. */
|
|
113
|
-
getEmails(page?: number, perPage?: number, filters?: EmailFilters, excludeBody?: boolean): Promise<PaginatedResult<
|
|
155
|
+
getEmails(page?: number, perPage?: number, filters?: EmailFilters, excludeBody?: boolean): Promise<PaginatedResult<Record<string, unknown>>>;
|
|
114
156
|
/** Get email HTML body for preview (falls back to text_body). */
|
|
115
157
|
getEmailHtml(id: number): Promise<string | null>;
|
|
116
158
|
/**
|
|
@@ -119,25 +161,25 @@ export declare class DashboardStore {
|
|
|
119
161
|
* Structured filters query into the JSON `data` column using
|
|
120
162
|
* SQLite's `json_extract()`.
|
|
121
163
|
*/
|
|
122
|
-
getLogs(page?: number, perPage?: number, filters?: LogFilters): Promise<PaginatedResult<
|
|
164
|
+
getLogs(page?: number, perPage?: number, filters?: LogFilters): Promise<PaginatedResult<Record<string, unknown>>>;
|
|
123
165
|
/** Paginated trace history with optional filters. */
|
|
124
|
-
getTraces(page?: number, perPage?: number, filters?: TraceFilters): Promise<PaginatedResult<
|
|
166
|
+
getTraces(page?: number, perPage?: number, filters?: TraceFilters): Promise<PaginatedResult<Record<string, unknown>>>;
|
|
125
167
|
/** Single trace with full span data. */
|
|
126
|
-
getTraceDetail(id: number): Promise<
|
|
168
|
+
getTraceDetail(id: number): Promise<Record<string, unknown> | null>;
|
|
127
169
|
/** Single request with associated queries, events, and trace. */
|
|
128
|
-
getRequestDetail(id: number): Promise<
|
|
170
|
+
getRequestDetail(id: number): Promise<Record<string, unknown> | null>;
|
|
129
171
|
/**
|
|
130
172
|
* Aggregated overview metrics for the dashboard cards.
|
|
131
173
|
*
|
|
132
174
|
* @param range — '1h' | '6h' | '24h' | '7d'
|
|
133
175
|
*/
|
|
134
|
-
getOverviewMetrics(range?: string): Promise<
|
|
176
|
+
getOverviewMetrics(range?: string): Promise<Record<string, unknown> | null>;
|
|
135
177
|
/**
|
|
136
178
|
* Time-series chart data from server_stats_metrics.
|
|
137
179
|
*
|
|
138
180
|
* @param range — '1h' | '6h' | '24h' | '7d'
|
|
139
181
|
*/
|
|
140
|
-
getChartData(range?: string): Promise<
|
|
182
|
+
getChartData(range?: string): Promise<Record<string, unknown>[]>;
|
|
141
183
|
/**
|
|
142
184
|
* Widget data for the dashboard overview.
|
|
143
185
|
*
|
|
@@ -172,9 +214,9 @@ export declare class DashboardStore {
|
|
|
172
214
|
}[];
|
|
173
215
|
}>;
|
|
174
216
|
/** Get sparkline data points from pre-aggregated metrics. */
|
|
175
|
-
getSparklineData(range: string): Promise<
|
|
176
|
-
getSavedFilters(section?: string): Promise<
|
|
177
|
-
createSavedFilter(name: string, section: string, filterConfig: Record<string,
|
|
217
|
+
getSparklineData(range: string): Promise<Record<string, unknown>[]>;
|
|
218
|
+
getSavedFilters(section?: string): Promise<Record<string, unknown>[]>;
|
|
219
|
+
createSavedFilter(name: string, section: string, filterConfig: Record<string, unknown>): Promise<Record<string, unknown> | null>;
|
|
178
220
|
deleteSavedFilter(id: number): Promise<boolean>;
|
|
179
221
|
/**
|
|
180
222
|
* Run EXPLAIN on a stored query using the app's default database connection.
|
|
@@ -183,7 +225,7 @@ export declare class DashboardStore {
|
|
|
183
225
|
* @param queryId — ID from server_stats_queries
|
|
184
226
|
* @param appDb — The application's Lucid database manager
|
|
185
227
|
*/
|
|
186
|
-
runExplain(queryId: number, appDb:
|
|
228
|
+
runExplain(queryId: number, appDb: unknown): Promise<Record<string, unknown> | null>;
|
|
187
229
|
/** Generic paginated query with filter callback. */
|
|
188
230
|
private paginate;
|
|
189
231
|
/**
|
|
@@ -191,4 +233,5 @@ export declare class DashboardStore {
|
|
|
191
233
|
*/
|
|
192
234
|
private wireEventListeners;
|
|
193
235
|
}
|
|
236
|
+
export {};
|
|
194
237
|
//# sourceMappingURL=dashboard_store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard_store.d.ts","sourceRoot":"","sources":["../../../src/dashboard/dashboard_store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dashboard_store.d.ts","sourceRoot":"","sources":["../../../src/dashboard/dashboard_store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import { mkdir } from 'node:fs/promises';
|
|
1
|
+
import { mkdir, stat as fsStat } from 'node:fs/promises';
|
|
2
2
|
import { dirname } from 'node:path';
|
|
3
3
|
import { safeParseJson, safeParseJsonArray } from '../utils/json_helpers.js';
|
|
4
|
+
import { log } from '../utils/logger.js';
|
|
4
5
|
import { extractAddresses } from '../utils/mail_helpers.js';
|
|
5
6
|
import { round } from '../utils/math_helpers.js';
|
|
6
7
|
import { rangeToCutoff, rangeToMinutes, roundBucket } from '../utils/time_helpers.js';
|
|
7
8
|
import { ChartAggregator } from './chart_aggregator.js';
|
|
8
9
|
import { autoMigrate, runRetentionCleanup } from './migrator.js';
|
|
9
10
|
// ---------------------------------------------------------------------------
|
|
11
|
+
// Warn-once tracking for write-path and overview catch blocks
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
const warnedWritePaths = new Set();
|
|
14
|
+
let overviewWidgetWarned = false;
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
10
16
|
// DashboardStore
|
|
11
17
|
// ---------------------------------------------------------------------------
|
|
12
18
|
/**
|
|
@@ -24,6 +30,8 @@ export class DashboardStore {
|
|
|
24
30
|
retentionTimer = null;
|
|
25
31
|
chartAggregator = null;
|
|
26
32
|
handlers = [];
|
|
33
|
+
dbFilePath = '';
|
|
34
|
+
lastCleanupAt = null;
|
|
27
35
|
constructor(config) {
|
|
28
36
|
this.config = config;
|
|
29
37
|
this.dashboardPath = config.dashboardPath;
|
|
@@ -37,7 +45,8 @@ export class DashboardStore {
|
|
|
37
45
|
*/
|
|
38
46
|
async start(_lucidDb, emitter, appRoot) {
|
|
39
47
|
this.emitter = emitter;
|
|
40
|
-
|
|
48
|
+
this.dbFilePath = appRoot + '/' + this.config.dbPath;
|
|
49
|
+
const dbFilePath = this.dbFilePath;
|
|
41
50
|
await mkdir(dirname(dbFilePath), { recursive: true });
|
|
42
51
|
// Create a standalone Knex connection to SQLite — bypasses Lucid's
|
|
43
52
|
// connection manager entirely so we never pollute the app's pool.
|
|
@@ -52,13 +61,17 @@ export class DashboardStore {
|
|
|
52
61
|
await this.db.raw('PRAGMA foreign_keys=ON');
|
|
53
62
|
await autoMigrate(this.db);
|
|
54
63
|
await runRetentionCleanup(this.db, this.config.retentionDays);
|
|
64
|
+
this.lastCleanupAt = Date.now();
|
|
55
65
|
// Hourly retention cleanup
|
|
56
66
|
this.retentionTimer = setInterval(async () => {
|
|
57
67
|
try {
|
|
58
|
-
|
|
68
|
+
if (this.db) {
|
|
69
|
+
await runRetentionCleanup(this.db, this.config.retentionDays);
|
|
70
|
+
this.lastCleanupAt = Date.now();
|
|
71
|
+
}
|
|
59
72
|
}
|
|
60
|
-
catch {
|
|
61
|
-
|
|
73
|
+
catch (err) {
|
|
74
|
+
log.warn('dashboard: retention cleanup failed — ' + err?.message);
|
|
62
75
|
}
|
|
63
76
|
}, 60 * 60 * 1000);
|
|
64
77
|
// Start chart aggregation (every 60s)
|
|
@@ -86,8 +99,8 @@ export class DashboardStore {
|
|
|
86
99
|
try {
|
|
87
100
|
await this.db.destroy();
|
|
88
101
|
}
|
|
89
|
-
catch {
|
|
90
|
-
|
|
102
|
+
catch (err) {
|
|
103
|
+
log.warn('dashboard: error closing SQLite — ' + err?.message);
|
|
91
104
|
}
|
|
92
105
|
}
|
|
93
106
|
this.db = null;
|
|
@@ -100,6 +113,65 @@ export class DashboardStore {
|
|
|
100
113
|
isReady() {
|
|
101
114
|
return this.db !== null;
|
|
102
115
|
}
|
|
116
|
+
/** Get SQLite storage statistics for the diagnostics endpoint. */
|
|
117
|
+
async getStorageStats() {
|
|
118
|
+
if (!this.db) {
|
|
119
|
+
return {
|
|
120
|
+
ready: false,
|
|
121
|
+
dbPath: this.config.dbPath,
|
|
122
|
+
fileSizeMb: 0,
|
|
123
|
+
walSizeMb: 0,
|
|
124
|
+
retentionDays: this.config.retentionDays,
|
|
125
|
+
tables: [],
|
|
126
|
+
lastCleanupAt: null,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
let fileSizeMb = 0;
|
|
130
|
+
let walSizeMb = 0;
|
|
131
|
+
try {
|
|
132
|
+
const s = await fsStat(this.dbFilePath);
|
|
133
|
+
fileSizeMb = Math.round((s.size / (1024 * 1024)) * 100) / 100;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// File may not exist yet
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
const ws = await fsStat(this.dbFilePath + '-wal');
|
|
140
|
+
walSizeMb = Math.round((ws.size / (1024 * 1024)) * 100) / 100;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// WAL file may not exist
|
|
144
|
+
}
|
|
145
|
+
const tableNames = [
|
|
146
|
+
'server_stats_requests',
|
|
147
|
+
'server_stats_queries',
|
|
148
|
+
'server_stats_events',
|
|
149
|
+
'server_stats_emails',
|
|
150
|
+
'server_stats_logs',
|
|
151
|
+
'server_stats_traces',
|
|
152
|
+
'server_stats_metrics',
|
|
153
|
+
'server_stats_saved_filters',
|
|
154
|
+
];
|
|
155
|
+
const tables = [];
|
|
156
|
+
for (const name of tableNames) {
|
|
157
|
+
try {
|
|
158
|
+
const [row] = await this.db(name).count('* as count');
|
|
159
|
+
tables.push({ name, rowCount: Number(row.count) });
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
tables.push({ name, rowCount: 0 });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
ready: true,
|
|
167
|
+
dbPath: this.config.dbPath,
|
|
168
|
+
fileSizeMb,
|
|
169
|
+
walSizeMb,
|
|
170
|
+
retentionDays: this.config.retentionDays,
|
|
171
|
+
tables,
|
|
172
|
+
lastCleanupAt: this.lastCleanupAt,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
103
175
|
// =========================================================================
|
|
104
176
|
// Write methods — persist data from collectors
|
|
105
177
|
// =========================================================================
|
|
@@ -107,23 +179,28 @@ export class DashboardStore {
|
|
|
107
179
|
* Record a completed request. Returns the inserted row ID, or null
|
|
108
180
|
* if the request was self-excluded or an error occurred.
|
|
109
181
|
*/
|
|
110
|
-
async recordRequest(
|
|
182
|
+
async recordRequest(input) {
|
|
111
183
|
if (!this.db)
|
|
112
184
|
return null;
|
|
113
|
-
if (url.startsWith(this.dashboardPath))
|
|
185
|
+
if (input.url.startsWith(this.dashboardPath))
|
|
114
186
|
return null;
|
|
115
187
|
try {
|
|
116
188
|
const [id] = await this.db('server_stats_requests').insert({
|
|
117
|
-
method,
|
|
118
|
-
url,
|
|
119
|
-
status_code: statusCode,
|
|
120
|
-
duration: round(duration),
|
|
121
|
-
span_count: spanCount,
|
|
122
|
-
warning_count: warningCount,
|
|
189
|
+
method: input.method,
|
|
190
|
+
url: input.url,
|
|
191
|
+
status_code: input.statusCode,
|
|
192
|
+
duration: round(input.duration),
|
|
193
|
+
span_count: input.spanCount ?? 0,
|
|
194
|
+
warning_count: input.warningCount ?? 0,
|
|
123
195
|
});
|
|
124
196
|
return id;
|
|
125
197
|
}
|
|
126
|
-
catch {
|
|
198
|
+
catch (err) {
|
|
199
|
+
const method_ = 'recordRequest';
|
|
200
|
+
if (!warnedWritePaths.has(method_)) {
|
|
201
|
+
warnedWritePaths.add(method_);
|
|
202
|
+
log.warn(`dashboard: ${method_} failed — ${err?.message}`);
|
|
203
|
+
}
|
|
127
204
|
return null;
|
|
128
205
|
}
|
|
129
206
|
}
|
|
@@ -151,8 +228,12 @@ export class DashboardStore {
|
|
|
151
228
|
await this.db('server_stats_queries').insert(rows.slice(i, i + 50));
|
|
152
229
|
}
|
|
153
230
|
}
|
|
154
|
-
catch {
|
|
155
|
-
|
|
231
|
+
catch (err) {
|
|
232
|
+
const method = 'recordQueries';
|
|
233
|
+
if (!warnedWritePaths.has(method)) {
|
|
234
|
+
warnedWritePaths.add(method);
|
|
235
|
+
log.warn(`dashboard: ${method} failed — ${err?.message}`);
|
|
236
|
+
}
|
|
156
237
|
}
|
|
157
238
|
}
|
|
158
239
|
/** Batch-insert events for a request. */
|
|
@@ -169,8 +250,12 @@ export class DashboardStore {
|
|
|
169
250
|
await this.db('server_stats_events').insert(rows.slice(i, i + 50));
|
|
170
251
|
}
|
|
171
252
|
}
|
|
172
|
-
catch {
|
|
173
|
-
|
|
253
|
+
catch (err) {
|
|
254
|
+
const method = 'recordEvents';
|
|
255
|
+
if (!warnedWritePaths.has(method)) {
|
|
256
|
+
warnedWritePaths.add(method);
|
|
257
|
+
log.warn(`dashboard: ${method} failed — ${err?.message}`);
|
|
258
|
+
}
|
|
174
259
|
}
|
|
175
260
|
}
|
|
176
261
|
/** Record a single email. */
|
|
@@ -192,8 +277,12 @@ export class DashboardStore {
|
|
|
192
277
|
attachment_count: record.attachmentCount,
|
|
193
278
|
});
|
|
194
279
|
}
|
|
195
|
-
catch {
|
|
196
|
-
|
|
280
|
+
catch (err) {
|
|
281
|
+
const method = 'recordEmail';
|
|
282
|
+
if (!warnedWritePaths.has(method)) {
|
|
283
|
+
warnedWritePaths.add(method);
|
|
284
|
+
log.warn(`dashboard: ${method} failed — ${err?.message}`);
|
|
285
|
+
}
|
|
197
286
|
}
|
|
198
287
|
}
|
|
199
288
|
/** Record a single log entry (from LogStreamService). */
|
|
@@ -205,12 +294,18 @@ export class DashboardStore {
|
|
|
205
294
|
await this.db('server_stats_logs').insert({
|
|
206
295
|
level: levelName,
|
|
207
296
|
message: String(entry.msg || entry.message || ''),
|
|
208
|
-
request_id: entry.
|
|
297
|
+
request_id: entry.request_id || entry.requestId || entry['x-request-id']
|
|
298
|
+
? String(entry.request_id || entry.requestId || entry['x-request-id'])
|
|
299
|
+
: null,
|
|
209
300
|
data: JSON.stringify(entry),
|
|
210
301
|
});
|
|
211
302
|
}
|
|
212
|
-
catch {
|
|
213
|
-
|
|
303
|
+
catch (err) {
|
|
304
|
+
const method = 'recordLog';
|
|
305
|
+
if (!warnedWritePaths.has(method)) {
|
|
306
|
+
warnedWritePaths.add(method);
|
|
307
|
+
log.warn(`dashboard: ${method} failed — ${err?.message}`);
|
|
308
|
+
}
|
|
214
309
|
}
|
|
215
310
|
}
|
|
216
311
|
/** Record a trace for a request. */
|
|
@@ -229,21 +324,32 @@ export class DashboardStore {
|
|
|
229
324
|
warnings: trace.warnings.length > 0 ? JSON.stringify(trace.warnings) : null,
|
|
230
325
|
});
|
|
231
326
|
}
|
|
232
|
-
catch {
|
|
233
|
-
|
|
327
|
+
catch (err) {
|
|
328
|
+
const method = 'recordTrace';
|
|
329
|
+
if (!warnedWritePaths.has(method)) {
|
|
330
|
+
warnedWritePaths.add(method);
|
|
331
|
+
log.warn(`dashboard: ${method} failed — ${err?.message}`);
|
|
332
|
+
}
|
|
234
333
|
}
|
|
235
334
|
}
|
|
236
335
|
/**
|
|
237
336
|
* Convenience: persist a full request with associated queries and trace.
|
|
238
337
|
* Calls recordRequest, recordQueries, and recordTrace in sequence.
|
|
239
338
|
*/
|
|
240
|
-
async persistRequest(
|
|
241
|
-
const requestId = await this.recordRequest(
|
|
339
|
+
async persistRequest(input) {
|
|
340
|
+
const requestId = await this.recordRequest({
|
|
341
|
+
method: input.method,
|
|
342
|
+
url: input.url,
|
|
343
|
+
statusCode: input.statusCode,
|
|
344
|
+
duration: input.duration,
|
|
345
|
+
spanCount: input.trace?.spanCount ?? 0,
|
|
346
|
+
warningCount: input.trace?.warnings?.length ?? 0,
|
|
347
|
+
});
|
|
242
348
|
if (requestId === null)
|
|
243
349
|
return null;
|
|
244
|
-
await this.recordQueries(requestId, queries);
|
|
245
|
-
if (trace) {
|
|
246
|
-
await this.recordTrace(requestId, trace);
|
|
350
|
+
await this.recordQueries(requestId, input.queries);
|
|
351
|
+
if (input.trace) {
|
|
352
|
+
await this.recordTrace(requestId, input.trace);
|
|
247
353
|
}
|
|
248
354
|
return requestId;
|
|
249
355
|
}
|
|
@@ -267,6 +373,12 @@ export class DashboardStore {
|
|
|
267
373
|
query.where('duration', '>=', filters.durationMin);
|
|
268
374
|
if (filters?.durationMax)
|
|
269
375
|
query.where('duration', '<=', filters.durationMax);
|
|
376
|
+
if (filters?.search) {
|
|
377
|
+
const term = `%${filters.search}%`;
|
|
378
|
+
query.where((qb) => {
|
|
379
|
+
qb.where('url', 'like', term).orWhere('method', 'like', term);
|
|
380
|
+
});
|
|
381
|
+
}
|
|
270
382
|
});
|
|
271
383
|
}
|
|
272
384
|
/** Paginated query history with optional filters. */
|
|
@@ -284,13 +396,21 @@ export class DashboardStore {
|
|
|
284
396
|
query.where('duration', '<=', filters.durationMax);
|
|
285
397
|
if (filters?.requestId)
|
|
286
398
|
query.where('request_id', filters.requestId);
|
|
399
|
+
if (filters?.search) {
|
|
400
|
+
const term = `%${filters.search}%`;
|
|
401
|
+
query.where((qb) => {
|
|
402
|
+
qb.where('sql_text', 'like', term)
|
|
403
|
+
.orWhere('model', 'like', term)
|
|
404
|
+
.orWhere('connection', 'like', term);
|
|
405
|
+
});
|
|
406
|
+
}
|
|
287
407
|
});
|
|
288
408
|
}
|
|
289
409
|
/**
|
|
290
410
|
* Grouped query patterns: aggregated by sql_normalized
|
|
291
411
|
* with count, avg/min/max/total duration.
|
|
292
412
|
*/
|
|
293
|
-
async getQueriesGrouped(limit = 200, sort = 'total_duration') {
|
|
413
|
+
async getQueriesGrouped(limit = 200, sort = 'total_duration', search) {
|
|
294
414
|
if (!this.db)
|
|
295
415
|
return [];
|
|
296
416
|
const validSorts = {
|
|
@@ -299,22 +419,38 @@ export class DashboardStore {
|
|
|
299
419
|
total_duration: 'total_duration',
|
|
300
420
|
};
|
|
301
421
|
const orderCol = validSorts[sort] || 'total_duration';
|
|
302
|
-
|
|
422
|
+
const query = this.db('server_stats_queries')
|
|
303
423
|
.select('sql_normalized', this.db.raw('COUNT(*) as count'), this.db.raw('ROUND(AVG(duration), 2) as avg_duration'), this.db.raw('ROUND(MIN(duration), 2) as min_duration'), this.db.raw('ROUND(MAX(duration), 2) as max_duration'), this.db.raw('ROUND(SUM(duration), 2) as total_duration'))
|
|
304
424
|
.groupBy('sql_normalized')
|
|
305
425
|
.orderBy(orderCol, 'desc')
|
|
306
426
|
.limit(limit);
|
|
427
|
+
if (search) {
|
|
428
|
+
query.where('sql_normalized', 'like', `%${search}%`);
|
|
429
|
+
}
|
|
430
|
+
return query;
|
|
307
431
|
}
|
|
308
432
|
/** Paginated event history with optional filters. */
|
|
309
433
|
async getEvents(page = 1, perPage = 50, filters) {
|
|
310
434
|
return this.paginate('server_stats_events', page, perPage, (query) => {
|
|
311
435
|
if (filters?.eventName)
|
|
312
436
|
query.where('event_name', 'like', `%${filters.eventName}%`);
|
|
437
|
+
if (filters?.search) {
|
|
438
|
+
query.where('event_name', 'like', `%${filters.search}%`);
|
|
439
|
+
}
|
|
313
440
|
});
|
|
314
441
|
}
|
|
315
442
|
/** Paginated email history with optional filters. */
|
|
316
443
|
async getEmails(page = 1, perPage = 50, filters, excludeBody = false) {
|
|
317
444
|
return this.paginate('server_stats_emails', page, perPage, (query) => {
|
|
445
|
+
if (filters?.search) {
|
|
446
|
+
const term = `%${filters.search}%`;
|
|
447
|
+
query.where((sub) => {
|
|
448
|
+
sub
|
|
449
|
+
.where('from_addr', 'like', term)
|
|
450
|
+
.orWhere('to_addr', 'like', term)
|
|
451
|
+
.orWhere('subject', 'like', term);
|
|
452
|
+
});
|
|
453
|
+
}
|
|
318
454
|
if (filters?.from)
|
|
319
455
|
query.where('from_addr', 'like', `%${filters.from}%`);
|
|
320
456
|
if (filters?.to)
|
|
@@ -386,6 +522,12 @@ export class DashboardStore {
|
|
|
386
522
|
query.where('status_code', '>=', filters.statusMin);
|
|
387
523
|
if (filters?.statusMax)
|
|
388
524
|
query.where('status_code', '<=', filters.statusMax);
|
|
525
|
+
if (filters?.search) {
|
|
526
|
+
const term = `%${filters.search}%`;
|
|
527
|
+
query.where((qb) => {
|
|
528
|
+
qb.where('url', 'like', term).orWhere('method', 'like', term);
|
|
529
|
+
});
|
|
530
|
+
}
|
|
389
531
|
});
|
|
390
532
|
}
|
|
391
533
|
/** Single trace with full span data. */
|
|
@@ -613,12 +755,13 @@ export class DashboardStore {
|
|
|
613
755
|
const emailActivity = { sent: 0, queued: 0, failed: 0 };
|
|
614
756
|
for (const row of emailStatusRaw || []) {
|
|
615
757
|
const status = row.status;
|
|
758
|
+
const count = row.count;
|
|
616
759
|
if (status === 'sent')
|
|
617
|
-
emailActivity.sent =
|
|
760
|
+
emailActivity.sent = count;
|
|
618
761
|
else if (status === 'queued')
|
|
619
|
-
emailActivity.queued =
|
|
762
|
+
emailActivity.queued = count;
|
|
620
763
|
else if (status === 'failed')
|
|
621
|
-
emailActivity.failed =
|
|
764
|
+
emailActivity.failed = count;
|
|
622
765
|
}
|
|
623
766
|
// Map log level breakdown
|
|
624
767
|
const logLevelBreakdown = { error: 0, warn: 0, info: 0, debug: 0 };
|
|
@@ -643,7 +786,11 @@ export class DashboardStore {
|
|
|
643
786
|
}));
|
|
644
787
|
return { topEvents, emailActivity, logLevelBreakdown, statusDistribution, slowestQueries };
|
|
645
788
|
}
|
|
646
|
-
catch {
|
|
789
|
+
catch (err) {
|
|
790
|
+
if (!overviewWidgetWarned) {
|
|
791
|
+
overviewWidgetWarned = true;
|
|
792
|
+
log.warn('dashboard: getOverviewWidgets query failed — ' + err?.message);
|
|
793
|
+
}
|
|
647
794
|
return empty;
|
|
648
795
|
}
|
|
649
796
|
}
|
|
@@ -724,7 +871,8 @@ export class DashboardStore {
|
|
|
724
871
|
const countQuery = this.db(table);
|
|
725
872
|
if (applyFilters)
|
|
726
873
|
applyFilters(countQuery);
|
|
727
|
-
const [{ count:
|
|
874
|
+
const [{ count: totalRaw }] = await countQuery.count('* as count');
|
|
875
|
+
const total = Number(totalRaw);
|
|
728
876
|
// Fetch page
|
|
729
877
|
const offset = (page - 1) * perPage;
|
|
730
878
|
const dataQuery = this.db(table).orderBy('created_at', 'desc').limit(perPage).offset(offset);
|
|
@@ -746,7 +894,8 @@ export class DashboardStore {
|
|
|
746
894
|
if (!this.emitter || typeof this.emitter.on !== 'function')
|
|
747
895
|
return;
|
|
748
896
|
const buildAndPersistEmail = (data, status) => {
|
|
749
|
-
const
|
|
897
|
+
const d = data;
|
|
898
|
+
const msg = (d?.message || d);
|
|
750
899
|
const record = {
|
|
751
900
|
id: 0,
|
|
752
901
|
from: extractAddresses(msg?.from) || 'unknown',
|
|
@@ -756,10 +905,14 @@ export class DashboardStore {
|
|
|
756
905
|
subject: msg?.subject || '(no subject)',
|
|
757
906
|
html: msg?.html || null,
|
|
758
907
|
text: msg?.text || null,
|
|
759
|
-
mailer:
|
|
908
|
+
mailer: d?.mailerName || d?.mailer || 'unknown',
|
|
760
909
|
status,
|
|
761
|
-
messageId:
|
|
762
|
-
|
|
910
|
+
messageId: d?.response?.messageId ||
|
|
911
|
+
d?.messageId ||
|
|
912
|
+
null,
|
|
913
|
+
attachmentCount: Array.isArray(msg?.attachments)
|
|
914
|
+
? msg.attachments.length
|
|
915
|
+
: 0,
|
|
763
916
|
timestamp: Date.now(),
|
|
764
917
|
};
|
|
765
918
|
this.recordEmail(record);
|