@oneuptime/common 12.0.33 → 12.0.34

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 (652) hide show
  1. package/Models/AnalyticsModels/RumSession.ts +117 -1
  2. package/Models/AnalyticsModels/RumSessionChunk.ts +13 -0
  3. package/Models/DatabaseModels/AlertCustomField.ts +77 -3
  4. package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
  5. package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
  6. package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
  7. package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
  8. package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
  9. package/Models/DatabaseModels/RumApplication.ts +6 -6
  10. package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
  11. package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
  12. package/Models/DatabaseModels/TeamCustomField.ts +77 -3
  13. package/Models/DatabaseModels/TeamMember.ts +0 -9
  14. package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
  15. package/Models/DatabaseModels/TeamPermission.ts +3 -24
  16. package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
  17. package/Models/DatabaseModels/UserTelegram.ts +0 -4
  18. package/Scripts/benchmark-fanin-capacity.js +181 -0
  19. package/Server/API/TelemetryAPI.ts +1284 -164
  20. package/Server/API/UserNotificationSettingAPI.ts +55 -0
  21. package/Server/API/UserTelegramAPI.ts +48 -4
  22. package/Server/EnvironmentConfig.ts +35 -2
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.ts +91 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.ts +67 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.ts +139 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.ts +121 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  28. package/Server/Infrastructure/QueueWorker.ts +20 -14
  29. package/Server/Infrastructure/Semaphore.ts +2 -0
  30. package/Server/Middleware/TelemetryIngest.ts +453 -7
  31. package/Server/Services/AccessTokenService.ts +1 -0
  32. package/Server/Services/AlertCustomFieldService.ts +98 -0
  33. package/Server/Services/AlertService.ts +37 -0
  34. package/Server/Services/ApiKeyPermissionService.ts +461 -29
  35. package/Server/Services/CustomFieldMappingService.ts +879 -0
  36. package/Server/Services/GlobalConfigService.ts +194 -0
  37. package/Server/Services/IncidentCustomFieldService.ts +98 -0
  38. package/Server/Services/IncidentService.ts +35 -0
  39. package/Server/Services/MetricService.ts +194 -0
  40. package/Server/Services/MonitorService.ts +32 -0
  41. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +78 -25
  42. package/Server/Services/ProjectService.ts +22 -0
  43. package/Server/Services/RoutineEmailSettingsService.ts +73 -0
  44. package/Server/Services/RumSessionReplayViewService.ts +104 -24
  45. package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
  46. package/Server/Services/ScheduledMaintenanceService.ts +32 -0
  47. package/Server/Services/TeamMemberService.ts +78 -0
  48. package/Server/Services/TeamPermissionService.ts +235 -3
  49. package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
  50. package/Server/Services/UserNotificationSettingService.ts +34 -6
  51. package/Server/Services/UserTelegramService.ts +326 -5
  52. package/Server/Types/Database/QueryHelper.ts +2 -0
  53. package/Server/Utils/APIKey/AccessPermission.ts +5 -2
  54. package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
  55. package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
  56. package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
  57. package/Server/Utils/DataSource/EgressGuard.ts +177 -8
  58. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
  59. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +57 -4
  60. package/Server/Utils/FrontendEnvironment.ts +40 -0
  61. package/Server/Utils/LogRedaction.ts +20 -0
  62. package/Server/Utils/Logger.ts +11 -0
  63. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +338 -77
  64. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
  65. package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
  66. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +110 -15
  67. package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
  68. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -0
  69. package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
  70. package/Server/Utils/SSRFProtection.ts +217 -10
  71. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
  72. package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
  73. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
  74. package/Server/Utils/StartServer.ts +2 -17
  75. package/Server/Utils/TelegramVerificationToken.ts +185 -0
  76. package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
  77. package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +38 -16
  78. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +92 -0
  79. package/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.ts +217 -0
  80. package/Server/Utils/VM/VMAPI.ts +1 -0
  81. package/Server/Utils/VM/VMRunner.ts +975 -95
  82. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
  83. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
  84. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
  85. package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +399 -0
  86. package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
  87. package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
  88. package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
  89. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
  90. package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
  91. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
  92. package/Tests/ResponsiveVisibility.test.ts +115 -0
  93. package/Tests/ResponsiveVisibility.ts +183 -0
  94. package/Tests/Server/API/SessionReplayAPI.test.ts +1940 -216
  95. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +186 -0
  96. package/Tests/Server/API/UserTelegramAPISecurity.test.ts +231 -0
  97. package/Tests/Server/EnvironmentConfigFrontendSecurity.test.ts +234 -0
  98. package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +202 -0
  99. package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
  100. package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
  101. package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
  102. package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
  103. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
  104. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
  105. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
  106. package/Tests/Server/Services/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
  107. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
  108. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
  109. package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
  110. package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
  111. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
  112. package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
  113. package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
  114. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +226 -1
  115. package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
  116. package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
  117. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
  118. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
  119. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
  120. package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
  121. package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
  122. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +141 -0
  123. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +18 -10
  124. package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
  125. package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
  126. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
  127. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
  128. package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
  129. package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
  130. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
  131. package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
  132. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
  133. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
  134. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
  135. package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
  136. package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
  137. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
  138. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +584 -0
  139. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
  140. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +437 -0
  141. package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
  142. package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
  143. package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
  144. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
  145. package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
  146. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
  147. package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
  148. package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
  149. package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
  150. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriterCapacity.test.ts +458 -0
  151. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +424 -0
  152. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.test.ts +528 -0
  153. package/Tests/Server/Utils/TelemetryExporterEnvironment.test.ts +56 -0
  154. package/Tests/Server/Utils/VM/VMRunnerHostBridgeLatency.test.ts +74 -0
  155. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +100 -7
  156. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +1176 -6
  157. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +220 -0
  158. package/Tests/Types/CustomField/CustomFieldValueMapping.test.ts +348 -0
  159. package/Tests/Types/JSONFunctions.test.ts +260 -0
  160. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
  161. package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +495 -15
  162. package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
  163. package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
  164. package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
  165. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
  166. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
  167. package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
  168. package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
  169. package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
  170. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
  171. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
  172. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
  173. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
  174. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
  175. package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
  176. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
  177. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
  178. package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
  179. package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
  180. package/Tests/Types/NotificationSetting/RoutineEmailEvents.test.ts +47 -0
  181. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +608 -0
  182. package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +434 -0
  183. package/Tests/Types/WebsiteRequest.test.ts +285 -3
  184. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
  185. package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
  186. package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
  187. package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
  188. package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
  189. package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
  190. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
  191. package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
  192. package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
  193. package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
  194. package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
  195. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
  196. package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
  197. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +28 -12
  198. package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
  199. package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
  200. package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
  201. package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
  202. package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
  203. package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
  204. package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
  205. package/Tests/UI/Rum/ChunkLoader.test.ts +1036 -2
  206. package/Tests/UI/Rum/FidelityNotices.test.ts +187 -0
  207. package/Tests/UI/Rum/InactivityMap.test.ts +341 -0
  208. package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +259 -0
  209. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +855 -0
  210. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +594 -0
  211. package/Tests/UI/Rum/ReplayCard.test.tsx +451 -0
  212. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +536 -0
  213. package/Tests/UI/Rum/ReplayEngine.test.ts +2503 -0
  214. package/Tests/UI/Rum/ReplayEngineTypes.test.ts +171 -0
  215. package/Tests/UI/Rum/ReplayHeader.test.tsx +711 -0
  216. package/Tests/UI/Rum/ReplayLink.test.tsx +119 -0
  217. package/Tests/UI/Rum/ReplayPinControl.test.tsx +408 -0
  218. package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +152 -0
  219. package/Tests/UI/Rum/ReplayRail.test.tsx +1296 -0
  220. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +900 -0
  221. package/Tests/UI/Rum/ReplayScrubber.test.tsx +763 -147
  222. package/Tests/UI/Rum/ReplaySignalTypes.test.ts +189 -0
  223. package/Tests/UI/Rum/ReplaySignals.test.ts +1579 -0
  224. package/Tests/UI/Rum/ReplayStage.test.tsx +396 -473
  225. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +918 -0
  226. package/Tests/UI/Rum/ReplayTimeline.test.tsx +696 -0
  227. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +499 -0
  228. package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +346 -0
  229. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +545 -0
  230. package/Tests/UI/Rum/SessionReplayTable.test.tsx +991 -0
  231. package/Tests/UI/Rum/TargetedCapturePanel.test.tsx +254 -0
  232. package/Tests/UI/Telemetry/BrowserExporterIsolation.test.ts +71 -0
  233. package/Tests/UI/Utils/GlobalKeyboardShortcut.test.ts +344 -0
  234. package/Tests/Utils/API.test.ts +308 -0
  235. package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
  236. package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
  237. package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
  238. package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
  239. package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
  240. package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
  241. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
  242. package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
  243. package/Tests/Utils/ValueFormatter.test.ts +148 -0
  244. package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
  245. package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
  246. package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
  247. package/Types/Icon/IconProp.ts +1 -0
  248. package/Types/JSONFunctions.ts +189 -43
  249. package/Types/Monitor/CephAlertTemplates.ts +157 -195
  250. package/Types/Monitor/DockerAlertTemplates.ts +338 -128
  251. package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
  252. package/Types/Monitor/HostAlertTemplates.ts +302 -130
  253. package/Types/Monitor/IotAlertTemplates.ts +112 -104
  254. package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
  255. package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
  256. package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
  257. package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
  258. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
  259. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
  260. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
  261. package/Types/Monitor/RumAlertTemplates.ts +46 -7
  262. package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
  263. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
  264. package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
  265. package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
  266. package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
  267. package/Types/Rum/SessionReplay.ts +209 -0
  268. package/Types/Rum/SessionReplayApi.ts +722 -0
  269. package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
  270. package/Types/Rum/SessionReplayConsentMode.ts +11 -7
  271. package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
  272. package/Types/Rum/SessionReplayHealth.ts +238 -0
  273. package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
  274. package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
  275. package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
  276. package/Types/WebsiteRequest.ts +85 -3
  277. package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
  278. package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
  279. package/UI/Components/Charts/Line/LineChart.tsx +13 -2
  280. package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
  281. package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
  282. package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
  283. package/UI/Components/Charts/Utils/XAxis.ts +217 -0
  284. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +143 -25
  285. package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
  286. package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
  287. package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
  288. package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
  289. package/UI/Components/Header/Header.tsx +25 -9
  290. package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
  291. package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
  292. package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
  293. package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
  294. package/UI/Components/Icon/Icon.tsx +11 -0
  295. package/UI/Components/JSONTable/JSONTable.tsx +2 -2
  296. package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
  297. package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
  298. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
  299. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
  300. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
  301. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
  302. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
  303. package/UI/Components/ModelTable/Column.ts +15 -0
  304. package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
  305. package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
  306. package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
  307. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
  308. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  309. package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
  310. package/UI/Components/Table/CellClassName.ts +81 -0
  311. package/UI/Components/Table/TableRow.tsx +20 -14
  312. package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
  313. package/UI/Components/Table/Types/Column.ts +36 -0
  314. package/UI/Components/Tooltip/Tooltip.tsx +11 -1
  315. package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
  316. package/UI/Components/Workflow/NodePlacement.ts +57 -0
  317. package/UI/Components/Workflow/Workflow.tsx +47 -18
  318. package/UI/Config.ts +15 -33
  319. package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
  320. package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
  321. package/UI/Utils/Telemetry/Telemetry.ts +10 -8
  322. package/Utils/API.ts +129 -3
  323. package/Utils/HTTPResponseBodyReader.ts +221 -0
  324. package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
  325. package/Utils/Rum/ChunkMath.ts +106 -0
  326. package/Utils/Rum/SessionReplayHealth.ts +732 -0
  327. package/Utils/Rum/SessionReplayStringMap.ts +226 -0
  328. package/Utils/Schema/ModelSchema.ts +1 -0
  329. package/Utils/StatusPage/ResourceSearch.ts +290 -0
  330. package/Utils/Telemetry/OriginAllowList.ts +355 -0
  331. package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
  332. package/Utils/ValueFormatter.ts +35 -1
  333. package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
  334. package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
  335. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
  336. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
  338. package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
  339. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
  340. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
  341. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
  342. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  343. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
  344. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
  345. package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
  346. package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
  347. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
  348. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
  349. package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
  350. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  351. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
  352. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
  353. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
  354. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
  355. package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
  356. package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
  358. package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
  360. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
  362. package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
  364. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
  366. package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
  367. package/build/dist/Server/API/TelemetryAPI.js +769 -109
  368. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  369. package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
  370. package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
  371. package/build/dist/Server/API/UserTelegramAPI.js +28 -6
  372. package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
  373. package/build/dist/Server/EnvironmentConfig.js +29 -2
  374. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  375. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
  376. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
  377. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
  378. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
  379. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
  380. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
  381. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
  382. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
  383. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  384. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  385. package/build/dist/Server/Infrastructure/QueueWorker.js +19 -7
  386. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  387. package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
  388. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  389. package/build/dist/Server/Middleware/TelemetryIngest.js +315 -8
  390. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  391. package/build/dist/Server/Services/AccessTokenService.js +1 -0
  392. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  393. package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
  394. package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
  395. package/build/dist/Server/Services/AlertService.js +34 -0
  396. package/build/dist/Server/Services/AlertService.js.map +1 -1
  397. package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
  398. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  399. package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
  400. package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
  401. package/build/dist/Server/Services/GlobalConfigService.js +133 -0
  402. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentCustomFieldService.js +93 -0
  404. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentService.js +32 -0
  406. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  407. package/build/dist/Server/Services/MetricService.js +163 -0
  408. package/build/dist/Server/Services/MetricService.js.map +1 -1
  409. package/build/dist/Server/Services/MonitorService.js +29 -0
  410. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  411. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +79 -27
  412. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/ProjectService.js +22 -0
  414. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  415. package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
  416. package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
  417. package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
  418. package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
  419. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
  420. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
  421. package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
  422. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  423. package/build/dist/Server/Services/TeamMemberService.js +62 -2
  424. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  425. package/build/dist/Server/Services/TeamPermissionService.js +166 -3
  426. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  427. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
  428. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  429. package/build/dist/Server/Services/UserNotificationSettingService.js +26 -6
  430. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  431. package/build/dist/Server/Services/UserTelegramService.js +257 -4
  432. package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
  433. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  434. package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
  435. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  436. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
  437. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
  438. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
  439. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
  440. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
  441. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
  442. package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
  443. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  444. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +38 -5
  445. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -1
  446. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +44 -2
  447. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  448. package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
  449. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
  450. package/build/dist/Server/Utils/LogRedaction.js +20 -0
  451. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  452. package/build/dist/Server/Utils/Logger.js +10 -0
  453. package/build/dist/Server/Utils/Logger.js.map +1 -1
  454. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +287 -68
  455. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  456. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
  457. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  458. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
  459. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  460. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +88 -13
  461. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  462. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  463. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  464. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +22 -0
  465. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  466. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
  467. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
  468. package/build/dist/Server/Utils/SSRFProtection.js +136 -9
  469. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  470. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
  471. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
  472. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
  473. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
  474. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
  475. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  476. package/build/dist/Server/Utils/StartServer.js +3 -14
  477. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  478. package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
  479. package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
  480. package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
  481. package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
  482. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
  483. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
  484. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
  485. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
  486. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
  487. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
  488. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  489. package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
  490. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  491. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +60 -0
  492. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -0
  493. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js +20 -0
  494. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js.map +1 -0
  495. package/build/dist/Types/CustomField/CustomFieldValueMapping.js +141 -0
  496. package/build/dist/Types/CustomField/CustomFieldValueMapping.js.map +1 -0
  497. package/build/dist/Types/Icon/IconProp.js +1 -0
  498. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  499. package/build/dist/Types/JSONFunctions.js +118 -37
  500. package/build/dist/Types/JSONFunctions.js.map +1 -1
  501. package/build/dist/Types/Monitor/CephAlertTemplates.js +130 -171
  502. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  503. package/build/dist/Types/Monitor/DockerAlertTemplates.js +286 -121
  504. package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
  505. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
  506. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
  507. package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
  508. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
  509. package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
  510. package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
  511. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
  512. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  513. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
  514. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  515. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
  516. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
  517. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
  518. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
  519. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
  520. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
  521. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
  522. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  523. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
  524. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
  525. package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
  526. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  527. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
  528. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
  529. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
  530. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
  531. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
  532. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
  533. package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
  534. package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
  535. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
  536. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
  537. package/build/dist/Types/Rum/SessionReplay.js +117 -0
  538. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  539. package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
  540. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
  541. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
  542. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
  543. package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
  544. package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
  545. package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
  546. package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
  547. package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
  548. package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
  549. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
  550. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
  551. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
  552. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
  553. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
  554. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
  555. package/build/dist/Types/WebsiteRequest.js +55 -3
  556. package/build/dist/Types/WebsiteRequest.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
  558. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
  560. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
  562. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  563. package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
  564. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
  565. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  566. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
  567. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  568. package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
  569. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  570. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +80 -6
  571. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  572. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +118 -0
  573. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -0
  574. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +112 -7
  575. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  576. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
  577. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  578. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
  579. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
  580. package/build/dist/UI/Components/Header/Header.js +2 -3
  581. package/build/dist/UI/Components/Header/Header.js.map +1 -1
  582. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
  583. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
  584. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
  585. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
  586. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
  587. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
  588. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
  589. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
  590. package/build/dist/UI/Components/Icon/Icon.js +5 -0
  591. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  592. package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
  593. package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
  594. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
  595. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
  596. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
  597. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
  598. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
  599. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
  600. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
  601. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  602. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
  603. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  604. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +38 -0
  605. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  606. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
  607. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
  608. package/build/dist/UI/Components/Table/CellClassName.js +55 -0
  609. package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
  610. package/build/dist/UI/Components/Table/TableRow.js +16 -13
  611. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  612. package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
  613. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
  614. package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
  615. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  616. package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
  617. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  618. package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
  619. package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
  620. package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
  621. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  622. package/build/dist/UI/Config.js +10 -20
  623. package/build/dist/UI/Config.js.map +1 -1
  624. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
  625. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
  626. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
  627. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
  628. package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
  629. package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
  630. package/build/dist/Utils/API.js +67 -5
  631. package/build/dist/Utils/API.js.map +1 -1
  632. package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
  633. package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
  636. package/build/dist/Utils/Rum/ChunkMath.js +76 -0
  637. package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
  638. package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
  639. package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
  640. package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
  641. package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
  642. package/build/dist/Utils/Schema/ModelSchema.js +1 -0
  643. package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
  644. package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
  645. package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
  646. package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
  647. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
  648. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
  649. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
  650. package/build/dist/Utils/ValueFormatter.js +32 -1
  651. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  652. package/package.json +1 -1
