@oneuptime/common 12.0.13 → 12.0.15

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 (561) hide show
  1. package/Models/DatabaseModels/GlobalOidc.ts +20 -0
  2. package/Models/DatabaseModels/GlobalSso.ts +20 -0
  3. package/Models/DatabaseModels/MarketingConversion.ts +19 -9
  4. package/Models/DatabaseModels/NetworkDeviceLinkRule.ts +46 -0
  5. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
  6. package/Models/DatabaseModels/StatusPage.ts +7 -4
  7. package/Models/DatabaseModels/UserCall.ts +94 -3
  8. package/Models/DatabaseModels/UserEmail.ts +94 -3
  9. package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
  10. package/Models/DatabaseModels/UserPush.ts +37 -0
  11. package/Models/DatabaseModels/UserSMS.ts +94 -3
  12. package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
  13. package/Server/API/BaseAPI.ts +79 -14
  14. package/Server/API/StatusPageAPI.ts +29 -4
  15. package/Server/API/UserCallAPI.ts +53 -45
  16. package/Server/API/UserEmailAPI.ts +53 -44
  17. package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
  18. package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
  19. package/Server/API/UserPushAPI.ts +126 -2
  20. package/Server/API/UserSmsAPI.ts +53 -44
  21. package/Server/API/UserWhatsAppAPI.ts +53 -50
  22. package/Server/EnvironmentConfig.ts +7 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.ts +19 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.ts +40 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  29. package/Server/Middleware/SlackAuthorization.ts +43 -6
  30. package/Server/Middleware/UserAuthorization.ts +236 -26
  31. package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
  32. package/Server/Middleware/WhatsAppAuthorization.ts +43 -3
  33. package/Server/Services/AnalyticsDatabaseService.ts +169 -0
  34. package/Server/Services/DatabaseService.ts +101 -0
  35. package/Server/Services/GlobalOidcProjectService.ts +126 -1
  36. package/Server/Services/GlobalOidcService.ts +132 -0
  37. package/Server/Services/GlobalSsoProjectService.ts +126 -1
  38. package/Server/Services/GlobalSsoService.ts +132 -0
  39. package/Server/Services/LogAggregationService.ts +5 -0
  40. package/Server/Services/PushNotificationService.ts +127 -12
  41. package/Server/Services/TeamMemberService.ts +53 -13
  42. package/Server/Services/UserCallService.ts +55 -24
  43. package/Server/Services/UserEmailService.ts +83 -17
  44. package/Server/Services/UserIncomingCallNumberService.ts +49 -85
  45. package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
  46. package/Server/Services/UserNotificationRuleService.ts +26 -0
  47. package/Server/Services/UserPushService.ts +89 -0
  48. package/Server/Services/UserSmsService.ts +50 -17
  49. package/Server/Services/UserWhatsAppService.ts +48 -15
  50. package/Server/Types/Database/QueryHelper.ts +30 -0
  51. package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
  52. package/Server/Utils/ChannelVerification.ts +510 -0
  53. package/Server/Utils/CronTab.ts +73 -0
  54. package/Server/Utils/GlobalSsoAuthorization.ts +175 -0
  55. package/Server/Utils/Marketing/ConversionUploadProvider.ts +35 -5
  56. package/Server/Utils/Marketing/Providers/GoogleAds.ts +1 -1
  57. package/Server/Utils/Marketing/Providers/LinkedIn.ts +1 -1
  58. package/Server/Utils/Marketing/Providers/Meta.ts +1 -1
  59. package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +1 -1
  60. package/Server/Utils/Marketing/Providers/Reddit.ts +1 -1
  61. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +48 -33
  62. package/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.ts +35 -30
  63. package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +33 -28
  64. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +475 -47
  65. package/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.ts +35 -30
  66. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +47 -44
  67. package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +33 -28
  68. package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +69 -40
  69. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +35 -29
  70. package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
  71. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +8 -0
  72. package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
  73. package/Server/Utils/Monitor/MonitorResource.ts +161 -21
  74. package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
  75. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
  76. package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
  77. package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
  78. package/Server/Utils/StatusPageContentSecurityPolicy.ts +56 -0
  79. package/Server/Utils/StatusPageCustomizationAccess.ts +117 -0
  80. package/Server/Utils/TotpAuth.ts +137 -9
  81. package/Server/Utils/UserRegistrationToken.ts +182 -0
  82. package/Server/Utils/VerificationCode.ts +134 -0
  83. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
  84. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
  85. package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
  86. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
  87. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
  88. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +28 -0
  89. package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
  90. package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
  91. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
  92. package/Tests/Server/API/StatusPageCustomizationOrigin.test.ts +348 -0
  93. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
  94. package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
  95. package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
  96. package/Tests/Server/API/UserSmsApi.test.ts +107 -14
  97. package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
  98. package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +265 -0
  99. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +227 -0
  100. package/Tests/Server/Middleware/SlackAuthorization.test.ts +149 -0
  101. package/Tests/Server/Middleware/UserAuthorization.test.ts +27 -13
  102. package/Tests/Server/Middleware/UserAuthorizationGlobalSsoGovernance.test.ts +1455 -0
  103. package/Tests/Server/Middleware/UserAuthorizationSSOProvider.test.ts +91 -2
  104. package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
  105. package/Tests/Server/Middleware/WhatsAppAuthorization.test.ts +233 -0
  106. package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
  107. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
  108. package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
  109. package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
  110. package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
  111. package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
  112. package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
  113. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +21 -8
  114. package/Tests/Server/Services/GlobalSsoProviderAuthorization.test.ts +1242 -0
  115. package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
  116. package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
  117. package/Tests/Server/Services/MonitorResourceProbeAgreementHydration.test.ts +459 -0
  118. package/Tests/Server/Services/MonitorResourceProbeAgreementReuse.test.ts +10 -0
  119. package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
  120. package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
  121. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
  122. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
  123. package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
  124. package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
  125. package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
  126. package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
  127. package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
  128. package/Tests/Server/Types/AnalyticsDatabase/AggregateUtilBucketTimestamp.test.ts +416 -0
  129. package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
  130. package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
  131. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
  132. package/Tests/Server/Types/Database/QueryHelperManyToManyAndEmptyValues.test.ts +551 -0
  133. package/Tests/Server/Types/Database/SelectUtil.test.ts +348 -0
  134. package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
  135. package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
  136. package/Tests/Server/Utils/Browser.test.ts +162 -0
  137. package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
  138. package/Tests/Server/Utils/CronTab.test.ts +116 -0
  139. package/Tests/Server/Utils/Express.test.ts +371 -0
  140. package/Tests/Server/Utils/GlobalSSOToken.test.ts +581 -0
  141. package/Tests/Server/Utils/GlobalSsoAuthorization.test.ts +1401 -0
  142. package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +254 -0
  143. package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +1 -1
  144. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaEvaluateOverTime.test.ts +508 -0
  145. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +30 -9
  146. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
  147. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
  148. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +987 -0
  149. package/Tests/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.test.ts +916 -0
  150. package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
  151. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
  152. package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +382 -0
  153. package/Tests/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.test.ts +1219 -0
  154. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
  155. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
  156. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
  157. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
  158. package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +86 -0
  159. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
  160. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
  161. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
  162. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
  163. package/Tests/Server/Utils/StatusPageContentSecurityPolicy.test.ts +136 -0
  164. package/Tests/Server/Utils/StatusPageCustomizationAccess.test.ts +223 -0
  165. package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
  166. package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
  167. package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
  168. package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
  169. package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
  170. package/Tests/Types/Call/CallRequest.test.ts +189 -0
  171. package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
  172. package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
  173. package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
  174. package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
  175. package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
  176. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
  177. package/Tests/Types/Monitor/MonitorStepConfigHelpers.test.ts +165 -0
  178. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
  179. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
  180. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
  181. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
  182. package/Tests/Types/NetworkDevice/NetworkDeviceLinkRuleScope.test.ts +215 -0
  183. package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
  184. package/Tests/Types/TextRandomGeneration.test.ts +211 -0
  185. package/Tests/UI/Components/Button.test.tsx +175 -1
  186. package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
  187. package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
  188. package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
  189. package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
  190. package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
  191. package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
  192. package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
  193. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
  194. package/Tests/UI/Components/Forms/FormSubmitAnalytics.test.tsx +206 -0
  195. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
  196. package/Tests/UI/Components/List.test.tsx +9 -2
  197. package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
  198. package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
  199. package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
  200. package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
  201. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
  202. package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
  203. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
  204. package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
  205. package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
  206. package/Tests/UI/Components/Skeleton.test.tsx +71 -0
  207. package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
  208. package/Tests/UI/Components/Tabs.test.tsx +24 -0
  209. package/Tests/UI/Components/Toast.test.tsx +130 -7
  210. package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
  211. package/Tests/UI/Utils/AIChatExport/ConversationMarkdown.test.ts +774 -0
  212. package/Tests/UI/Utils/AIChatExport/MarkdownBlocks.test.ts +791 -0
  213. package/Tests/UI/Utils/AIChatExport/MarkdownSafety.test.ts +544 -0
  214. package/Tests/UI/Utils/Dropdown.test.ts +423 -0
  215. package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
  216. package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
  217. package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
  218. package/Tests/Utils/API.test.ts +16 -2
  219. package/Tests/Utils/Analytics.test.ts +187 -0
  220. package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
  221. package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
  222. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
  223. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +80 -0
  224. package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +1291 -0
  225. package/Tests/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.test.ts +214 -0
  226. package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
  227. package/Types/Email/EmailTemplateType.ts +1 -0
  228. package/Types/Marketing/MarketingConversion.ts +12 -0
  229. package/Types/Monitor/CriteriaFilter.ts +9 -0
  230. package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
  231. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
  232. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
  233. package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
  234. package/Types/NetworkDevice/NetworkDeviceLinkRuleScope.ts +51 -0
  235. package/Types/Permission.ts +35 -0
  236. package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
  237. package/Types/PushNotification/PushNotificationMessage.ts +15 -0
  238. package/Types/PushNotification/PushNotificationRequest.ts +8 -16
  239. package/Types/Service/ServiceLanguage.ts +144 -0
  240. package/Types/Text.ts +111 -19
  241. package/UI/Components/Button/Button.tsx +27 -14
  242. package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
  243. package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
  244. package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
  245. package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
  246. package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
  247. package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
  248. package/UI/Components/CommandPalette/Types.ts +49 -0
  249. package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
  250. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  251. package/UI/Components/Feed/FeedItem.tsx +1 -1
  252. package/UI/Components/FormModal/BasicFormModal.tsx +12 -0
  253. package/UI/Components/Forms/BasicForm.tsx +13 -1
  254. package/UI/Components/Forms/BasicModelForm.tsx +2 -1
  255. package/UI/Components/Forms/ModelForm.tsx +10 -1
  256. package/UI/Components/Forms/Utils/FormAnalyticsName.ts +39 -0
  257. package/UI/Components/List/List.tsx +37 -5
  258. package/UI/Components/List/ListSkeleton.tsx +54 -0
  259. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
  260. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
  261. package/UI/Components/Modal/Modal.tsx +2 -2
  262. package/UI/Components/ModelFormModal/ModelFormModal.tsx +6 -1
  263. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  264. package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
  265. package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
  266. package/UI/Components/Navbar/NavBar.tsx +14 -1
  267. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
  268. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
  269. package/UI/Components/SideOver/SideOver.tsx +37 -2
  270. package/UI/Components/Skeleton/Skeleton.tsx +53 -0
  271. package/UI/Components/Table/Table.tsx +74 -44
  272. package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
  273. package/UI/Components/Tabs/Tab.tsx +1 -1
  274. package/UI/Components/Toast/Toast.tsx +118 -53
  275. package/UI/Components/Toast/ToastInit.tsx +82 -32
  276. package/UI/Styles/Theme.css +40 -0
  277. package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
  278. package/UI/Utils/ModelListCache.ts +188 -0
  279. package/UI/Utils/Project.ts +29 -0
  280. package/Utils/API.ts +6 -1
  281. package/Utils/Analytics.ts +55 -2
  282. package/Utils/Monitor/MonitorMetricType.ts +40 -0
  283. package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +587 -37
  284. package/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.ts +115 -0
  285. package/build/dist/Models/DatabaseModels/GlobalOidc.js +21 -0
  286. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  287. package/build/dist/Models/DatabaseModels/GlobalSso.js +21 -0
  288. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  289. package/build/dist/Models/DatabaseModels/MarketingConversion.js +20 -10
  290. package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -1
  291. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js +47 -0
  292. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js.map +1 -1
  293. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
  294. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  295. package/build/dist/Models/DatabaseModels/StatusPage.js +4 -4
  296. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  297. package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
  298. package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
  299. package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
  300. package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
  301. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
  302. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
  303. package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
  304. package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
  305. package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
  306. package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
  307. package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
  308. package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
  309. package/build/dist/Server/API/BaseAPI.js +69 -13
  310. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  311. package/build/dist/Server/API/StatusPageAPI.js +25 -4
  312. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  313. package/build/dist/Server/API/UserCallAPI.js +42 -38
  314. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  315. package/build/dist/Server/API/UserEmailAPI.js +42 -38
  316. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  317. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
  318. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  319. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
  320. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
  321. package/build/dist/Server/API/UserPushAPI.js +95 -2
  322. package/build/dist/Server/API/UserPushAPI.js.map +1 -1
  323. package/build/dist/Server/API/UserSmsAPI.js +42 -38
  324. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  325. package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
  326. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  327. package/build/dist/Server/EnvironmentConfig.js +6 -0
  328. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  329. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
  330. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
  331. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
  332. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
  333. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
  334. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
  335. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.js +12 -0
  336. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.js.map +1 -0
  337. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.js +29 -0
  338. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.js.map +1 -0
  339. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  340. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  341. package/build/dist/Server/Middleware/SlackAuthorization.js +28 -4
  342. package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
  343. package/build/dist/Server/Middleware/UserAuthorization.js +197 -22
  344. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  345. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
  346. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
  347. package/build/dist/Server/Middleware/WhatsAppAuthorization.js +32 -2
  348. package/build/dist/Server/Middleware/WhatsAppAuthorization.js.map +1 -1
  349. package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
  350. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  351. package/build/dist/Server/Services/DatabaseService.js +74 -0
  352. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  353. package/build/dist/Server/Services/GlobalOidcProjectService.js +105 -0
  354. package/build/dist/Server/Services/GlobalOidcProjectService.js.map +1 -1
  355. package/build/dist/Server/Services/GlobalOidcService.js +127 -0
  356. package/build/dist/Server/Services/GlobalOidcService.js.map +1 -1
  357. package/build/dist/Server/Services/GlobalSsoProjectService.js +105 -0
  358. package/build/dist/Server/Services/GlobalSsoProjectService.js.map +1 -1
  359. package/build/dist/Server/Services/GlobalSsoService.js +127 -0
  360. package/build/dist/Server/Services/GlobalSsoService.js.map +1 -1
  361. package/build/dist/Server/Services/LogAggregationService.js +5 -0
  362. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  363. package/build/dist/Server/Services/PushNotificationService.js +69 -30
  364. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  365. package/build/dist/Server/Services/TeamMemberService.js +43 -7
  366. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  367. package/build/dist/Server/Services/UserCallService.js +54 -22
  368. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  369. package/build/dist/Server/Services/UserEmailService.js +78 -17
  370. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  371. package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
  372. package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
  373. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
  374. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
  375. package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
  376. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  377. package/build/dist/Server/Services/UserPushService.js +77 -0
  378. package/build/dist/Server/Services/UserPushService.js.map +1 -1
  379. package/build/dist/Server/Services/UserSmsService.js +50 -17
  380. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  381. package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
  382. package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
  383. package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
  384. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  385. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
  386. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
  387. package/build/dist/Server/Utils/ChannelVerification.js +348 -0
  388. package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
  389. package/build/dist/Server/Utils/CronTab.js +66 -0
  390. package/build/dist/Server/Utils/CronTab.js.map +1 -1
  391. package/build/dist/Server/Utils/GlobalSsoAuthorization.js +112 -0
  392. package/build/dist/Server/Utils/GlobalSsoAuthorization.js.map +1 -0
  393. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +17 -1
  394. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -1
  395. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +1 -1
  396. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -1
  397. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +1 -1
  398. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -1
  399. package/build/dist/Server/Utils/Marketing/Providers/Meta.js +1 -1
  400. package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -1
  401. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +1 -1
  402. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -1
  403. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +1 -1
  404. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -1
  405. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +37 -35
  406. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  407. package/build/dist/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.js +21 -25
  408. package/build/dist/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.js.map +1 -1
  409. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +20 -22
  410. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
  411. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +370 -42
  412. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  413. package/build/dist/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.js +21 -25
  414. package/build/dist/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.js.map +1 -1
  415. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +34 -37
  416. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  417. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +21 -25
  418. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
  419. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +64 -52
  420. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
  421. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +25 -29
  422. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  423. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
  424. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  425. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +8 -0
  426. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  427. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
  428. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  429. package/build/dist/Server/Utils/Monitor/MonitorResource.js +123 -23
  430. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  431. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
  432. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
  433. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
  434. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
  435. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
  436. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
  437. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  438. package/build/dist/Server/Utils/StatusPageContentSecurityPolicy.js +39 -0
  439. package/build/dist/Server/Utils/StatusPageContentSecurityPolicy.js.map +1 -0
  440. package/build/dist/Server/Utils/StatusPageCustomizationAccess.js +85 -0
  441. package/build/dist/Server/Utils/StatusPageCustomizationAccess.js.map +1 -0
  442. package/build/dist/Server/Utils/TotpAuth.js +127 -8
  443. package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
  444. package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
  445. package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
  446. package/build/dist/Server/Utils/VerificationCode.js +120 -0
  447. package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
  448. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  449. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  450. package/build/dist/Types/Marketing/MarketingConversion.js +10 -0
  451. package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -1
  452. package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
  453. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  454. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
  455. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  456. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
  457. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  458. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
  459. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  460. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
  461. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
  462. package/build/dist/Types/NetworkDevice/NetworkDeviceLinkRuleScope.js +46 -0
  463. package/build/dist/Types/NetworkDevice/NetworkDeviceLinkRuleScope.js.map +1 -0
  464. package/build/dist/Types/Permission.js +33 -0
  465. package/build/dist/Types/Permission.js.map +1 -1
  466. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
  467. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
  468. package/build/dist/Types/Service/ServiceLanguage.js +96 -0
  469. package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
  470. package/build/dist/Types/Text.js +82 -17
  471. package/build/dist/Types/Text.js.map +1 -1
  472. package/build/dist/UI/Components/Button/Button.js +22 -14
  473. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  474. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
  475. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  476. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
  477. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
  478. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
  479. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
  480. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
  481. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
  482. package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
  483. package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
  484. package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
  485. package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
  486. package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
  487. package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
  488. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
  489. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
  490. package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
  491. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  492. package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
  493. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  494. package/build/dist/UI/Components/FormModal/BasicFormModal.js +2 -1
  495. package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
  496. package/build/dist/UI/Components/Forms/BasicForm.js +10 -1
  497. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  498. package/build/dist/UI/Components/Forms/BasicModelForm.js +2 -1
  499. package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
  500. package/build/dist/UI/Components/Forms/ModelForm.js +4 -1
  501. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  502. package/build/dist/UI/Components/Forms/Utils/FormAnalyticsName.js +33 -0
  503. package/build/dist/UI/Components/Forms/Utils/FormAnalyticsName.js.map +1 -0
  504. package/build/dist/UI/Components/List/List.js +19 -5
  505. package/build/dist/UI/Components/List/List.js.map +1 -1
  506. package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
  507. package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
  508. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  509. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
  510. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  511. package/build/dist/UI/Components/Modal/Modal.js +2 -2
  512. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +2 -1
  513. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  514. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  515. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  516. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
  517. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
  518. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
  519. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  520. package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
  521. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  522. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
  523. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  524. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
  525. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  526. package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
  527. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  528. package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
  529. package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
  530. package/build/dist/UI/Components/Table/Table.js +35 -24
  531. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  532. package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
  533. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
  534. package/build/dist/UI/Components/Tabs/Tab.js +1 -1
  535. package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
  536. package/build/dist/UI/Components/Toast/Toast.js +77 -23
  537. package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
  538. package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
  539. package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
  540. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
  541. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  542. package/build/dist/UI/Utils/ModelListCache.js +126 -0
  543. package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
  544. package/build/dist/UI/Utils/Project.js +24 -1
  545. package/build/dist/UI/Utils/Project.js.map +1 -1
  546. package/build/dist/Utils/API.js +6 -1
  547. package/build/dist/Utils/API.js.map +1 -1
  548. package/build/dist/Utils/Analytics.js +50 -2
  549. package/build/dist/Utils/Analytics.js.map +1 -1
  550. package/build/dist/Utils/Monitor/MonitorMetricType.js +37 -0
  551. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  552. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +318 -37
  553. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -1
  554. package/build/dist/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.js +87 -0
  555. package/build/dist/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.js.map +1 -0
  556. package/jest.config.json +1 -1
  557. package/package.json +2 -3
  558. package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
  559. package/Tests/__mocks__/otpauth.js +0 -30
  560. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
  561. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
