@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,608 @@
1
+ import { describe, expect, it } from "@jest/globals";
2
+ import {
3
+ SESSION_REPLAY_OMITTED_CHUNKS_HEADER,
4
+ SESSION_REPLAY_READ_ERROR_PREFIXES,
5
+ SESSION_REPLAY_READ_ERROR_PREFIX_ERASED,
6
+ SESSION_REPLAY_READ_ERROR_PREFIX_EXPIRED,
7
+ SESSION_REPLAY_READ_ERROR_PREFIX_NOT_FOUND,
8
+ SESSION_REPLAY_SORT_BY_VALUES,
9
+ SessionReplayChunksRequestDto,
10
+ SessionReplayExceptionSessionDto,
11
+ SessionReplayForExceptionResponseDto,
12
+ SessionReplayHeartbeatResponseDto,
13
+ SessionReplayListItemDto,
14
+ SessionReplayListRequestDto,
15
+ SessionReplayListResponseDto,
16
+ SessionReplayManifestHeaderDto,
17
+ SessionReplayManifestRequestDto,
18
+ SessionReplayManifestResponseDto,
19
+ SessionReplayManifestTabDto,
20
+ SessionReplayViewDto,
21
+ SessionReplayViewsRequestDto,
22
+ SessionReplayViewsResponseDto,
23
+ isSessionReplaySortedListCursor,
24
+ parseSessionReplayListCursor,
25
+ readDtoBoolean,
26
+ readDtoNumber,
27
+ readDtoNumberArray,
28
+ readDtoOptionalNumber,
29
+ readDtoOptionalString,
30
+ readDtoString,
31
+ readDtoStringArray,
32
+ readDtoStringMap,
33
+ readDtoUnixMs,
34
+ } from "../../../Types/Rum/SessionReplayApi";
35
+ import { SessionReplayChunkManifestEntry } from "../../../Types/Rum/SessionReplay";
36
+
37
+ /*
38
+ * The DTOs are the wire between the Dashboard and TelemetryAPI's
39
+ * session-replay routes. The fixtures below are shaped EXACTLY like the
40
+ * handlers answer today (SessionReplayReadService.listSessions /
41
+ * getSessionHeader / getManifest / getSessionsForException through
42
+ * Response.sendJsonObjectResponse, which turns Dates into ISO strings).
43
+ * Two things are pinned:
44
+ *
45
+ * 1. Today's response satisfies the DTO with no additive field present,
46
+ * so an older server (or a cached response) still parses.
47
+ * 2. The readDto* helpers keep the defensive semantics the player and
48
+ * table parsers were written with.
49
+ *
50
+ * The typed fixtures are also compile-time assertions: if a required
51
+ * field is added to a DTO, this file stops type-checking.
52
+ */
53
+
54
+ const START_ISO: string = "2026-09-04T10:00:00.000Z";
55
+ const END_ISO: string = "2026-09-04T10:04:12.000Z";
56
+
57
+ /* One row of /list as listSessions builds it, serialised. */
58
+ const legacyListItem: SessionReplayListItemDto = {
59
+ sessionId: "sess-1",
60
+ rumApplicationId: "app-1",
61
+ startTime: START_ISO,
62
+ endTime: END_ISO,
63
+ durationMs: 252000,
64
+ isFinalized: true,
65
+ sealedReason: "final-chunk",
66
+ chunkCount: 17,
67
+ maxChunkIndex: 16,
68
+ missingChunkCount: 0,
69
+ eventCount: 4210,
70
+ payloadBytes: 812345,
71
+ hasError: true,
72
+ errorCount: 2,
73
+ rageClickCount: 1,
74
+ deadClickCount: 0,
75
+ errorClickCount: 0,
76
+ refreshRageCount: 0,
77
+ pageCount: 6,
78
+ triggerReason: "sampled",
79
+ entryUrl: "https://acme.com/cart",
80
+ exitUrl: "https://acme.com/pay",
81
+ browserName: "Chrome",
82
+ browserVersion: "128",
83
+ osName: "macOS",
84
+ deviceType: "desktop",
85
+ countryCode: "US",
86
+ viewportWidth: 1440,
87
+ viewportHeight: 900,
88
+ identifiedUserKey: "hmac-1",
89
+ samplePercentageAtCapture: 100,
90
+ };
91
+
92
+ const legacyListResponse: SessionReplayListResponseDto = {
93
+ sessions: [legacyListItem],
94
+ nextCursor: { startTimeUnixMs: Date.parse(START_ISO), sessionId: "sess-1" },
95
+ };
96
+
97
+ /* The chunk row getManifest builds. */
98
+ const legacyChunk: SessionReplayChunkManifestEntry = {
99
+ chunkIndex: 0,
100
+ tabId: "tab-1",
101
+ chunkStartOffsetMs: 0,
102
+ chunkEndOffsetMs: 15000,
103
+ eventCount: 240,
104
+ hasFullSnapshot: true,
105
+ payloadBytes: 54000,
106
+ errorCount: 0,
107
+ rageClickCount: 0,
108
+ deadClickCount: 0,
109
+ errorClickCount: 0,
110
+ refreshRageCount: 0,
111
+ routeCount: 1,
112
+ };
113
+
114
+ const legacyTab: SessionReplayManifestTabDto = {
115
+ tabId: "tab-1",
116
+ chunks: [legacyChunk],
117
+ chunkIndexes: [0],
118
+ fullSnapshotChunkIndexes: [0],
119
+ gaps: [],
120
+ maxChunkIndex: 0,
121
+ totalPayloadBytes: 54000,
122
+ };
123
+
124
+ /* The header getSessionHeader builds, serialised. */
125
+ const legacyHeader: SessionReplayManifestHeaderDto = {
126
+ sessionId: "sess-1",
127
+ projectId: "proj-1",
128
+ rumApplicationId: "app-1",
129
+ startTime: START_ISO,
130
+ endTime: END_ISO,
131
+ durationMs: 252000,
132
+ isFinalized: true,
133
+ sealedReason: "final-chunk",
134
+ chunkCount: 17,
135
+ maxChunkIndex: 16,
136
+ missingChunkCount: 0,
137
+ eventCount: 4210,
138
+ payloadBytes: 812345,
139
+ hasError: true,
140
+ errorCount: 2,
141
+ rageClickCount: 1,
142
+ deadClickCount: 0,
143
+ errorClickCount: 0,
144
+ refreshRageCount: 0,
145
+ pageCount: 6,
146
+ triggerReason: "sampled",
147
+ maskingMode: "MaskSensitiveInputsOnly",
148
+ consentState: "NotRequired",
149
+ recorderKind: "dom",
150
+ recorderVersion: "1.2.3",
151
+ rrwebVersion: "2.1.1",
152
+ schemaVersion: 1,
153
+ wireVersion: 1,
154
+ entryUrl: "https://acme.com/cart",
155
+ exitUrl: "https://acme.com/pay",
156
+ routes: ["/cart", "/checkout", "/pay"],
157
+ browserName: "Chrome",
158
+ browserVersion: "128",
159
+ osName: "macOS",
160
+ deviceType: "desktop",
161
+ countryCode: "US",
162
+ viewportWidth: 1440,
163
+ viewportHeight: 900,
164
+ fidelityNotices: [],
165
+ fullSnapshotChunkIndexes: [0],
166
+ traceIds: ["abc"],
167
+ exceptionFingerprints: [],
168
+ clockSkewMs: -120,
169
+ };
170
+
171
+ const legacyManifestResponse: SessionReplayManifestResponseDto = {
172
+ viewId: "view-1",
173
+ header: legacyHeader,
174
+ tabs: [legacyTab],
175
+ isChunkIndexTruncated: false,
176
+ };
177
+
178
+ const legacyExceptionSession: SessionReplayExceptionSessionDto = {
179
+ sessionId: "sess-1",
180
+ rumApplicationId: "app-1",
181
+ startTime: START_ISO,
182
+ endTime: END_ISO,
183
+ durationMs: 252000,
184
+ hasError: true,
185
+ errorCount: 2,
186
+ rageClickCount: 0,
187
+ deadClickCount: 0,
188
+ errorClickCount: 0,
189
+ refreshRageCount: 0,
190
+ maskingMode: "MaskSensitiveInputsOnly",
191
+ triggerReason: "error",
192
+ entryUrl: "https://acme.com/cart",
193
+ browserName: "Chrome",
194
+ osName: "macOS",
195
+ deviceType: "desktop",
196
+ isFinalized: true,
197
+ };
198
+
199
+ const legacyForExceptionResponse: SessionReplayForExceptionResponseDto = {
200
+ sessions: [legacyExceptionSession],
201
+ isApplicationScopeTruncated: false,
202
+ };
203
+
204
+ const legacyHeartbeat: SessionReplayHeartbeatResponseDto = {
205
+ secondsWatched: 30,
206
+ };
207
+
208
+ describe("SessionReplayApi DTOs - today's wire shapes satisfy them", () => {
209
+ it("a /list response with no additive field parses, and dates are ISO strings", () => {
210
+ const item: SessionReplayListItemDto = legacyListResponse.sessions[0]!;
211
+
212
+ expect(typeof item.startTime).toBe("string");
213
+ expect(Date.parse(item.startTime)).toBe(Date.parse(START_ISO));
214
+ expect(item.routes).toBeUndefined();
215
+ expect(item.clickCount).toBeUndefined();
216
+ expect(item.expiresAtUnixMs).toBeUndefined();
217
+ expect(item.identifiedUserLabel).toBeUndefined();
218
+ expect(legacyListResponse.nextCursor).not.toBeNull();
219
+ });
220
+
221
+ it("a /manifest response with no additive field parses", () => {
222
+ expect(legacyManifestResponse.header.startTimeUnixMs).toBeUndefined();
223
+ expect(legacyManifestResponse.header.recorderCapabilities).toBeUndefined();
224
+ expect(
225
+ legacyManifestResponse.tabs[0]?.firstChunkStartOffsetMs,
226
+ ).toBeUndefined();
227
+ expect(
228
+ legacyManifestResponse.tabs[0]?.chunks[0]?.clickCount,
229
+ ).toBeUndefined();
230
+ expect(legacyManifestResponse.viewId).toBe("view-1");
231
+ });
232
+
233
+ it("a /manifest viewId may be null when no audit row could be created", () => {
234
+ const withoutView: SessionReplayManifestResponseDto = {
235
+ ...legacyManifestResponse,
236
+ viewId: null,
237
+ };
238
+
239
+ expect(withoutView.viewId).toBeNull();
240
+ });
241
+
242
+ it("/for-exception and /heartbeat responses parse", () => {
243
+ expect(legacyForExceptionResponse.sessions[0]?.isFinalized).toBe(true);
244
+ expect(legacyHeartbeat.secondsWatched).toBe(30);
245
+ });
246
+
247
+ it("the additive list and manifest fields are all optional and carry the documented types", () => {
248
+ const richItem: SessionReplayListItemDto = {
249
+ ...legacyListItem,
250
+ routes: ["/cart", "/checkout"],
251
+ traceCount: 3,
252
+ exceptionGroupCount: 1,
253
+ clickCount: 41,
254
+ activeMs: 150000,
255
+ firstErrorOffsetMs: 62000,
256
+ expiresAtUnixMs: Date.parse(START_ISO) + 7 * 24 * 60 * 60 * 1000,
257
+ tags: { build: "1.4.2" },
258
+ startTimeUnixMs: Date.parse(START_ISO),
259
+ endTimeUnixMs: Date.parse(END_ISO),
260
+ identifiedUserLabel: "jane@acme.com",
261
+ identifiedUserTraits: { plan: "pro" },
262
+ };
263
+
264
+ const richHeader: SessionReplayManifestHeaderDto = {
265
+ ...legacyHeader,
266
+ startTimeUnixMs: Date.parse(START_ISO),
267
+ endTimeUnixMs: Date.parse(END_ISO),
268
+ clientReportedStartUnixMs: Date.parse(START_ISO) - 120,
269
+ tags: { build: "1.4.2" },
270
+ expiresAtUnixMs: Date.parse(START_ISO) + 7 * 24 * 60 * 60 * 1000,
271
+ clickCount: 41,
272
+ customEventCount: 3,
273
+ activeMs: 150000,
274
+ firstErrorOffsetMs: 62000,
275
+ identifiedUserLabel: "jane@acme.com",
276
+ identifiedUserTraits: { plan: "pro" },
277
+ recorderCapabilities: ["click-events", "web-vitals"],
278
+ };
279
+
280
+ const richTab: SessionReplayManifestTabDto = {
281
+ ...legacyTab,
282
+ firstChunkStartOffsetMs: 134000,
283
+ chunks: [{ ...legacyChunk, clickCount: 4, url: "https://acme.com/cart" }],
284
+ };
285
+
286
+ expect(richItem.tags?.["build"]).toBe("1.4.2");
287
+ expect(richHeader.recorderCapabilities).toHaveLength(2);
288
+ expect(richTab.chunks[0]?.url).toBe("https://acme.com/cart");
289
+ });
290
+
291
+ it("request bodies: the list request matches what SessionReplayTable posts, the manifest request accepts the refresh fields", () => {
292
+ const listRequest: SessionReplayListRequestDto = {
293
+ rumApplicationId: "app-1",
294
+ startTime: START_ISO,
295
+ endTime: END_ISO,
296
+ filters: {
297
+ hasError: true,
298
+ triggerReasons: ["error"],
299
+ search: "checkout",
300
+ urlPrefix: "/checkout",
301
+ tags: { build: "1.4.2" },
302
+ hasIdentifiedUser: true,
303
+ isPlayable: true,
304
+ hasTraces: true,
305
+ },
306
+ limit: 20,
307
+ cursor: { startTimeUnixMs: 1, sessionId: "sess-0" },
308
+ sortBy: "errorCount",
309
+ };
310
+
311
+ const manifestRequest: SessionReplayManifestRequestDto = {
312
+ sessionId: "sess-1",
313
+ isRefresh: true,
314
+ viewId: "view-1",
315
+ };
316
+
317
+ const minimalManifestRequest: SessionReplayManifestRequestDto = {
318
+ sessionId: "sess-1",
319
+ };
320
+
321
+ expect(listRequest.sortBy).toBe("errorCount");
322
+ expect(manifestRequest.isRefresh).toBe(true);
323
+ expect(minimalManifestRequest.isRefresh).toBeUndefined();
324
+ });
325
+
326
+ it("SESSION_REPLAY_SORT_BY_VALUES lists exactly the four sort keys", () => {
327
+ expect([...SESSION_REPLAY_SORT_BY_VALUES]).toEqual([
328
+ "startTime",
329
+ "durationMs",
330
+ "errorCount",
331
+ "frustration",
332
+ ]);
333
+ });
334
+ });
335
+
336
+ describe("SessionReplayApi - the additive contracts the surfaces already ship", () => {
337
+ /*
338
+ * The server drops identifiedUserRef when the caller lacks the identity
339
+ * permission. Dropping it silently answers a WIDER set of rows as if it
340
+ * were the filtered one, so the response says what it ignored and the
341
+ * list renders a notice. Absent (not []) on an older server.
342
+ */
343
+ it("/list: ignoredFilters is optional, and [] means 'looked and dropped nothing'", () => {
344
+ expect(legacyListResponse.ignoredFilters).toBeUndefined();
345
+
346
+ const withIgnored: SessionReplayListResponseDto = {
347
+ ...legacyListResponse,
348
+ ignoredFilters: ["identifiedUserRef"],
349
+ };
350
+ const withNoneIgnored: SessionReplayListResponseDto = {
351
+ ...legacyListResponse,
352
+ ignoredFilters: [],
353
+ };
354
+
355
+ expect(withIgnored.ignoredFilters).toEqual(["identifiedUserRef"]);
356
+ expect(withNoneIgnored.ignoredFilters).toEqual([]);
357
+ expect(withNoneIgnored.ignoredFilters).not.toBeUndefined();
358
+ });
359
+
360
+ /*
361
+ * POST /telemetry/rum/session-replay/views: "who watched this
362
+ * recording", off the audit rows every manifest read has written.
363
+ */
364
+ it("/views: the request is one session plus the application disambiguator, the response is the route's projection", () => {
365
+ const request: SessionReplayViewsRequestDto = {
366
+ sessionId: "sess-1",
367
+ rumApplicationId: "app-1",
368
+ limit: 50,
369
+ };
370
+ const minimalRequest: SessionReplayViewsRequestDto = {
371
+ sessionId: "sess-1",
372
+ };
373
+
374
+ const response: SessionReplayViewsResponseDto = {
375
+ views: [
376
+ {
377
+ id: "view-1",
378
+ viewedAt: START_ISO,
379
+ secondsWatched: 45,
380
+ accessReason: "incident-1234",
381
+ viewedByUserId: "user-1",
382
+ viewedByUser: {
383
+ id: "user-1",
384
+ name: "Jane Doe",
385
+ email: "jane@acme.com",
386
+ profilePictureId: "file-1",
387
+ },
388
+ },
389
+ /*
390
+ * The audit row outlives the account it names, and a view that
391
+ * never sent a heartbeat is a real 0 - "opened, never watched" -
392
+ * not a missing measurement.
393
+ */
394
+ {
395
+ id: "view-2",
396
+ viewedAt: START_ISO,
397
+ secondsWatched: 0,
398
+ accessReason: "",
399
+ viewedByUserId: null,
400
+ viewedByUser: null,
401
+ },
402
+ ],
403
+ };
404
+
405
+ const deletedViewer: SessionReplayViewDto = response.views[1]!;
406
+
407
+ expect(request.limit).toBe(50);
408
+ expect(minimalRequest.rumApplicationId).toBeUndefined();
409
+ expect(minimalRequest.limit).toBeUndefined();
410
+ expect(response.views[0]?.viewedByUser?.email).toBe("jane@acme.com");
411
+ expect(deletedViewer.viewedByUser).toBeNull();
412
+ expect(deletedViewer.secondsWatched).toBe(0);
413
+ });
414
+
415
+ it("/chunks: the request carries the application disambiguator, and the omitted-chunk header is one shared string", () => {
416
+ const chunksRequest: SessionReplayChunksRequestDto = {
417
+ sessionId: "sess-1",
418
+ tabId: "tab-1",
419
+ chunkIndexes: [0, 1, 2],
420
+ rumApplicationId: "app-1",
421
+ };
422
+ const minimalChunksRequest: SessionReplayChunksRequestDto = {
423
+ sessionId: "sess-1",
424
+ tabId: "tab-1",
425
+ chunkIndexes: [0],
426
+ };
427
+
428
+ expect(chunksRequest.chunkIndexes).toEqual([0, 1, 2]);
429
+ expect(minimalChunksRequest.rumApplicationId).toBeUndefined();
430
+ expect(SESSION_REPLAY_OMITTED_CHUNKS_HEADER).toBe(
431
+ "X-OneUptime-Replay-Omitted-Chunks",
432
+ );
433
+ });
434
+
435
+ /*
436
+ * A 404 from the read routes carries its reason as a prefix because the
437
+ * three reasons need three different screens - and only a prefix
438
+ * survives HTTPErrorResponse, which keeps the message and nothing else.
439
+ */
440
+ it("read failures: the three 404 prefixes are pinned, colon included", () => {
441
+ expect(SESSION_REPLAY_READ_ERROR_PREFIX_EXPIRED).toBe("expired:");
442
+ expect(SESSION_REPLAY_READ_ERROR_PREFIX_ERASED).toBe("erased:");
443
+ expect(SESSION_REPLAY_READ_ERROR_PREFIX_NOT_FOUND).toBe("not-found:");
444
+ expect([...SESSION_REPLAY_READ_ERROR_PREFIXES]).toEqual([
445
+ "expired:",
446
+ "erased:",
447
+ "not-found:",
448
+ ]);
449
+
450
+ for (const prefix of SESSION_REPLAY_READ_ERROR_PREFIXES) {
451
+ expect(prefix.endsWith(":")).toBe(true);
452
+ expect(`${prefix} This recording is gone.`.startsWith(prefix)).toBe(true);
453
+ }
454
+ });
455
+ });
456
+
457
+ describe("SessionReplayApi cursor helpers", () => {
458
+ it("isSessionReplaySortedListCursor tells the two cursor shapes apart", () => {
459
+ expect(
460
+ isSessionReplaySortedListCursor({
461
+ sortBy: "durationMs",
462
+ sortValue: 5,
463
+ sessionId: "s",
464
+ }),
465
+ ).toBe(true);
466
+ expect(
467
+ isSessionReplaySortedListCursor({ startTimeUnixMs: 5, sessionId: "s" }),
468
+ ).toBe(false);
469
+ });
470
+
471
+ it("parseSessionReplayListCursor normalises the legacy shape to sortBy startTime", () => {
472
+ expect(
473
+ parseSessionReplayListCursor({
474
+ startTimeUnixMs: 1700000000000,
475
+ sessionId: "s",
476
+ }),
477
+ ).toEqual({
478
+ sortBy: "startTime",
479
+ sortValue: 1700000000000,
480
+ sessionId: "s",
481
+ });
482
+ });
483
+
484
+ it("parseSessionReplayListCursor reads the sorted shape, including numeric strings", () => {
485
+ expect(
486
+ parseSessionReplayListCursor({
487
+ sortBy: "frustration",
488
+ sortValue: "7",
489
+ sessionId: "s",
490
+ }),
491
+ ).toEqual({ sortBy: "frustration", sortValue: 7, sessionId: "s" });
492
+ });
493
+
494
+ it("parseSessionReplayListCursor prefers the sorted fields when both shapes are present", () => {
495
+ expect(
496
+ parseSessionReplayListCursor({
497
+ sortBy: "errorCount",
498
+ sortValue: 3,
499
+ startTimeUnixMs: 1,
500
+ sessionId: "s",
501
+ }),
502
+ ).toEqual({ sortBy: "errorCount", sortValue: 3, sessionId: "s" });
503
+ });
504
+
505
+ it("parseSessionReplayListCursor rejects an unknown sortBy, a missing sessionId and non-objects", () => {
506
+ expect(
507
+ parseSessionReplayListCursor({
508
+ sortBy: "nope",
509
+ sortValue: 1,
510
+ sessionId: "s",
511
+ }),
512
+ ).toBeNull();
513
+ expect(
514
+ parseSessionReplayListCursor({ sortBy: "startTime", sortValue: 1 }),
515
+ ).toBeNull();
516
+ expect(parseSessionReplayListCursor({ sessionId: "s" })).toBeNull();
517
+ expect(parseSessionReplayListCursor(null)).toBeNull();
518
+ expect(parseSessionReplayListCursor("x")).toBeNull();
519
+ expect(parseSessionReplayListCursor([1])).toBeNull();
520
+ });
521
+ });
522
+
523
+ describe("readDto* helpers keep the parsers' defensive semantics", () => {
524
+ const row: Record<string, unknown> = {
525
+ n: 42,
526
+ nStr: "42",
527
+ nBad: "forty-two",
528
+ nNull: null,
529
+ nEmpty: "",
530
+ s: "text",
531
+ sNum: 7,
532
+ sNull: null,
533
+ bTrue: true,
534
+ bOne: 1,
535
+ bOneStr: "1",
536
+ bZeroStr: "0",
537
+ bFalse: false,
538
+ arr: ["a", 1, true],
539
+ notArr: "a",
540
+ nums: [1, "2", "x", null],
541
+ map: { a: "1", b: 2, c: null },
542
+ mapArr: ["a"],
543
+ iso: "2026-09-04T10:00:00.000Z",
544
+ isoBad: "yesterday",
545
+ unixNum: 1700000000000,
546
+ };
547
+
548
+ it("readDtoNumber: finite numbers and numeric strings, else 0", () => {
549
+ expect(readDtoNumber(row, "n")).toBe(42);
550
+ expect(readDtoNumber(row, "nStr")).toBe(42);
551
+ expect(readDtoNumber(row, "nBad")).toBe(0);
552
+ expect(readDtoNumber(row, "missing")).toBe(0);
553
+ });
554
+
555
+ it("readDtoOptionalNumber: undefined for absent, null, empty and non-numeric - never 0", () => {
556
+ expect(readDtoOptionalNumber(row, "n")).toBe(42);
557
+ expect(readDtoOptionalNumber(row, "nStr")).toBe(42);
558
+ expect(readDtoOptionalNumber(row, "nBad")).toBeUndefined();
559
+ expect(readDtoOptionalNumber(row, "nNull")).toBeUndefined();
560
+ expect(readDtoOptionalNumber(row, "nEmpty")).toBeUndefined();
561
+ expect(readDtoOptionalNumber(row, "missing")).toBeUndefined();
562
+ });
563
+
564
+ it("readDtoString: stringifies, null/undefined become empty", () => {
565
+ expect(readDtoString(row, "s")).toBe("text");
566
+ expect(readDtoString(row, "sNum")).toBe("7");
567
+ expect(readDtoString(row, "sNull")).toBe("");
568
+ expect(readDtoString(row, "missing")).toBe("");
569
+ });
570
+
571
+ it("readDtoOptionalString: non-empty strings only", () => {
572
+ expect(readDtoOptionalString(row, "s")).toBe("text");
573
+ expect(readDtoOptionalString(row, "sNum")).toBeUndefined();
574
+ expect(readDtoOptionalString(row, "nEmpty")).toBeUndefined();
575
+ });
576
+
577
+ it("readDtoBoolean: true, 1 and '1' are true; everything else is false", () => {
578
+ expect(readDtoBoolean(row, "bTrue")).toBe(true);
579
+ expect(readDtoBoolean(row, "bOne")).toBe(true);
580
+ expect(readDtoBoolean(row, "bOneStr")).toBe(true);
581
+ expect(readDtoBoolean(row, "bZeroStr")).toBe(false);
582
+ expect(readDtoBoolean(row, "bFalse")).toBe(false);
583
+ expect(readDtoBoolean(row, "missing")).toBe(false);
584
+ });
585
+
586
+ it("readDtoStringArray / readDtoNumberArray", () => {
587
+ expect(readDtoStringArray(row, "arr")).toEqual(["a", "1", "true"]);
588
+ expect(readDtoStringArray(row, "notArr")).toEqual([]);
589
+ expect(readDtoNumberArray(row, "nums")).toEqual([1, 2, 0]);
590
+ expect(readDtoNumberArray(row, "notArr")).toEqual([]);
591
+ });
592
+
593
+ it("readDtoStringMap: objects only, values stringified, nulls dropped", () => {
594
+ expect(readDtoStringMap(row, "map")).toEqual({ a: "1", b: "2" });
595
+ expect(readDtoStringMap(row, "mapArr")).toEqual({});
596
+ expect(readDtoStringMap(row, "missing")).toEqual({});
597
+ });
598
+
599
+ it("readDtoUnixMs: ISO strings and numbers, never epoch for garbage", () => {
600
+ expect(readDtoUnixMs(row, "iso")).toBe(
601
+ Date.parse("2026-09-04T10:00:00.000Z"),
602
+ );
603
+ expect(readDtoUnixMs(row, "unixNum")).toBe(1700000000000);
604
+ expect(readDtoUnixMs(row, "isoBad")).toBeUndefined();
605
+ expect(readDtoUnixMs(row, "nEmpty")).toBeUndefined();
606
+ expect(readDtoUnixMs(row, "missing")).toBeUndefined();
607
+ });
608
+ });