@@ -0,0 +1,420 @@
1
+ import SessionReplayGateCache, {
2
+ SessionReplayGatePolicy,
3
+ } from "../../../Server/Utils/SessionReplay/SessionReplayGateCache";
4
+ import OriginAllowList from "../../../Utils/Telemetry/OriginAllowList";
5
+ import { afterEach, describe, expect, test } from "@jest/globals";
6
+
7
+ /*
8
+ * SessionReplayGateCache.isOriginAllowed after it was rewritten to delegate
9
+ * its matching to the shared Common/Utils/Telemetry/OriginAllowList. The
10
+ * point of this suite is that the rewrite changed NOTHING a customer can
11
+ * observe: the gate answers today exactly what it answered before the shared
12
+ * matcher existed.
13
+ *
14
+ * READ THIS BEFORE "FIXING" THE EMPTY-LIST RULE.
15
+ *
16
+ * An EMPTY allowlist here means "accept ANY origin". That is deliberately the
17
+ * INVERSE of the rule the Browser telemetry-ingestion-key path applies, where
18
+ * an empty allowlist means "accept NOTHING" (see TelemetryIngest -
19
+ * `policy.allowedOrigins.length === 0 || !OriginAllowList.matches(...)`
20
+ * refuses). The two are not inconsistent by accident:
21
+ *
22
+ * - session replay shipped WITHOUT an allowlist. The column was retrofitted
23
+ * as optional hardening, defaults to '[]', and every installation running
24
+ * today has it empty. Reading empty as "refuse" would stop recording for
25
+ * all of them on upgrade, with no customer action and no warning - a
26
+ * silent, total outage of a feature they had working.
27
+ * - a Browser ingestion key is NEW. Nothing depends on it yet, so it can
28
+ * start closed, and it must: a public credential pasted into a web page
29
+ * with no origin binding is not a credential at all.
30
+ *
31
+ * The shared matcher stays out of this argument on purpose - OriginAllowList
32
+ * .matches returns false for an empty list, meaning only "nothing in this
33
+ * list matched", and each caller applies its own default. So the permissive
34
+ * branch lives HERE, in the gate, and the strict branch lives in the ingest
35
+ * middleware. Do not "align" one with the other; changing this one breaks
36
+ * live installations, and changing that one reopens the hole the Browser key
37
+ * type was built to close.
38
+ *
39
+ * Existing coverage this suite deliberately does not repeat: the exact-match,
40
+ * unlisted-origin, missing-Origin-once-configured, origin-side case and
41
+ * padding, and subdomain-of-an-exact-entry cases are pinned by
42
+ * Common/Tests/Server/Utils/SessionReplay/SessionReplayOriginAllowlist.test.ts,
43
+ * and the matcher's own semantics are pinned in depth by
44
+ * Common/Tests/Utils/Telemetry/OriginAllowList.test.ts. What is added here is
45
+ * the behaviour that only became reachable through the gate once it started
46
+ * delegating - wildcards, scheme and port strictness, allowlist-side
47
+ * normalization - plus the delegation itself and the inverse-polarity rule
48
+ * above.
49
+ */
50
+
51
+ type BuildPolicyFunction = (
52
+ allowedOrigins: Array<string>,
53
+ ) => SessionReplayGatePolicy;
54
+
55
+ const buildPolicy: BuildPolicyFunction = (
56
+ allowedOrigins: Array<string>,
57
+ ): SessionReplayGatePolicy => {
58
+ return {
59
+ allowedOrigins: allowedOrigins,
60
+ } as unknown as SessionReplayGatePolicy;
61
+ };
62
+
63
+ afterEach(() => {
64
+ jest.restoreAllMocks();
65
+ });
66
+
67
+ describe("SessionReplayGateCache.isOriginAllowed - an empty allowlist accepts anything", () => {
68
+ /*
69
+ * The rule that must survive every refactor of this function, because
70
+ * every installation that has not filled the list in depends on it.
71
+ */
72
+ test("an unconfigured allowlist accepts an origin nobody named", () => {
73
+ expect(
74
+ SessionReplayGateCache.isOriginAllowed(
75
+ buildPolicy([]),
76
+ "https://anything.example.com",
77
+ ),
78
+ ).toBe(true);
79
+ });
80
+
81
+ test("an unconfigured allowlist accepts a request that sends no Origin at all", () => {
82
+ expect(
83
+ SessionReplayGateCache.isOriginAllowed(buildPolicy([]), undefined),
84
+ ).toBe(true);
85
+ });
86
+
87
+ test("an unconfigured allowlist accepts a blank Origin header", () => {
88
+ /*
89
+ * A blank header is the same situation as a missing one and has to reach
90
+ * the same answer, or the gate becomes sensitive to which proxy stripped
91
+ * the value.
92
+ */
93
+ expect(SessionReplayGateCache.isOriginAllowed(buildPolicy([]), "")).toBe(
94
+ true,
95
+ );
96
+ expect(SessionReplayGateCache.isOriginAllowed(buildPolicy([]), " ")).toBe(
97
+ true,
98
+ );
99
+ });
100
+
101
+ /*
102
+ * The polarity assertion, spelled out so the inverse rules are visible side
103
+ * by side in one test: the shared matcher says "nothing matched" for an
104
+ * empty list, and the gate - not the matcher - is what turns that into
105
+ * "allow". The ingest path turns the same answer into "refuse".
106
+ */
107
+ test("the permissive empty-list rule lives in the gate, not in the shared matcher", () => {
108
+ const emptyList: Array<string> = [];
109
+
110
+ expect(OriginAllowList.matches("https://app.example.com", emptyList)).toBe(
111
+ false,
112
+ );
113
+ expect(
114
+ SessionReplayGateCache.isOriginAllowed(
115
+ buildPolicy(emptyList),
116
+ "https://app.example.com",
117
+ ),
118
+ ).toBe(true);
119
+ });
120
+
121
+ test("an empty allowlist is answered without consulting the shared matcher", () => {
122
+ /*
123
+ * Not merely an optimisation: if the empty case were routed through
124
+ * OriginAllowList.matches, the gate would inherit that module's
125
+ * "nothing matched" answer and every unconfigured installation would stop
126
+ * recording.
127
+ */
128
+ const matchesSpy: jest.SpyInstance = jest.spyOn(OriginAllowList, "matches");
129
+
130
+ expect(
131
+ SessionReplayGateCache.isOriginAllowed(
132
+ buildPolicy([]),
133
+ "https://app.example.com",
134
+ ),
135
+ ).toBe(true);
136
+
137
+ expect(matchesSpy).not.toHaveBeenCalled();
138
+ });
139
+ });
140
+
141
+ describe("SessionReplayGateCache.isOriginAllowed - a configured allowlist is strict", () => {
142
+ test("a request with no Origin is refused once the customer has named their origins", () => {
143
+ /*
144
+ * The pivot: the permissive branch applies only while the list is empty.
145
+ * If a missing header were waved through here, the allowlist could be
146
+ * bypassed by simply not sending one.
147
+ */
148
+ const policy: SessionReplayGatePolicy = buildPolicy([
149
+ "https://app.example.com",
150
+ ]);
151
+
152
+ expect(SessionReplayGateCache.isOriginAllowed(policy, undefined)).toBe(
153
+ false,
154
+ );
155
+ expect(SessionReplayGateCache.isOriginAllowed(policy, "")).toBe(false);
156
+ expect(SessionReplayGateCache.isOriginAllowed(policy, " ")).toBe(false);
157
+ });
158
+
159
+ test("an exactly listed origin is accepted", () => {
160
+ expect(
161
+ SessionReplayGateCache.isOriginAllowed(
162
+ buildPolicy(["https://app.example.com"]),
163
+ "https://app.example.com",
164
+ ),
165
+ ).toBe(true);
166
+ });
167
+
168
+ test("a wildcard entry accepts a subdomain, so per-tenant hosts need not be enumerated", () => {
169
+ const policy: SessionReplayGatePolicy = buildPolicy([
170
+ "https://*.example.com",
171
+ ]);
172
+
173
+ expect(
174
+ SessionReplayGateCache.isOriginAllowed(
175
+ policy,
176
+ "https://tenant-a.example.com",
177
+ ),
178
+ ).toBe(true);
179
+ expect(
180
+ SessionReplayGateCache.isOriginAllowed(
181
+ policy,
182
+ "https://deep.tenant-a.example.com",
183
+ ),
184
+ ).toBe(true);
185
+ });
186
+
187
+ /*
188
+ * "*.example.com" is a statement about subdomains. The customer who wrote
189
+ * it did not list the apex, and inferring it would quietly widen every
190
+ * allowlist in the product by one origin.
191
+ */
192
+ test("a wildcard entry does not accept the bare apex domain", () => {
193
+ expect(
194
+ SessionReplayGateCache.isOriginAllowed(
195
+ buildPolicy(["https://*.example.com"]),
196
+ "https://example.com",
197
+ ),
198
+ ).toBe(false);
199
+ });
200
+
201
+ /*
202
+ * The attack this branch exists to stop: "evilexample.com" is a domain
203
+ * anyone can register, and a suffix match that forgot the dot would hand
204
+ * its owner the ability to write recordings into this project.
205
+ */
206
+ test("a wildcard entry does not accept an attacker-registrable lookalike domain", () => {
207
+ const policy: SessionReplayGatePolicy = buildPolicy([
208
+ "https://*.example.com",
209
+ ]);
210
+
211
+ expect(
212
+ SessionReplayGateCache.isOriginAllowed(policy, "https://evilexample.com"),
213
+ ).toBe(false);
214
+ expect(
215
+ SessionReplayGateCache.isOriginAllowed(
216
+ policy,
217
+ "https://app.evilexample.com",
218
+ ),
219
+ ).toBe(false);
220
+ });
221
+
222
+ test("the scheme is part of the origin - http never satisfies an https entry", () => {
223
+ expect(
224
+ SessionReplayGateCache.isOriginAllowed(
225
+ buildPolicy(["https://app.example.com"]),
226
+ "http://app.example.com",
227
+ ),
228
+ ).toBe(false);
229
+ expect(
230
+ SessionReplayGateCache.isOriginAllowed(
231
+ buildPolicy(["http://app.example.com"]),
232
+ "https://app.example.com",
233
+ ),
234
+ ).toBe(false);
235
+ });
236
+
237
+ test("a wildcard entry does not relax the scheme either", () => {
238
+ expect(
239
+ SessionReplayGateCache.isOriginAllowed(
240
+ buildPolicy(["https://*.example.com"]),
241
+ "http://app.example.com",
242
+ ),
243
+ ).toBe(false);
244
+ });
245
+
246
+ test("the port is part of the origin - a different port is a different origin", () => {
247
+ expect(
248
+ SessionReplayGateCache.isOriginAllowed(
249
+ buildPolicy(["https://app.example.com:8443"]),
250
+ "https://app.example.com:9443",
251
+ ),
252
+ ).toBe(false);
253
+ expect(
254
+ SessionReplayGateCache.isOriginAllowed(
255
+ buildPolicy(["https://app.example.com"]),
256
+ "https://app.example.com:8443",
257
+ ),
258
+ ).toBe(false);
259
+ expect(
260
+ SessionReplayGateCache.isOriginAllowed(
261
+ buildPolicy(["https://app.example.com:8443"]),
262
+ "https://app.example.com",
263
+ ),
264
+ ).toBe(false);
265
+ });
266
+
267
+ test("a matching explicit port is accepted", () => {
268
+ expect(
269
+ SessionReplayGateCache.isOriginAllowed(
270
+ buildPolicy(["http://localhost:3000"]),
271
+ "http://localhost:3000",
272
+ ),
273
+ ).toBe(true);
274
+ });
275
+
276
+ /*
277
+ * Origins are case-insensitive in scheme and host, and customers paste
278
+ * allowlist entries out of address bars, docs and spreadsheets. Matching
279
+ * has to be case-insensitive on BOTH sides or an allowlist stops working
280
+ * because of how it was typed.
281
+ */
282
+ test("matching is case-insensitive on the allowlist side as well as the request side", () => {
283
+ expect(
284
+ SessionReplayGateCache.isOriginAllowed(
285
+ buildPolicy(["HTTPS://APP.EXAMPLE.COM"]),
286
+ "https://app.example.com",
287
+ ),
288
+ ).toBe(true);
289
+ expect(
290
+ SessionReplayGateCache.isOriginAllowed(
291
+ buildPolicy(["https://*.EXAMPLE.com"]),
292
+ "https://TENANT.example.COM",
293
+ ),
294
+ ).toBe(true);
295
+ });
296
+
297
+ /*
298
+ * Entries arrive from a text field. A stray space or a trailing slash
299
+ * copied from the address bar must not silently turn the allowlist into
300
+ * one that matches nothing - that failure looks identical to a working
301
+ * configuration until the recordings stop arriving.
302
+ */
303
+ test("a whitespace-padded allowlist entry still matches", () => {
304
+ expect(
305
+ SessionReplayGateCache.isOriginAllowed(
306
+ buildPolicy([" https://app.example.com "]),
307
+ "https://app.example.com",
308
+ ),
309
+ ).toBe(true);
310
+ });
311
+
312
+ test("a trailing slash on either side does not stop a match", () => {
313
+ expect(
314
+ SessionReplayGateCache.isOriginAllowed(
315
+ buildPolicy(["https://app.example.com/"]),
316
+ "https://app.example.com",
317
+ ),
318
+ ).toBe(true);
319
+ expect(
320
+ SessionReplayGateCache.isOriginAllowed(
321
+ buildPolicy(["https://app.example.com"]),
322
+ "https://app.example.com/",
323
+ ),
324
+ ).toBe(true);
325
+ });
326
+
327
+ test("a blank entry does not turn a configured allowlist back into an open one", () => {
328
+ /*
329
+ * A list of blanks is still a configured list: the customer meant to
330
+ * restrict something. It must refuse rather than fall back to the
331
+ * empty-list permissive branch.
332
+ */
333
+ const policy: SessionReplayGatePolicy = buildPolicy(["", " "]);
334
+
335
+ expect(
336
+ SessionReplayGateCache.isOriginAllowed(
337
+ policy,
338
+ "https://anything.example.com",
339
+ ),
340
+ ).toBe(false);
341
+ });
342
+
343
+ test("an origin matching any one entry of several is accepted", () => {
344
+ const policy: SessionReplayGatePolicy = buildPolicy([
345
+ "https://app.example.com",
346
+ "https://*.other.example",
347
+ "http://localhost:3000",
348
+ ]);
349
+
350
+ expect(
351
+ SessionReplayGateCache.isOriginAllowed(policy, "http://localhost:3000"),
352
+ ).toBe(true);
353
+ expect(
354
+ SessionReplayGateCache.isOriginAllowed(
355
+ policy,
356
+ "https://tenant.other.example",
357
+ ),
358
+ ).toBe(true);
359
+ expect(
360
+ SessionReplayGateCache.isOriginAllowed(
361
+ policy,
362
+ "https://not.listed.example",
363
+ ),
364
+ ).toBe(false);
365
+ });
366
+ });
367
+
368
+ describe("SessionReplayGateCache.isOriginAllowed - the delegation itself", () => {
369
+ test("a configured allowlist is answered by the shared matcher, with the request's own arguments", () => {
370
+ const matchesSpy: jest.SpyInstance = jest.spyOn(OriginAllowList, "matches");
371
+
372
+ const allowedOrigins: Array<string> = ["https://app.example.com"];
373
+
374
+ SessionReplayGateCache.isOriginAllowed(
375
+ buildPolicy(allowedOrigins),
376
+ "https://app.example.com",
377
+ );
378
+
379
+ expect(matchesSpy).toHaveBeenCalledTimes(1);
380
+ expect(matchesSpy).toHaveBeenCalledWith(
381
+ "https://app.example.com",
382
+ allowedOrigins,
383
+ );
384
+ });
385
+
386
+ /*
387
+ * The gate must not second-guess the matcher on a configured list. If it
388
+ * ever grew a rule of its own here, session replay and Browser-key ingest
389
+ * would start disagreeing about which origins are legitimate - a split that
390
+ * is confusing to debug and exploitable in whichever direction is looser.
391
+ */
392
+ test("on a configured allowlist the gate returns exactly what the shared matcher returns", () => {
393
+ const allowedOrigins: Array<string> = [
394
+ "https://app.example.com",
395
+ "https://*.tenant.example.com",
396
+ ];
397
+
398
+ const origins: Array<string | undefined> = [
399
+ "https://app.example.com",
400
+ "https://a.tenant.example.com",
401
+ "https://tenant.example.com",
402
+ "https://eviltenant.example.com",
403
+ "http://app.example.com",
404
+ "https://app.example.com:8443",
405
+ " HTTPS://APP.EXAMPLE.COM/ ",
406
+ "https://unlisted.example.com",
407
+ "",
408
+ undefined,
409
+ ];
410
+
411
+ for (const origin of origins) {
412
+ expect(
413
+ SessionReplayGateCache.isOriginAllowed(
414
+ buildPolicy(allowedOrigins),
415
+ origin,
416
+ ),
417
+ ).toBe(OriginAllowList.matches(origin, allowedOrigins));
418
+ }
419
+ });
420
+ });
@@ -0,0 +1,253 @@
1
+ import {
2
+ RESEND_COOLDOWN_SECONDS,
3
+ VERIFICATION_CODE_EXPIRY_MINUTES,
4
+ } from "../../../Server/Utils/ChannelVerification";
5
+ import TelegramVerificationToken, {
6
+ TELEGRAM_VERIFICATION_TOKEN_LENGTH,
7
+ } from "../../../Server/Utils/TelegramVerificationToken";
8
+
9
+ describe("TelegramVerificationToken", () => {
10
+ const issuedAt: Date = new Date("2026-09-04T12:00:00.000Z");
11
+
12
+ describe("mint", () => {
13
+ test("creates a Telegram-safe 52-character bearer capability", () => {
14
+ const token: string = TelegramVerificationToken.mint(issuedAt);
15
+
16
+ expect(token).toHaveLength(TELEGRAM_VERIFICATION_TOKEN_LENGTH);
17
+ expect(TelegramVerificationToken.isValidShape(token)).toBe(true);
18
+ expect(token).toMatch(/^[A-Za-z0-9_-]+$/);
19
+ expect(token).toMatch(/^[0-9a-z]{8}_[A-Za-z0-9_-]{43}$/);
20
+ });
21
+
22
+ test("uses fresh CSPRNG material for tokens issued in the same second", () => {
23
+ const tokens: Set<string> = new Set(
24
+ Array.from({ length: 32 }, () => {
25
+ return TelegramVerificationToken.mint(issuedAt);
26
+ }),
27
+ );
28
+
29
+ expect(tokens.size).toBe(32);
30
+ });
31
+
32
+ test("encodes the issue time to whole-second precision", () => {
33
+ const token: string = TelegramVerificationToken.mint(
34
+ new Date("2026-09-04T12:00:00.987Z"),
35
+ );
36
+
37
+ expect(TelegramVerificationToken.getIssuedAt(token)).toEqual(issuedAt);
38
+ });
39
+
40
+ test("stays below Telegram's 64-character start parameter limit", () => {
41
+ expect(TELEGRAM_VERIFICATION_TOKEN_LENGTH).toBeLessThanOrEqual(64);
42
+ });
43
+ });
44
+
45
+ describe("shape validation", () => {
46
+ test.each([
47
+ undefined,
48
+ null,
49
+ "",
50
+ "123456",
51
+ "00000000_short",
52
+ "000000000_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
53
+ "00000000_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!",
54
+ "ZZZZZZZZ_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
55
+ "00000000.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
56
+ {},
57
+ ])("rejects malformed token %#", (token: unknown) => {
58
+ expect(TelegramVerificationToken.isValidShape(token)).toBe(false);
59
+ expect(TelegramVerificationToken.getIssuedAt(token)).toBeNull();
60
+ });
61
+
62
+ test("rejects an all-zero timestamp", () => {
63
+ const token: string = `00000000_${"A".repeat(43)}`;
64
+
65
+ expect(TelegramVerificationToken.isValidShape(token)).toBe(true);
66
+ expect(TelegramVerificationToken.getIssuedAt(token)).toBeNull();
67
+ expect(
68
+ TelegramVerificationToken.isExpired({ token, now: issuedAt }),
69
+ ).toBe(true);
70
+ });
71
+ });
72
+
73
+ describe("expiry", () => {
74
+ const token: string = TelegramVerificationToken.mint(issuedAt);
75
+ const expiryMs: number = VERIFICATION_CODE_EXPIRY_MINUTES * 60 * 1000;
76
+
77
+ test("accepts a token immediately after issue", () => {
78
+ expect(
79
+ TelegramVerificationToken.isExpired({ token, now: issuedAt }),
80
+ ).toBe(false);
81
+ });
82
+
83
+ test("accepts a token one millisecond before its deadline", () => {
84
+ expect(
85
+ TelegramVerificationToken.isExpired({
86
+ token,
87
+ now: new Date(issuedAt.getTime() + expiryMs - 1),
88
+ }),
89
+ ).toBe(false);
90
+ });
91
+
92
+ test("expires a token exactly at its deadline", () => {
93
+ expect(
94
+ TelegramVerificationToken.isExpired({
95
+ token,
96
+ now: new Date(issuedAt.getTime() + expiryMs),
97
+ }),
98
+ ).toBe(true);
99
+ });
100
+
101
+ test("rejects a token issued in the future", () => {
102
+ expect(
103
+ TelegramVerificationToken.isExpired({
104
+ token,
105
+ now: new Date(issuedAt.getTime() - 1),
106
+ }),
107
+ ).toBe(true);
108
+ });
109
+
110
+ test("treats a legacy six-digit code as expired", () => {
111
+ expect(
112
+ TelegramVerificationToken.isExpired({
113
+ token: "123456",
114
+ now: issuedAt,
115
+ }),
116
+ ).toBe(true);
117
+ });
118
+ });
119
+
120
+ describe("rotation cooldown", () => {
121
+ const token: string = TelegramVerificationToken.mint(issuedAt);
122
+
123
+ test("requires the full cooldown immediately after issue", () => {
124
+ expect(
125
+ TelegramVerificationToken.getResendRetryAfterSeconds({
126
+ token,
127
+ now: issuedAt,
128
+ }),
129
+ ).toBe(RESEND_COOLDOWN_SECONDS);
130
+ });
131
+
132
+ test("rounds a partial remaining second up", () => {
133
+ expect(
134
+ TelegramVerificationToken.getResendRetryAfterSeconds({
135
+ token,
136
+ now: new Date(issuedAt.getTime() + 1_500),
137
+ }),
138
+ ).toBe(RESEND_COOLDOWN_SECONDS - 1);
139
+ });
140
+
141
+ test("allows rotation at the cooldown boundary", () => {
142
+ expect(
143
+ TelegramVerificationToken.getResendRetryAfterSeconds({
144
+ token,
145
+ now: new Date(issuedAt.getTime() + RESEND_COOLDOWN_SECONDS * 1000),
146
+ }),
147
+ ).toBe(0);
148
+ });
149
+
150
+ test("allows immediate replacement of legacy malformed values", () => {
151
+ expect(
152
+ TelegramVerificationToken.getResendRetryAfterSeconds({
153
+ token: "123456",
154
+ now: issuedAt,
155
+ }),
156
+ ).toBe(0);
157
+ });
158
+ });
159
+
160
+ describe("one-time and rate-limit values", () => {
161
+ test("hashes the live token before using it as a rate-limit key", () => {
162
+ const token: string = TelegramVerificationToken.mint(issuedAt);
163
+ const key: string = TelegramVerificationToken.getRateLimitKey(token);
164
+
165
+ expect(key).toMatch(/^[0-9a-f]{64}$/);
166
+ expect(key).not.toContain(token);
167
+ expect(TelegramVerificationToken.getRateLimitKey(token)).toBe(key);
168
+ expect(TelegramVerificationToken.getRateLimitKey(`${token}A`)).not.toBe(
169
+ key,
170
+ );
171
+ });
172
+
173
+ test("burned values can never pass live-token validation", () => {
174
+ const first: string = TelegramVerificationToken.mintUnusableValue();
175
+ const second: string = TelegramVerificationToken.mintUnusableValue();
176
+
177
+ expect(first).toMatch(/^[0-9a-f]{64}$/);
178
+ expect(second).not.toBe(first);
179
+ expect(TelegramVerificationToken.isValidShape(first)).toBe(false);
180
+ });
181
+ });
182
+
183
+ describe("webhook secret validation", () => {
184
+ test.each([
185
+ "oneuptime_telegram_secret_01234567",
186
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ_12345",
187
+ "abcdefghijklmnopqrstuvwxyz-12345",
188
+ ])(
189
+ "accepts strong Telegram-safe configured values %#",
190
+ (secret: string) => {
191
+ expect(TelegramVerificationToken.isWebhookSecretStrong(secret)).toBe(
192
+ true,
193
+ );
194
+ },
195
+ );
196
+
197
+ test.each([
198
+ undefined,
199
+ "",
200
+ "short-secret",
201
+ "oneuptime.telegram.secret.01234567",
202
+ "oneuptime telegram secret 01234567",
203
+ "🔐oneuptime_telegram_secret_01234567",
204
+ "a".repeat(101),
205
+ ])(
206
+ "rejects weak or unsupported configured values %#",
207
+ (secret: unknown) => {
208
+ expect(TelegramVerificationToken.isWebhookSecretStrong(secret)).toBe(
209
+ false,
210
+ );
211
+ },
212
+ );
213
+
214
+ test("accepts an exact configured secret", () => {
215
+ expect(
216
+ TelegramVerificationToken.isWebhookSecretValid({
217
+ configuredSecret: "a-strong-secret",
218
+ providedSecret: "a-strong-secret",
219
+ }),
220
+ ).toBe(true);
221
+ });
222
+
223
+ test("normalizes administrator whitespace around the configured value", () => {
224
+ expect(
225
+ TelegramVerificationToken.isWebhookSecretValid({
226
+ configuredSecret: " a-strong-secret ",
227
+ providedSecret: "a-strong-secret",
228
+ }),
229
+ ).toBe(true);
230
+ });
231
+
232
+ test.each([
233
+ { configuredSecret: undefined, providedSecret: "secret" },
234
+ { configuredSecret: "", providedSecret: "secret" },
235
+ { configuredSecret: "secret", providedSecret: undefined },
236
+ { configuredSecret: "secret", providedSecret: "" },
237
+ { configuredSecret: "secret", providedSecret: "Secret" },
238
+ { configuredSecret: "secret", providedSecret: "secret " },
239
+ { configuredSecret: "secret", providedSecret: "short" },
240
+ { configuredSecret: "🔐secret", providedSecret: "🔐secrex" },
241
+ ])(
242
+ "rejects absent or mismatched values %#",
243
+ (data: {
244
+ configuredSecret: string | undefined;
245
+ providedSecret: string | undefined;
246
+ }) => {
247
+ expect(TelegramVerificationToken.isWebhookSecretValid(data)).toBe(
248
+ false,
249
+ );
250
+ },
251
+ );
252
+ });
253
+ });