@@ -0,0 +1,175 @@
1
+ import ObjectID from "../../Types/ObjectID";
2
+ import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
3
+
4
+ /*
5
+ * The stateful half of Global SSO enforcement.
6
+ *
7
+ * A Global SSO/OIDC token is a 30-day, self-contained JWT with no project
8
+ * binding, so on its own it answers only "this person authenticated against
9
+ * SOME instance-wide identity provider at some point in the last month". Two
10
+ * questions it cannot answer:
11
+ *
12
+ * 1. IS THE PROVIDER STILL TRUSTED? Turning a provider off, or deleting it,
13
+ * has to actually cut off access. Without a check at request time the
14
+ * "Enabled" toggle does nothing to anyone already signed in, for up to
15
+ * thirty days. This check is UNCONDITIONAL - "disabled" has only one
16
+ * possible meaning.
17
+ *
18
+ * 2. DOES THE PROVIDER GOVERN THIS PROJECT? Deliberately OPT-IN, per
19
+ * provider, via `restrictToAttachedProjects`. The attachment rows
20
+ * (GlobalSsoProject / GlobalOidcProject) were introduced as the
21
+ * PROVISIONING allow-list - "a SAML assertion can only ever provision a
22
+ * user into projects that a master admin has explicitly attached here",
23
+ * per the model's own docstring - and the login routers gate a session on
24
+ * membership of ANY project, not of an attached one. Reading attachments
25
+ * as an access boundary by default would therefore lock existing users
26
+ * out of projects they legitimately reach today, immediately on upgrade,
27
+ * with no way to recover from inside the product. So it stays off unless
28
+ * an admin asks for it.
29
+ *
30
+ * Both answers come from Postgres and run on every authenticated request
31
+ * against an SSO-enforced project, so both are cached in-process for 60
32
+ * seconds, and concurrent misses share one query.
33
+ */
34
+
35
+ export const GLOBAL_SSO_AUTHORIZATION_CACHE_TTL_MS: number = 60_000;
36
+
37
+ /** What the enforcement path needs to know about a global provider. */
38
+ export interface GlobalProviderTrust {
39
+ // The provider row exists and its "Enabled" toggle is on.
40
+ isUsable: boolean;
41
+ // The admin opted this provider into attachment-scoped access.
42
+ restrictToAttachedProjects: boolean;
43
+ }
44
+
45
+ /*
46
+ * Absence of an entry means "not yet looked up", which is why these are read
47
+ * with an explicit `undefined` check rather than a truthiness test: a cached
48
+ * "this provider is disabled" must not be mistaken for a cache miss and
49
+ * re-queried on every single request.
50
+ */
51
+ export const globalSsoProviderTrustCache: InMemoryTTLCache<GlobalProviderTrust> =
52
+ new InMemoryTTLCache(10_000);
53
+
54
+ /**
55
+ * A provider's attachment rows.
56
+ *
57
+ * `hasAnyAttachmentRows` distinguishes "this provider has no attachments at
58
+ * all" from "it has attachments but every one of them is disabled". Collapsing
59
+ * those two would mean an admin disabling the last attachment WIDENS the
60
+ * provider to every project - the exact opposite of the intent.
61
+ */
62
+ export interface GlobalProviderAttachments {
63
+ hasAnyAttachmentRows: boolean;
64
+ enabledProjectIds: Array<string>;
65
+ }
66
+
67
+ export const globalSsoAttachmentsCache: InMemoryTTLCache<GlobalProviderAttachments> =
68
+ new InMemoryTTLCache(10_000);
69
+
70
+ export type GlobalProviderKind = "sso" | "oidc";
71
+
72
+ /*
73
+ * Namespaced by kind. A Global SSO provider and a Global OIDC provider are
74
+ * different rows in different tables and could in principle share an id;
75
+ * collapsing the keys would let one vouch for the other.
76
+ */
77
+ export function globalProviderCacheKey(
78
+ providerKind: GlobalProviderKind,
79
+ providerId: ObjectID,
80
+ ): string {
81
+ return `${providerKind}:${providerId.toString()}`;
82
+ }
83
+
84
+ /**
85
+ * Decides whether a provider's attachments cover `projectId`, for a provider
86
+ * that has opted into attachment-scoped access.
87
+ *
88
+ * A provider with no attachment rows at all is instance-wide, matching the
89
+ * "default-all" reading the login routers use. A provider that HAS attachment
90
+ * rows governs exactly the enabled ones - so disabling them all denies rather
91
+ * than widens.
92
+ */
93
+ export function doAttachmentsGovernProject(
94
+ attachments: GlobalProviderAttachments,
95
+ projectId: ObjectID,
96
+ ): boolean {
97
+ if (!attachments.hasAnyAttachmentRows) {
98
+ return true;
99
+ }
100
+
101
+ return attachments.enabledProjectIds.includes(projectId.toString());
102
+ }
103
+
104
+ /** Drops every cached answer. Used by the write hooks and by tests. */
105
+ export function clearGlobalSsoAuthorizationCaches(): void {
106
+ globalSsoProviderTrustCache.clear();
107
+ globalSsoAttachmentsCache.clear();
108
+ inFlightTrustLookups.clear();
109
+ inFlightAttachmentLookups.clear();
110
+ }
111
+
112
+ /*
113
+ * In-flight de-duplication.
114
+ *
115
+ * The multi-tenant permission path fans out over every project the user
116
+ * belongs to CONCURRENTLY. Without this, a cold cache means N simultaneous
117
+ * copies of the same two queries - for a user in fifty projects, a hundred
118
+ * queries where two would do. Worse, failures are never cached, so a database
119
+ * that is already struggling gets the full fan-out again on every request.
120
+ *
121
+ * Sharing the promise collapses all of that to one query per provider, and a
122
+ * rejection is shared too rather than being retried N times in the same tick.
123
+ */
124
+ const inFlightTrustLookups: Map<
125
+ string,
126
+ Promise<GlobalProviderTrust>
127
+ > = new Map();
128
+ const inFlightAttachmentLookups: Map<
129
+ string,
130
+ Promise<GlobalProviderAttachments>
131
+ > = new Map();
132
+
133
+ async function loadOnce<T>(
134
+ inFlight: Map<string, Promise<T>>,
135
+ key: string,
136
+ load: () => Promise<T>,
137
+ ): Promise<T> {
138
+ const existing: Promise<T> | undefined = inFlight.get(key);
139
+
140
+ if (existing) {
141
+ return existing;
142
+ }
143
+
144
+ const pending: Promise<T> = load().finally((): void => {
145
+ /*
146
+ * Only clear the slot if it is still OURS. A cache clear between the two
147
+ * (every write to a Global SSO/OIDC service does exactly that, twice) lets
148
+ * a NEWER lookup take the key while this one is still on the wire; a blind
149
+ * delete would evict that newer entry when this one settles, and the fan-
150
+ * out that follows would stop de-duplicating - the one situation this
151
+ * exists for.
152
+ */
153
+ if (inFlight.get(key) === pending) {
154
+ inFlight.delete(key);
155
+ }
156
+ });
157
+
158
+ inFlight.set(key, pending);
159
+
160
+ return pending;
161
+ }
162
+
163
+ export function loadTrustOnce(
164
+ key: string,
165
+ load: () => Promise<GlobalProviderTrust>,
166
+ ): Promise<GlobalProviderTrust> {
167
+ return loadOnce(inFlightTrustLookups, key, load);
168
+ }
169
+
170
+ export function loadAttachmentsOnce(
171
+ key: string,
172
+ load: () => Promise<GlobalProviderAttachments>,
173
+ ): Promise<GlobalProviderAttachments> {
174
+ return loadOnce(inFlightAttachmentLookups, key, load);
175
+ }
@@ -1,6 +1,9 @@
1
1
  import { AxiosError } from "axios";
