@oneuptime/common 12.0.1 → 12.0.3

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.
Files changed (385) hide show
  1. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +14 -0
  2. package/Models/DatabaseModels/Host.ts +12 -4
  3. package/Models/DatabaseModels/Index.ts +2 -0
  4. package/Models/DatabaseModels/KubernetesContainer.ts +5 -4
  5. package/Models/DatabaseModels/KubernetesResource.ts +8 -7
  6. package/Models/DatabaseModels/LogDropFilter.ts +9 -20
  7. package/Models/DatabaseModels/PodmanResource.ts +6 -6
  8. package/Models/DatabaseModels/ServiceLevelObjective.ts +91 -0
  9. package/Models/DatabaseModels/StatusPage.ts +95 -0
  10. package/Models/DatabaseModels/StatusPageMonitorRule.ts +911 -0
  11. package/Models/DatabaseModels/StatusPageResource.ts +73 -0
  12. package/Models/DatabaseModels/TraceDropFilter.ts +9 -20
  13. package/Server/API/BaseAPI.ts +13 -2
  14. package/Server/API/DashboardAPI.ts +39 -0
  15. package/Server/API/TeamMemberAPI.ts +85 -0
  16. package/Server/EnvironmentConfig.ts +31 -1
  17. package/Server/Infrastructure/GlobalCache.ts +115 -0
  18. package/Server/Infrastructure/Postgres/DataSourceOptions.ts +16 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1785900000000-AddSloMonitorLabelRule.ts +84 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1785915638551-IncreaseHostIpAddressesLength.ts +40 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1785930000000-WidenInventoryResourceNameColumns.ts +131 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1785930709405-AddStatusPageReportPeriod.ts +25 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.ts +123 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  25. package/Server/Middleware/ProjectAuthorization.ts +66 -4
  26. package/Server/Services/AlertStateTimelineService.ts +20 -0
  27. package/Server/Services/BillingService.ts +600 -51
  28. package/Server/Services/CephClusterService.ts +27 -45
  29. package/Server/Services/CephResourceService.ts +43 -4
  30. package/Server/Services/CloudResourceService.ts +24 -42
  31. package/Server/Services/DatabaseService.ts +198 -6
  32. package/Server/Services/DockerHostService.ts +20 -38
  33. package/Server/Services/DockerResourceService.ts +62 -8
  34. package/Server/Services/DockerSwarmClusterService.ts +28 -46
  35. package/Server/Services/DockerSwarmResourceService.ts +53 -4
  36. package/Server/Services/HostService.ts +47 -57
  37. package/Server/Services/IncidentStateTimelineService.ts +20 -0
  38. package/Server/Services/Index.ts +2 -0
  39. package/Server/Services/IoTDeviceService.ts +1 -17
  40. package/Server/Services/IoTFleetService.ts +20 -38
  41. package/Server/Services/KubernetesClusterService.ts +18 -36
  42. package/Server/Services/KubernetesContainerService.ts +50 -9
  43. package/Server/Services/KubernetesResourceService.ts +53 -7
  44. package/Server/Services/LabelService.ts +153 -1
  45. package/Server/Services/MetricTypeService.ts +84 -0
  46. package/Server/Services/MonitorService.ts +146 -14
  47. package/Server/Services/MonitorStatusTimelineService.ts +29 -0
  48. package/Server/Services/MonitorTemplateService.ts +65 -0
  49. package/Server/Services/PodmanHostService.ts +20 -38
  50. package/Server/Services/PodmanResourceService.ts +62 -8
  51. package/Server/Services/ProjectService.ts +165 -35
  52. package/Server/Services/ProxmoxClusterService.ts +24 -42
  53. package/Server/Services/ProxmoxResourceService.ts +43 -4
  54. package/Server/Services/RumApplicationService.ts +20 -38
  55. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +21 -0
  56. package/Server/Services/ServerlessFunctionService.ts +25 -43
  57. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +426 -0
  58. package/Server/Services/ServiceLevelObjectiveService.ts +39 -0
  59. package/Server/Services/ServiceService.ts +299 -73
  60. package/Server/Services/StatusPageMonitorRuleEngineService.ts +752 -0
  61. package/Server/Services/StatusPageMonitorRuleService.ts +471 -0
  62. package/Server/Services/StatusPageService.ts +95 -36
  63. package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +18 -1
  64. package/Server/Services/StatusPageSubscriberService.ts +3 -0
  65. package/Server/Services/TelemetryEntityRelationshipService.ts +1 -0
  66. package/Server/Services/TelemetryEntityService.ts +1 -0
  67. package/Server/Types/Database/JSONColumnQuery.ts +621 -0
  68. package/Server/Types/Database/Permissions/PublicPermission.ts +9 -2
  69. package/Server/Types/Database/QueryHelper.ts +17 -32
  70. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +170 -39
  71. package/Server/Utils/Database/TruncateColumnValue.ts +84 -0
  72. package/Server/Utils/Monitor/MonitorResource.ts +63 -36
  73. package/Server/Utils/Monitor/MonitorStatusTimeline.ts +36 -0
  74. package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +148 -127
  75. package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +434 -0
  76. package/Server/Utils/SingleFlight.ts +83 -0
  77. package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +46 -0
  78. package/Server/Utils/Telemetry/EntityRegistry.ts +107 -26
  79. package/Server/Utils/Telemetry/ResourceHeartbeat.ts +314 -0
  80. package/Server/Utils/Telemetry/Telemetry.ts +351 -122
  81. package/Tests/App/Dashboard/UsersTableGroupsByPerson.test.tsx +448 -0
  82. package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
  83. package/Tests/Models/DatabaseModels/ColumnTransformerInvariants.test.ts +306 -0
  84. package/Tests/Models/DatabaseModels/NumberColumnDeserialization.test.ts +333 -0
  85. package/Tests/Models/DatabaseModels/StatusPageMonitorRuleModel.test.ts +190 -0
  86. package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +704 -0
  87. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +26 -0
  88. package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +303 -0
  89. package/Tests/Server/Infrastructure/GlobalCache.test.ts +226 -0
  90. package/Tests/Server/Infrastructure/PostgresLockTimeoutOptions.test.ts +181 -0
  91. package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +350 -0
  92. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyHeader.test.ts +362 -0
  93. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +687 -0
  94. package/Tests/Server/Services/BillingService.test.ts +78 -3
  95. package/Tests/Server/Services/BillingServiceChangePlanCancel.test.ts +645 -0
  96. package/Tests/Server/Services/BillingServiceTrialPlanChange.test.ts +1005 -0
  97. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlocked.test.ts +342 -0
  98. package/Tests/Server/Services/DropFilterSaveValidation.test.ts +245 -0
  99. package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +503 -0
  100. package/Tests/Server/Services/HostIpAddressesColumnWidth.test.ts +198 -0
  101. package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +658 -0
  102. package/Tests/Server/Services/InventoryResourceNameColumnWidth.test.ts +500 -0
  103. package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +586 -0
  104. package/Tests/Server/Services/InventoryUpsertTruncationGuard.test.ts +1242 -0
  105. package/Tests/Server/Services/MetricTypeAttachServices.test.ts +222 -0
  106. package/Tests/Server/Services/MissingReferenceWriteGuard.test.ts +614 -0
  107. package/Tests/Server/Services/MonitorStatusTimelineFastPath.test.ts +23 -0
  108. package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +650 -0
  109. package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +1 -0
  110. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +636 -0
  111. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +770 -0
  112. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +130 -0
  113. package/Tests/Server/Services/ServiceUpdateLastSeenSplitGates.test.ts +705 -0
  114. package/Tests/Server/Services/SloMonitorLabelRuleHooks.test.ts +352 -0
  115. package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +1719 -0
  116. package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +1212 -0
  117. package/Tests/Server/Services/StatusPageMonitorRuleMonitorCreateHook.test.ts +228 -0
  118. package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +29 -13
  119. package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +69 -8
  120. package/Tests/Server/Types/Database/JSONColumnQuery.test.ts +593 -0
  121. package/Tests/Server/Types/Database/Permissions/PublicPermission.test.ts +495 -0
  122. package/Tests/Server/Types/Database/QueryUtil.test.ts +113 -0
  123. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +267 -0
  124. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +260 -13
  125. package/Tests/Server/Utils/Database/TruncateColumnValue.test.ts +179 -0
  126. package/Tests/Server/Utils/EntityRegistryRowFence.test.ts +302 -0
  127. package/Tests/Server/Utils/MetricTypeIndexConvergence.test.ts +598 -0
  128. package/Tests/Server/Utils/Monitor/MonitorStatusTimelineUnusableStatus.test.ts +154 -0
  129. package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +638 -92
  130. package/Tests/Server/Utils/Monitor/MonitorStepsReferenceExtractor.test.ts +724 -0
  131. package/Tests/Server/Utils/SingleFlight.test.ts +221 -0
  132. package/Tests/Types/Dashboard/NetworkDashboardTemplate.test.ts +793 -0
  133. package/Tests/Types/Database/BigIntColumnTransformer.test.ts +147 -0
  134. package/Tests/Types/Database/DatabasePropertyTransformer.test.ts +140 -0
  135. package/Tests/Types/Database/NumericColumnValue.test.ts +127 -0
  136. package/Tests/Types/Decimal.test.ts +37 -0
  137. package/Tests/Types/Events/Recurring.test.ts +157 -0
  138. package/Tests/Types/Monitor/SnmpVersionParsing.test.ts +152 -0
  139. package/Tests/Types/Port.test.ts +38 -0
  140. package/Tests/UI/Components/LogsHistogram.test.tsx +276 -0
  141. package/Tests/UI/Components/ModelTable/ModelTableGroupsProjectUsers.test.tsx +375 -0
  142. package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +196 -0
  143. package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +489 -0
  144. package/Tests/UI/Components/UseLogsHistogram.test.tsx +500 -0
  145. package/Tests/UI/Utils/ProjectUsersModelAPI.test.ts +739 -0
  146. package/Tests/UI/Utils/TeamMembersByUser.test.ts +633 -0
  147. package/Tests/Utils/Dashboard/Components/DashboardComponentsUtil.test.ts +120 -0
  148. package/Tests/Utils/Dashboard/DashboardNetworkMapComponent.test.ts +327 -0
  149. package/Tests/Utils/StatusPage/ReportPeriod.test.ts +218 -0
  150. package/Tests/Utils/Telemetry/HostIpAddresses.test.ts +291 -0
  151. package/Types/CustomField/CustomFieldDefinition.ts +24 -0
  152. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  153. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  154. package/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.ts +40 -0
  155. package/Types/Dashboard/DashboardTemplates.ts +397 -0
  156. package/Types/Database/BigIntColumnTransformer.ts +74 -0
  157. package/Types/Database/DatabaseProperty.ts +26 -0
  158. package/Types/Database/NumericColumnValue.ts +128 -0
  159. package/Types/Date.ts +112 -0
  160. package/Types/Decimal.ts +16 -4
  161. package/Types/Events/Recurring.ts +99 -1
  162. package/Types/Permission.ts +48 -0
  163. package/Types/Port.ts +16 -4
  164. package/Types/StatusPage/StatusPageReport.ts +11 -0
  165. package/Types/StatusPage/StatusPageReportPeriodType.ts +21 -0
  166. package/UI/Components/LogsViewer/useLiveLogsRefresh.ts +86 -0
  167. package/UI/Components/LogsViewer/useLogsHistogram.ts +113 -0
  168. package/UI/Components/ModelTable/CustomFieldColumns.tsx +2 -6
  169. package/UI/Components/ModelTable/useCustomFieldColumns.ts +21 -2
  170. package/UI/Utils/ModelAPI/ProjectUsersModelAPI.ts +305 -0
  171. package/UI/Utils/TeamMembersByUser.ts +302 -0
  172. package/Utils/Dashboard/Components/DashboardNetworkMapComponent.ts +136 -0
  173. package/Utils/Dashboard/Components/Index.ts +7 -0
  174. package/Utils/StatusPage/ReportPeriod.ts +236 -0
  175. package/Utils/Telemetry/HostIpAddresses.ts +98 -0
  176. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +12 -0
  177. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  178. package/build/dist/Models/DatabaseModels/Host.js +12 -4
  179. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  180. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  181. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  182. package/build/dist/Models/DatabaseModels/KubernetesContainer.js +4 -4
  183. package/build/dist/Models/DatabaseModels/KubernetesContainer.js.map +1 -1
  184. package/build/dist/Models/DatabaseModels/KubernetesResource.js +7 -7
  185. package/build/dist/Models/DatabaseModels/KubernetesResource.js.map +1 -1
  186. package/build/dist/Models/DatabaseModels/LogDropFilter.js +9 -20
  187. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
  188. package/build/dist/Models/DatabaseModels/PodmanResource.js +6 -6
  189. package/build/dist/Models/DatabaseModels/PodmanResource.js.map +1 -1
  190. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +87 -0
  191. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/StatusPage.js +98 -0
  193. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  194. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +925 -0
  195. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -0
  196. package/build/dist/Models/DatabaseModels/StatusPageResource.js +72 -0
  197. package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
  198. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +9 -20
  199. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
  200. package/build/dist/Server/API/BaseAPI.js +11 -1
  201. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  202. package/build/dist/Server/API/DashboardAPI.js +39 -0
  203. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  204. package/build/dist/Server/API/TeamMemberAPI.js +57 -2
  205. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  206. package/build/dist/Server/EnvironmentConfig.js +27 -1
  207. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  208. package/build/dist/Server/Infrastructure/GlobalCache.js +91 -0
  209. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  210. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +5 -3
  211. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
  212. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785900000000-AddSloMonitorLabelRule.js +45 -0
  213. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785900000000-AddSloMonitorLabelRule.js.map +1 -0
  214. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785915638551-IncreaseHostIpAddressesLength.js +31 -0
  215. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785915638551-IncreaseHostIpAddressesLength.js.map +1 -0
  216. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785930000000-WidenInventoryResourceNameColumns.js +90 -0
  217. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785930000000-WidenInventoryResourceNameColumns.js.map +1 -0
  218. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785930709405-AddStatusPageReportPeriod.js +14 -0
  219. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785930709405-AddStatusPageReportPeriod.js.map +1 -0
  220. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js +48 -0
  221. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js.map +1 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  224. package/build/dist/Server/Middleware/ProjectAuthorization.js +59 -4
  225. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  226. package/build/dist/Server/Services/AlertStateTimelineService.js +19 -0
  227. package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
  228. package/build/dist/Server/Services/BillingService.js +466 -36
  229. package/build/dist/Server/Services/BillingService.js.map +1 -1
  230. package/build/dist/Server/Services/CephClusterService.js +26 -39
  231. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  232. package/build/dist/Server/Services/CephResourceService.js +28 -3
  233. package/build/dist/Server/Services/CephResourceService.js.map +1 -1
  234. package/build/dist/Server/Services/CloudResourceService.js +23 -36
  235. package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
  236. package/build/dist/Server/Services/DatabaseService.js +155 -2
  237. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  238. package/build/dist/Server/Services/DockerHostService.js +19 -32
  239. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  240. package/build/dist/Server/Services/DockerResourceService.js +34 -4
  241. package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
  242. package/build/dist/Server/Services/DockerSwarmClusterService.js +27 -40
  243. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  244. package/build/dist/Server/Services/DockerSwarmResourceService.js +28 -3
  245. package/build/dist/Server/Services/DockerSwarmResourceService.js.map +1 -1
  246. package/build/dist/Server/Services/HostService.js +58 -64
  247. package/build/dist/Server/Services/HostService.js.map +1 -1
  248. package/build/dist/Server/Services/IncidentStateTimelineService.js +19 -0
  249. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  250. package/build/dist/Server/Services/Index.js +2 -0
  251. package/build/dist/Server/Services/Index.js.map +1 -1
  252. package/build/dist/Server/Services/IoTDeviceService.js +1 -8
  253. package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
  254. package/build/dist/Server/Services/IoTFleetService.js +19 -32
  255. package/build/dist/Server/Services/IoTFleetService.js.map +1 -1
  256. package/build/dist/Server/Services/KubernetesClusterService.js +17 -30
  257. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  258. package/build/dist/Server/Services/KubernetesContainerService.js +29 -3
  259. package/build/dist/Server/Services/KubernetesContainerService.js.map +1 -1
  260. package/build/dist/Server/Services/KubernetesResourceService.js +32 -4
  261. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  262. package/build/dist/Server/Services/LabelService.js +127 -0
  263. package/build/dist/Server/Services/LabelService.js.map +1 -1
  264. package/build/dist/Server/Services/MetricTypeService.js +74 -0
  265. package/build/dist/Server/Services/MetricTypeService.js.map +1 -1
  266. package/build/dist/Server/Services/MonitorService.js +128 -9
  267. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  268. package/build/dist/Server/Services/MonitorStatusTimelineService.js +28 -0
  269. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  270. package/build/dist/Server/Services/MonitorTemplateService.js +60 -0
  271. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  272. package/build/dist/Server/Services/PodmanHostService.js +19 -32
  273. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  274. package/build/dist/Server/Services/PodmanResourceService.js +34 -4
  275. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
  276. package/build/dist/Server/Services/ProjectService.js +135 -21
  277. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  278. package/build/dist/Server/Services/ProxmoxClusterService.js +23 -36
  279. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  280. package/build/dist/Server/Services/ProxmoxResourceService.js +28 -3
  281. package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -1
  282. package/build/dist/Server/Services/RumApplicationService.js +19 -32
  283. package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
  284. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +20 -0
  285. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  286. package/build/dist/Server/Services/ServerlessFunctionService.js +24 -37
  287. package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
  288. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +347 -0
  289. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -0
  290. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +33 -1
  291. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  292. package/build/dist/Server/Services/ServiceService.js +236 -61
  293. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  294. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +603 -0
  295. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -0
  296. package/build/dist/Server/Services/StatusPageMonitorRuleService.js +401 -0
  297. package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -0
  298. package/build/dist/Server/Services/StatusPageService.js +69 -46
  299. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  300. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +17 -1
  301. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
  302. package/build/dist/Server/Services/StatusPageSubscriberService.js +3 -0
  303. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  304. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +1 -0
  305. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
  306. package/build/dist/Server/Services/TelemetryEntityService.js +1 -0
  307. package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
  308. package/build/dist/Server/Types/Database/JSONColumnQuery.js +402 -0
  309. package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -0
  310. package/build/dist/Server/Types/Database/Permissions/PublicPermission.js +9 -2
  311. package/build/dist/Server/Types/Database/Permissions/PublicPermission.js.map +1 -1
  312. package/build/dist/Server/Types/Database/QueryHelper.js +17 -27
  313. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  314. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +105 -29
  315. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  316. package/build/dist/Server/Utils/Database/TruncateColumnValue.js +32 -0
  317. package/build/dist/Server/Utils/Database/TruncateColumnValue.js.map +1 -0
  318. package/build/dist/Server/Utils/Monitor/MonitorResource.js +56 -32
  319. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  320. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +30 -3
  321. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
  322. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +110 -98
  323. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
  324. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +312 -0
  325. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -0
  326. package/build/dist/Server/Utils/SingleFlight.js +76 -0
  327. package/build/dist/Server/Utils/SingleFlight.js.map +1 -0
  328. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +29 -0
  329. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -0
  330. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +78 -19
  331. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  332. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +160 -0
  333. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -0
  334. package/build/dist/Server/Utils/Telemetry/Telemetry.js +279 -104
  335. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  336. package/build/dist/Types/CustomField/CustomFieldDefinition.js +2 -0
  337. package/build/dist/Types/CustomField/CustomFieldDefinition.js.map +1 -0
  338. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  339. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  340. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  341. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  342. package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js +2 -0
  343. package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js.map +1 -0
  344. package/build/dist/Types/Dashboard/DashboardTemplates.js +368 -0
  345. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  346. package/build/dist/Types/Database/BigIntColumnTransformer.js +66 -0
  347. package/build/dist/Types/Database/BigIntColumnTransformer.js.map +1 -0
  348. package/build/dist/Types/Database/DatabaseProperty.js +25 -0
  349. package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
  350. package/build/dist/Types/Database/NumericColumnValue.js +97 -0
  351. package/build/dist/Types/Database/NumericColumnValue.js.map +1 -0
  352. package/build/dist/Types/Date.js +68 -0
  353. package/build/dist/Types/Date.js.map +1 -1
  354. package/build/dist/Types/Decimal.js +14 -3
  355. package/build/dist/Types/Decimal.js.map +1 -1
  356. package/build/dist/Types/Events/Recurring.js +63 -0
  357. package/build/dist/Types/Events/Recurring.js.map +1 -1
  358. package/build/dist/Types/Permission.js +42 -0
  359. package/build/dist/Types/Permission.js.map +1 -1
  360. package/build/dist/Types/Port.js +15 -5
  361. package/build/dist/Types/Port.js.map +1 -1
  362. package/build/dist/Types/StatusPage/StatusPageReportPeriodType.js +22 -0
  363. package/build/dist/Types/StatusPage/StatusPageReportPeriodType.js.map +1 -0
  364. package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js +44 -0
  365. package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js.map +1 -0
  366. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +75 -0
  367. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -0
  368. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
  369. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +18 -2
  370. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
  371. package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js +213 -0
  372. package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js.map +1 -0
  373. package/build/dist/UI/Utils/TeamMembersByUser.js +195 -0
  374. package/build/dist/UI/Utils/TeamMembersByUser.js.map +1 -0
  375. package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js +114 -0
  376. package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js.map +1 -0
  377. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  378. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  379. package/build/dist/Utils/StatusPage/ReportPeriod.js +131 -0
  380. package/build/dist/Utils/StatusPage/ReportPeriod.js.map +1 -0
  381. package/build/dist/Utils/Telemetry/HostIpAddresses.js +82 -0
  382. package/build/dist/Utils/Telemetry/HostIpAddresses.js.map +1 -0
  383. package/jest.config.json +2 -0
  384. package/package.json +1 -1
  385. package/tsconfig.json +12 -1
