@microsoft/windows-admin-center-sdk 6.0.0 → 6.1.0

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 (176) hide show
  1. package/3rdPartyDisclosure.html +10 -13
  2. package/README.md +110 -33
  3. package/angular/fesm2022/msft-sme-angular.mjs +1235 -1213
  4. package/angular/fesm2022/msft-sme-angular.mjs.map +1 -1
  5. package/angular/index.d.ts +29 -14
  6. package/angular/package.json +1 -1
  7. package/core/azure/azure-manager.d.ts +15 -3
  8. package/core/azure/azure-manager.d.ts.map +1 -1
  9. package/core/azure/azure-manager.js +29 -10
  10. package/core/azure/azure-manager.js.map +1 -1
  11. package/core/azure/models/aadAppConfig-data.d.ts +16 -0
  12. package/core/azure/models/aadAppConfig-data.d.ts.map +1 -1
  13. package/core/azure/models/aadAppConfig-data.js.map +1 -1
  14. package/core/base/environment.d.ts +1 -1
  15. package/core/base/environment.d.ts.map +1 -1
  16. package/core/base/environment.js.map +1 -1
  17. package/core/base/utilities.d.ts +10 -2
  18. package/core/base/utilities.d.ts.map +1 -1
  19. package/core/base/utilities.js +45 -25
  20. package/core/base/utilities.js.map +1 -1
  21. package/core/data/gateway-connection.d.ts.map +1 -1
  22. package/core/data/gateway-connection.js +1 -0
  23. package/core/data/gateway-connection.js.map +1 -1
  24. package/core/diagnostics/sme-web-telemetry.d.ts +17 -1
  25. package/core/diagnostics/sme-web-telemetry.d.ts.map +1 -1
  26. package/core/diagnostics/sme-web-telemetry.js +16 -0
  27. package/core/diagnostics/sme-web-telemetry.js.map +1 -1
  28. package/core/enterprise/enterprise-models.d.ts +10 -4
  29. package/core/enterprise/enterprise-models.d.ts.map +1 -1
  30. package/core/enterprise/enterprise-models.js +9 -4
  31. package/core/enterprise/enterprise-models.js.map +1 -1
  32. package/core/index.d.ts +5 -3
  33. package/core/index.d.ts.map +1 -1
  34. package/core/index.js +2 -1
  35. package/core/index.js.map +1 -1
  36. package/core/manifest/environment-modules.d.ts +2 -2
  37. package/core/manifest/environment-modules.d.ts.map +1 -1
  38. package/core/manifest/environment-modules.js.map +1 -1
  39. package/core/manifest/gateway-url-validator.d.ts +17 -0
  40. package/core/manifest/gateway-url-validator.d.ts.map +1 -0
  41. package/core/manifest/gateway-url-validator.js +56 -0
  42. package/core/manifest/gateway-url-validator.js.map +1 -0
  43. package/core/manifest/manifest-loader.d.ts +47 -11
  44. package/core/manifest/manifest-loader.d.ts.map +1 -1
  45. package/core/manifest/manifest-loader.js +141 -72
  46. package/core/manifest/manifest-loader.js.map +1 -1
  47. package/core/manifest/module-schema.json +1 -1
  48. package/core/performance/performance-tracker.d.ts +2 -0
  49. package/core/performance/performance-tracker.d.ts.map +1 -1
  50. package/core/performance/performance-tracker.js +18 -0
  51. package/core/performance/performance-tracker.js.map +1 -1
  52. package/core/rpc/azure/rpc-azure-model.d.ts +19 -1
  53. package/core/rpc/azure/rpc-azure-model.d.ts.map +1 -1
  54. package/core/rpc/azure/rpc-azure-model.js.map +1 -1
  55. package/core/rpc/forward/rpc-forward-auto-client.d.ts +5 -0
  56. package/core/rpc/forward/rpc-forward-auto-client.d.ts.map +1 -1
  57. package/core/rpc/forward/rpc-forward-auto-client.js +13 -0
  58. package/core/rpc/forward/rpc-forward-auto-client.js.map +1 -1
  59. package/core/rpc/resource-data-changed/rpc-resource-data-changed-client.d.ts +16 -0
  60. package/core/rpc/resource-data-changed/rpc-resource-data-changed-client.d.ts.map +1 -0
  61. package/core/rpc/resource-data-changed/rpc-resource-data-changed-client.js +18 -0
  62. package/core/rpc/resource-data-changed/rpc-resource-data-changed-client.js.map +1 -0
  63. package/core/rpc/resource-data-changed/rpc-resource-data-changed-handler.d.ts +8 -0
  64. package/core/rpc/resource-data-changed/rpc-resource-data-changed-handler.d.ts.map +1 -0
  65. package/core/rpc/resource-data-changed/rpc-resource-data-changed-handler.js +2 -0
  66. package/core/rpc/resource-data-changed/rpc-resource-data-changed-handler.js.map +1 -0
  67. package/core/rpc/resource-data-changed/rpc-resource-data-changed-model.d.ts +18 -0
  68. package/core/rpc/resource-data-changed/rpc-resource-data-changed-model.d.ts.map +1 -0
  69. package/core/rpc/resource-data-changed/rpc-resource-data-changed-model.js +8 -0
  70. package/core/rpc/resource-data-changed/rpc-resource-data-changed-model.js.map +1 -0
  71. package/core/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.d.ts +27 -0
  72. package/core/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.d.ts.map +1 -0
  73. package/core/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.js +23 -0
  74. package/core/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.js.map +1 -0
  75. package/core/rpc/rpc-forwarder.d.ts +16 -2
  76. package/core/rpc/rpc-forwarder.d.ts.map +1 -1
  77. package/core/rpc/rpc-forwarder.js +50 -6
  78. package/core/rpc/rpc-forwarder.js.map +1 -1
  79. package/core/security/authorization-manager.d.ts +126 -4
  80. package/core/security/authorization-manager.d.ts.map +1 -1
  81. package/core/security/authorization-manager.js +381 -49
  82. package/core/security/authorization-manager.js.map +1 -1
  83. package/core/security/connection-manager.d.ts +2 -1
  84. package/core/security/connection-manager.d.ts.map +1 -1
  85. package/core/security/connection-manager.js +10 -6
  86. package/core/security/connection-manager.js.map +1 -1
  87. package/core/security/tool-condition-validator.d.ts +8 -3
  88. package/core/security/tool-condition-validator.d.ts.map +1 -1
  89. package/core/security/tool-condition-validator.js +43 -28
  90. package/core/security/tool-condition-validator.js.map +1 -1
  91. package/core/version.js +1 -1
  92. package/core/version.js.map +1 -1
  93. package/core/virtualization/virtualization-client.d.ts +47 -78
  94. package/core/virtualization/virtualization-client.d.ts.map +1 -1
  95. package/core/virtualization/virtualization-client.js +57 -77
  96. package/core/virtualization/virtualization-client.js.map +1 -1
  97. package/core/virtualization/virtualization-models.d.ts +9 -8
  98. package/core/virtualization/virtualization-models.d.ts.map +1 -1
  99. package/core/virtualization/virtualization-models.js +7 -5
  100. package/core/virtualization/virtualization-models.js.map +1 -1
  101. package/core/virtualization/virtualization-unavailable-error.d.ts +1 -1
  102. package/core/virtualization/virtualization-unavailable-error.js +1 -1
  103. package/core/virtualization/virtualization-unavailable-error.js.map +1 -1
  104. package/package.json +12 -17
  105. package/{react-sdk-core → react}/hooks/useAppContextInit.d.ts +2 -0
  106. package/react/hooks/useAppContextInit.d.ts.map +1 -0
  107. package/{react-sdk-core → react}/hooks/useAppContextInit.js +18 -2
  108. package/{react-sdk-core → react}/index.js +1 -1
  109. package/react/services/BaseNavigationService.d.ts.map +1 -0
  110. package/{react-sdk-core → react}/services/BaseNavigationService.js +4 -0
  111. package/{react-sdk-core → react}/version.d.ts.map +1 -1
  112. package/react/version.js +3 -0
  113. package/{react-sdk-core → react}/vite/smeCoreStringsPlugin.d.ts +1 -1
  114. package/{react-sdk-core → react}/vite/smeCoreStringsPlugin.js +1 -1
  115. package/{react-sdk-core → react}/vite/smeManifestResourcesPlugin.d.ts +1 -1
  116. package/{react-sdk-core → react}/vite/smeManifestResourcesPlugin.js +1 -1
  117. package/{react-sdk-core → react}/vite/smePowerShellPlugin.d.ts +1 -1
  118. package/{react-sdk-core → react}/vite/smePowerShellPlugin.js +1 -1
  119. package/styles/css/main-v2.css +1 -1
  120. package/styles/package.json +1 -1
  121. package/wac-cli/dist/angular20/configs/ci-build-yml-config.js +3 -2
  122. package/wac-cli/dist/angular20/configs/ci-build-yml-config.js.map +1 -1
  123. package/wac-cli/dist/angular20/upgrader/nvmrc-engines-upgrader.js +2 -2
  124. package/wac-cli/dist/create-react/main.js +3 -2
  125. package/wac-cli/dist/create-react/main.js.map +1 -1
  126. package/wac-cli/module-template/build/pipelines/ci-build.yml +2 -2
  127. package/wac-cli/module-template/build/pipelines/pull-request.yml +2 -2
  128. package/wac-cli/templates/internal/main.ts +2 -2
  129. package/wac-cli/templates/internal/package.json +26 -14
  130. package/wac-cli/templates/react-template/package.json +3 -2
  131. package/wac-cli/templates/react-template/src/App.tsx +1 -1
  132. package/wac-cli/templates/react-template/src/hooks/useServicesData.ts +1 -1
  133. package/wac-cli/templates/react-template/vite.config.ts +1 -1
  134. package/wac-cli/templates/wac-template/angular.json +8 -13
  135. package/wac-cli/templates/wac-template/package.json +26 -14
  136. package/wac-cli/templates/wac-template/src/main.ts +2 -2
  137. package/react-sdk-core/hooks/useAppContextInit.d.ts.map +0 -1
  138. package/react-sdk-core/services/BaseNavigationService.d.ts.map +0 -1
  139. package/react-sdk-core/version.js +0 -3
  140. /package/{react-sdk-core → react}/components/SplashScreen.d.ts +0 -0
  141. /package/{react-sdk-core → react}/components/SplashScreen.d.ts.map +0 -0
  142. /package/{react-sdk-core → react}/components/SplashScreen.js +0 -0
  143. /package/{react-sdk-core → react}/context/AppContextProvider.d.ts +0 -0
  144. /package/{react-sdk-core → react}/context/AppContextProvider.d.ts.map +0 -0
  145. /package/{react-sdk-core → react}/context/AppContextProvider.js +0 -0
  146. /package/{react-sdk-core → react}/hooks/useAppContext.d.ts +0 -0
  147. /package/{react-sdk-core → react}/hooks/useAppContext.d.ts.map +0 -0
  148. /package/{react-sdk-core → react}/hooks/useAppContext.js +0 -0
  149. /package/{react-sdk-core → react}/hooks/useSkeletonStyles.d.ts +0 -0
  150. /package/{react-sdk-core → react}/hooks/useSkeletonStyles.d.ts.map +0 -0
  151. /package/{react-sdk-core → react}/hooks/useSkeletonStyles.js +0 -0
  152. /package/{react-sdk-core → react}/hooks/useWacTheme.d.ts +0 -0
  153. /package/{react-sdk-core → react}/hooks/useWacTheme.d.ts.map +0 -0
  154. /package/{react-sdk-core → react}/hooks/useWacTheme.js +0 -0
  155. /package/{react-sdk-core → react}/index.d.ts +0 -0
  156. /package/{react-sdk-core → react}/index.d.ts.map +0 -0
  157. /package/{react-sdk-core → react}/services/AppContextService.d.ts +0 -0
  158. /package/{react-sdk-core → react}/services/AppContextService.d.ts.map +0 -0
  159. /package/{react-sdk-core → react}/services/AppContextService.js +0 -0
  160. /package/{react-sdk-core → react}/services/BaseNavigationService.d.ts +0 -0
  161. /package/{react-sdk-core → react}/services/NavigationService.d.ts +0 -0
  162. /package/{react-sdk-core → react}/services/NavigationService.d.ts.map +0 -0
  163. /package/{react-sdk-core → react}/services/NavigationService.js +0 -0
  164. /package/{react-sdk-core → react}/services/Polyfills.d.ts +0 -0
  165. /package/{react-sdk-core → react}/services/Polyfills.d.ts.map +0 -0
  166. /package/{react-sdk-core → react}/services/Polyfills.js +0 -0
  167. /package/{react-sdk-core → react}/version.d.ts +0 -0
  168. /package/{react-sdk-core → react}/vite/index.d.ts +0 -0
  169. /package/{react-sdk-core → react}/vite/index.d.ts.map +0 -0
  170. /package/{react-sdk-core → react}/vite/index.js +0 -0
  171. /package/{react-sdk-core → react}/vite/log.d.ts +0 -0
  172. /package/{react-sdk-core → react}/vite/log.d.ts.map +0 -0
  173. /package/{react-sdk-core → react}/vite/log.js +0 -0
  174. /package/{react-sdk-core → react}/vite/smeCoreStringsPlugin.d.ts.map +0 -0
  175. /package/{react-sdk-core → react}/vite/smeManifestResourcesPlugin.d.ts.map +0 -0
  176. /package/{react-sdk-core → react}/vite/smePowerShellPlugin.d.ts.map +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"performance-tracker.js","sourceRoot":"","sources":["../../src/performance/performance-tracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { getCLS, getFCP, getFID, getLCP, getTTFB } from 'web-vitals';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { SmeWebTelemetry } from '../diagnostics/sme-web-telemetry';\r\nimport { LighthousePerformanceMetrics, SmePerformanceData } from '../diagnostics/sme-web-telemetry-models';\r\n\r\n/**\r\n * Summarizes a sequence of measurements\r\n */\r\nexport class SmePerformanceSummary {\r\n label: string;\r\n startTime: number;\r\n totalLoadTime: number;\r\n timestamps: { [index: string]: number };\r\n}\r\n\r\n/**\r\n * Web Vitals metrics to track. See more details at https://web.dev/vitals/\r\n */\r\nexport enum WebVitalFields {\r\n CLS = 'CumulativeLayoutShift',\r\n LCP = 'LargestContentfulPaint',\r\n FCP = 'FirstContentfulPaint',\r\n FID = 'FirstInputDelay',\r\n TTFB = 'TimeToFirstByte',\r\n TBT = 'TotalBlockingTime',\r\n TTI = 'TimeToInteractive'\r\n}\r\n\r\n/**\r\n * List performance entry types that are relevant for our metrics.\r\n */\r\nexport enum PerformanceEntryType {\r\n LongTask = 'longtask',\r\n Resource = 'resource',\r\n Mark = 'mark',\r\n Navigation = 'navigation'\r\n}\r\n\r\n/**\r\n * Simplified performance entry type with only a start time, end time, and entryType.\r\n */\r\nexport class TaskTiming {\r\n startTime: number;\r\n endTime: number;\r\n entryType: PerformanceEntryType;\r\n}\r\n\r\n/**\r\n * Internal further simplification for a range of time with only start and end time.\r\n */\r\nclass TimeWindow {\r\n start: number;\r\n end: number;\r\n}\r\n\r\n/**\r\n * Performance tracker class handles two things:\r\n * 1) Tracking lighthouse metrics (see https://web.dev/vitals/)\r\n * 2) Providing a wrapper to mark various times in code for performance measurement.\r\n * This is used primarily for shell and various tools to determine load times.\r\n */\r\nexport class PerformanceTracker {\r\n public static get smePrefix(): string {\r\n return 'SME:';\r\n }\r\n\r\n /**\r\n * The source name to use when logging about this service.\r\n */\r\n private static get logSourceName() {\r\n return 'PerformanceTracker';\r\n }\r\n\r\n // indexLoaded is logged by each extension when there index.html file starts executing code\r\n // The value itself is used, not the variable. This is kept here to have a complete list of sme marks used.\r\n private static markIndexLoaded = PerformanceTracker.smePrefix + 'IndexLoaded';\r\n private static markCoreEnvironmentInitStarted = PerformanceTracker.smePrefix + 'CoreEnvironmentInitializeStarted';\r\n private static markCoreEnvironmentInitCompleted = PerformanceTracker.smePrefix + 'CoreEnvironmentInitializeCompleted';\r\n private static markManifestLoadStarted = PerformanceTracker.smePrefix + 'ManifestLoadStarted';\r\n private static markLocalizationStarted = PerformanceTracker.smePrefix + 'LocalizationStarted';\r\n private static markAccessibilityManagerStarted = PerformanceTracker.smePrefix + 'AccessibilityManagerStarted';\r\n private static markAppContextServiceStarted = PerformanceTracker.smePrefix + 'AppContextServiceStarted';\r\n private static markAppContextRpcInitStarted = PerformanceTracker.smePrefix + 'AppContextRpcInitStarted';\r\n private static markAppContextRpcInitComplete = PerformanceTracker.smePrefix + 'AppContextRpcInitComplete';\r\n private static markAppModuleInitialized = PerformanceTracker.smePrefix + 'AppModuleInitialized';\r\n private static markAppComponentInitialized = PerformanceTracker.smePrefix + 'AppComponentInitialized';\r\n\r\n private static markCriticalDataLoaded = PerformanceTracker.smePrefix + 'CriticalDataLoaded';\r\n private static markNavigationInitialized = PerformanceTracker.smePrefix + 'NavigationInitialized';\r\n private static markNavigationStarted = PerformanceTracker.smePrefix + 'NavigationStarted';\r\n private static markNavigationCompleted = PerformanceTracker.smePrefix + 'NavigationCompleted';\r\n private static markNavigationMeasure = PerformanceTracker.smePrefix + 'NavigationMeasure';\r\n\r\n private static moduleOpening = true;\r\n\r\n /**\r\n * Used to keep track of various marks when measuring arbitrary timings.\r\n */\r\n private static dataLoadMap: { [index: string]: PerformanceEntry[] } = {};\r\n\r\n /**\r\n * Counter for total blocking time on initial loadup. This should be reset every time a new page is initialized.\r\n */\r\n private static totalBlockingTime = 0;\r\n\r\n // initialize totalBlockingTime as null so we can distinguish when majority of lighthouse metrics are collected\r\n private static lighthouseMetrics: LighthousePerformanceMetrics = { TotalBlockingTime: null };\r\n private static ttiIntervalCheck: NodeJS.Timeout;\r\n private static ttiInProgress = false;\r\n private static wacPo: PerformanceObserver;\r\n private static fcp = 0;\r\n private static tasks: TaskTiming[] = [];\r\n\r\n public static readonly timeToInteractiveNotFound = -1;\r\n\r\n // Under TTI guidelines, a quiet window is defined to be a 5 second period where no long tasks run and no more than\r\n // 2 network requests at any given point.\r\n public static readonly quietWindowLength = 5000;\r\n\r\n // Time to interactive has to be calculated retroactively - every 10 seconds, we'll calculate and see if we can find TTI.\r\n // After 20 seconds, cancel and just find current tti (assume a quiet window will appear somewhere in the future)\r\n // These windows were selected arbitrarily - can be tweaked if necessary.\r\n public static readonly ttiTimeout = 10000;\r\n public static readonly ttiTimeoutThreshold = 2;\r\n\r\n // Long events (events in excess of 50ms) qualify for total blocking time - any duration in excess of 50ms,\r\n // the excess time will be added to total blocking time.\r\n public static readonly totalBlockingTimeThresholdRequirement = 50;\r\n\r\n private static setLighthouseField(field: string, value: number) {\r\n this.lighthouseMetrics[field] = value;\r\n if (this.lighthouseMetrics.TotalBlockingTime !== null) {\r\n // if TBT is calculated, we (should) have all required fields, log this in telemetry.\r\n // It is possible once TBT is calculated other fields can be triggered afterwards (eg CLS or LCP).\r\n // We will simply update those fields within lighthouse object and send the whole thing.\r\n // On telemetry end we can decide how to handle (ie take first or last instance).\r\n SmeWebTelemetry.traceLighthouseData(this.lighthouseMetrics);\r\n }\r\n }\r\n\r\n /**\r\n * Calculate Time to Interactive using list of longtask and resource events. Time to Interactive calculation\r\n * method can be found at https://web.dev/tti#what-is-tti\r\n * @param taskList List of all longtask and resource events from current time.\r\n * @returns Returns time to interactive if it exists, TTI_NOT_FOUND if not.\r\n */\r\n public static tryFindTti(taskList: TaskTiming[]): number {\r\n const timestamps: { entryType: PerformanceEntryType; time: number; isStart?: boolean }[] = [];\r\n\r\n taskList.forEach(entry => {\r\n timestamps.push({ entryType: entry.entryType, time: entry.startTime, isStart: true });\r\n timestamps.push({ entryType: entry.entryType, time: entry.endTime });\r\n });\r\n // push an entry for the current timestamp, so that if the quiet window is at the end\r\n // (eg mass entries early on, and emptiness later), we can capture the end of the window with this event.\r\n timestamps.push({ entryType: PerformanceEntryType.LongTask, time: window.performance.now(), isStart: true });\r\n timestamps.sort((a, b) => (a.time < b.time ? -1 : 1));\r\n\r\n const quietWindows: TimeWindow[] = [];\r\n let startTime = this.fcp;\r\n let longTaskCount = 0;\r\n let networkRequestCount = 0;\r\n // Split ranges into starts and ends, iterate through all timestamps of start/end\r\n // for each start/end, identify and keep track of long tasks and network requests to identify potential windows\r\n // isStart means the timestamp is a startTime of a performance entry (long task or resource).\r\n for (const { entryType, time, isStart } of timestamps) {\r\n if (isStart) {\r\n // check if ends current window\r\n if (\r\n (entryType === PerformanceEntryType.LongTask && longTaskCount === 0 && networkRequestCount <= 2) ||\r\n (entryType === PerformanceEntryType.Resource && longTaskCount === 0 && networkRequestCount === 2)\r\n ) {\r\n const newStartTime = startTime ? Math.max(startTime, this.fcp) : this.fcp;\r\n const endTime = time;\r\n if (endTime > newStartTime) {\r\n quietWindows.push({ start: newStartTime, end: endTime });\r\n }\r\n }\r\n } else {\r\n if (\r\n (entryType === PerformanceEntryType.LongTask && longTaskCount === 1 && networkRequestCount <= 2) ||\r\n (entryType === PerformanceEntryType.Resource && longTaskCount === 0 && networkRequestCount === 3)\r\n ) {\r\n startTime = time;\r\n }\r\n }\r\n // For both cases, if we just hit an isStart timestamp, we are starting a new task - increment count depending on type.\r\n // if not isStart, we are ending a task, decrement count.\r\n if (entryType === PerformanceEntryType.LongTask) {\r\n longTaskCount += isStart ? 1 : -1;\r\n } else if (entryType === PerformanceEntryType.Resource) {\r\n networkRequestCount += isStart ? 1 : -1;\r\n }\r\n }\r\n\r\n const firstValidWindow = quietWindows.find(window => window.end - window.start >= this.quietWindowLength);\r\n const relevantLongTasks = taskList.filter(\r\n task => firstValidWindow && task.entryType === PerformanceEntryType.LongTask && task.startTime >= this.fcp && task.endTime <= firstValidWindow.start\r\n );\r\n const timeToInteractiveTimestamp = relevantLongTasks.length > 0 ? relevantLongTasks[relevantLongTasks.length - 1].endTime : this.fcp;\r\n // if no valid window found, return timeToInteractiveNotFound\r\n return firstValidWindow ? timeToInteractiveTimestamp : this.timeToInteractiveNotFound;\r\n }\r\n\r\n /**\r\n * Initialize interval to calculate time to interactive. TTI will only be calculated if WAC is in non-production mode;\r\n * b/c calculation itself is non-performant. In production, we will use FID as a proxy for TTI.\r\n */\r\n public static tryStartCalculatingTimeToInteractive(): void {\r\n if (SmeWebTelemetry.isProduction || this.ttiInProgress) {\r\n return;\r\n }\r\n this.ttiInProgress = true;\r\n let ttiTrackerCount = 0;\r\n this.ttiIntervalCheck = setInterval(() => {\r\n const tti = this.tryFindTti(this.tasks);\r\n if (tti !== this.timeToInteractiveNotFound) {\r\n this.setLighthouseField(WebVitalFields.TTI, tti);\r\n // need to recalculate here because this is dependent on where the TTI is.\r\n const recalculatedTotalBlockingTime = this.tasks\r\n .filter(entry => entry.entryType === PerformanceEntryType.LongTask)\r\n .reduce((totalBlockTime, nextEntry) => {\r\n const duration = nextEntry.endTime - nextEntry.startTime;\r\n const entrySatisfiesBlockingCriteria = duration > this.totalBlockingTimeThresholdRequirement && nextEntry.endTime < tti && nextEntry.startTime > this.fcp;\r\n return totalBlockTime + (entrySatisfiesBlockingCriteria ? duration : 0);\r\n }, 0);\r\n this.setLighthouseField(WebVitalFields.TBT, recalculatedTotalBlockingTime);\r\n clearInterval(this.ttiIntervalCheck);\r\n this.wacPo.disconnect();\r\n } else if (ttiTrackerCount > this.ttiTimeoutThreshold) {\r\n // if we have gone past threshold and no TTI found,\r\n // give up on TTI and just search for last long task, we will already have bad score\r\n const lastLongTask = this.tasks.filter(entry => entry.entryType === PerformanceEntryType.LongTask).slice(-1)[0];\r\n this.setLighthouseField(WebVitalFields.TTI, lastLongTask ? lastLongTask.endTime : this.ttiTimeout * this.ttiTimeoutThreshold);\r\n this.setLighthouseField(WebVitalFields.TBT, this.totalBlockingTime);\r\n this.wacPo.disconnect();\r\n clearInterval(this.ttiIntervalCheck);\r\n }\r\n ++ttiTrackerCount;\r\n }, this.ttiTimeout);\r\n }\r\n\r\n /**\r\n * Initialize web-vitals trackers for all lighthouse metrics. If function not supported (eg due to browser limitations)\r\n * log warning and return.\r\n */\r\n public static initializeLighthouseMetricsTrackers(): void {\r\n if (!getLCP) {\r\n Logging.logWarning(this.logSourceName, 'Web Vitals not supported in current environment');\r\n return;\r\n }\r\n\r\n getCLS(item => this.setLighthouseField(WebVitalFields.CLS, item.value), true);\r\n getFCP(item => {\r\n this.setLighthouseField(WebVitalFields.FCP, item.value);\r\n this.fcp = item.value;\r\n this.tryStartCalculatingTimeToInteractive();\r\n }, true);\r\n getLCP(item => this.setLighthouseField(WebVitalFields.LCP, item.value), true);\r\n getFID(item => {\r\n this.setLighthouseField(WebVitalFields.FID, item.value);\r\n if (!this.ttiInProgress) {\r\n this.setLighthouseField(WebVitalFields.TBT, this.totalBlockingTime);\r\n }\r\n });\r\n getTTFB(item => this.setLighthouseField(WebVitalFields.TTFB, item.value));\r\n\r\n // Set a performance observer to collect all the long task and resource events we need to calculate lighthouse metrics.\r\n this.wacPo = new PerformanceObserver(list => {\r\n const entries = list.getEntries();\r\n\r\n for (let i = 0; i < entries.length; ++i) {\r\n if (entries[i].entryType === PerformanceEntryType.LongTask) {\r\n // measure TBT as we collect long task events - if using FID, we can just send this accumulated value as is,\r\n // otherwise can recalculate this later when we find TTI.\r\n const entrySatisfiesBlockingCriteria = entries[i].duration > this.totalBlockingTimeThresholdRequirement && entries[i].startTime > this.fcp;\r\n this.totalBlockingTime += entrySatisfiesBlockingCriteria ? entries[i].duration : 0;\r\n this.tasks.push({\r\n startTime: entries[i].startTime,\r\n endTime: entries[i].startTime + entries[i].duration,\r\n entryType: PerformanceEntryType.LongTask\r\n } as TaskTiming);\r\n } else {\r\n this.tasks.push({\r\n startTime: entries[i].startTime,\r\n endTime: entries[i].startTime + entries[i].duration,\r\n entryType: PerformanceEntryType.Resource\r\n } as TaskTiming);\r\n }\r\n }\r\n });\r\n\r\n this.wacPo.observe({ entryTypes: [PerformanceEntryType.LongTask, PerformanceEntryType.Resource] });\r\n }\r\n\r\n public static coreEnvironmentInitStarted(): void {\r\n performance.mark(PerformanceTracker.markCoreEnvironmentInitStarted);\r\n }\r\n\r\n public static coreEnvironmentInitCompleted(): void {\r\n performance.mark(PerformanceTracker.markCoreEnvironmentInitCompleted);\r\n }\r\n\r\n public static manifestLoadStarted(): void {\r\n performance.mark(PerformanceTracker.markManifestLoadStarted);\r\n }\r\n\r\n public static localizationStarted(): void {\r\n performance.mark(PerformanceTracker.markLocalizationStarted);\r\n }\r\n\r\n public static accessibilityManagerStarted(): void {\r\n performance.mark(PerformanceTracker.markAccessibilityManagerStarted);\r\n }\r\n\r\n public static appContextServiceStarted(): void {\r\n performance.mark(PerformanceTracker.markAppContextServiceStarted);\r\n }\r\n\r\n public static appContextRpcInitStarted(): void {\r\n performance.mark(PerformanceTracker.markAppContextRpcInitStarted);\r\n }\r\n\r\n public static appContextRpcInitComplete(): void {\r\n performance.mark(PerformanceTracker.markAppContextRpcInitComplete);\r\n }\r\n\r\n public static appModuleInitialized(): void {\r\n performance.mark(PerformanceTracker.markAppModuleInitialized);\r\n }\r\n\r\n public static appComponentInitialized(): void {\r\n performance.mark(PerformanceTracker.markAppComponentInitialized);\r\n PerformanceTracker.logAppComponentLoadTime();\r\n }\r\n\r\n public static navigationInitialized(): void {\r\n const navigationMarks = performance.getEntriesByType(PerformanceEntryType.Mark).filter(e => e.name.startsWith(PerformanceTracker.smePrefix + 'Navigation'));\r\n // If we reinitialize navigation, clear all previous navigation marks.\r\n navigationMarks.forEach(m => {\r\n performance.clearMarks(m.name);\r\n });\r\n performance.mark(PerformanceTracker.markNavigationInitialized);\r\n }\r\n\r\n public static navigationStarted(): void {\r\n // clear previous marks prior to starting new navigation\r\n performance.clearMarks(PerformanceTracker.markNavigationStarted);\r\n performance.clearMarks(PerformanceTracker.markNavigationCompleted);\r\n\r\n performance.mark(PerformanceTracker.markNavigationStarted);\r\n }\r\n\r\n public static navigationCompleted(moduleOpened: boolean): void {\r\n // clear last measure b/c we are replacing.\r\n performance.clearMeasures(PerformanceTracker.markNavigationMeasure);\r\n\r\n // If the navigation via module open, set this flag so we can treat the criticalLoad differently than normal. We want to\r\n // separate this data b/c some modules have pivot tabs that can also trigger critical data loads multiple times.\r\n this.moduleOpening = moduleOpened;\r\n\r\n performance.mark(PerformanceTracker.markNavigationCompleted);\r\n performance.measure(PerformanceTracker.markNavigationMeasure, PerformanceTracker.markNavigationStarted, PerformanceTracker.markNavigationCompleted);\r\n\r\n // clear navigation start/end marks after we measure - only maintain one set of start/end to keep simple.\r\n performance.clearMarks(PerformanceTracker.markNavigationCompleted);\r\n performance.clearMarks(PerformanceTracker.markNavigationStarted);\r\n }\r\n\r\n public static criticalDataLoaded(): void {\r\n performance.mark(PerformanceTracker.markCriticalDataLoaded);\r\n PerformanceTracker.logCriticalDataLoadTime();\r\n }\r\n\r\n /**\r\n * Mark an arbitrary measurement with a label. Clear the previous mark(s) prior to starting new one - allow only one at\r\n * all times.\r\n * @param label The label for the mark and the index for the entry in the internal map.\r\n */\r\n public static markDataLoadStart(label: string) {\r\n const smeLabelString = `${PerformanceTracker.smePrefix}${label}`;\r\n\r\n // If we start, overwrite and clear existing entries.\r\n if (smeLabelString in this.dataLoadMap) {\r\n this.dataLoadMap[smeLabelString].forEach(mark => {\r\n performance.clearMarks(mark.name);\r\n });\r\n }\r\n performance.mark(smeLabelString);\r\n // get latest one\r\n const startMark = performance.getEntriesByName(smeLabelString).slice(-1)[0];\r\n\r\n this.dataLoadMap[smeLabelString] = [startMark];\r\n }\r\n\r\n /**\r\n * Mark an arbitrary measurement with a label. Intended to be a midpoint between a start and end.\r\n * @param label The label for the entry in the data map.\r\n * @param specificLabel The label for the mark\r\n */\r\n public static markDataIntermediary(label: string, specificLabel?: string) {\r\n const smeLabelString = `${PerformanceTracker.smePrefix}${label}`;\r\n\r\n if (!(smeLabelString in this.dataLoadMap)) {\r\n return;\r\n }\r\n\r\n const intermediaryLabel = specificLabel\r\n ? `${PerformanceTracker.smePrefix}${specificLabel}`\r\n : `${PerformanceTracker.smePrefix}${label}-${this.dataLoadMap[smeLabelString].length + 1}`;\r\n\r\n performance.mark(intermediaryLabel);\r\n\r\n // get latest one\r\n const mark = performance.getEntriesByName(intermediaryLabel).slice(-1)[0];\r\n\r\n this.dataLoadMap[smeLabelString].push(mark);\r\n }\r\n\r\n /**\r\n * Get a summary object from the aggregate data points marked previously.\r\n * @param label The label for the entry in the data map dictionary\r\n * @param specificLabel The label for the new measurement\r\n * @returns The performance summary of the multiple marks.\r\n */\r\n public static markDataLoadEnd(label: string, specificLabel?: string): SmePerformanceSummary {\r\n const smeLabelString = `${PerformanceTracker.smePrefix}${label}`;\r\n\r\n if (!(smeLabelString in this.dataLoadMap)) {\r\n return null;\r\n }\r\n const dataEntry = this.dataLoadMap[smeLabelString];\r\n\r\n const intermediaryLabel = specificLabel ? `${PerformanceTracker.smePrefix}${specificLabel}` : `${PerformanceTracker.smePrefix}${label}-${dataEntry.length + 1}`;\r\n\r\n performance.mark(intermediaryLabel);\r\n // get latest one\r\n const endMark = performance.getEntriesByName(intermediaryLabel).slice(-1)[0];\r\n dataEntry.push(endMark);\r\n\r\n const startEntry = dataEntry[0];\r\n\r\n const totalLoadTime = endMark.startTime - startEntry.startTime;\r\n\r\n // remove SME prefix here\r\n const summary: SmePerformanceSummary = {\r\n label: label,\r\n timestamps: {},\r\n totalLoadTime: totalLoadTime,\r\n startTime: startEntry.startTime\r\n };\r\n\r\n dataEntry.forEach((mark: PerformanceEntry) => {\r\n performance.clearMarks(mark.name);\r\n summary.timestamps[mark.name.replace(PerformanceTracker.smePrefix, '')] = mark.startTime - startEntry.startTime;\r\n });\r\n\r\n delete this.dataLoadMap[smeLabelString];\r\n return summary;\r\n }\r\n\r\n /**\r\n * Log app component load time - this contains timings up to when the appComponent is loaded.\r\n */\r\n private static logAppComponentLoadTime(): void {\r\n const data: SmePerformanceData = {\r\n sme: {},\r\n resources: {},\r\n navigation: {},\r\n totalLoadTime: 0\r\n };\r\n\r\n /// dont include sme angular navigation marks in the generic data load\r\n const smeMarks = performance\r\n .getEntriesByType(PerformanceEntryType.Mark)\r\n .filter(e => e.name.startsWith(PerformanceTracker.smePrefix) && !e.name.startsWith(PerformanceTracker.smePrefix + 'Navigation'));\r\n const resourceMarks = performance.getEntriesByType(PerformanceEntryType.Resource);\r\n smeMarks.forEach(m => {\r\n data.sme[m.name.replace(PerformanceTracker.smePrefix, '')] = m.startTime;\r\n performance.clearMarks(m.name);\r\n });\r\n resourceMarks.forEach((m: PerformanceResourceTiming) => {\r\n try {\r\n const url = new URL(m.name);\r\n data.resources[url.pathname] = m.duration;\r\n } catch (e) {\r\n data.resources[m.name] = m.duration;\r\n }\r\n performance.clearMarks(m.name);\r\n });\r\n data.totalLoadTime = data.sme[this.markAppComponentInitialized.replace(PerformanceTracker.smePrefix, '')];\r\n const navigationEntries = performance.getEntriesByType(PerformanceEntryType.Navigation);\r\n if (navigationEntries && navigationEntries.length) {\r\n data.navigation = navigationEntries[0];\r\n }\r\n\r\n SmeWebTelemetry.traceModuleOpenPerformance(data);\r\n }\r\n\r\n /**\r\n * Log critical data load time - this measures the time from angular's startNavigation event to a module to the point at\r\n * which criticalDataLoad() is called, usually in the ngInit of a module\r\n */\r\n private static logCriticalDataLoadTime(): void {\r\n const data: SmePerformanceData = {\r\n sme: {},\r\n totalLoadTime: 0\r\n };\r\n\r\n // If there are multiple somehow, take the latest one\r\n const navigationMeasure = performance.getEntriesByName(PerformanceTracker.markNavigationMeasure).slice(-1)[0];\r\n const criticalData = performance.getEntriesByName(PerformanceTracker.markCriticalDataLoaded).slice(-1)[0];\r\n\r\n // clear performance marks either way - if they exist, we clear them. If not, clear b/c it's faulty data.\r\n performance.clearMeasures(PerformanceTracker.markNavigationMeasure);\r\n performance.clearMarks(PerformanceTracker.markCriticalDataLoaded);\r\n\r\n if (!navigationMeasure || !criticalData) {\r\n Logging.logInformational('PerformanceTracker', 'Critical data loaded without either criticalData call or navigationMeasure call');\r\n return;\r\n }\r\n data.sme.criticalDataLoadTime = criticalData.startTime - navigationMeasure.startTime;\r\n data.sme.navigationTime = navigationMeasure.duration;\r\n data.totalLoadTime = data.sme.criticalDataLoadTime;\r\n\r\n // If there are multiple somehow, take the latest one\r\n const navInitialized = performance.getEntriesByName(PerformanceTracker.markNavigationInitialized).slice(-1)[0];\r\n if (navInitialized) {\r\n data.sme.timeToFirstNavigateInit = navInitialized.startTime;\r\n data.sme.timeToFirstNavigateStart = navigationMeasure.startTime;\r\n data.sme.timeToFirstNavigateEnd = navigationMeasure.startTime + navigationMeasure.duration;\r\n data.sme.timeToFirstCriticalData = criticalData.startTime;\r\n\r\n data.totalLoadTime = criticalData.startTime; // overwrite if navInit is true.\r\n\r\n performance.clearMarks(navInitialized.name);\r\n }\r\n\r\n if (this.moduleOpening) {\r\n SmeWebTelemetry.traceModuleOpenPerformance(data);\r\n } else {\r\n SmeWebTelemetry.tracePerformanceData(data);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"performance-tracker.js","sourceRoot":"","sources":["../../src/performance/performance-tracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { getCLS, getFCP, getFID, getLCP, getTTFB } from 'web-vitals';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { SmeWebTelemetry } from '../diagnostics/sme-web-telemetry';\r\nimport { LighthousePerformanceMetrics, SmePerformanceData } from '../diagnostics/sme-web-telemetry-models';\r\n\r\n/**\r\n * Summarizes a sequence of measurements\r\n */\r\nexport class SmePerformanceSummary {\r\n label: string;\r\n startTime: number;\r\n totalLoadTime: number;\r\n timestamps: { [index: string]: number };\r\n}\r\n\r\n/**\r\n * Web Vitals metrics to track. See more details at https://web.dev/vitals/\r\n */\r\nexport enum WebVitalFields {\r\n CLS = 'CumulativeLayoutShift',\r\n LCP = 'LargestContentfulPaint',\r\n FCP = 'FirstContentfulPaint',\r\n FID = 'FirstInputDelay',\r\n TTFB = 'TimeToFirstByte',\r\n TBT = 'TotalBlockingTime',\r\n TTI = 'TimeToInteractive'\r\n}\r\n\r\n/**\r\n * List performance entry types that are relevant for our metrics.\r\n */\r\nexport enum PerformanceEntryType {\r\n LongTask = 'longtask',\r\n Resource = 'resource',\r\n Mark = 'mark',\r\n Navigation = 'navigation'\r\n}\r\n\r\n/**\r\n * Simplified performance entry type with only a start time, end time, and entryType.\r\n */\r\nexport class TaskTiming {\r\n startTime: number;\r\n endTime: number;\r\n entryType: PerformanceEntryType;\r\n}\r\n\r\n/**\r\n * Internal further simplification for a range of time with only start and end time.\r\n */\r\nclass TimeWindow {\r\n start: number;\r\n end: number;\r\n}\r\n\r\n/**\r\n * Performance tracker class handles two things:\r\n * 1) Tracking lighthouse metrics (see https://web.dev/vitals/)\r\n * 2) Providing a wrapper to mark various times in code for performance measurement.\r\n * This is used primarily for shell and various tools to determine load times.\r\n */\r\nexport class PerformanceTracker {\r\n public static get smePrefix(): string {\r\n return 'SME:';\r\n }\r\n\r\n /**\r\n * The source name to use when logging about this service.\r\n */\r\n private static get logSourceName() {\r\n return 'PerformanceTracker';\r\n }\r\n\r\n // indexLoaded is logged by each extension when there index.html file starts executing code\r\n // The value itself is used, not the variable. This is kept here to have a complete list of sme marks used.\r\n private static markIndexLoaded = PerformanceTracker.smePrefix + 'IndexLoaded';\r\n private static markCoreEnvironmentInitStarted = PerformanceTracker.smePrefix + 'CoreEnvironmentInitializeStarted';\r\n private static markCoreEnvironmentInitCompleted = PerformanceTracker.smePrefix + 'CoreEnvironmentInitializeCompleted';\r\n private static markManifestLoadStarted = PerformanceTracker.smePrefix + 'ManifestLoadStarted';\r\n private static markLocalizationStarted = PerformanceTracker.smePrefix + 'LocalizationStarted';\r\n private static markAccessibilityManagerStarted = PerformanceTracker.smePrefix + 'AccessibilityManagerStarted';\r\n private static markAppContextServiceStarted = PerformanceTracker.smePrefix + 'AppContextServiceStarted';\r\n private static markAppContextRpcInitStarted = PerformanceTracker.smePrefix + 'AppContextRpcInitStarted';\r\n private static markAppContextRpcInitComplete = PerformanceTracker.smePrefix + 'AppContextRpcInitComplete';\r\n private static markAppModuleInitialized = PerformanceTracker.smePrefix + 'AppModuleInitialized';\r\n private static markAppComponentInitialized = PerformanceTracker.smePrefix + 'AppComponentInitialized';\r\n\r\n private static markCriticalDataLoaded = PerformanceTracker.smePrefix + 'CriticalDataLoaded';\r\n private static markNavigationInitialized = PerformanceTracker.smePrefix + 'NavigationInitialized';\r\n private static markNavigationStarted = PerformanceTracker.smePrefix + 'NavigationStarted';\r\n private static markNavigationCompleted = PerformanceTracker.smePrefix + 'NavigationCompleted';\r\n private static markNavigationMeasure = PerformanceTracker.smePrefix + 'NavigationMeasure';\r\n\r\n private static moduleOpening = true;\r\n\r\n /**\r\n * Used to keep track of various marks when measuring arbitrary timings.\r\n */\r\n private static dataLoadMap: { [index: string]: PerformanceEntry[] } = {};\r\n\r\n /**\r\n * Counter for total blocking time on initial loadup. This should be reset every time a new page is initialized.\r\n */\r\n private static totalBlockingTime = 0;\r\n\r\n // initialize totalBlockingTime as null so we can distinguish when majority of lighthouse metrics are collected\r\n private static lighthouseMetrics: LighthousePerformanceMetrics = { TotalBlockingTime: null };\r\n private static ttiIntervalCheck: NodeJS.Timeout;\r\n private static ttiInProgress = false;\r\n private static wacPo: PerformanceObserver;\r\n private static fcp = 0;\r\n private static tasks: TaskTiming[] = [];\r\n\r\n public static readonly timeToInteractiveNotFound = -1;\r\n\r\n // Under TTI guidelines, a quiet window is defined to be a 5 second period where no long tasks run and no more than\r\n // 2 network requests at any given point.\r\n public static readonly quietWindowLength = 5000;\r\n\r\n // Time to interactive has to be calculated retroactively - every 10 seconds, we'll calculate and see if we can find TTI.\r\n // After 20 seconds, cancel and just find current tti (assume a quiet window will appear somewhere in the future)\r\n // These windows were selected arbitrarily - can be tweaked if necessary.\r\n public static readonly ttiTimeout = 10000;\r\n public static readonly ttiTimeoutThreshold = 2;\r\n\r\n // Long events (events in excess of 50ms) qualify for total blocking time - any duration in excess of 50ms,\r\n // the excess time will be added to total blocking time.\r\n public static readonly totalBlockingTimeThresholdRequirement = 50;\r\n\r\n private static setLighthouseField(field: string, value: number) {\r\n this.lighthouseMetrics[field] = value;\r\n if (this.lighthouseMetrics.TotalBlockingTime !== null) {\r\n // if TBT is calculated, we (should) have all required fields, log this in telemetry.\r\n // It is possible once TBT is calculated other fields can be triggered afterwards (eg CLS or LCP).\r\n // We will simply update those fields within lighthouse object and send the whole thing.\r\n // On telemetry end we can decide how to handle (ie take first or last instance).\r\n SmeWebTelemetry.traceLighthouseData(this.lighthouseMetrics);\r\n }\r\n }\r\n\r\n /**\r\n * Calculate Time to Interactive using list of longtask and resource events. Time to Interactive calculation\r\n * method can be found at https://web.dev/tti#what-is-tti\r\n * @param taskList List of all longtask and resource events from current time.\r\n * @returns Returns time to interactive if it exists, TTI_NOT_FOUND if not.\r\n */\r\n public static tryFindTti(taskList: TaskTiming[]): number {\r\n const timestamps: { entryType: PerformanceEntryType; time: number; isStart?: boolean }[] = [];\r\n\r\n taskList.forEach(entry => {\r\n timestamps.push({ entryType: entry.entryType, time: entry.startTime, isStart: true });\r\n timestamps.push({ entryType: entry.entryType, time: entry.endTime });\r\n });\r\n // push an entry for the current timestamp, so that if the quiet window is at the end\r\n // (eg mass entries early on, and emptiness later), we can capture the end of the window with this event.\r\n timestamps.push({ entryType: PerformanceEntryType.LongTask, time: window.performance.now(), isStart: true });\r\n timestamps.sort((a, b) => (a.time < b.time ? -1 : 1));\r\n\r\n const quietWindows: TimeWindow[] = [];\r\n let startTime = this.fcp;\r\n let longTaskCount = 0;\r\n let networkRequestCount = 0;\r\n // Split ranges into starts and ends, iterate through all timestamps of start/end\r\n // for each start/end, identify and keep track of long tasks and network requests to identify potential windows\r\n // isStart means the timestamp is a startTime of a performance entry (long task or resource).\r\n for (const { entryType, time, isStart } of timestamps) {\r\n if (isStart) {\r\n // check if ends current window\r\n if (\r\n (entryType === PerformanceEntryType.LongTask && longTaskCount === 0 && networkRequestCount <= 2) ||\r\n (entryType === PerformanceEntryType.Resource && longTaskCount === 0 && networkRequestCount === 2)\r\n ) {\r\n const newStartTime = startTime ? Math.max(startTime, this.fcp) : this.fcp;\r\n const endTime = time;\r\n if (endTime > newStartTime) {\r\n quietWindows.push({ start: newStartTime, end: endTime });\r\n }\r\n }\r\n } else {\r\n if (\r\n (entryType === PerformanceEntryType.LongTask && longTaskCount === 1 && networkRequestCount <= 2) ||\r\n (entryType === PerformanceEntryType.Resource && longTaskCount === 0 && networkRequestCount === 3)\r\n ) {\r\n startTime = time;\r\n }\r\n }\r\n // For both cases, if we just hit an isStart timestamp, we are starting a new task - increment count depending on type.\r\n // if not isStart, we are ending a task, decrement count.\r\n if (entryType === PerformanceEntryType.LongTask) {\r\n longTaskCount += isStart ? 1 : -1;\r\n } else if (entryType === PerformanceEntryType.Resource) {\r\n networkRequestCount += isStart ? 1 : -1;\r\n }\r\n }\r\n\r\n const firstValidWindow = quietWindows.find(window => window.end - window.start >= this.quietWindowLength);\r\n const relevantLongTasks = taskList.filter(\r\n task => firstValidWindow && task.entryType === PerformanceEntryType.LongTask && task.startTime >= this.fcp && task.endTime <= firstValidWindow.start\r\n );\r\n const timeToInteractiveTimestamp = relevantLongTasks.length > 0 ? relevantLongTasks[relevantLongTasks.length - 1].endTime : this.fcp;\r\n // if no valid window found, return timeToInteractiveNotFound\r\n return firstValidWindow ? timeToInteractiveTimestamp : this.timeToInteractiveNotFound;\r\n }\r\n\r\n /**\r\n * Initialize interval to calculate time to interactive. TTI will only be calculated if WAC is in non-production mode;\r\n * b/c calculation itself is non-performant. In production, we will use FID as a proxy for TTI.\r\n */\r\n public static tryStartCalculatingTimeToInteractive(): void {\r\n if (SmeWebTelemetry.isProduction || this.ttiInProgress) {\r\n return;\r\n }\r\n this.ttiInProgress = true;\r\n let ttiTrackerCount = 0;\r\n this.ttiIntervalCheck = setInterval(() => {\r\n const tti = this.tryFindTti(this.tasks);\r\n if (tti !== this.timeToInteractiveNotFound) {\r\n this.setLighthouseField(WebVitalFields.TTI, tti);\r\n // need to recalculate here because this is dependent on where the TTI is.\r\n const recalculatedTotalBlockingTime = this.tasks\r\n .filter(entry => entry.entryType === PerformanceEntryType.LongTask)\r\n .reduce((totalBlockTime, nextEntry) => {\r\n const duration = nextEntry.endTime - nextEntry.startTime;\r\n const entrySatisfiesBlockingCriteria = duration > this.totalBlockingTimeThresholdRequirement && nextEntry.endTime < tti && nextEntry.startTime > this.fcp;\r\n return totalBlockTime + (entrySatisfiesBlockingCriteria ? duration : 0);\r\n }, 0);\r\n this.setLighthouseField(WebVitalFields.TBT, recalculatedTotalBlockingTime);\r\n clearInterval(this.ttiIntervalCheck);\r\n this.wacPo.disconnect();\r\n } else if (ttiTrackerCount > this.ttiTimeoutThreshold) {\r\n // if we have gone past threshold and no TTI found,\r\n // give up on TTI and just search for last long task, we will already have bad score\r\n const lastLongTask = this.tasks.filter(entry => entry.entryType === PerformanceEntryType.LongTask).slice(-1)[0];\r\n this.setLighthouseField(WebVitalFields.TTI, lastLongTask ? lastLongTask.endTime : this.ttiTimeout * this.ttiTimeoutThreshold);\r\n this.setLighthouseField(WebVitalFields.TBT, this.totalBlockingTime);\r\n this.wacPo.disconnect();\r\n clearInterval(this.ttiIntervalCheck);\r\n }\r\n ++ttiTrackerCount;\r\n }, this.ttiTimeout);\r\n }\r\n\r\n /**\r\n * Initialize web-vitals trackers for all lighthouse metrics. If function not supported (eg due to browser limitations)\r\n * log warning and return.\r\n */\r\n public static initializeLighthouseMetricsTrackers(): void {\r\n if (!getLCP) {\r\n Logging.logWarning(this.logSourceName, 'Web Vitals not supported in current environment');\r\n return;\r\n }\r\n\r\n getCLS(item => this.setLighthouseField(WebVitalFields.CLS, item.value), true);\r\n getFCP(item => {\r\n this.setLighthouseField(WebVitalFields.FCP, item.value);\r\n this.fcp = item.value;\r\n this.tryStartCalculatingTimeToInteractive();\r\n }, true);\r\n getLCP(item => this.setLighthouseField(WebVitalFields.LCP, item.value), true);\r\n getFID(item => {\r\n this.setLighthouseField(WebVitalFields.FID, item.value);\r\n if (!this.ttiInProgress) {\r\n this.setLighthouseField(WebVitalFields.TBT, this.totalBlockingTime);\r\n }\r\n });\r\n getTTFB(item => this.setLighthouseField(WebVitalFields.TTFB, item.value));\r\n\r\n // Set a performance observer to collect all the long task and resource events we need to calculate lighthouse metrics.\r\n this.wacPo = new PerformanceObserver(list => {\r\n const entries = list.getEntries();\r\n\r\n for (let i = 0; i < entries.length; ++i) {\r\n if (entries[i].entryType === PerformanceEntryType.LongTask) {\r\n // measure TBT as we collect long task events - if using FID, we can just send this accumulated value as is,\r\n // otherwise can recalculate this later when we find TTI.\r\n const entrySatisfiesBlockingCriteria = entries[i].duration > this.totalBlockingTimeThresholdRequirement && entries[i].startTime > this.fcp;\r\n this.totalBlockingTime += entrySatisfiesBlockingCriteria ? entries[i].duration : 0;\r\n this.tasks.push({\r\n startTime: entries[i].startTime,\r\n endTime: entries[i].startTime + entries[i].duration,\r\n entryType: PerformanceEntryType.LongTask\r\n } as TaskTiming);\r\n } else {\r\n this.tasks.push({\r\n startTime: entries[i].startTime,\r\n endTime: entries[i].startTime + entries[i].duration,\r\n entryType: PerformanceEntryType.Resource\r\n } as TaskTiming);\r\n }\r\n }\r\n });\r\n\r\n this.wacPo.observe({ entryTypes: [PerformanceEntryType.LongTask, PerformanceEntryType.Resource] });\r\n }\r\n\r\n public static coreEnvironmentInitStarted(): void {\r\n performance.mark(PerformanceTracker.markCoreEnvironmentInitStarted);\r\n }\r\n\r\n public static coreEnvironmentInitCompleted(): void {\r\n performance.mark(PerformanceTracker.markCoreEnvironmentInitCompleted);\r\n }\r\n\r\n public static manifestLoadStarted(): void {\r\n performance.mark(PerformanceTracker.markManifestLoadStarted);\r\n }\r\n\r\n public static localizationStarted(): void {\r\n performance.mark(PerformanceTracker.markLocalizationStarted);\r\n }\r\n\r\n public static accessibilityManagerStarted(): void {\r\n performance.mark(PerformanceTracker.markAccessibilityManagerStarted);\r\n }\r\n\r\n public static appContextServiceStarted(): void {\r\n performance.mark(PerformanceTracker.markAppContextServiceStarted);\r\n }\r\n\r\n public static appContextRpcInitStarted(): void {\r\n performance.mark(PerformanceTracker.markAppContextRpcInitStarted);\r\n }\r\n\r\n public static appContextRpcInitComplete(): void {\r\n performance.mark(PerformanceTracker.markAppContextRpcInitComplete);\r\n }\r\n\r\n public static appModuleInitialized(): void {\r\n performance.mark(PerformanceTracker.markAppModuleInitialized);\r\n }\r\n\r\n public static appComponentInitialized(): void {\r\n performance.mark(PerformanceTracker.markAppComponentInitialized);\r\n PerformanceTracker.logAppComponentLoadTime();\r\n }\r\n\r\n public static navigationInitialized(): void {\r\n PerformanceTracker.navigationCancelled();\r\n const navigationMarks = performance.getEntriesByType(PerformanceEntryType.Mark).filter(e => e.name.startsWith(PerformanceTracker.smePrefix + 'Navigation'));\r\n // If we reinitialize navigation, clear all previous navigation marks.\r\n navigationMarks.forEach(m => {\r\n performance.clearMarks(m.name);\r\n });\r\n performance.mark(PerformanceTracker.markNavigationInitialized);\r\n }\r\n\r\n public static navigationStarted(): void {\r\n // clear previous marks prior to starting new navigation\r\n performance.clearMarks(PerformanceTracker.markNavigationStarted);\r\n performance.clearMarks(PerformanceTracker.markNavigationCompleted);\r\n performance.clearMarks(PerformanceTracker.markCriticalDataLoaded);\r\n performance.clearMeasures(PerformanceTracker.markNavigationMeasure);\r\n\r\n performance.mark(PerformanceTracker.markNavigationStarted);\r\n }\r\n\r\n public static navigationCompleted(moduleOpened: boolean): void {\r\n // clear last measure b/c we are replacing.\r\n performance.clearMeasures(PerformanceTracker.markNavigationMeasure);\r\n\r\n // If the navigation via module open, set this flag so we can treat the criticalLoad differently than normal. We want to\r\n // separate this data b/c some modules have pivot tabs that can also trigger critical data loads multiple times.\r\n this.moduleOpening = moduleOpened;\r\n\r\n performance.mark(PerformanceTracker.markNavigationCompleted);\r\n performance.measure(PerformanceTracker.markNavigationMeasure, PerformanceTracker.markNavigationStarted, PerformanceTracker.markNavigationCompleted);\r\n\r\n // clear navigation start/end marks after we measure - only maintain one set of start/end to keep simple.\r\n performance.clearMarks(PerformanceTracker.markNavigationCompleted);\r\n performance.clearMarks(PerformanceTracker.markNavigationStarted);\r\n\r\n // Cached data can arrive in a child layout effect before the navigation commit.\r\n if (performance.getEntriesByName(PerformanceTracker.markCriticalDataLoaded).length) {\r\n PerformanceTracker.logCriticalDataLoadTime();\r\n }\r\n }\r\n\r\n /** Discard an abandoned navigation without emitting a successful load. */\r\n public static navigationCancelled(): void {\r\n performance.clearMarks(PerformanceTracker.markNavigationInitialized);\r\n performance.clearMarks(PerformanceTracker.markNavigationStarted);\r\n performance.clearMarks(PerformanceTracker.markNavigationCompleted);\r\n performance.clearMarks(PerformanceTracker.markCriticalDataLoaded);\r\n performance.clearMeasures(PerformanceTracker.markNavigationMeasure);\r\n }\r\n\r\n public static criticalDataLoaded(): void {\r\n performance.mark(PerformanceTracker.markCriticalDataLoaded);\r\n if (performance.getEntriesByName(PerformanceTracker.markNavigationStarted).length) {\r\n return;\r\n }\r\n PerformanceTracker.logCriticalDataLoadTime();\r\n }\r\n\r\n /**\r\n * Mark an arbitrary measurement with a label. Clear the previous mark(s) prior to starting new one - allow only one at\r\n * all times.\r\n * @param label The label for the mark and the index for the entry in the internal map.\r\n */\r\n public static markDataLoadStart(label: string) {\r\n const smeLabelString = `${PerformanceTracker.smePrefix}${label}`;\r\n\r\n // If we start, overwrite and clear existing entries.\r\n if (smeLabelString in this.dataLoadMap) {\r\n this.dataLoadMap[smeLabelString].forEach(mark => {\r\n performance.clearMarks(mark.name);\r\n });\r\n }\r\n performance.mark(smeLabelString);\r\n // get latest one\r\n const startMark = performance.getEntriesByName(smeLabelString).slice(-1)[0];\r\n\r\n this.dataLoadMap[smeLabelString] = [startMark];\r\n }\r\n\r\n /**\r\n * Mark an arbitrary measurement with a label. Intended to be a midpoint between a start and end.\r\n * @param label The label for the entry in the data map.\r\n * @param specificLabel The label for the mark\r\n */\r\n public static markDataIntermediary(label: string, specificLabel?: string) {\r\n const smeLabelString = `${PerformanceTracker.smePrefix}${label}`;\r\n\r\n if (!(smeLabelString in this.dataLoadMap)) {\r\n return;\r\n }\r\n\r\n const intermediaryLabel = specificLabel\r\n ? `${PerformanceTracker.smePrefix}${specificLabel}`\r\n : `${PerformanceTracker.smePrefix}${label}-${this.dataLoadMap[smeLabelString].length + 1}`;\r\n\r\n performance.mark(intermediaryLabel);\r\n\r\n // get latest one\r\n const mark = performance.getEntriesByName(intermediaryLabel).slice(-1)[0];\r\n\r\n this.dataLoadMap[smeLabelString].push(mark);\r\n }\r\n\r\n /**\r\n * Get a summary object from the aggregate data points marked previously.\r\n * @param label The label for the entry in the data map dictionary\r\n * @param specificLabel The label for the new measurement\r\n * @returns The performance summary of the multiple marks.\r\n */\r\n public static markDataLoadEnd(label: string, specificLabel?: string): SmePerformanceSummary {\r\n const smeLabelString = `${PerformanceTracker.smePrefix}${label}`;\r\n\r\n if (!(smeLabelString in this.dataLoadMap)) {\r\n return null;\r\n }\r\n const dataEntry = this.dataLoadMap[smeLabelString];\r\n\r\n const intermediaryLabel = specificLabel ? `${PerformanceTracker.smePrefix}${specificLabel}` : `${PerformanceTracker.smePrefix}${label}-${dataEntry.length + 1}`;\r\n\r\n performance.mark(intermediaryLabel);\r\n // get latest one\r\n const endMark = performance.getEntriesByName(intermediaryLabel).slice(-1)[0];\r\n dataEntry.push(endMark);\r\n\r\n const startEntry = dataEntry[0];\r\n\r\n const totalLoadTime = endMark.startTime - startEntry.startTime;\r\n\r\n // remove SME prefix here\r\n const summary: SmePerformanceSummary = {\r\n label: label,\r\n timestamps: {},\r\n totalLoadTime: totalLoadTime,\r\n startTime: startEntry.startTime\r\n };\r\n\r\n dataEntry.forEach((mark: PerformanceEntry) => {\r\n performance.clearMarks(mark.name);\r\n summary.timestamps[mark.name.replace(PerformanceTracker.smePrefix, '')] = mark.startTime - startEntry.startTime;\r\n });\r\n\r\n delete this.dataLoadMap[smeLabelString];\r\n return summary;\r\n }\r\n\r\n /**\r\n * Log app component load time - this contains timings up to when the appComponent is loaded.\r\n */\r\n private static logAppComponentLoadTime(): void {\r\n const data: SmePerformanceData = {\r\n sme: {},\r\n resources: {},\r\n navigation: {},\r\n totalLoadTime: 0\r\n };\r\n\r\n /// dont include sme angular navigation marks in the generic data load\r\n const smeMarks = performance\r\n .getEntriesByType(PerformanceEntryType.Mark)\r\n .filter(e => e.name.startsWith(PerformanceTracker.smePrefix) && !e.name.startsWith(PerformanceTracker.smePrefix + 'Navigation'));\r\n const resourceMarks = performance.getEntriesByType(PerformanceEntryType.Resource);\r\n smeMarks.forEach(m => {\r\n data.sme[m.name.replace(PerformanceTracker.smePrefix, '')] = m.startTime;\r\n performance.clearMarks(m.name);\r\n });\r\n resourceMarks.forEach((m: PerformanceResourceTiming) => {\r\n try {\r\n const url = new URL(m.name);\r\n data.resources[url.pathname] = m.duration;\r\n } catch (e) {\r\n data.resources[m.name] = m.duration;\r\n }\r\n performance.clearMarks(m.name);\r\n });\r\n data.totalLoadTime = data.sme[this.markAppComponentInitialized.replace(PerformanceTracker.smePrefix, '')];\r\n const navigationEntries = performance.getEntriesByType(PerformanceEntryType.Navigation);\r\n if (navigationEntries && navigationEntries.length) {\r\n data.navigation = navigationEntries[0];\r\n }\r\n\r\n SmeWebTelemetry.traceModuleOpenPerformance(data);\r\n }\r\n\r\n /**\r\n * Log critical data load time - this measures the time from angular's startNavigation event to a module to the point at\r\n * which criticalDataLoad() is called, usually in the ngInit of a module\r\n */\r\n private static logCriticalDataLoadTime(): void {\r\n const data: SmePerformanceData = {\r\n sme: {},\r\n totalLoadTime: 0\r\n };\r\n\r\n // If there are multiple somehow, take the latest one\r\n const navigationMeasure = performance.getEntriesByName(PerformanceTracker.markNavigationMeasure).slice(-1)[0];\r\n const criticalData = performance.getEntriesByName(PerformanceTracker.markCriticalDataLoaded).slice(-1)[0];\r\n\r\n // clear performance marks either way - if they exist, we clear them. If not, clear b/c it's faulty data.\r\n performance.clearMeasures(PerformanceTracker.markNavigationMeasure);\r\n performance.clearMarks(PerformanceTracker.markCriticalDataLoaded);\r\n\r\n if (!navigationMeasure || !criticalData) {\r\n Logging.logInformational('PerformanceTracker', 'Critical data loaded without either criticalData call or navigationMeasure call');\r\n return;\r\n }\r\n data.sme.criticalDataLoadTime = criticalData.startTime - navigationMeasure.startTime;\r\n data.sme.navigationTime = navigationMeasure.duration;\r\n data.totalLoadTime = data.sme.criticalDataLoadTime;\r\n\r\n // If there are multiple somehow, take the latest one\r\n const navInitialized = performance.getEntriesByName(PerformanceTracker.markNavigationInitialized).slice(-1)[0];\r\n if (navInitialized) {\r\n data.sme.timeToFirstNavigateInit = navInitialized.startTime;\r\n data.sme.timeToFirstNavigateStart = navigationMeasure.startTime;\r\n data.sme.timeToFirstNavigateEnd = navigationMeasure.startTime + navigationMeasure.duration;\r\n data.sme.timeToFirstCriticalData = criticalData.startTime;\r\n\r\n data.totalLoadTime = criticalData.startTime; // overwrite if navInit is true.\r\n\r\n performance.clearMarks(navInitialized.name);\r\n }\r\n\r\n if (this.moduleOpening) {\r\n SmeWebTelemetry.traceModuleOpenPerformance(data);\r\n } else {\r\n SmeWebTelemetry.tracePerformanceData(data);\r\n }\r\n }\r\n}\r\n"]}
@@ -1,3 +1,4 @@
1
+ import type { AzureRegistrationModel } from '../../azure/models/aadAppConfig-data';
1
2
  import { RpcBaseData } from '../rpc-base';
2
3
  /**
3
4
  * Azure request RPC call name and version.
@@ -70,11 +71,28 @@ export interface RpcAzureOperation extends RpcBaseData {
70
71
  * The set of permissions for which the token has to be requested.
71
72
  */
72
73
  tokenScopes?: string[];
74
+ /**
75
+ * True when a token request comes from a user action. When the user has never signed in, the shell then asks
76
+ * them to go to Settings > Azure. Older shells ignore it.
77
+ */
78
+ interactive?: boolean;
73
79
  }
74
80
  /**
75
81
  * Azure RPC app info.
76
82
  */
77
83
  export interface RpcAzureAppInfo {
84
+ /**
85
+ * True when the gateway is registered with Azure (any registration model).
86
+ */
87
+ isRegistered?: boolean;
88
+ /**
89
+ * How the gateway is registered: 'tenant_locked' (Azure RBAC) or 'app_rbac' (WAC RBAC).
90
+ */
91
+ registrationModel?: AzureRegistrationModel;
92
+ /**
93
+ * Azure cloud configured for the gateway registration.
94
+ */
95
+ cloudName?: string;
78
96
  /**
79
97
  * Logged in AAD user name
80
98
  */
@@ -111,7 +129,7 @@ export interface RpcAzureOperationResult {
111
129
  /**
112
130
  * Application information
113
131
  */
114
- appInfo: RpcAzureAppInfo;
132
+ appInfo: RpcAzureAppInfo | null;
115
133
  /**
116
134
  * Error if any
117
135
  */
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-azure-model.d.ts","sourceRoot":"","sources":["../../../src/rpc/azure/rpc-azure-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,qBAAa,kBAAkB;IAC3B,OAAc,OAAO,SAAkB;IACvC,OAAc,OAAO,SAAW;CACnC;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC5B,OAAc,OAAO,SAAW;IAChC,OAAc,OAAO,SAAW;CACnC;AAED;;GAEG;AACH,oBAAY,qBAAqB;IAC7B;;OAEG;IACH,YAAY,IAAI;IAEhB;;OAEG;IACH,eAAe,IAAI;IAEnB;;OAEG;IACH,WAAW,IAAI;IAEf;;OAEG;IACH,gBAAgB,IAAI;IAEpB;;OAEG;IACH,MAAM,IAAI;IAEV;;OAEG;IACH,OAAO,IAAI;IAEX;;OAEG;IACH,cAAc,IAAI;IAElB;;OAEG;IACH,iBAAiB,IAAI;IAErB;;OAEG;IACH,sBAAsB,IAAI;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IAClD;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,qBAAqB,CAAC;IAEjC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,EAAE,eAAe,CAAC;IAEzB;;OAEG;IACH,KAAK,CAAC,EAAE,GAAG,CAAC;CACf"}
1
+ {"version":3,"file":"rpc-azure-model.d.ts","sourceRoot":"","sources":["../../../src/rpc/azure/rpc-azure-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,qBAAa,kBAAkB;IAC3B,OAAc,OAAO,SAAkB;IACvC,OAAc,OAAO,SAAW;CACnC;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC5B,OAAc,OAAO,SAAW;IAChC,OAAc,OAAO,SAAW;CACnC;AAED;;GAEG;AACH,oBAAY,qBAAqB;IAC7B;;OAEG;IACH,YAAY,IAAI;IAEhB;;OAEG;IACH,eAAe,IAAI;IAEnB;;OAEG;IACH,WAAW,IAAI;IAEf;;OAEG;IACH,gBAAgB,IAAI;IAEpB;;OAEG;IACH,MAAM,IAAI;IAEV;;OAEG;IACH,OAAO,IAAI;IAEX;;OAEG;IACH,cAAc,IAAI;IAElB;;OAEG;IACH,iBAAiB,IAAI;IAErB;;OAEG;IACH,sBAAsB,IAAI;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IAClD;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,qBAAqB,CAAC;IAEjC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;IAE3C;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAEhC;;OAEG;IACH,KAAK,CAAC,EAAE,GAAG,CAAC;CACf"}
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-azure-model.js","sourceRoot":"","sources":["../../../src/rpc/azure/rpc-azure-model.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACpB,MAAM,CAAC,OAAO,GAAG,cAAc,CAAC;IAChC,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;;AAGpC;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACrB,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;;AAGpC;;GAEG;AACH,MAAM,CAAN,IAAY,qBA6CX;AA7CD,WAAY,qBAAqB;IAC7B;;OAEG;IACH,iFAAgB,CAAA;IAEhB;;OAEG;IACH,uFAAmB,CAAA;IAEnB;;OAEG;IACH,+EAAe,CAAA;IAEf;;OAEG;IACH,yFAAoB,CAAA;IAEpB;;OAEG;IACH,qEAAU,CAAA;IAEV;;OAEG;IACH,uEAAW,CAAA;IAEX;;OAEG;IACH,qFAAkB,CAAA;IAElB;;OAEG;IACH,2FAAqB,CAAA;IAErB;;OAEG;IACH,qGAA0B,CAAA;AAC9B,CAAC,EA7CW,qBAAqB,KAArB,qBAAqB,QA6ChC","sourcesContent":["import { RpcBaseData } from '../rpc-base';\r\n\r\n/**\r\n * Azure request RPC call name and version.\r\n */\r\nexport class RpcAzureRequestKey {\r\n public static command = 'AzureRequest';\r\n public static version = '0.2.0';\r\n}\r\n\r\n/**\r\n * Azure response RPC call name and version.\r\n */\r\nexport class RpcAzureResponseKey {\r\n public static command = 'Azure';\r\n public static version = '0.2.0';\r\n}\r\n\r\n/**\r\n * Identifies the Azure operation type to perform\r\n */\r\nexport enum RpcAzureOperationType {\r\n /**\r\n * Get AAD status and information\r\n */\r\n GetAadStatus = 0,\r\n\r\n /**\r\n * Open register AAD Dialog\r\n */\r\n OpenAzureDialog = 1,\r\n\r\n /**\r\n * Get AAD user token\r\n */\r\n GetAadToken = 2,\r\n\r\n /**\r\n * Get AAD user token for Azure AD Graph API\r\n */\r\n GetAadGraphToken = 3,\r\n\r\n /**\r\n * Sign in to Azure.\r\n */\r\n SignIn = 4,\r\n\r\n /**\r\n * Sign out of Azure.\r\n */\r\n SignOut = 5,\r\n\r\n /**\r\n * Sign in with a different account\r\n */\r\n SwitchAccounts = 6,\r\n\r\n /**\r\n * Check if user is signed in.\r\n */\r\n CheckUserSignedIn = 7,\r\n\r\n /**\r\n * Get AAD user token for Microsoft Graph API\r\n */\r\n GetMicrosoftGraphToken = 8\r\n}\r\n\r\n/**\r\n * Azure Manager operation/action RPC message.\r\n */\r\nexport interface RpcAzureOperation extends RpcBaseData {\r\n /**\r\n * Request specific Id to track completion.\r\n */\r\n requestId: string;\r\n\r\n /**\r\n * Type of Azure operation to perform\r\n */\r\n operation: RpcAzureOperationType;\r\n\r\n /**\r\n * The set of permissions for which the token has to be requested.\r\n */\r\n tokenScopes?: string[];\r\n}\r\n\r\n/**\r\n * Azure RPC app info.\r\n */\r\nexport interface RpcAzureAppInfo {\r\n /**\r\n * Logged in AAD user name\r\n */\r\n aadUserName: string;\r\n /**\r\n * Application id\r\n */\r\n appId: string;\r\n /**\r\n * Tenant id\r\n */\r\n tenantId: string;\r\n /**\r\n * Application name in AAD\r\n */\r\n appDisplayName: string;\r\n /**\r\n * Register AAD application verify url\r\n */\r\n appVerifyAddress: string;\r\n\r\n /**\r\n * Application token\r\n */\r\n token: string;\r\n}\r\n\r\n/**\r\n * Azure operation/action RPC message result.\r\n */\r\nexport interface RpcAzureOperationResult {\r\n /**\r\n * Request specific Id to track completion.\r\n */\r\n requestId: string;\r\n\r\n /**\r\n * Application information\r\n */\r\n appInfo: RpcAzureAppInfo;\r\n\r\n /**\r\n * Error if any\r\n */\r\n error?: any;\r\n}\r\n"]}
1
+ {"version":3,"file":"rpc-azure-model.js","sourceRoot":"","sources":["../../../src/rpc/azure/rpc-azure-model.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACpB,MAAM,CAAC,OAAO,GAAG,cAAc,CAAC;IAChC,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;;AAGpC;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACrB,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;;AAGpC;;GAEG;AACH,MAAM,CAAN,IAAY,qBA6CX;AA7CD,WAAY,qBAAqB;IAC7B;;OAEG;IACH,iFAAgB,CAAA;IAEhB;;OAEG;IACH,uFAAmB,CAAA;IAEnB;;OAEG;IACH,+EAAe,CAAA;IAEf;;OAEG;IACH,yFAAoB,CAAA;IAEpB;;OAEG;IACH,qEAAU,CAAA;IAEV;;OAEG;IACH,uEAAW,CAAA;IAEX;;OAEG;IACH,qFAAkB,CAAA;IAElB;;OAEG;IACH,2FAAqB,CAAA;IAErB;;OAEG;IACH,qGAA0B,CAAA;AAC9B,CAAC,EA7CW,qBAAqB,KAArB,qBAAqB,QA6ChC","sourcesContent":["import type { AzureRegistrationModel } from '../../azure/models/aadAppConfig-data';\r\nimport { RpcBaseData } from '../rpc-base';\r\n\r\n/**\r\n * Azure request RPC call name and version.\r\n */\r\nexport class RpcAzureRequestKey {\r\n public static command = 'AzureRequest';\r\n public static version = '0.2.0';\r\n}\r\n\r\n/**\r\n * Azure response RPC call name and version.\r\n */\r\nexport class RpcAzureResponseKey {\r\n public static command = 'Azure';\r\n public static version = '0.2.0';\r\n}\r\n\r\n/**\r\n * Identifies the Azure operation type to perform\r\n */\r\nexport enum RpcAzureOperationType {\r\n /**\r\n * Get AAD status and information\r\n */\r\n GetAadStatus = 0,\r\n\r\n /**\r\n * Open register AAD Dialog\r\n */\r\n OpenAzureDialog = 1,\r\n\r\n /**\r\n * Get AAD user token\r\n */\r\n GetAadToken = 2,\r\n\r\n /**\r\n * Get AAD user token for Azure AD Graph API\r\n */\r\n GetAadGraphToken = 3,\r\n\r\n /**\r\n * Sign in to Azure.\r\n */\r\n SignIn = 4,\r\n\r\n /**\r\n * Sign out of Azure.\r\n */\r\n SignOut = 5,\r\n\r\n /**\r\n * Sign in with a different account\r\n */\r\n SwitchAccounts = 6,\r\n\r\n /**\r\n * Check if user is signed in.\r\n */\r\n CheckUserSignedIn = 7,\r\n\r\n /**\r\n * Get AAD user token for Microsoft Graph API\r\n */\r\n GetMicrosoftGraphToken = 8\r\n}\r\n\r\n/**\r\n * Azure Manager operation/action RPC message.\r\n */\r\nexport interface RpcAzureOperation extends RpcBaseData {\r\n /**\r\n * Request specific Id to track completion.\r\n */\r\n requestId: string;\r\n\r\n /**\r\n * Type of Azure operation to perform\r\n */\r\n operation: RpcAzureOperationType;\r\n\r\n /**\r\n * The set of permissions for which the token has to be requested.\r\n */\r\n tokenScopes?: string[];\r\n\r\n /**\r\n * True when a token request comes from a user action. When the user has never signed in, the shell then asks\r\n * them to go to Settings > Azure. Older shells ignore it.\r\n */\r\n interactive?: boolean;\r\n}\r\n\r\n/**\r\n * Azure RPC app info.\r\n */\r\nexport interface RpcAzureAppInfo {\r\n /**\r\n * True when the gateway is registered with Azure (any registration model).\r\n */\r\n isRegistered?: boolean;\r\n\r\n /**\r\n * How the gateway is registered: 'tenant_locked' (Azure RBAC) or 'app_rbac' (WAC RBAC).\r\n */\r\n registrationModel?: AzureRegistrationModel;\r\n\r\n /**\r\n * Azure cloud configured for the gateway registration.\r\n */\r\n cloudName?: string;\r\n\r\n /**\r\n * Logged in AAD user name\r\n */\r\n aadUserName: string;\r\n /**\r\n * Application id\r\n */\r\n appId: string;\r\n /**\r\n * Tenant id\r\n */\r\n tenantId: string;\r\n /**\r\n * Application name in AAD\r\n */\r\n appDisplayName: string;\r\n /**\r\n * Register AAD application verify url\r\n */\r\n appVerifyAddress: string;\r\n\r\n /**\r\n * Application token\r\n */\r\n token: string;\r\n}\r\n\r\n/**\r\n * Azure operation/action RPC message result.\r\n */\r\nexport interface RpcAzureOperationResult {\r\n /**\r\n * Request specific Id to track completion.\r\n */\r\n requestId: string;\r\n\r\n /**\r\n * Application information\r\n */\r\n appInfo: RpcAzureAppInfo | null;\r\n\r\n /**\r\n * Error if any\r\n */\r\n error?: any;\r\n}\r\n"]}
@@ -5,5 +5,10 @@ export declare class RpcForwardAutoClient {
5
5
  * report a forward update from the shell or module
6
6
  */
7
7
  static forward<T>(rpc: Rpc, data: RpcForwardReportData): Promise<RpcForwardResponse<T>>;
8
+ /**
9
+ * Forwards a message from the shell to all child frames with the given RPC name.
10
+ * Resolves with null when no matching child frame is currently loaded.
11
+ */
12
+ static forwardToChildren<T>(rpc: Rpc, childName: string, data: RpcForwardReportData): Promise<RpcForwardResponse<T>>;
8
13
  }
9
14
  //# sourceMappingURL=rpc-forward-auto-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-forward-auto-client.d.ts","sourceRoot":"","sources":["../../../src/rpc/forward/rpc-forward-auto-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAE7B,OAAO,EAAqB,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGlG,qBAAa,oBAAoB;IAC7B;;OAEG;WACW,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;CAoBjG"}
1
+ {"version":3,"file":"rpc-forward-auto-client.d.ts","sourceRoot":"","sources":["../../../src/rpc/forward/rpc-forward-auto-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAE7B,OAAO,EAAqB,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGlG,qBAAa,oBAAoB;IAC7B;;OAEG;WACW,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAqB9F;;;OAGG;WACW,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;CAsB9H"}
@@ -22,5 +22,18 @@ export class RpcForwardAutoClient {
22
22
  }))
23
23
  .toPromise();
24
24
  }
25
+ /**
26
+ * Forwards a message from the shell to all child frames with the given RPC name.
27
+ * Resolves with null when no matching child frame is currently loaded.
28
+ */
29
+ static forwardToChildren(rpc, childName, data) {
30
+ const outbounds = rpc.rpcManager.getCurrentRpcOutbound().filter(rpcOutbound => rpcOutbound.name === childName);
31
+ if (outbounds.length === 0) {
32
+ return Promise.resolve(null);
33
+ }
34
+ return zip(...outbounds.map(rpcOutbound => from(RpcOutboundClient.callOutbound(rpc.rpcManager.rpcChannel, rpcOutbound, RpcForwardDownKey.command, RpcForwardDownKey.version, data))))
35
+ .pipe(map(results => results.find(result => result && result.error) || results[0]))
36
+ .toPromise();
37
+ }
25
38
  }
26
39
  //# sourceMappingURL=rpc-forward-auto-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-forward-auto-client.js","sourceRoot":"","sources":["../../../src/rpc/forward/rpc-forward-auto-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAErC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAA4C,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,OAAO,oBAAoB;IAC7B;;OAEG;IACI,MAAM,CAAC,OAAO,CAAI,GAAQ,EAAE,IAA0B;QACzD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,kBAAkB,CAAC,OAAO,CAAM,GAAG,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;QAED,8DAA8D;QAC9D,+FAA+F;QAC/F,OAAO,GAAG,CACN,GAAG,GAAG,CAAC,UAAU;aACZ,qBAAqB,EAAE;aACvB,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,WAAW,EAAE,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CACpK;aACI,IAAI,CACD,GAAG,CAAC,OAAO,CAAC,EAAE;YACV,mDAAmD;YACnD,OAAO,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,KAAK,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;QACjG,CAAC,CAAC,CACL;aACA,SAAS,EAAE,CAAC;IACrB,CAAC;CACJ","sourcesContent":["import { from, zip } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { Rpc } from '../rpc';\r\nimport { RpcOutboundClient } from '../rpc-outbound-client';\r\nimport { RpcForwardDownKey, RpcForwardReportData, RpcForwardResponse } from './rpc-forward-model';\r\nimport { RpcForwardUpClient } from './rpc-forward-up-client';\r\n\r\nexport class RpcForwardAutoClient {\r\n /**\r\n * report a forward update from the shell or module\r\n */\r\n public static forward<T>(rpc: Rpc, data: RpcForwardReportData): Promise<RpcForwardResponse<T>> {\r\n if (!rpc.isShell) {\r\n return RpcForwardUpClient.forward<any>(rpc, data);\r\n }\r\n\r\n // If we are the shell, then broadcast forwards to all iframes\r\n // since only gateway, connections, and auth services use this architecture, it should be safe.\r\n return zip(\r\n ...rpc.rpcManager\r\n .getCurrentRpcOutbound()\r\n .map(rpcOutbound => from(RpcOutboundClient.callOutbound(rpc.rpcManager.rpcChannel, rpcOutbound, RpcForwardDownKey.command, RpcForwardDownKey.version, data)))\r\n )\r\n .pipe(\r\n map(results => {\r\n // TODO: do we care about errors from other frames?\r\n return results.find(rpcOutbound => rpcOutbound === rpc.rpcManager.rpcOutbound) || results[0];\r\n })\r\n )\r\n .toPromise();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"rpc-forward-auto-client.js","sourceRoot":"","sources":["../../../src/rpc/forward/rpc-forward-auto-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAErC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAA4C,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,OAAO,oBAAoB;IAC7B;;OAEG;IACI,MAAM,CAAC,OAAO,CAAI,GAAQ,EAAE,IAA0B;QACzD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,kBAAkB,CAAC,OAAO,CAAM,GAAG,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;QAED,8DAA8D;QAC9D,+FAA+F;QAC/F,OAAO,GAAG,CACN,GAAG,GAAG,CAAC,UAAU;aACZ,qBAAqB,EAAE;aACvB,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,WAAW,EAAE,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CACpK;aACI,IAAI,CACD,GAAG,CAAC,OAAO,CAAC,EAAE;YACV,mDAAmD;YACnD,OAAO,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,KAAK,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;QACjG,CAAC,CAAC,CACL;aACA,SAAS,EAAE,CAAC;IACrB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,iBAAiB,CAAI,GAAQ,EAAE,SAAiB,EAAE,IAA0B;QACtF,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC/G,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,GAAG,CACN,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAC3B,IAAI,CACA,iBAAiB,CAAC,YAAY,CAC1B,GAAG,CAAC,UAAU,CAAC,UAAU,EACzB,WAAW,EACX,iBAAiB,CAAC,OAAO,EACzB,iBAAiB,CAAC,OAAO,EACzB,IAAI,CACP,CACJ,CACJ,CACJ;aACI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;aAClF,SAAS,EAAE,CAAC;IACrB,CAAC;CACJ","sourcesContent":["import { from, zip } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { Rpc } from '../rpc';\r\nimport { RpcOutboundClient } from '../rpc-outbound-client';\r\nimport { RpcForwardDownKey, RpcForwardReportData, RpcForwardResponse } from './rpc-forward-model';\r\nimport { RpcForwardUpClient } from './rpc-forward-up-client';\r\n\r\nexport class RpcForwardAutoClient {\r\n /**\r\n * report a forward update from the shell or module\r\n */\r\n public static forward<T>(rpc: Rpc, data: RpcForwardReportData): Promise<RpcForwardResponse<T>> {\r\n if (!rpc.isShell) {\r\n return RpcForwardUpClient.forward<any>(rpc, data);\r\n }\r\n\r\n // If we are the shell, then broadcast forwards to all iframes\r\n // since only gateway, connections, and auth services use this architecture, it should be safe.\r\n return zip(\r\n ...rpc.rpcManager\r\n .getCurrentRpcOutbound()\r\n .map(rpcOutbound => from(RpcOutboundClient.callOutbound(rpc.rpcManager.rpcChannel, rpcOutbound, RpcForwardDownKey.command, RpcForwardDownKey.version, data)))\r\n )\r\n .pipe(\r\n map(results => {\r\n // TODO: do we care about errors from other frames?\r\n return results.find(rpcOutbound => rpcOutbound === rpc.rpcManager.rpcOutbound) || results[0];\r\n })\r\n )\r\n .toPromise();\r\n }\r\n\r\n /**\r\n * Forwards a message from the shell to all child frames with the given RPC name.\r\n * Resolves with null when no matching child frame is currently loaded.\r\n */\r\n public static forwardToChildren<T>(rpc: Rpc, childName: string, data: RpcForwardReportData): Promise<RpcForwardResponse<T>> {\r\n const outbounds = rpc.rpcManager.getCurrentRpcOutbound().filter(rpcOutbound => rpcOutbound.name === childName);\r\n if (outbounds.length === 0) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n return zip(\r\n ...outbounds.map(rpcOutbound =>\r\n from(\r\n RpcOutboundClient.callOutbound<RpcForwardReportData, RpcForwardResponse<T>>(\r\n rpc.rpcManager.rpcChannel,\r\n rpcOutbound,\r\n RpcForwardDownKey.command,\r\n RpcForwardDownKey.version,\r\n data\r\n )\r\n )\r\n )\r\n )\r\n .pipe(map(results => results.find(result => result && result.error) || results[0]))\r\n .toPromise();\r\n }\r\n}\r\n"]}
@@ -0,0 +1,16 @@
1
+ import { Rpc } from '../rpc';
2
+ import { RpcResourceDataChanged } from './rpc-resource-data-changed-model';
3
+ /**
4
+ * Sends resource-data invalidation requests from an extension to its shell.
5
+ */
6
+ export declare class RpcResourceDataChangedClient {
7
+ /**
8
+ * Notifies the shell that resource data changed for one or more nodes.
9
+ *
10
+ * @param rpc The RPC instance.
11
+ * @param data The affected node names.
12
+ * @returns A promise that resolves after the shell handles the request.
13
+ */
14
+ static notify(rpc: Rpc, data: RpcResourceDataChanged): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=rpc-resource-data-changed-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-resource-data-changed-client.d.ts","sourceRoot":"","sources":["../../../src/rpc/resource-data-changed/rpc-resource-data-changed-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAE7B,OAAO,EAAE,sBAAsB,EAA6B,MAAM,mCAAmC,CAAC;AAEtG;;GAEG;AACH,qBAAa,4BAA4B;IACrC;;;;;;OAMG;WACW,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9E"}
@@ -0,0 +1,18 @@
1
+ import { RpcInboundClient } from '../rpc-inbound-client';
2
+ import { RpcResourceDataChangedKey } from './rpc-resource-data-changed-model';
3
+ /**
4
+ * Sends resource-data invalidation requests from an extension to its shell.
5
+ */
6
+ export class RpcResourceDataChangedClient {
7
+ /**
8
+ * Notifies the shell that resource data changed for one or more nodes.
9
+ *
10
+ * @param rpc The RPC instance.
11
+ * @param data The affected node names.
12
+ * @returns A promise that resolves after the shell handles the request.
13
+ */
14
+ static notify(rpc, data) {
15
+ return RpcInboundClient.call(rpc, RpcResourceDataChangedKey.command, RpcResourceDataChangedKey.version, data);
16
+ }
17
+ }
18
+ //# sourceMappingURL=rpc-resource-data-changed-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-resource-data-changed-client.js","sourceRoot":"","sources":["../../../src/rpc/resource-data-changed/rpc-resource-data-changed-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAA0B,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAEtG;;GAEG;AACH,MAAM,OAAO,4BAA4B;IACrC;;;;;;OAMG;IACI,MAAM,CAAC,MAAM,CAAC,GAAQ,EAAE,IAA4B;QACvD,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,yBAAyB,CAAC,OAAO,EAAE,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClH,CAAC;CACJ","sourcesContent":["import { Rpc } from '../rpc';\r\nimport { RpcInboundClient } from '../rpc-inbound-client';\r\nimport { RpcResourceDataChanged, RpcResourceDataChangedKey } from './rpc-resource-data-changed-model';\r\n\r\n/**\r\n * Sends resource-data invalidation requests from an extension to its shell.\r\n */\r\nexport class RpcResourceDataChangedClient {\r\n /**\r\n * Notifies the shell that resource data changed for one or more nodes.\r\n *\r\n * @param rpc The RPC instance.\r\n * @param data The affected node names.\r\n * @returns A promise that resolves after the shell handles the request.\r\n */\r\n public static notify(rpc: Rpc, data: RpcResourceDataChanged): Promise<void> {\r\n return RpcInboundClient.call(rpc, RpcResourceDataChangedKey.command, RpcResourceDataChangedKey.version, data);\r\n }\r\n}\r\n"]}
@@ -0,0 +1,8 @@
1
+ import { RpcResourceDataChanged } from './rpc-resource-data-changed-model';
2
+ /**
3
+ * RPC resource data changed server-side handler interface.
4
+ */
5
+ export interface RpcResourceDataChangedHandler {
6
+ handler(data: RpcResourceDataChanged): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=rpc-resource-data-changed-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-resource-data-changed-handler.d.ts","sourceRoot":"","sources":["../../../src/rpc/resource-data-changed/rpc-resource-data-changed-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C,OAAO,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rpc-resource-data-changed-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-resource-data-changed-handler.js","sourceRoot":"","sources":["../../../src/rpc/resource-data-changed/rpc-resource-data-changed-handler.ts"],"names":[],"mappings":"","sourcesContent":["import { RpcResourceDataChanged } from './rpc-resource-data-changed-model';\r\n\r\n/**\r\n * RPC resource data changed server-side handler interface.\r\n */\r\nexport interface RpcResourceDataChangedHandler {\r\n handler(data: RpcResourceDataChanged): Promise<void>;\r\n}\r\n"]}
@@ -0,0 +1,18 @@
1
+ import { RpcBaseData } from '../rpc-base';
2
+ /**
3
+ * RPC resource data changed request name and version.
4
+ */
5
+ export declare class RpcResourceDataChangedKey {
6
+ static command: string;
7
+ static version: string;
8
+ }
9
+ /**
10
+ * Identifies nodes whose resource inventory changed and should be collected again.
11
+ */
12
+ export interface RpcResourceDataChanged extends RpcBaseData {
13
+ /**
14
+ * Node names whose resource data changed. Cluster names must not be included.
15
+ */
16
+ nodeNames: string[];
17
+ }
18
+ //# sourceMappingURL=rpc-resource-data-changed-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-resource-data-changed-model.d.ts","sourceRoot":"","sources":["../../../src/rpc/resource-data-changed/rpc-resource-data-changed-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,qBAAa,yBAAyB;IAClC,OAAc,OAAO,SAAyB;IAC9C,OAAc,OAAO,SAAW;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,WAAW;IACvD;;OAEG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;CACvB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * RPC resource data changed request name and version.
3
+ */
4
+ export class RpcResourceDataChangedKey {
5
+ static command = 'ResourceDataChanged';
6
+ static version = '0.1.0';
7
+ }
8
+ //# sourceMappingURL=rpc-resource-data-changed-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-resource-data-changed-model.js","sourceRoot":"","sources":["../../../src/rpc/resource-data-changed/rpc-resource-data-changed-model.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,yBAAyB;IAC3B,MAAM,CAAC,OAAO,GAAG,qBAAqB,CAAC;IACvC,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC","sourcesContent":["import { RpcBaseData } from '../rpc-base';\r\n\r\n/**\r\n * RPC resource data changed request name and version.\r\n */\r\nexport class RpcResourceDataChangedKey {\r\n public static command = 'ResourceDataChanged';\r\n public static version = '0.1.0';\r\n}\r\n\r\n/**\r\n * Identifies nodes whose resource inventory changed and should be collected again.\r\n */\r\nexport interface RpcResourceDataChanged extends RpcBaseData {\r\n /**\r\n * Node names whose resource data changed. Cluster names must not be included.\r\n */\r\n nodeNames: string[];\r\n}\r\n"]}
@@ -0,0 +1,27 @@
1
+ import { Subject } from 'rxjs';
2
+ import { DeferredData, Rpc } from '../rpc';
3
+ import { RpcSubjectServer } from '../rpc-subject-server';
4
+ import { RpcResourceDataChangedHandler } from './rpc-resource-data-changed-handler';
5
+ import { RpcResourceDataChanged } from './rpc-resource-data-changed-model';
6
+ /**
7
+ * Resource data changed subject interface.
8
+ */
9
+ export interface RpcResourceDataChangedSubject extends Subject<DeferredData<RpcResourceDataChanged, void>> {
10
+ }
11
+ /**
12
+ * Receives resource-data invalidation requests through an RxJS subject.
13
+ */
14
+ export declare class RpcResourceDataChangedSubjectServer extends RpcSubjectServer<RpcResourceDataChanged, void> implements RpcResourceDataChangedHandler {
15
+ /**
16
+ * Initializes a new instance of the RpcResourceDataChangedSubjectServer class.
17
+ */
18
+ constructor(rpc: Rpc);
19
+ /**
20
+ * Publishes the request to the registered shell handler.
21
+ *
22
+ * @param data The affected node names.
23
+ * @returns A promise that resolves when the shell handler completes.
24
+ */
25
+ handler(data: RpcResourceDataChanged): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=rpc-resource-data-changed-subject-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-resource-data-changed-subject-server.d.ts","sourceRoot":"","sources":["../../../src/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAA6B,MAAM,mCAAmC,CAAC;AAEtG;;GAEG;AACH,MAAM,WAAW,6BAA8B,SAAQ,OAAO,CAAC,YAAY,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;CAAG;AAE7G;;GAEG;AACH,qBAAa,mCAAoC,SAAQ,gBAAgB,CAAC,sBAAsB,EAAE,IAAI,CAAE,YAAW,6BAA6B;IAC5I;;OAEG;gBACS,GAAG,EAAE,GAAG;IAIpB;;;;;OAKG;IACI,OAAO,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9D"}
@@ -0,0 +1,23 @@
1
+ import { RpcSubjectServer } from '../rpc-subject-server';
2
+ import { RpcResourceDataChangedKey } from './rpc-resource-data-changed-model';
3
+ /**
4
+ * Receives resource-data invalidation requests through an RxJS subject.
5
+ */
6
+ export class RpcResourceDataChangedSubjectServer extends RpcSubjectServer {
7
+ /**
8
+ * Initializes a new instance of the RpcResourceDataChangedSubjectServer class.
9
+ */
10
+ constructor(rpc) {
11
+ super(rpc, RpcResourceDataChangedKey.command);
12
+ }
13
+ /**
14
+ * Publishes the request to the registered shell handler.
15
+ *
16
+ * @param data The affected node names.
17
+ * @returns A promise that resolves when the shell handler completes.
18
+ */
19
+ handler(data) {
20
+ return this.processNextForSubject(RpcResourceDataChangedKey.command, data);
21
+ }
22
+ }
23
+ //# sourceMappingURL=rpc-resource-data-changed-subject-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-resource-data-changed-subject-server.js","sourceRoot":"","sources":["../../../src/rpc/resource-data-changed/rpc-resource-data-changed-subject-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAA0B,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAOtG;;GAEG;AACH,MAAM,OAAO,mCAAoC,SAAQ,gBAA8C;IACnG;;OAEG;IACH,YAAY,GAAQ;QAChB,KAAK,CAAC,GAAG,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACI,OAAO,CAAC,IAA4B;QACvC,OAAO,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/E,CAAC;CACJ","sourcesContent":["import { Subject } from 'rxjs';\r\nimport { DeferredData, Rpc } from '../rpc';\r\nimport { RpcSubjectServer } from '../rpc-subject-server';\r\nimport { RpcResourceDataChangedHandler } from './rpc-resource-data-changed-handler';\r\nimport { RpcResourceDataChanged, RpcResourceDataChangedKey } from './rpc-resource-data-changed-model';\r\n\r\n/**\r\n * Resource data changed subject interface.\r\n */\r\nexport interface RpcResourceDataChangedSubject extends Subject<DeferredData<RpcResourceDataChanged, void>> {}\r\n\r\n/**\r\n * Receives resource-data invalidation requests through an RxJS subject.\r\n */\r\nexport class RpcResourceDataChangedSubjectServer extends RpcSubjectServer<RpcResourceDataChanged, void> implements RpcResourceDataChangedHandler {\r\n /**\r\n * Initializes a new instance of the RpcResourceDataChangedSubjectServer class.\r\n */\r\n constructor(rpc: Rpc) {\r\n super(rpc, RpcResourceDataChangedKey.command);\r\n }\r\n\r\n /**\r\n * Publishes the request to the registered shell handler.\r\n *\r\n * @param data The affected node names.\r\n * @returns A promise that resolves when the shell handler completes.\r\n */\r\n public handler(data: RpcResourceDataChanged): Promise<void> {\r\n return this.processNextForSubject(RpcResourceDataChangedKey.command, data);\r\n }\r\n}\r\n"]}
@@ -58,17 +58,19 @@ export declare abstract class RpcServiceForwarder {
58
58
  /**
59
59
  * Called when a new instance of the service in another window is initialized and needs to synchronize with its parent
60
60
  * @param from The RpcRelationshipType that this request is from
61
+ * @param sourceName The name of the remote RPC that sent the request, when known
61
62
  * @returns an observable for the all the values needed to initialize the service
62
63
  */
63
- protected abstract onForwardInit(): Observable<any>;
64
+ protected abstract onForwardInit(sourceName?: string): Observable<any>;
64
65
  /**
65
66
  * Called when the forwarded services counterpart wants to get data from the parent
66
67
  * @param from The RpcRelationshipType that this request is from
67
68
  * @param name The name of the method to forward to
68
69
  * @param args The arguments of the method
70
+ * @param sourceName The name of the remote RPC that sent the request, when known
69
71
  * @returns an observable for the result of the method call
70
72
  */
71
- protected abstract onForwardExecute(from: RpcRelationshipType, name: string, args: any[]): Observable<any>;
73
+ protected abstract onForwardExecute(from: RpcRelationshipType, name: string, args: any[], sourceName?: string): Observable<any>;
72
74
  /**
73
75
  * Called when the forwarded services counterpart sends a notify message
74
76
  * @param from The RpcRelationshipType that this request is from
@@ -96,6 +98,18 @@ export declare abstract class RpcServiceForwarder {
96
98
  * @returns an observable for the result of the method call
97
99
  */
98
100
  protected forwardExecute<T>(to: RpcRelationshipType, name: string, args: any[]): Observable<T> | void;
101
+ /**
102
+ * Executes a method in all child frames with the given RPC name and waits for their responses.
103
+ */
104
+ protected forwardExecuteToChildren<T>(childName: string, name: string, args: unknown[]): Observable<T> | void;
105
+ /**
106
+ * Forwards a notification from the shell to all child frames with the given RPC name.
107
+ * @param childName The RPC name of the child frames to notify
108
+ * @param name The name of the state change
109
+ * @param value The new value of some state
110
+ * @returns an observable that completes when the state has been changed, or nothing if the message cannot be forwarded.
111
+ */
112
+ protected forwardNotifyToChildren(childName: string, name: string, value: any): Observable<void> | void;
99
113
  /**
100
114
  * Forwards a notification of some state change to the target relationship type
101
115
  * @param to The RpcRelationshipType that this request is intended for
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-forwarder.d.ts","sourceRoot":"","sources":["../../src/rpc/rpc-forwarder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAkB,MAAM,MAAM,CAAC;AAIxD,OAAO,EAA8E,oBAAoB,EAAE,kBAAkB,EAAkB,MAAM,6BAA6B,CAAC;AAEnL,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;GAGG;AACH,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAAC,yBAAyB,CAAiC;IACzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAmB;IACvC,OAAO,CAAC,MAAM,CAAC,UAAU,CAA4E;WACvF,YAAY,CAAC,GAAG,EAAE,GAAG;WAsCrB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,mBAAmB,GAAG,IAAI;IAW/E,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAmBhC;;;;;;OAMG;WACW,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;CAqBlD;AAED;;;;;;GAMG;AACH,8BAAsB,mBAAmB;IAKjC,OAAO,CAAC,SAAS;IACjB,SAAS,CAAC,GAAG,EAAE,GAAG;IALtB;;OAEG;gBAES,SAAS,EAAE,MAAM,EACf,GAAG,EAAE,GAAG;IAKtB;;;;OAIG;IACI,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,UAAU,CAAC,GAAG,CAAC;IAiB1E;;OAEG;IACI,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC;IAsBxC;;OAEG;IACI,yBAAyB,IAAI,UAAU,CAAC,IAAI,CAAC;IAepD;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,IAAI;IAE7E;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,aAAa,IAAI,UAAU,CAAC,GAAG,CAAC;IAEnD;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC;IAE1G;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC;IAEzG;;;OAGG;IACH,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC;IAIrD;;;;OAIG;IACH,SAAS,CAAC,UAAU,CAAC,EAAE,EAAE,mBAAmB;IAoB5C;;;;;;OAMG;IACH,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAwBrG;;;;;;OAMG;IACH,SAAS,CAAC,aAAa,CAAC,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,UAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI;CAuB9H"}
1
+ {"version":3,"file":"rpc-forwarder.d.ts","sourceRoot":"","sources":["../../src/rpc/rpc-forwarder.ts"],"names":[],"mappings":"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"}