2
2
  import { JSONObject } from "../../../Types/JSON";
3
- import { MarketingConversionType } from "../../../Types/Marketing/MarketingConversion";
3
+ import {
4
+ AdUploadableMarketingConversionTypes,
5
+ MarketingConversionType,
6
+ } from "../../../Types/Marketing/MarketingConversion";
4
7
  import MarketingConversion from "../../../Models/DatabaseModels/MarketingConversion";
5
8
 
6
9
  /*
@@ -11,9 +14,12 @@ import MarketingConversion from "../../../Models/DatabaseModels/MarketingConvers
11
14
  *
12
15
  * Contract:
13
16
  * - getSkipReason returns a human-readable reason when this conversion can
14
- * never be uploaded to this platform (wrong/missing click id, outside the
15
- * platform's upload window, provider not configured for this conversion
16
- * type). Null means uploadable.
17
+ * never be uploaded to this platform (conversion type with no ad-platform
18
+ * mapping, wrong/missing click id, outside the platform's upload window,
19
+ * provider not configured for this conversion type). Null means uploadable.
20
+ * It is implemented here and must not be overridden — providers implement
21
+ * getProviderSkipReason instead, which only runs for conversion types that
22
+ * are ad-uploadable at all.
17
23
  * - upload() sends one batch. Per-conversion PERMANENT rejections are
18
24
  * returned in the result keyed by array index; they will not be retried.
19
25
  * Transport/auth-level failures must THROW — the whole batch stays pending
@@ -52,7 +58,31 @@ export default abstract class ConversionUploadProvider {
52
58
 
53
59
  public abstract isConfigured(): boolean;
54
60
 
55
- public abstract getSkipReason(
61
+ /*
62
+ * Every provider maps a conversion onto a platform conversion action by
63
+ * branching on isSignUp() — so a conversion type the ad platforms have no
64
+ * mapping for (a booked meeting) would otherwise be silently uploaded as a
65
+ * purchase. Screen those out here, before any provider sees them, so no
66
+ * provider or call site can skip the check.
67
+ */
68
+ public getSkipReason(conversion: MarketingConversion): ConversionSkip | null {
69
+ if (
70
+ !AdUploadableMarketingConversionTypes.includes(
71
+ conversion.conversionType as MarketingConversionType,
72
+ )
73
+ ) {
74
+ return {
75
+ reason: `Conversion type ${
76
+ conversion.conversionType || "unknown"
77
+ } has no ad platform conversion mapping`,
78
+ isPermanent: true,
79
+ };
80
+ }
81
+
82
+ return this.getProviderSkipReason(conversion);
83
+ }
84
+
85
+ protected abstract getProviderSkipReason(
56
86
  conversion: MarketingConversion,
57
87
  ): ConversionSkip | null;