@@ -0,0 +1,489 @@
1
+ import useLiveLogsRefresh from "../../../UI/Components/LogsViewer/useLiveLogsRefresh";
2
+ import "@testing-library/jest-dom/extend-expect";
3
+ import { act, render } from "@testing-library/react";
4
+ import React, { FunctionComponent, ReactElement } from "react";
5
+ import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
6
+
7
+ const POLL_INTERVAL_MS: number = 10000;
8
+
9
+ interface ProbeProps {
10
+ isLive: boolean;
11
+ isEligible?: boolean | undefined;
12
+ intervalInMs?: number | undefined;
13
+ refreshLogs: () => void;
14
+ refreshHistogram: () => void;
15
+ }
16
+
17
+ /*
18
+ * Exercises the hook through a real component lifecycle (mount, re-render,
19
+ * unmount) rather than poking at it in isolation — the bug this guards
20
+ * against lives in the effect wiring, not in a return value.
21
+ */
22
+ const LiveProbe: FunctionComponent<ProbeProps> = (
23
+ props: ProbeProps,
24
+ ): ReactElement => {
25
+ useLiveLogsRefresh({
26
+ isLive: props.isLive,
27
+ isEligible: props.isEligible ?? true,
28
+ intervalInMs: props.intervalInMs ?? POLL_INTERVAL_MS,
29
+ refreshLogs: props.refreshLogs,
30
+ refreshHistogram: props.refreshHistogram,
31
+ });
32
+
33
+ return <div data-testid="live-probe" />;
34
+ };
35
+
36
+ function advance(milliseconds: number): void {
37
+ act(() => {
38
+ jest.advanceTimersByTime(milliseconds);
39
+ });
40
+ }
41
+
42
+ describe("useLiveLogsRefresh", () => {
43
+ let refreshLogs: jest.Mock;
44
+ let refreshHistogram: jest.Mock;
45
+
46
+ beforeEach(() => {
47
+ jest.useFakeTimers();
48
+ refreshLogs = jest.fn();
49
+ refreshHistogram = jest.fn();
50
+ });
51
+
52
+ afterEach(() => {
53
+ jest.useRealTimers();
54
+ });
55
+
56
+ describe("while live mode is off", () => {
57
+ test("refreshes nothing", () => {
58
+ render(
59
+ <LiveProbe
60
+ isLive={false}
61
+ refreshLogs={refreshLogs}
62
+ refreshHistogram={refreshHistogram}
63
+ />,
64
+ );
65
+
66
+ advance(POLL_INTERVAL_MS * 5);
67
+
68
+ expect(refreshLogs).not.toHaveBeenCalled();
69
+ expect(refreshHistogram).not.toHaveBeenCalled();
70
+ });
71
+
72
+ test("leaves no timer running", () => {
73
+ render(
74
+ <LiveProbe
75
+ isLive={false}
76
+ refreshLogs={refreshLogs}
77
+ refreshHistogram={refreshHistogram}
78
+ />,
79
+ );
80
+
81
+ expect(jest.getTimerCount()).toBe(0);
82
+ });
83
+ });
84
+
85
+ describe("when live mode is switched on", () => {
86
+ test("refreshes the logs straight away rather than one tick later", () => {
87
+ render(
88
+ <LiveProbe
89
+ isLive={true}
90
+ refreshLogs={refreshLogs}
91
+ refreshHistogram={refreshHistogram}
92
+ />,
93
+ );
94
+
95
+ expect(refreshLogs).toHaveBeenCalledTimes(1);
96
+ });
97
+
98
+ /*
99
+ * The regression this hook exists for: live mode used to poll only the
100
+ * log list, so new rows kept arriving under a histogram that never moved.
101
+ */
102
+ test("refreshes the histogram straight away too", () => {
103
+ render(
104
+ <LiveProbe
105
+ isLive={true}
106
+ refreshLogs={refreshLogs}
107
+ refreshHistogram={refreshHistogram}
108
+ />,
109
+ );
110
+
111
+ expect(refreshHistogram).toHaveBeenCalledTimes(1);
112
+ });
113
+
114
+ test("runs exactly one timer", () => {
115
+ render(
116
+ <LiveProbe
117
+ isLive={true}
118
+ refreshLogs={refreshLogs}
119
+ refreshHistogram={refreshHistogram}
120
+ />,
121
+ );
122
+
123
+ expect(jest.getTimerCount()).toBe(1);
124
+ });
125
+ });
126
+
127
+ describe("on every poll", () => {
128
+ test("waits for the full interval before the next refresh", () => {
129
+ render(
130
+ <LiveProbe
131
+ isLive={true}
132
+ refreshLogs={refreshLogs}
133
+ refreshHistogram={refreshHistogram}
134
+ />,
135
+ );
136
+
137
+ advance(POLL_INTERVAL_MS - 1);
138
+
139
+ expect(refreshLogs).toHaveBeenCalledTimes(1);
140
+ expect(refreshHistogram).toHaveBeenCalledTimes(1);
141
+ });
142
+
143
+ test("refreshes again on the interval boundary", () => {
144
+ render(
145
+ <LiveProbe
146
+ isLive={true}
147
+ refreshLogs={refreshLogs}
148
+ refreshHistogram={refreshHistogram}
149
+ />,
150
+ );
151
+
152
+ advance(POLL_INTERVAL_MS);
153
+
154
+ expect(refreshLogs).toHaveBeenCalledTimes(2);
155
+ expect(refreshHistogram).toHaveBeenCalledTimes(2);
156
+ });
157
+
158
+ test("keeps the histogram on the same beat as the logs over many ticks", () => {
159
+ render(
160
+ <LiveProbe
161
+ isLive={true}
162
+ refreshLogs={refreshLogs}
163
+ refreshHistogram={refreshHistogram}
164
+ />,
165
+ );
166
+
167
+ for (let tick: number = 0; tick < 10; tick++) {
168
+ advance(POLL_INTERVAL_MS);
169
+
170
+ expect(refreshHistogram).toHaveBeenCalledTimes(
171
+ refreshLogs.mock.calls.length,
172
+ );
173
+ }
174
+
175
+ // 1 immediate + 10 ticks.
176
+ expect(refreshLogs).toHaveBeenCalledTimes(11);
177
+ expect(refreshHistogram).toHaveBeenCalledTimes(11);
178
+ });
179
+
180
+ test("does not drift or double up across a long session", () => {
181
+ render(
182
+ <LiveProbe
183
+ isLive={true}
184
+ refreshLogs={refreshLogs}
185
+ refreshHistogram={refreshHistogram}
186
+ />,
187
+ );
188
+
189
+ advance(POLL_INTERVAL_MS * 60);
190
+
191
+ expect(refreshLogs).toHaveBeenCalledTimes(61);
192
+ expect(jest.getTimerCount()).toBe(1);
193
+ });
194
+ });
195
+
196
+ describe("when the view cannot be tailed", () => {
197
+ test("does not poll on a page other than the first", () => {
198
+ render(
199
+ <LiveProbe
200
+ isLive={true}
201
+ isEligible={false}
202
+ refreshLogs={refreshLogs}
203
+ refreshHistogram={refreshHistogram}
204
+ />,
205
+ );
206
+
207
+ advance(POLL_INTERVAL_MS * 3);
208
+
209
+ expect(refreshLogs).not.toHaveBeenCalled();
210
+ expect(refreshHistogram).not.toHaveBeenCalled();
211
+ expect(jest.getTimerCount()).toBe(0);
212
+ });
213
+
214
+ test("starts polling both endpoints once the view becomes eligible", () => {
215
+ const view: ReturnType<typeof render> = render(
216
+ <LiveProbe
217
+ isLive={true}
218
+ isEligible={false}
219
+ refreshLogs={refreshLogs}
220
+ refreshHistogram={refreshHistogram}
221
+ />,
222
+ );
223
+
224
+ view.rerender(
225
+ <LiveProbe
226
+ isLive={true}
227
+ isEligible={true}
228
+ refreshLogs={refreshLogs}
229
+ refreshHistogram={refreshHistogram}
230
+ />,
231
+ );
232
+
233
+ expect(refreshLogs).toHaveBeenCalledTimes(1);
234
+ expect(refreshHistogram).toHaveBeenCalledTimes(1);
235
+ });
236
+
237
+ test("stops polling when the reader pages away mid-session", () => {
238
+ const view: ReturnType<typeof render> = render(
239
+ <LiveProbe
240
+ isLive={true}
241
+ refreshLogs={refreshLogs}
242
+ refreshHistogram={refreshHistogram}
243
+ />,
244
+ );
245
+
246
+ advance(POLL_INTERVAL_MS);
247
+
248
+ view.rerender(
249
+ <LiveProbe
250
+ isLive={true}
251
+ isEligible={false}
252
+ refreshLogs={refreshLogs}
253
+ refreshHistogram={refreshHistogram}
254
+ />,
255
+ );
256
+
257
+ advance(POLL_INTERVAL_MS * 5);
258
+
259
+ expect(refreshLogs).toHaveBeenCalledTimes(2);
260
+ expect(refreshHistogram).toHaveBeenCalledTimes(2);
261
+ expect(jest.getTimerCount()).toBe(0);
262
+ });
263
+ });
264
+
265
+ describe("when live mode is switched off", () => {
266
+ test("stops refreshing both the logs and the histogram", () => {
267
+ const view: ReturnType<typeof render> = render(
268
+ <LiveProbe
269
+ isLive={true}
270
+ refreshLogs={refreshLogs}
271
+ refreshHistogram={refreshHistogram}
272
+ />,
273
+ );
274
+
275
+ view.rerender(
276
+ <LiveProbe
277
+ isLive={false}
278
+ refreshLogs={refreshLogs}
279
+ refreshHistogram={refreshHistogram}
280
+ />,
281
+ );
282
+
283
+ advance(POLL_INTERVAL_MS * 5);
284
+
285
+ expect(refreshLogs).toHaveBeenCalledTimes(1);
286
+ expect(refreshHistogram).toHaveBeenCalledTimes(1);
287
+ expect(jest.getTimerCount()).toBe(0);
288
+ });
289
+
290
+ test("refreshes immediately again when switched back on", () => {
291
+ const view: ReturnType<typeof render> = render(
292
+ <LiveProbe
293
+ isLive={true}
294
+ refreshLogs={refreshLogs}
295
+ refreshHistogram={refreshHistogram}
296
+ />,
297
+ );
298
+
299
+ view.rerender(
300
+ <LiveProbe
301
+ isLive={false}
302
+ refreshLogs={refreshLogs}
303
+ refreshHistogram={refreshHistogram}
304
+ />,
305
+ );
306
+ view.rerender(
307
+ <LiveProbe
308
+ isLive={true}
309
+ refreshLogs={refreshLogs}
310
+ refreshHistogram={refreshHistogram}
311
+ />,
312
+ );
313
+
314
+ expect(refreshLogs).toHaveBeenCalledTimes(2);
315
+ expect(refreshHistogram).toHaveBeenCalledTimes(2);
316
+ expect(jest.getTimerCount()).toBe(1);
317
+ });
318
+ });
319
+
320
+ describe("when the parent re-renders mid-session", () => {
321
+ /*
322
+ * Results landing from a poll re-render the parent, which hands over
323
+ * freshly-created callbacks. Re-arming the timer on that would reset the
324
+ * cadence and fire an extra request on every render.
325
+ */
326
+ test("does not poll again just because the callbacks changed identity", () => {
327
+ const view: ReturnType<typeof render> = render(
328
+ <LiveProbe
329
+ isLive={true}
330
+ refreshLogs={refreshLogs}
331
+ refreshHistogram={refreshHistogram}
332
+ />,
333
+ );
334
+
335
+ // A distinct pair of callbacks per render, as a real parent would hand over.
336
+ const renders: Array<{ logs: () => void; histogram: () => void }> = [
337
+ 1, 2, 3, 4, 5,
338
+ ].map(() => {
339
+ return {
340
+ logs: () => {
341
+ refreshLogs();
342
+ },
343
+ histogram: () => {
344
+ refreshHistogram();
345
+ },
346
+ };
347
+ });
348
+
349
+ for (const callbacks of renders) {
350
+ view.rerender(
351
+ <LiveProbe
352
+ isLive={true}
353
+ refreshLogs={callbacks.logs}
354
+ refreshHistogram={callbacks.histogram}
355
+ />,
356
+ );
357
+ }
358
+
359
+ expect(refreshLogs).toHaveBeenCalledTimes(1);
360
+ expect(refreshHistogram).toHaveBeenCalledTimes(1);
361
+ expect(jest.getTimerCount()).toBe(1);
362
+ });
363
+
364
+ test("keeps the original cadence rather than restarting the clock", () => {
365
+ const view: ReturnType<typeof render> = render(
366
+ <LiveProbe
367
+ isLive={true}
368
+ refreshLogs={refreshLogs}
369
+ refreshHistogram={refreshHistogram}
370
+ />,
371
+ );
372
+
373
+ advance(POLL_INTERVAL_MS - 1000);
374
+
375
+ view.rerender(
376
+ <LiveProbe
377
+ isLive={true}
378
+ refreshLogs={() => {
379
+ refreshLogs();
380
+ }}
381
+ refreshHistogram={() => {
382
+ refreshHistogram();
383
+ }}
384
+ />,
385
+ );
386
+
387
+ advance(1000);
388
+
389
+ expect(refreshLogs).toHaveBeenCalledTimes(2);
390
+ expect(refreshHistogram).toHaveBeenCalledTimes(2);
391
+ });
392
+
393
+ test("polls through the newest callbacks", () => {
394
+ const laterLogs: jest.Mock = jest.fn();
395
+ const laterHistogram: jest.Mock = jest.fn();
396
+
397
+ const view: ReturnType<typeof render> = render(
398
+ <LiveProbe
399
+ isLive={true}
400
+ refreshLogs={refreshLogs}
401
+ refreshHistogram={refreshHistogram}
402
+ />,
403
+ );
404
+
405
+ view.rerender(
406
+ <LiveProbe
407
+ isLive={true}
408
+ refreshLogs={laterLogs}
409
+ refreshHistogram={laterHistogram}
410
+ />,
411
+ );
412
+
413
+ advance(POLL_INTERVAL_MS);
414
+
415
+ expect(laterLogs).toHaveBeenCalledTimes(1);
416
+ expect(laterHistogram).toHaveBeenCalledTimes(1);
417
+ expect(refreshLogs).toHaveBeenCalledTimes(1);
418
+ expect(refreshHistogram).toHaveBeenCalledTimes(1);
419
+ });
420
+ });
421
+
422
+ describe("when the poll interval changes", () => {
423
+ test("adopts the new cadence", () => {
424
+ const view: ReturnType<typeof render> = render(
425
+ <LiveProbe
426
+ isLive={true}
427
+ refreshLogs={refreshLogs}
428
+ refreshHistogram={refreshHistogram}
429
+ />,
430
+ );
431
+
432
+ view.rerender(
433
+ <LiveProbe
434
+ isLive={true}
435
+ intervalInMs={1000}
436
+ refreshLogs={refreshLogs}
437
+ refreshHistogram={refreshHistogram}
438
+ />,
439
+ );
440
+
441
+ advance(1000);
442
+
443
+ // 1 on mount, 1 on the re-armed loop's immediate poll, 1 on its tick.
444
+ expect(refreshLogs).toHaveBeenCalledTimes(3);
445
+ expect(refreshHistogram).toHaveBeenCalledTimes(3);
446
+ });
447
+
448
+ test("does not leave the old cadence's timer behind", () => {
449
+ const view: ReturnType<typeof render> = render(
450
+ <LiveProbe
451
+ isLive={true}
452
+ refreshLogs={refreshLogs}
453
+ refreshHistogram={refreshHistogram}
454
+ />,
455
+ );
456
+
457
+ view.rerender(
458
+ <LiveProbe
459
+ isLive={true}
460
+ intervalInMs={1000}
461
+ refreshLogs={refreshLogs}
462
+ refreshHistogram={refreshHistogram}
463
+ />,
464
+ );
465
+
466
+ expect(jest.getTimerCount()).toBe(1);
467
+ });
468
+ });
469
+
470
+ describe("cleanup", () => {
471
+ test("stops polling once the viewer is unmounted", () => {
472
+ const view: ReturnType<typeof render> = render(
473
+ <LiveProbe
474
+ isLive={true}
475
+ refreshLogs={refreshLogs}
476
+ refreshHistogram={refreshHistogram}
477
+ />,
478
+ );
479
+
480
+ view.unmount();
481
+
482
+ advance(POLL_INTERVAL_MS * 5);
483
+
484
+ expect(refreshLogs).toHaveBeenCalledTimes(1);
485
+ expect(refreshHistogram).toHaveBeenCalledTimes(1);
486
+ expect(jest.getTimerCount()).toBe(0);
487
+ });
488
+ });
489
+ });