58
88
 
@@ -46,7 +46,7 @@ export default class GoogleAdsProvider extends ConversionUploadProvider {
46
46
  );
47
47
  }
48
48
 
49
- public override getSkipReason(
49
+ protected override getProviderSkipReason(
50
50
  conversion: MarketingConversion,
51
51
  ): ConversionSkip | null {
52
52
  if (!this.getGoogleClickId(conversion)) {
@@ -41,7 +41,7 @@ export default class LinkedInProvider extends ConversionUploadProvider {
41
41
  return Boolean(LinkedInConversionsAccessToken);
42
42
  }
43
43
 
44
- public override getSkipReason(
44
+ protected override getProviderSkipReason(
45
45
  conversion: MarketingConversion,
46
46
  ): ConversionSkip | null {
47
47
  if (!this.getClickId(conversion, "li_fat_id")) {
@@ -32,7 +32,7 @@ export default class MetaProvider extends ConversionUploadProvider {
32
32
  return Boolean(MetaConversionsPixelId && MetaConversionsAccessToken);
33
33
  }
34
34
 
35
- public override getSkipReason(
35
+ protected override getProviderSkipReason(
36
36
  conversion: MarketingConversion,
37
37
  ): ConversionSkip | null {
38
38
  if (!this.getClickId(conversion, "fbclid")) {
@@ -45,7 +45,7 @@ export default class MicrosoftAdsProvider extends ConversionUploadProvider {
45
45
  );
46
46
  }
47
47
 
48
- public override getSkipReason(
48
+ protected override getProviderSkipReason(
49
49
  conversion: MarketingConversion,
50
50
  ): ConversionSkip | null {
51
51
  if (!this.getClickId(conversion, "msclkid")) {
@@ -41,7 +41,7 @@ export default class RedditProvider extends ConversionUploadProvider {
41
41
  );
42
42
  }
43
43
 
44
- public override getSkipReason(
44
+ protected override getProviderSkipReason(
45
45
  conversion: MarketingConversion,
46
46
  ): ConversionSkip | null {
47
47
  if (!this.getClickId(conversion, "rdt_cid")) {
@@ -1,6 +1,6 @@
1
1
  import DataToProcess from "../DataToProcess";
2
2
  import CompareCriteria from "./CompareCriteria";
3
- import EvaluateOverTime from "./EvaluateOverTime";
3
+ import EvaluateOverTime, { OverTimeCriteriaValue } from "./EvaluateOverTime";
4
4
  import { JSONObject } from "../../../../Types/JSON";
5
5
  import {
6
6
  CheckOn,
@@ -10,50 +10,65 @@ import {
10
10
  import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
11
11
  import Typeof from "../../../../Types/Typeof";
12
12
  import CaptureSpan from "../../Telemetry/CaptureSpan";
13
- import logger from "../../Logger";
14
13
 
15
14
  export default class APIRequestCriteria {
16
15
  @CaptureSpan()
17
16
  public static async isMonitorInstanceCriteriaFilterMet(input: {
18
17
  dataToProcess: DataToProcess;
19
18
  criteriaFilter: CriteriaFilter;
19
+ /*
20
+ * The monitor's monitoringInterval cron. Over-time filters use it to
21
+ * work out how many samples a fully covered window should hold, so a
22
+ * monitor that has only just started is not mistaken for one whose
23
+ * whole window is breaching.
24
+ */
25
+ monitoringInterval?: string | undefined;
20
26
  }): Promise<string | null> {
21
27
  // Server Monitoring Checks
22
28
 
23
29
  let threshold: number | string | undefined | null =
24
30
  input.criteriaFilter.value;
25
31
 
26
- let overTimeValue: Array<number | boolean> | number | boolean | undefined =
27
- undefined;
32
+ const overTime: OverTimeCriteriaValue =
33
+ await EvaluateOverTime.getOverTimeValueForCriteriaFilter({
34
+ projectId: (input.dataToProcess as ProbeMonitorResponse).projectId,
35
+ monitorId: input.dataToProcess.monitorId!,
36
+ criteriaFilter: input.criteriaFilter,
37
+ /*
38
+ * Only the disk-usage series carries a diskPath attribute, so
39
+ * scoping any other series by it would filter against an attribute
40
+ * no row has - and an empty window now means "cannot judge yet"
41
+ * rather than "compare the live value", which would silence the
42
+ * filter outright.
43
+ */
44
+ miscData:
45
+ input.criteriaFilter.checkOn === CheckOn.DiskUsagePercent
46
+ ? (input.criteriaFilter.serverMonitorOptions as JSONObject)
47
+ : undefined,
48
+ monitoringInterval: input.monitoringInterval,
49
+ });
28
50
 
29
- if (
30
- input.criteriaFilter.evaluateOverTime &&
31
- input.criteriaFilter.evaluateOverTimeOptions
32
- ) {
33
- try {
34
- overTimeValue = await EvaluateOverTime.getValueOverTime({
35
- projectId: (input.dataToProcess as ProbeMonitorResponse).projectId,
36
- monitorId: input.dataToProcess.monitorId!,
37
- evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
38
- metricType: input.criteriaFilter.checkOn,
39
- miscData: input.criteriaFilter.serverMonitorOptions as JSONObject,
40
- });
41
-
42
- if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
43
- overTimeValue = undefined;
44
- }
45
- } catch (err) {
46
- logger.error(
47
- `Error in getting over time value for ${input.criteriaFilter.checkOn}`,
48
- );
49
- logger.error(err);
50
- overTimeValue = undefined;
51
- }
51
+ /*
52
+ * The window could not back this over-time filter (nothing recorded yet,
53
+ * or the monitor has not been running long enough to cover it). Return
54
+ * the decision the no-data policy already made instead of falling
55
+ * through to the value that arrived with this one check - that fallback
56
+ * is what let "all values over the last N minutes" fire off a single
57
+ * bad reading.
58
+ */
59
+ if (overTime.earlyReturn) {
60
+ return overTime.earlyReturn.result;
52
61
  }
53
62
 
63
+ const overTimeValue:
64
+ | Array<number | boolean>
65
+ | number
66
+ | boolean
67
+ | undefined = overTime.value;
68
+
54
69
  if (input.criteriaFilter.checkOn === CheckOn.IsOnline) {
55
70
  const currentIsOnline: boolean | Array<boolean> =
56
- (overTimeValue as Array<boolean>) ||
71
+ (overTimeValue as Array<boolean>) ??
57
72
  (input.dataToProcess as ProbeMonitorResponse).isOnline;
58
73
 
59
74
  return CompareCriteria.compareCriteriaBoolean({
@@ -64,7 +79,7 @@ export default class APIRequestCriteria {
64
79
 
65
80
  if (input.criteriaFilter.checkOn === CheckOn.IsRequestTimeout) {
66
81
  const currentIsTimeout: boolean | Array<boolean> =
67
- (overTimeValue as Array<boolean>) ||
82
+ (overTimeValue as Array<boolean>) ??
68
83
  (input.dataToProcess as ProbeMonitorResponse).isTimeout;
69
84
 
70
85
  return CompareCriteria.compareCriteriaBoolean({
@@ -78,7 +93,7 @@ export default class APIRequestCriteria {
78
93
  threshold = CompareCriteria.convertToNumber(threshold);
79
94
 
80
95
  const value: Array<number> | number =
81
- (overTimeValue as Array<number>) ||
96
+ (overTimeValue as Array<number>) ??
82
97
  (input.dataToProcess as ProbeMonitorResponse).responseTimeInMs!;
83
98
 
84
99
  return CompareCriteria.compareCriteriaNumbers({
@@ -124,7 +139,7 @@ export default class APIRequestCriteria {
124
139
  ).pingResponse?.packetLossPercent;
125
140
 
126
141
  const value: Array<number> | number | undefined =
127
- (overTimeValue as Array<number>) || packetLossPercent;
142
+ (overTimeValue as Array<number>) ?? packetLossPercent;
128
143
 
129
144
  if (value === undefined) {
130
145
  return null;
@@ -146,7 +161,7 @@ export default class APIRequestCriteria {
146
161
  ).pingResponse?.jitterInMs;
147
162
 
148
163
  const value: Array<number> | number | undefined =
149
- (overTimeValue as Array<number>) || jitterInMs;
164
+ (overTimeValue as Array<number>) ?? jitterInMs;
150
165
 
151
166
  if (value === undefined) {
152
167
  return null;
@@ -169,7 +184,7 @@ export default class APIRequestCriteria {
169
184
  threshold = CompareCriteria.convertToNumber(threshold);
170
185
 
171
186
  const value: Array<number> | number =
172
- (overTimeValue as Array<number>) ||
187
+ (overTimeValue as Array<number>) ??
173
188
  (input.dataToProcess as ProbeMonitorResponse).responseCode!;
174
189
 
175
190
  return CompareCriteria.compareCriteriaNumbers({
@@ -7,15 +7,21 @@ import {
7
7
  } from "../../../../Types/Monitor/CriteriaFilter";
8
8
  import DnsMonitorResponse from "../../../../Types/Monitor/DnsMonitor/DnsMonitorResponse";
9
9
  import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
10
- import EvaluateOverTime from "./EvaluateOverTime";
10
+ import EvaluateOverTime, { OverTimeCriteriaValue } from "./EvaluateOverTime";
11
11
  import CaptureSpan from "../../Telemetry/CaptureSpan";
12
- import logger from "../../Logger";
13
12
 
14
13
  export default class DnsMonitorCriteria {
15
14
  @CaptureSpan()
16
15
  public static async isMonitorInstanceCriteriaFilterMet(input: {
17
16
  dataToProcess: DataToProcess;
18
17
  criteriaFilter: CriteriaFilter;
18
+ /*
19
+ * The monitor's monitoringInterval cron. Over-time filters use it to
20
+ * work out how many samples a fully covered window should hold, so a
21
+ * monitor that has only just started is not mistaken for one whose
22
+ * whole window is breaching.
23
+ */
24
+ monitoringInterval?: string | undefined;
19
25
  }): Promise<string | null> {
20
26
  let threshold: number | string | undefined | null =
21
27
  input.criteriaFilter.value;
@@ -26,37 +32,36 @@ export default class DnsMonitorCriteria {
26
32
  const dnsResponse: DnsMonitorResponse | undefined =
27
33
  dataToProcess.dnsResponse;
28
34
 
29
- let overTimeValue: Array<number | boolean> | number | boolean | undefined =
30
- undefined;
31
-
32
- if (
33
- input.criteriaFilter.evaluateOverTime &&
34
- input.criteriaFilter.evaluateOverTimeOptions
35
- ) {
36
- try {
37
- overTimeValue = await EvaluateOverTime.getValueOverTime({
38
- projectId: (input.dataToProcess as ProbeMonitorResponse).projectId,
39
- monitorId: input.dataToProcess.monitorId!,
40
- evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
41
- metricType: input.criteriaFilter.checkOn,
42
- });
35
+ const overTime: OverTimeCriteriaValue =
36
+ await EvaluateOverTime.getOverTimeValueForCriteriaFilter({
37
+ projectId: (input.dataToProcess as ProbeMonitorResponse).projectId,
38
+ monitorId: input.dataToProcess.monitorId!,
39
+ criteriaFilter: input.criteriaFilter,
40
+ monitoringInterval: input.monitoringInterval,
41
+ });
43
42
 
44
- if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
45
- overTimeValue = undefined;
46
- }
47
- } catch (err) {
48
- logger.error(
49
- `Error in getting over time value for ${input.criteriaFilter.checkOn}`,
50
- );
51
- logger.error(err);
52
- overTimeValue = undefined;
53
- }
43
+ /*
44
+ * The window could not back this over-time filter (nothing recorded yet,
45
+ * or the monitor has not been running long enough to cover it). Return
46
+ * the decision the no-data policy already made instead of falling
47
+ * through to the value that arrived with this one check - that fallback
48
+ * is what let "all values over the last N minutes" fire off a single
49
+ * bad reading.
50
+ */
51
+ if (overTime.earlyReturn) {
52
+ return overTime.earlyReturn.result;
54
53
  }
55
54
 
55
+ const overTimeValue:
56
+ | Array<number | boolean>
57
+ | number
58
+ | boolean
59
+ | undefined = overTime.value;
60
+
56
61
  // Check if DNS is online
57
62
  if (input.criteriaFilter.checkOn === CheckOn.DnsIsOnline) {
58
63
  const currentIsOnline: boolean | Array<boolean> =
59
- (overTimeValue as Array<boolean>) ||
64
+ (overTimeValue as Array<boolean>) ??
60
65
  (input.dataToProcess as ProbeMonitorResponse).isOnline;
61
66
 
62
67
  return CompareCriteria.compareCriteriaBoolean({
@@ -74,9 +79,9 @@ export default class DnsMonitorCriteria {
74
79
  }
75
80
 
76
81
  const currentResponseTime: number | Array<number> =
77
- (overTimeValue as Array<number>) ||
78
- dnsResponse?.responseTimeInMs ||
79
- (input.dataToProcess as ProbeMonitorResponse).responseTimeInMs;
82
+ (overTimeValue as Array<number>) ??
83
+ (dnsResponse?.responseTimeInMs ||
84
+ (input.dataToProcess as ProbeMonitorResponse).responseTimeInMs);
80
85
 
81
86
  if (currentResponseTime === null || currentResponseTime === undefined) {
82
87
  return null;
@@ -8,14 +8,20 @@ import {
8
8
  import DomainMonitorResponse from "../../../../Types/Monitor/DomainMonitor/DomainMonitorResponse";
9
9
  import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
10
10
  import CaptureSpan from "../../Telemetry/CaptureSpan";
11
- import EvaluateOverTime from "./EvaluateOverTime";
12
- import logger from "../../Logger";
11
+ import EvaluateOverTime, { OverTimeCriteriaValue } from "./EvaluateOverTime";
13
12
 
14
13
  export default class DomainMonitorCriteria {
15
14
  @CaptureSpan()
16
15
  public static async isMonitorInstanceCriteriaFilterMet(input: {
17
16
  dataToProcess: DataToProcess;
18
17
  criteriaFilter: CriteriaFilter;
18
+ /*
19
+ * The monitor's monitoringInterval cron. Over-time filters use it to
20
+ * work out how many samples a fully covered window should hold, so a
21
+ * monitor that has only just started is not mistaken for one whose
22
+ * whole window is breaching.
23
+ */
24
+ monitoringInterval?: string | undefined;
19
25
  }): Promise<string | null> {
20
26
  let threshold: number | string | undefined | null =
21
27
  input.criteriaFilter.value;
@@ -26,33 +32,32 @@ export default class DomainMonitorCriteria {
26
32
  const domainResponse: DomainMonitorResponse | undefined =
27
33
  dataToProcess.domainResponse;
28
34
 
29
- let overTimeValue: Array<number | boolean> | number | boolean | undefined =
30
- undefined;
31
-
32
- if (
33
- input.criteriaFilter.evaluateOverTime &&
34
- input.criteriaFilter.evaluateOverTimeOptions
35
- ) {
36
- try {
37
- overTimeValue = await EvaluateOverTime.getValueOverTime({
38
- projectId: dataToProcess.projectId,
39
- monitorId: input.dataToProcess.monitorId!,
40
- evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
41
- metricType: input.criteriaFilter.checkOn,
42
- });
35
+ const overTime: OverTimeCriteriaValue =
36
+ await EvaluateOverTime.getOverTimeValueForCriteriaFilter({
37
+ projectId: dataToProcess.projectId,
38
+ monitorId: input.dataToProcess.monitorId!,
39
+ criteriaFilter: input.criteriaFilter,
40
+ monitoringInterval: input.monitoringInterval,
41
+ });
43
42
 
44
- if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
45
- overTimeValue = undefined;
46
- }
47
- } catch (err) {
48
- logger.error(
49
- `Error in getting over time value for ${input.criteriaFilter.checkOn}`,
50
- );
51
- logger.error(err);
52
- overTimeValue = undefined;
53
- }
43
+ /*
44
+ * The window could not back this over-time filter (nothing recorded yet,
45
+ * or the monitor has not been running long enough to cover it). Return
46
+ * the decision the no-data policy already made instead of falling
47
+ * through to the value that arrived with this one check - that fallback
48
+ * is what let "all values over the last N minutes" fire off a single
49
+ * bad reading.
50
+ */
51
+ if (overTime.earlyReturn) {
52
+ return overTime.earlyReturn.result;
54
53
  }
55
54
 
55
+ const overTimeValue:
56
+ | Array<number | boolean>
57
+ | number
58
+ | boolean
59
+ | undefined = overTime.value;
60
+
56
61
  /*
57
62
  * Whether the registration lookup itself succeeded. Without this, a
58
63
  * domain whose TLD has no working WHOIS or RDAP service produces a
@@ -62,7 +67,7 @@ export default class DomainMonitorCriteria {
62
67
  */
63
68
  if (input.criteriaFilter.checkOn === CheckOn.IsOnline) {
64
69
  const currentIsOnline: boolean | Array<boolean> =
65
- (overTimeValue as Array<boolean>) || dataToProcess.isOnline;
70
+ (overTimeValue as Array<boolean>) ?? dataToProcess.isOnline;
66
71
 
67
72
  return CompareCriteria.compareCriteriaBoolean({
68
73
  value: currentIsOnline,
@@ -72,7 +77,7 @@ export default class DomainMonitorCriteria {
72
77
 
73
78
  if (input.criteriaFilter.checkOn === CheckOn.IsRequestTimeout) {
74
79
  const currentIsTimeout: boolean | Array<boolean> =
75
- (overTimeValue as Array<boolean>) || dataToProcess.isTimeout;
80
+ (overTimeValue as Array<boolean>) ?? dataToProcess.isTimeout;
76
81
 
77
82
  return CompareCriteria.compareCriteriaBoolean({
78
83
  value: currentIsTimeout,