@fluidframework/container-runtime 2.118.1 → 3.0.1

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 (326) hide show
  1. package/CHANGELOG.md +68 -4
  2. package/README.md +53 -50
  3. package/{api-extractor.json → api-extractor/api-extractor-model.json} +1 -1
  4. package/api-report/container-runtime.legacy.alpha.api.md +3 -1
  5. package/api-report/container-runtime.legacy.beta.api.md +3 -1
  6. package/container-runtime.test-files.tar +0 -0
  7. package/dist/batchTracker.d.ts.map +1 -1
  8. package/dist/batchTracker.js +5 -1
  9. package/dist/batchTracker.js.map +1 -1
  10. package/dist/blobManager/blobManager.d.ts +1 -1
  11. package/dist/blobManager/blobManager.d.ts.map +1 -1
  12. package/dist/blobManager/blobManager.js +264 -231
  13. package/dist/blobManager/blobManager.js.map +1 -1
  14. package/dist/blobManager/blobManagerSnapSum.d.ts.map +1 -1
  15. package/dist/channelCollection.d.ts.map +1 -1
  16. package/dist/channelCollection.js +70 -58
  17. package/dist/channelCollection.js.map +1 -1
  18. package/dist/connectionTelemetry.js +38 -20
  19. package/dist/connectionTelemetry.js.map +1 -1
  20. package/dist/containerCompatibility.d.ts +3 -3
  21. package/dist/containerCompatibility.d.ts.map +1 -1
  22. package/dist/containerCompatibility.js +36 -45
  23. package/dist/containerCompatibility.js.map +1 -1
  24. package/dist/containerHandleContext.d.ts.map +1 -1
  25. package/dist/containerHandleContext.js +4 -0
  26. package/dist/containerHandleContext.js.map +1 -1
  27. package/dist/containerRuntime.d.ts +4 -4
  28. package/dist/containerRuntime.d.ts.map +1 -1
  29. package/dist/containerRuntime.js +346 -223
  30. package/dist/containerRuntime.js.map +1 -1
  31. package/dist/dataStore.d.ts.map +1 -1
  32. package/dist/dataStore.js +9 -1
  33. package/dist/dataStore.js.map +1 -1
  34. package/dist/dataStoreContext.d.ts.map +1 -1
  35. package/dist/dataStoreContext.js +184 -127
  36. package/dist/dataStoreContext.js.map +1 -1
  37. package/dist/dataStoreContexts.js +43 -42
  38. package/dist/dataStoreContexts.js.map +1 -1
  39. package/dist/dataStoreRegistry.js +1 -0
  40. package/dist/dataStoreRegistry.js.map +1 -1
  41. package/dist/deltaManagerProxies.js +5 -0
  42. package/dist/deltaManagerProxies.js.map +1 -1
  43. package/dist/deltaScheduler.js +104 -99
  44. package/dist/deltaScheduler.js.map +1 -1
  45. package/dist/error.js +2 -1
  46. package/dist/error.js.map +1 -1
  47. package/dist/gc/garbageCollection.js +85 -55
  48. package/dist/gc/garbageCollection.js.map +1 -1
  49. package/dist/gc/gcConfigs.js +2 -3
  50. package/dist/gc/gcConfigs.js.map +1 -1
  51. package/dist/gc/gcHelpers.js +12 -13
  52. package/dist/gc/gcHelpers.js.map +1 -1
  53. package/dist/gc/gcReferenceGraphAlgorithm.js +1 -2
  54. package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -1
  55. package/dist/gc/gcSummaryStateTracker.js +8 -3
  56. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  57. package/dist/gc/gcTelemetry.js +12 -5
  58. package/dist/gc/gcTelemetry.js.map +1 -1
  59. package/dist/gc/gcUnreferencedStateTracker.js +18 -1
  60. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  61. package/dist/inboundBatchAggregator.js +122 -117
  62. package/dist/inboundBatchAggregator.js.map +1 -1
  63. package/dist/metadata.d.ts.map +1 -1
  64. package/dist/metadata.js +3 -3
  65. package/dist/metadata.js.map +1 -1
  66. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  67. package/dist/opLifecycle/batchManager.js +11 -5
  68. package/dist/opLifecycle/batchManager.js.map +1 -1
  69. package/dist/opLifecycle/duplicateBatchDetector.js +18 -18
  70. package/dist/opLifecycle/duplicateBatchDetector.js.map +1 -1
  71. package/dist/opLifecycle/index.d.ts +2 -2
  72. package/dist/opLifecycle/index.d.ts.map +1 -1
  73. package/dist/opLifecycle/index.js +2 -1
  74. package/dist/opLifecycle/index.js.map +1 -1
  75. package/dist/opLifecycle/opCompressor.js +2 -1
  76. package/dist/opLifecycle/opCompressor.js.map +1 -1
  77. package/dist/opLifecycle/opDecompressor.js +10 -6
  78. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  79. package/dist/opLifecycle/opGroupingManager.js +5 -3
  80. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  81. package/dist/opLifecycle/opSerialization.d.ts +11 -1
  82. package/dist/opLifecycle/opSerialization.d.ts.map +1 -1
  83. package/dist/opLifecycle/opSerialization.js +22 -6
  84. package/dist/opLifecycle/opSerialization.js.map +1 -1
  85. package/dist/opLifecycle/opSplitter.d.ts +17 -1
  86. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  87. package/dist/opLifecycle/opSplitter.js +46 -9
  88. package/dist/opLifecycle/opSplitter.js.map +1 -1
  89. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  90. package/dist/opLifecycle/outbox.js +17 -13
  91. package/dist/opLifecycle/outbox.js.map +1 -1
  92. package/dist/opLifecycle/remoteMessageProcessor.js +6 -3
  93. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  94. package/dist/opProperties.d.ts.map +1 -1
  95. package/dist/packageVersion.d.ts +1 -1
  96. package/dist/packageVersion.d.ts.map +1 -1
  97. package/dist/packageVersion.js +1 -1
  98. package/dist/packageVersion.js.map +1 -1
  99. package/dist/pendingStateManager.js +54 -47
  100. package/dist/pendingStateManager.js.map +1 -1
  101. package/dist/runCounter.js +10 -30
  102. package/dist/runCounter.js.map +1 -1
  103. package/dist/runtimeLayerCompatState.d.ts +1 -1
  104. package/dist/runtimeLayerCompatState.d.ts.map +1 -1
  105. package/dist/runtimeLayerCompatState.js +31 -11
  106. package/dist/runtimeLayerCompatState.js.map +1 -1
  107. package/dist/signalTelemetryProcessing.js +15 -17
  108. package/dist/signalTelemetryProcessing.js.map +1 -1
  109. package/dist/storageServiceWithAttachBlobs.js +2 -0
  110. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  111. package/dist/summary/documentSchema.d.ts.map +1 -1
  112. package/dist/summary/documentSchema.js +51 -13
  113. package/dist/summary/documentSchema.js.map +1 -1
  114. package/dist/summary/orderedClientElection.js +25 -17
  115. package/dist/summary/orderedClientElection.js.map +1 -1
  116. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  117. package/dist/summary/summarizerClientElection.js +18 -7
  118. package/dist/summary/summarizerClientElection.js.map +1 -1
  119. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  120. package/dist/summary/summarizerNode/summarizerNode.js +22 -13
  121. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  122. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  123. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +20 -6
  124. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  125. package/dist/summary/summarizerUtils.d.ts.map +1 -1
  126. package/dist/summary/summarizerUtils.js +4 -3
  127. package/dist/summary/summarizerUtils.js.map +1 -1
  128. package/dist/summary/summaryCollection.js +23 -11
  129. package/dist/summary/summaryCollection.js.map +1 -1
  130. package/dist/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.js +4 -2
  131. package/dist/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.js.map +1 -1
  132. package/dist/summary/summaryDelayLoadedModule/runningSummarizer.d.ts.map +1 -1
  133. package/dist/summary/summaryDelayLoadedModule/runningSummarizer.js +65 -46
  134. package/dist/summary/summaryDelayLoadedModule/runningSummarizer.js.map +1 -1
  135. package/dist/summary/summaryDelayLoadedModule/summarizer.d.ts.map +1 -1
  136. package/dist/summary/summaryDelayLoadedModule/summarizer.js +15 -6
  137. package/dist/summary/summaryDelayLoadedModule/summarizer.js.map +1 -1
  138. package/dist/summary/summaryDelayLoadedModule/summarizerHeuristics.js +30 -25
  139. package/dist/summary/summaryDelayLoadedModule/summarizerHeuristics.js.map +1 -1
  140. package/dist/summary/summaryDelayLoadedModule/summaryGenerator.js +9 -0
  141. package/dist/summary/summaryDelayLoadedModule/summaryGenerator.js.map +1 -1
  142. package/dist/summary/summaryDelayLoadedModule/summaryResultBuilder.js +3 -5
  143. package/dist/summary/summaryDelayLoadedModule/summaryResultBuilder.js.map +1 -1
  144. package/dist/summary/summaryFormat.d.ts.map +1 -1
  145. package/dist/summary/summaryFormat.js +7 -7
  146. package/dist/summary/summaryFormat.js.map +1 -1
  147. package/dist/summary/summaryHelpers.js +5 -5
  148. package/dist/summary/summaryHelpers.js.map +1 -1
  149. package/dist/summary/summaryManager.js +66 -54
  150. package/dist/summary/summaryManager.js.map +1 -1
  151. package/dist/throttler.d.ts.map +1 -1
  152. package/dist/throttler.js +4 -1
  153. package/dist/throttler.js.map +1 -1
  154. package/dist/versionMarks/inboundBatch.d.ts +8 -6
  155. package/dist/versionMarks/inboundBatch.d.ts.map +1 -1
  156. package/dist/versionMarks/inboundBatch.js +11 -7
  157. package/dist/versionMarks/inboundBatch.js.map +1 -1
  158. package/dist/versionMarks/versionMarkResolver.d.ts +30 -23
  159. package/dist/versionMarks/versionMarkResolver.d.ts.map +1 -1
  160. package/dist/versionMarks/versionMarkResolver.js +112 -63
  161. package/dist/versionMarks/versionMarkResolver.js.map +1 -1
  162. package/lib/batchTracker.d.ts.map +1 -1
  163. package/lib/batchTracker.js +5 -1
  164. package/lib/batchTracker.js.map +1 -1
  165. package/lib/blobManager/blobManager.d.ts +1 -1
  166. package/lib/blobManager/blobManager.d.ts.map +1 -1
  167. package/lib/blobManager/blobManager.js +264 -231
  168. package/lib/blobManager/blobManager.js.map +1 -1
  169. package/lib/blobManager/blobManagerSnapSum.d.ts.map +1 -1
  170. package/lib/channelCollection.d.ts.map +1 -1
  171. package/lib/channelCollection.js +65 -53
  172. package/lib/channelCollection.js.map +1 -1
  173. package/lib/connectionTelemetry.js +36 -18
  174. package/lib/connectionTelemetry.js.map +1 -1
  175. package/lib/containerCompatibility.d.ts +3 -3
  176. package/lib/containerCompatibility.d.ts.map +1 -1
  177. package/lib/containerCompatibility.js +33 -42
  178. package/lib/containerCompatibility.js.map +1 -1
  179. package/lib/containerHandleContext.d.ts.map +1 -1
  180. package/lib/containerHandleContext.js +4 -0
  181. package/lib/containerHandleContext.js.map +1 -1
  182. package/lib/containerRuntime.d.ts +4 -4
  183. package/lib/containerRuntime.d.ts.map +1 -1
  184. package/lib/containerRuntime.js +341 -218
  185. package/lib/containerRuntime.js.map +1 -1
  186. package/lib/dataStore.d.ts.map +1 -1
  187. package/lib/dataStore.js +9 -1
  188. package/lib/dataStore.js.map +1 -1
  189. package/lib/dataStoreContext.d.ts.map +1 -1
  190. package/lib/dataStoreContext.js +182 -125
  191. package/lib/dataStoreContext.js.map +1 -1
  192. package/lib/dataStoreContexts.js +43 -42
  193. package/lib/dataStoreContexts.js.map +1 -1
  194. package/lib/dataStoreRegistry.js +1 -0
  195. package/lib/dataStoreRegistry.js.map +1 -1
  196. package/lib/deltaManagerProxies.js +5 -0
  197. package/lib/deltaManagerProxies.js.map +1 -1
  198. package/lib/deltaScheduler.js +104 -99
  199. package/lib/deltaScheduler.js.map +1 -1
  200. package/lib/error.js +2 -1
  201. package/lib/error.js.map +1 -1
  202. package/lib/gc/garbageCollection.js +85 -55
  203. package/lib/gc/garbageCollection.js.map +1 -1
  204. package/lib/gc/gcSummaryStateTracker.js +8 -3
  205. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  206. package/lib/gc/gcTelemetry.js +12 -5
  207. package/lib/gc/gcTelemetry.js.map +1 -1
  208. package/lib/gc/gcUnreferencedStateTracker.js +18 -1
  209. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  210. package/lib/inboundBatchAggregator.js +122 -117
  211. package/lib/inboundBatchAggregator.js.map +1 -1
  212. package/lib/legacy.d.ts +1 -1
  213. package/lib/legacyAlpha.d.ts +1 -1
  214. package/lib/metadata.d.ts.map +1 -1
  215. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  216. package/lib/opLifecycle/batchManager.js +8 -2
  217. package/lib/opLifecycle/batchManager.js.map +1 -1
  218. package/lib/opLifecycle/duplicateBatchDetector.js +18 -18
  219. package/lib/opLifecycle/duplicateBatchDetector.js.map +1 -1
  220. package/lib/opLifecycle/index.d.ts +2 -2
  221. package/lib/opLifecycle/index.d.ts.map +1 -1
  222. package/lib/opLifecycle/index.js +2 -2
  223. package/lib/opLifecycle/index.js.map +1 -1
  224. package/lib/opLifecycle/opCompressor.js +3 -2
  225. package/lib/opLifecycle/opCompressor.js.map +1 -1
  226. package/lib/opLifecycle/opDecompressor.js +10 -6
  227. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  228. package/lib/opLifecycle/opGroupingManager.js +3 -1
  229. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  230. package/lib/opLifecycle/opSerialization.d.ts +11 -1
  231. package/lib/opLifecycle/opSerialization.d.ts.map +1 -1
  232. package/lib/opLifecycle/opSerialization.js +16 -0
  233. package/lib/opLifecycle/opSerialization.js.map +1 -1
  234. package/lib/opLifecycle/opSplitter.d.ts +17 -1
  235. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  236. package/lib/opLifecycle/opSplitter.js +44 -7
  237. package/lib/opLifecycle/opSplitter.js.map +1 -1
  238. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  239. package/lib/opLifecycle/outbox.js +14 -10
  240. package/lib/opLifecycle/outbox.js.map +1 -1
  241. package/lib/opLifecycle/remoteMessageProcessor.js +4 -1
  242. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  243. package/lib/opProperties.d.ts.map +1 -1
  244. package/lib/packageVersion.d.ts +1 -1
  245. package/lib/packageVersion.d.ts.map +1 -1
  246. package/lib/packageVersion.js +1 -1
  247. package/lib/packageVersion.js.map +1 -1
  248. package/lib/pendingStateManager.js +52 -45
  249. package/lib/pendingStateManager.js.map +1 -1
  250. package/lib/public.d.ts +1 -1
  251. package/lib/runCounter.js +10 -30
  252. package/lib/runCounter.js.map +1 -1
  253. package/lib/runtimeLayerCompatState.d.ts +1 -1
  254. package/lib/runtimeLayerCompatState.d.ts.map +1 -1
  255. package/lib/runtimeLayerCompatState.js +28 -8
  256. package/lib/runtimeLayerCompatState.js.map +1 -1
  257. package/lib/signalTelemetryProcessing.js +15 -17
  258. package/lib/signalTelemetryProcessing.js.map +1 -1
  259. package/lib/storageServiceWithAttachBlobs.js +2 -0
  260. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  261. package/lib/summary/documentSchema.d.ts.map +1 -1
  262. package/lib/summary/documentSchema.js +51 -13
  263. package/lib/summary/documentSchema.js.map +1 -1
  264. package/lib/summary/orderedClientElection.js +25 -17
  265. package/lib/summary/orderedClientElection.js.map +1 -1
  266. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  267. package/lib/summary/summarizerClientElection.js +18 -7
  268. package/lib/summary/summarizerClientElection.js.map +1 -1
  269. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  270. package/lib/summary/summarizerNode/summarizerNode.js +22 -13
  271. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  272. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  273. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +20 -6
  274. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  275. package/lib/summary/summarizerUtils.d.ts.map +1 -1
  276. package/lib/summary/summarizerUtils.js +1 -0
  277. package/lib/summary/summarizerUtils.js.map +1 -1
  278. package/lib/summary/summaryCollection.js +23 -11
  279. package/lib/summary/summaryCollection.js.map +1 -1
  280. package/lib/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.js +4 -2
  281. package/lib/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.js.map +1 -1
  282. package/lib/summary/summaryDelayLoadedModule/runningSummarizer.d.ts.map +1 -1
  283. package/lib/summary/summaryDelayLoadedModule/runningSummarizer.js +65 -46
  284. package/lib/summary/summaryDelayLoadedModule/runningSummarizer.js.map +1 -1
  285. package/lib/summary/summaryDelayLoadedModule/summarizer.d.ts.map +1 -1
  286. package/lib/summary/summaryDelayLoadedModule/summarizer.js +15 -6
  287. package/lib/summary/summaryDelayLoadedModule/summarizer.js.map +1 -1
  288. package/lib/summary/summaryDelayLoadedModule/summarizerHeuristics.js +30 -25
  289. package/lib/summary/summaryDelayLoadedModule/summarizerHeuristics.js.map +1 -1
  290. package/lib/summary/summaryDelayLoadedModule/summaryGenerator.js +9 -0
  291. package/lib/summary/summaryDelayLoadedModule/summaryGenerator.js.map +1 -1
  292. package/lib/summary/summaryDelayLoadedModule/summaryResultBuilder.js +3 -5
  293. package/lib/summary/summaryDelayLoadedModule/summaryResultBuilder.js.map +1 -1
  294. package/lib/summary/summaryFormat.d.ts.map +1 -1
  295. package/lib/summary/summaryManager.js +66 -54
  296. package/lib/summary/summaryManager.js.map +1 -1
  297. package/lib/throttler.d.ts.map +1 -1
  298. package/lib/throttler.js +4 -1
  299. package/lib/throttler.js.map +1 -1
  300. package/lib/versionMarks/inboundBatch.d.ts +8 -6
  301. package/lib/versionMarks/inboundBatch.d.ts.map +1 -1
  302. package/lib/versionMarks/inboundBatch.js +10 -5
  303. package/lib/versionMarks/inboundBatch.js.map +1 -1
  304. package/lib/versionMarks/versionMarkResolver.d.ts +30 -23
  305. package/lib/versionMarks/versionMarkResolver.d.ts.map +1 -1
  306. package/lib/versionMarks/versionMarkResolver.js +112 -63
  307. package/lib/versionMarks/versionMarkResolver.js.map +1 -1
  308. package/package.json +60 -102
  309. package/src/containerCompatibility.ts +33 -42
  310. package/src/containerRuntime.ts +15 -12
  311. package/src/opLifecycle/index.ts +7 -1
  312. package/src/opLifecycle/opCompressor.ts +2 -2
  313. package/src/opLifecycle/opSerialization.ts +22 -1
  314. package/src/opLifecycle/opSplitter.ts +63 -6
  315. package/src/packageVersion.ts +1 -1
  316. package/src/runtimeLayerCompatState.ts +28 -21
  317. package/src/summary/documentSchema.ts +31 -6
  318. package/src/versionMarks/DEV.md +595 -157
  319. package/src/versionMarks/inboundBatch.ts +18 -8
  320. package/src/versionMarks/versionMarkResolver.ts +144 -75
  321. package/tsconfig.json +1 -1
  322. package/internal.d.ts +0 -11
  323. package/legacy/alpha.d.ts +0 -11
  324. package/legacy.d.ts +0 -11
  325. /package/api-extractor/{api-extractor.current.json → api-extractor-report.current.json} +0 -0
  326. /package/api-extractor/{api-extractor.legacy.json → api-extractor-report.legacy.json} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"summarizerHeuristics.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summarizerHeuristics.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Timer } from \"@fluidframework/core-utils/internal\";\nimport type { TelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\n\nimport type {\n\tISummaryConfigurationHeuristics,\n\tISummarizeAttempt,\n\tISummarizeHeuristicData,\n\tISummarizeHeuristicRunner,\n\tISummaryHeuristicStrategy,\n} from \"../summarizerTypes.js\";\nimport type { SummarizeReason } from \"../summarizerUtils.js\";\n\n/**\n * Simple implementation of class for tracking summarize heuristic data.\n */\nexport class SummarizeHeuristicData implements ISummarizeHeuristicData {\n\tprotected _lastAttempt: ISummarizeAttempt;\n\tpublic get lastAttempt(): ISummarizeAttempt {\n\t\treturn this._lastAttempt;\n\t}\n\n\tprotected _lastSuccessfulSummary: Readonly<ISummarizeAttempt>;\n\tpublic get lastSuccessfulSummary(): Readonly<ISummarizeAttempt> {\n\t\treturn this._lastSuccessfulSummary;\n\t}\n\n\tpublic get opsSinceLastSummary(): number {\n\t\treturn this.numNonRuntimeOpsBefore + this.numRuntimeOpsBefore;\n\t}\n\n\tpublic hasMissingOpData: boolean = false;\n\n\tpublic totalOpsSize: number = 0;\n\t/**\n\t * Cumulative size in bytes of all the ops at the beginning of the summarization attempt.\n\t * Is used to adjust totalOpsSize appropriately after successful summarization.\n\t */\n\tprivate totalOpsSizeBefore: number = 0;\n\n\tpublic numNonRuntimeOps: number = 0;\n\t/**\n\t * Number of non-runtime ops at beginning of attempting to summarize.\n\t * Is used to adjust numNonRuntimeOps appropriately after successful summarization.\n\t */\n\tprivate numNonRuntimeOpsBefore: number = 0;\n\n\tpublic numRuntimeOps: number = 0;\n\t/**\n\t * Number of runtime ops at beginning of attempting to summarize.\n\t * Is used to adjust numRuntimeOps appropriately after successful summarization.\n\t */\n\tprivate numRuntimeOpsBefore: number = 0;\n\n\tconstructor(\n\t\tpublic lastOpSequenceNumber: number,\n\t\t/**\n\t\t * Baseline attempt data used for comparisons with subsequent attempts/calculations.\n\t\t */\n\t\tattemptBaseline: ISummarizeAttempt,\n\t) {\n\t\tthis._lastAttempt = attemptBaseline;\n\t\tthis._lastSuccessfulSummary = { ...attemptBaseline };\n\t}\n\n\tpublic updateWithLastSummaryAckInfo(lastSummary: Readonly<ISummarizeAttempt>): void {\n\t\tthis._lastAttempt = lastSummary;\n\t\tthis._lastSuccessfulSummary = { ...lastSummary };\n\t}\n\n\tpublic recordAttempt(refSequenceNumber?: number): void {\n\t\tthis._lastAttempt = {\n\t\t\trefSequenceNumber: refSequenceNumber ?? this.lastOpSequenceNumber,\n\t\t\tsummaryTime: Date.now(),\n\t\t};\n\n\t\tthis.numNonRuntimeOpsBefore = this.numNonRuntimeOps;\n\t\tthis.numRuntimeOpsBefore = this.numRuntimeOps;\n\t\tthis.totalOpsSizeBefore = this.totalOpsSize;\n\t}\n\n\tpublic markLastAttemptAsSuccessful(): void {\n\t\tthis._lastSuccessfulSummary = { ...this.lastAttempt };\n\n\t\tthis.numNonRuntimeOps -= this.numNonRuntimeOpsBefore;\n\t\tthis.numNonRuntimeOpsBefore = 0;\n\n\t\tthis.numRuntimeOps -= this.numRuntimeOpsBefore;\n\t\tthis.numRuntimeOpsBefore = 0;\n\n\t\tthis.totalOpsSize -= this.totalOpsSizeBefore;\n\t\tthis.totalOpsSizeBefore = 0;\n\t}\n}\n\n/**\n * This class contains the heuristics for when to summarize.\n */\nexport class SummarizeHeuristicRunner implements ISummarizeHeuristicRunner {\n\tprivate readonly idleTimer: Timer | undefined;\n\tprivate readonly runSummarize: (reason: SummarizeReason) => void;\n\n\tpublic constructor(\n\t\tprivate readonly heuristicData: ISummarizeHeuristicData,\n\t\tprivate readonly configuration: ISummaryConfigurationHeuristics,\n\t\ttrySummarize: (reason: SummarizeReason) => void,\n\t\tprivate readonly logger: TelemetryLoggerExt,\n\t\tprivate readonly summarizeStrategies: ISummaryHeuristicStrategy[] = getDefaultSummaryHeuristicStrategies(),\n\t) {\n\t\tthis.idleTimer = new Timer(this.idleTime, () => this.runSummarize(\"idle\"));\n\n\t\tthis.runSummarize = (reason: SummarizeReason) => {\n\t\t\tthis.idleTimer?.clear();\n\n\t\t\t// We shouldn't attempt a summary if there are no new processed ops\n\t\t\tconst opsSinceLastAck = this.opsSinceLastAck;\n\t\t\tif (opsSinceLastAck > 0) {\n\t\t\t\ttrySummarize(reason);\n\t\t\t}\n\t\t};\n\t}\n\n\tpublic get idleTime(): number {\n\t\tconst maxIdleTime = this.configuration.maxIdleTime;\n\t\tconst minIdleTime = this.configuration.minIdleTime;\n\t\tconst weightedNumOfOps = getWeightedNumberOfOps(\n\t\t\tthis.heuristicData.numRuntimeOps,\n\t\t\tthis.heuristicData.numNonRuntimeOps,\n\t\t\tthis.configuration.runtimeOpWeight,\n\t\t\tthis.configuration.nonRuntimeOpWeight,\n\t\t);\n\t\tconst pToMaxOps = (weightedNumOfOps * 1) / this.configuration.maxOps;\n\n\t\tif (pToMaxOps >= 1) {\n\t\t\treturn minIdleTime;\n\t\t}\n\n\t\t// Return a ratioed idle time based on the percentage of ops\n\t\treturn maxIdleTime - (maxIdleTime - minIdleTime) * pToMaxOps;\n\t}\n\n\tpublic get opsSinceLastAck(): number {\n\t\treturn (\n\t\t\tthis.heuristicData.lastOpSequenceNumber -\n\t\t\tthis.heuristicData.lastSuccessfulSummary.refSequenceNumber\n\t\t);\n\t}\n\n\tpublic start(): void {\n\t\tthis.idleTimer?.start(this.idleTime);\n\t}\n\n\tpublic run(): void {\n\t\tfor (const strategy of this.summarizeStrategies) {\n\t\t\tif (strategy.shouldRunSummary(this.configuration, this.heuristicData)) {\n\t\t\t\treturn this.runSummarize(strategy.summarizeReason);\n\t\t\t}\n\t\t}\n\n\t\tthis.idleTimer?.restart(this.idleTime);\n\t}\n\n\tpublic shouldRunLastSummary(): boolean {\n\t\tconst weightedOpsSinceLastAck = getWeightedNumberOfOps(\n\t\t\tthis.heuristicData.numRuntimeOps,\n\t\t\tthis.heuristicData.numNonRuntimeOps,\n\t\t\tthis.configuration.runtimeOpWeight,\n\t\t\tthis.configuration.nonRuntimeOpWeight,\n\t\t);\n\t\tconst minOpsForLastSummaryAttempt = this.configuration.minOpsForLastSummaryAttempt;\n\n\t\tthis.logger.sendTelemetryEvent({\n\t\t\teventName: \"ShouldRunLastSummary\",\n\t\t\tweightedOpsSinceLastAck,\n\t\t\tminOpsForLastSummaryAttempt,\n\t\t});\n\n\t\treturn weightedOpsSinceLastAck >= minOpsForLastSummaryAttempt;\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.idleTimer?.clear();\n\t}\n}\n\n/**\n * Strategy used to run a summary when it's been a while since our last successful summary\n */\nclass MaxTimeSummaryHeuristicStrategy implements ISummaryHeuristicStrategy {\n\tpublic readonly summarizeReason: Readonly<SummarizeReason> = \"maxTime\";\n\n\tpublic shouldRunSummary(\n\t\tconfiguration: ISummaryConfigurationHeuristics,\n\t\theuristicData: ISummarizeHeuristicData,\n\t): boolean {\n\t\tconst timeSinceLastSummary = Date.now() - heuristicData.lastSuccessfulSummary.summaryTime;\n\t\treturn timeSinceLastSummary > configuration.maxTime;\n\t}\n}\n\nfunction getWeightedNumberOfOps(\n\truntimeOpCount: number,\n\tnonRuntimeOpCount: number,\n\truntimeOpWeight: number,\n\tnonRuntimeOpWeight: number,\n): number {\n\treturn runtimeOpWeight * runtimeOpCount + nonRuntimeOpWeight * nonRuntimeOpCount;\n}\n\n/**\n * Strategy used to do a weighted analysis on the ops we've processed since the last successful summary\n */\nclass WeightedOpsSummaryHeuristicStrategy implements ISummaryHeuristicStrategy {\n\tpublic readonly summarizeReason: Readonly<SummarizeReason> = \"maxOps\";\n\n\tpublic shouldRunSummary(\n\t\tconfiguration: ISummaryConfigurationHeuristics,\n\t\theuristicData: ISummarizeHeuristicData,\n\t): boolean {\n\t\tconst weightedNumOfOps = getWeightedNumberOfOps(\n\t\t\theuristicData.numRuntimeOps,\n\t\t\theuristicData.numNonRuntimeOps,\n\t\t\tconfiguration.runtimeOpWeight,\n\t\t\tconfiguration.nonRuntimeOpWeight,\n\t\t);\n\t\treturn weightedNumOfOps > configuration.maxOps;\n\t}\n}\n\nfunction getDefaultSummaryHeuristicStrategies(): (\n\t| MaxTimeSummaryHeuristicStrategy\n\t| WeightedOpsSummaryHeuristicStrategy\n)[] {\n\treturn [new MaxTimeSummaryHeuristicStrategy(), new WeightedOpsSummaryHeuristicStrategy()];\n}\n"]}
1
+ {"version":3,"file":"summarizerHeuristics.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summarizerHeuristics.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Timer } from \"@fluidframework/core-utils/internal\";\nimport type { TelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\n\nimport type {\n\tISummaryConfigurationHeuristics,\n\tISummarizeAttempt,\n\tISummarizeHeuristicData,\n\tISummarizeHeuristicRunner,\n\tISummaryHeuristicStrategy,\n} from \"../summarizerTypes.js\";\nimport type { SummarizeReason } from \"../summarizerUtils.js\";\n\n/**\n * Simple implementation of class for tracking summarize heuristic data.\n */\nexport class SummarizeHeuristicData implements ISummarizeHeuristicData {\n\tprotected _lastAttempt: ISummarizeAttempt;\n\tpublic get lastAttempt(): ISummarizeAttempt {\n\t\treturn this._lastAttempt;\n\t}\n\n\tprotected _lastSuccessfulSummary: Readonly<ISummarizeAttempt>;\n\tpublic get lastSuccessfulSummary(): Readonly<ISummarizeAttempt> {\n\t\treturn this._lastSuccessfulSummary;\n\t}\n\n\tpublic get opsSinceLastSummary(): number {\n\t\treturn this.numNonRuntimeOpsBefore + this.numRuntimeOpsBefore;\n\t}\n\n\tpublic hasMissingOpData: boolean = false;\n\n\tpublic totalOpsSize: number = 0;\n\t/**\n\t * Cumulative size in bytes of all the ops at the beginning of the summarization attempt.\n\t * Is used to adjust totalOpsSize appropriately after successful summarization.\n\t */\n\tprivate totalOpsSizeBefore: number = 0;\n\n\tpublic numNonRuntimeOps: number = 0;\n\t/**\n\t * Number of non-runtime ops at beginning of attempting to summarize.\n\t * Is used to adjust numNonRuntimeOps appropriately after successful summarization.\n\t */\n\tprivate numNonRuntimeOpsBefore: number = 0;\n\n\tpublic numRuntimeOps: number = 0;\n\t/**\n\t * Number of runtime ops at beginning of attempting to summarize.\n\t * Is used to adjust numRuntimeOps appropriately after successful summarization.\n\t */\n\tprivate numRuntimeOpsBefore: number = 0;\n\n\tconstructor(\n\t\tpublic lastOpSequenceNumber: number,\n\t\t/**\n\t\t * Baseline attempt data used for comparisons with subsequent attempts/calculations.\n\t\t */\n\t\tattemptBaseline: ISummarizeAttempt,\n\t) {\n\t\tthis._lastAttempt = attemptBaseline;\n\t\tthis._lastSuccessfulSummary = { ...attemptBaseline };\n\t}\n\n\tpublic updateWithLastSummaryAckInfo(lastSummary: Readonly<ISummarizeAttempt>): void {\n\t\tthis._lastAttempt = lastSummary;\n\t\tthis._lastSuccessfulSummary = { ...lastSummary };\n\t}\n\n\tpublic recordAttempt(refSequenceNumber?: number): void {\n\t\tthis._lastAttempt = {\n\t\t\trefSequenceNumber: refSequenceNumber ?? this.lastOpSequenceNumber,\n\t\t\tsummaryTime: Date.now(),\n\t\t};\n\n\t\tthis.numNonRuntimeOpsBefore = this.numNonRuntimeOps;\n\t\tthis.numRuntimeOpsBefore = this.numRuntimeOps;\n\t\tthis.totalOpsSizeBefore = this.totalOpsSize;\n\t}\n\n\tpublic markLastAttemptAsSuccessful(): void {\n\t\tthis._lastSuccessfulSummary = { ...this.lastAttempt };\n\n\t\tthis.numNonRuntimeOps -= this.numNonRuntimeOpsBefore;\n\t\tthis.numNonRuntimeOpsBefore = 0;\n\n\t\tthis.numRuntimeOps -= this.numRuntimeOpsBefore;\n\t\tthis.numRuntimeOpsBefore = 0;\n\n\t\tthis.totalOpsSize -= this.totalOpsSizeBefore;\n\t\tthis.totalOpsSizeBefore = 0;\n\t}\n}\n\n/**\n * This class contains the heuristics for when to summarize.\n */\nexport class SummarizeHeuristicRunner implements ISummarizeHeuristicRunner {\n\tprivate readonly idleTimer: Timer | undefined;\n\tprivate readonly runSummarize: (reason: SummarizeReason) => void;\n\n\tpublic constructor(\n\t\tprivate readonly heuristicData: ISummarizeHeuristicData,\n\t\tprivate readonly configuration: ISummaryConfigurationHeuristics,\n\t\ttrySummarize: (reason: SummarizeReason) => void,\n\t\tprivate readonly logger: TelemetryLoggerExt,\n\t\tprivate readonly summarizeStrategies: ISummaryHeuristicStrategy[] = getDefaultSummaryHeuristicStrategies(),\n\t) {\n\t\tthis.idleTimer = new Timer(this.idleTime, () => this.runSummarize(\"idle\"));\n\n\t\tthis.runSummarize = (reason: SummarizeReason) => {\n\t\t\tthis.idleTimer?.clear();\n\n\t\t\t// We shouldn't attempt a summary if there are no new processed ops\n\t\t\tconst opsSinceLastAck = this.opsSinceLastAck;\n\t\t\tif (opsSinceLastAck > 0) {\n\t\t\t\ttrySummarize(reason);\n\t\t\t}\n\t\t};\n\t}\n\n\tpublic get idleTime(): number {\n\t\tconst maxIdleTime = this.configuration.maxIdleTime;\n\t\tconst minIdleTime = this.configuration.minIdleTime;\n\t\tconst weightedNumOfOps = getWeightedNumberOfOps(\n\t\t\tthis.heuristicData.numRuntimeOps,\n\t\t\tthis.heuristicData.numNonRuntimeOps,\n\t\t\tthis.configuration.runtimeOpWeight,\n\t\t\tthis.configuration.nonRuntimeOpWeight,\n\t\t);\n\t\tconst pToMaxOps = (weightedNumOfOps * 1) / this.configuration.maxOps;\n\n\t\tif (pToMaxOps >= 1) {\n\t\t\treturn minIdleTime;\n\t\t}\n\n\t\t// Return a ratioed idle time based on the percentage of ops\n\t\treturn maxIdleTime - (maxIdleTime - minIdleTime) * pToMaxOps;\n\t}\n\n\tpublic get opsSinceLastAck(): number {\n\t\treturn (\n\t\t\tthis.heuristicData.lastOpSequenceNumber -\n\t\t\tthis.heuristicData.lastSuccessfulSummary.refSequenceNumber\n\t\t);\n\t}\n\n\tpublic start(): void {\n\t\tthis.idleTimer?.start(this.idleTime);\n\t}\n\n\tpublic run(): void {\n\t\tfor (const strategy of this.summarizeStrategies) {\n\t\t\tif (strategy.shouldRunSummary(this.configuration, this.heuristicData)) {\n\t\t\t\treturn this.runSummarize(strategy.summarizeReason);\n\t\t\t}\n\t\t}\n\n\t\tthis.idleTimer?.restart(this.idleTime);\n\t}\n\n\tpublic shouldRunLastSummary(): boolean {\n\t\tconst weightedOpsSinceLastAck = getWeightedNumberOfOps(\n\t\t\tthis.heuristicData.numRuntimeOps,\n\t\t\tthis.heuristicData.numNonRuntimeOps,\n\t\t\tthis.configuration.runtimeOpWeight,\n\t\t\tthis.configuration.nonRuntimeOpWeight,\n\t\t);\n\t\tconst minOpsForLastSummaryAttempt = this.configuration.minOpsForLastSummaryAttempt;\n\n\t\tthis.logger.sendTelemetryEvent({\n\t\t\teventName: \"ShouldRunLastSummary\",\n\t\t\tweightedOpsSinceLastAck,\n\t\t\tminOpsForLastSummaryAttempt,\n\t\t});\n\n\t\treturn weightedOpsSinceLastAck >= minOpsForLastSummaryAttempt;\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.idleTimer?.clear();\n\t}\n}\n\n/**\n * Strategy used to run a summary when it's been a while since our last successful summary\n */\nclass MaxTimeSummaryHeuristicStrategy implements ISummaryHeuristicStrategy {\n\tpublic readonly summarizeReason: Readonly<SummarizeReason> = \"maxTime\";\n\n\tpublic shouldRunSummary(\n\t\tconfiguration: ISummaryConfigurationHeuristics,\n\t\theuristicData: ISummarizeHeuristicData,\n\t): boolean {\n\t\tconst timeSinceLastSummary = Date.now() - heuristicData.lastSuccessfulSummary.summaryTime;\n\t\treturn timeSinceLastSummary > configuration.maxTime;\n\t}\n}\n\nfunction getWeightedNumberOfOps(\n\truntimeOpCount: number,\n\tnonRuntimeOpCount: number,\n\truntimeOpWeight: number,\n\tnonRuntimeOpWeight: number,\n): number {\n\treturn runtimeOpWeight * runtimeOpCount + nonRuntimeOpWeight * nonRuntimeOpCount;\n}\n\n/**\n * Strategy used to do a weighted analysis on the ops we've processed since the last successful summary\n */\nclass WeightedOpsSummaryHeuristicStrategy implements ISummaryHeuristicStrategy {\n\tpublic readonly summarizeReason: Readonly<SummarizeReason> = \"maxOps\";\n\n\tpublic shouldRunSummary(\n\t\tconfiguration: ISummaryConfigurationHeuristics,\n\t\theuristicData: ISummarizeHeuristicData,\n\t): boolean {\n\t\tconst weightedNumOfOps = getWeightedNumberOfOps(\n\t\t\theuristicData.numRuntimeOps,\n\t\t\theuristicData.numNonRuntimeOps,\n\t\t\tconfiguration.runtimeOpWeight,\n\t\t\tconfiguration.nonRuntimeOpWeight,\n\t\t);\n\t\treturn weightedNumOfOps > configuration.maxOps;\n\t}\n}\n\nfunction getDefaultSummaryHeuristicStrategies(): (\n\t| MaxTimeSummaryHeuristicStrategy\n\t| WeightedOpsSummaryHeuristicStrategy\n)[] {\n\treturn [new MaxTimeSummaryHeuristicStrategy(), new WeightedOpsSummaryHeuristicStrategy()];\n}\n"]}
@@ -20,6 +20,15 @@ const maxSummarizeTimeoutCount = 5; // Double and resend 5 times
20
20
  * This class generates and tracks a summary attempt.
21
21
  */
22
22
  class SummaryGenerator extends client_utils_1.TypedEventEmitter {
23
+ pendingAckTimer;
24
+ heuristicData;
25
+ submitSummaryCallback;
26
+ successfulSummaryCallback;
27
+ refreshLatestSummaryCallback;
28
+ summaryWatcher;
29
+ logger;
30
+ summarizeTimer;
31
+ activeTelemetryContext;
23
32
  constructor(pendingAckTimer, heuristicData, submitSummaryCallback, successfulSummaryCallback, refreshLatestSummaryCallback, summaryWatcher, logger) {
24
33
  super();
25
34
  this.pendingAckTimer = pendingAckTimer;
@@ -1 +1 @@
1
- {"version":3,"file":"summaryGenerator.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summaryGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type { ISummarizerEvents } from \"@fluidframework/container-runtime-definitions/internal\";\nimport { assert, type IPromiseTimer, Timer } from \"@fluidframework/core-utils/internal\";\nimport { DriverErrorTypes, MessageType } from \"@fluidframework/driver-definitions/internal\";\nimport { getRetryDelaySecondsFromError } from \"@fluidframework/driver-utils/internal\";\nimport { TelemetryContext } from \"@fluidframework/runtime-utils/internal\";\nimport {\n\tisFluidError,\n\tPerformanceEvent,\n\ttype TelemetryLoggerExt,\n\twrapError,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport type {\n\tIRefreshSummaryAckOptions,\n\tIRetriableFailureError,\n\tISubmitSummaryOptions,\n\tISummarizeHeuristicData,\n\tSubmitSummaryFailureData,\n\tSubmitSummaryResult,\n\tSummaryGeneratorTelemetry,\n} from \"../summarizerTypes.js\";\nimport {\n\tRetriableSummaryError,\n\tgetFailMessage,\n\traceTimer,\n\ttype SummarizeErrorCode,\n} from \"../summarizerUtils.js\";\nimport type { IClientSummaryWatcher } from \"../summaryCollection.js\";\n\nimport { SummarizeResultBuilder } from \"./summaryResultBuilder.js\";\nimport type { INackSummaryResult, ISummarizeResults } from \"./summaryResultTypes.js\";\n\n// Send some telemetry if generate summary takes too long\nconst maxSummarizeTimeoutTime = 20000; // 20 sec\nconst maxSummarizeTimeoutCount = 5; // Double and resend 5 times\n\n/**\n * This class generates and tracks a summary attempt.\n */\nexport class SummaryGenerator extends TypedEventEmitter<ISummarizerEvents> {\n\tprivate readonly summarizeTimer: Timer;\n\tprivate activeTelemetryContext?: TelemetryContext;\n\tconstructor(\n\t\tprivate readonly pendingAckTimer: IPromiseTimer,\n\t\tprivate readonly heuristicData: ISummarizeHeuristicData,\n\t\tprivate readonly submitSummaryCallback: (\n\t\t\toptions: ISubmitSummaryOptions,\n\t\t) => Promise<SubmitSummaryResult>,\n\t\tprivate readonly successfulSummaryCallback: () => void,\n\t\tprivate readonly refreshLatestSummaryCallback: (\n\t\t\toptions: IRefreshSummaryAckOptions,\n\t\t) => Promise<void>,\n\t\tprivate readonly summaryWatcher: Pick<IClientSummaryWatcher, \"watchSummary\">,\n\t\tprivate readonly logger: TelemetryLoggerExt,\n\t) {\n\t\tsuper();\n\t\tthis.summarizeTimer = new Timer(maxSummarizeTimeoutTime, () =>\n\t\t\tthis.summarizeTimerHandler(maxSummarizeTimeoutTime, 1),\n\t\t);\n\t}\n\n\t/**\n\t * Generates summary and listens for broadcast and ack/nack.\n\t * Returns true for ack, false for nack, and undefined for failure or timeout.\n\t * @param summaryOptions - options controlling how the summary is generated or submitted.\n\t * @param resultsBuilder - optional, result builder to use to build pass or fail result.\n\t */\n\tpublic summarize(\n\t\tsummaryOptions: ISubmitSummaryOptions,\n\t\tresultsBuilder = new SummarizeResultBuilder(),\n\t): ISummarizeResults {\n\t\tthis.summarizeCore(summaryOptions, resultsBuilder).catch(\n\t\t\t(error: IRetriableFailureError) => {\n\t\t\t\tconst message = \"UnexpectedSummarizeError\";\n\t\t\t\tsummaryOptions.summaryLogger.sendErrorEvent({ eventName: message }, error);\n\t\t\t\tresultsBuilder.fail(message, error);\n\t\t\t},\n\t\t);\n\n\t\treturn resultsBuilder.build();\n\t}\n\n\tprivate async summarizeCore(\n\t\tsubmitSummaryOptions: ISubmitSummaryOptions,\n\t\tresultsBuilder: SummarizeResultBuilder,\n\t): Promise<void> {\n\t\tconst {\n\t\t\tsummaryLogger,\n\t\t\tcancellationToken,\n\t\t\ttelemetryContext = new TelemetryContext(),\n\t\t\t...summarizeOptions\n\t\t} = submitSummaryOptions;\n\n\t\ttelemetryContext.setCurrentSummarizeStep(\"submitSummary\");\n\t\tconst submitOptions = { ...submitSummaryOptions, telemetryContext };\n\t\tthis.activeTelemetryContext = telemetryContext;\n\n\t\t// Note: timeSinceLastAttempt and timeSinceLastSummary for the\n\t\t// first summary are basically the time since the summarizer was loaded.\n\t\tconst timeSinceLastAttempt = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\t\tconst timeSinceLastSummary =\n\t\t\tDate.now() - this.heuristicData.lastSuccessfulSummary.summaryTime;\n\t\tlet summarizeTelemetryProps: SummaryGeneratorTelemetry = {\n\t\t\t...summarizeOptions,\n\t\t\tfullTree: summarizeOptions.fullTree ?? false,\n\t\t\ttimeSinceLastAttempt,\n\t\t\ttimeSinceLastSummary,\n\t\t\tnonRuntimeOpsSinceLastSummary: this.heuristicData.numNonRuntimeOps,\n\t\t\truntimeOpsSinceLastSummary: this.heuristicData.numRuntimeOps,\n\t\t};\n\n\t\tconst summarizeEvent = PerformanceEvent.start(\n\t\t\tsummaryLogger,\n\t\t\t{\n\t\t\t\teventName: \"Summarize\",\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t},\n\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t);\n\n\t\tlet summaryData: SubmitSummaryResult | undefined;\n\n\t\t/**\n\t\t * Summarization can fail during submit, during op broadcast or during nack.\n\t\t * For submit failures, submitFailureResult should be provided. For nack failures, nackSummaryResult should\n\t\t * be provided. For op broadcast failures, only errors / properties should be provided.\n\t\t */\n\t\tconst summaryFail = (\n\t\t\terrorCode: SummarizeErrorCode,\n\t\t\terror: IRetriableFailureError,\n\t\t\tproperties?: SummaryGeneratorTelemetry,\n\t\t\tsubmitFailureResult?: SubmitSummaryFailureData,\n\t\t\tnackSummaryResult?: INackSummaryResult,\n\t\t): void => {\n\t\t\t// Report any failure as an error unless it was due to cancellation (like \"disconnected\" error)\n\t\t\t// If failure happened on upload, we may not yet realized that socket disconnected, so check\n\t\t\t// offlineError too.\n\t\t\tconst category =\n\t\t\t\tcancellationToken.cancelled ||\n\t\t\t\t(isFluidError(error) && error?.errorType === DriverErrorTypes.offlineError)\n\t\t\t\t\t? \"generic\"\n\t\t\t\t\t: \"error\";\n\n\t\t\tconst reason = getFailMessage(errorCode);\n\t\t\tsummarizeEvent.cancel(\n\t\t\t\t{\n\t\t\t\t\t...properties,\n\t\t\t\t\treason,\n\t\t\t\t\tcategory,\n\t\t\t\t\tretryAfterSeconds: error.retryAfterSeconds,\n\t\t\t\t},\n\t\t\t\terror,\n\t\t\t); // disconnect & summaryAckTimeout do not have proper error.\n\n\t\t\tresultsBuilder.fail(reason, error, submitFailureResult, nackSummaryResult);\n\t\t};\n\n\t\t// Wait to generate and send summary\n\t\tthis.summarizeTimer.start();\n\t\ttry {\n\t\t\ttelemetryContext.setCurrentSummarizeStep(\"generateSummary\");\n\t\t\t// Need to save refSeqNum before we record new attempt (happens as part of submitSummaryCallback)\n\t\t\tconst lastAttemptRefSeqNum = this.heuristicData.lastAttempt.refSequenceNumber;\n\n\t\t\tsummaryData = await this.submitSummaryCallback(submitOptions);\n\t\t\ttelemetryContext.setCurrentSummarizeStep(\"submitSummaryOp\");\n\n\t\t\t// Cumulatively add telemetry properties based on how far generateSummary went.\n\t\t\tconst referenceSequenceNumber = summaryData.referenceSequenceNumber;\n\t\t\tsummarizeTelemetryProps = {\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t\treferenceSequenceNumber,\n\t\t\t\tminimumSequenceNumber: summaryData.minimumSequenceNumber,\n\t\t\t\topsSinceLastAttempt: referenceSequenceNumber - lastAttemptRefSeqNum,\n\t\t\t\topsSinceLastSummary:\n\t\t\t\t\treferenceSequenceNumber - this.heuristicData.lastSuccessfulSummary.refSequenceNumber,\n\t\t\t\tstage: summaryData.stage,\n\t\t\t};\n\t\t\tsummarizeTelemetryProps = this.addSummaryDataToTelemetryProps(\n\t\t\t\tsummaryData,\n\t\t\t\tsummarizeTelemetryProps,\n\t\t\t);\n\n\t\t\tif (summaryData.stage !== \"submit\") {\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"submitSummaryFailure\";\n\t\t\t\tconst retriableError =\n\t\t\t\t\tsummaryData.error ?? new RetriableSummaryError(getFailMessage(errorCode));\n\t\t\t\treturn summaryFail(errorCode, retriableError, summarizeTelemetryProps, {\n\t\t\t\t\tstage: summaryData.stage,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * With incremental summaries, if the full tree was not summarized, only data stores that changed should\n\t\t\t * be summarized. A data store is considered changed if either or both of the following is true:\n\t\t\t * - It has received an op.\n\t\t\t * - Its reference state changed, i.e., it went from referenced to unreferenced or vice-versa.\n\t\t\t *\n\t\t\t * In the extreme case, every op can be for a different data store and each op can result in the reference\n\t\t\t * state change of multiple data stores. So, the total number of data stores that are summarized should not\n\t\t\t * exceed the number of ops since last summary + number of data store whose reference state changed.\n\t\t\t */\n\t\t\tif (submitSummaryOptions.fullTree !== true) {\n\t\t\t\ttelemetryContext.setCurrentSummarizeStep(\"watchSummary\");\n\t\t\t\tconst { summarizedDataStoreCount, gcStateUpdatedDataStoreCount = 0 } =\n\t\t\t\t\tsummaryData.summaryStats;\n\t\t\t\tif (\n\t\t\t\t\tsummarizedDataStoreCount >\n\t\t\t\t\tgcStateUpdatedDataStoreCount + this.heuristicData.opsSinceLastSummary\n\t\t\t\t) {\n\t\t\t\t\tsummaryLogger.sendErrorEvent({\n\t\t\t\t\t\teventName: \"IncrementalSummaryViolation\",\n\t\t\t\t\t\tsummarizedDataStoreCount,\n\t\t\t\t\t\tgcStateUpdatedDataStoreCount,\n\t\t\t\t\t\topsSinceLastSummary: this.heuristicData.opsSinceLastSummary,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Log event here on summary success only, as Summarize_cancel duplicates failure logging.\n\t\t\tsummarizeEvent.reportEvent(\"generate\", { ...summarizeTelemetryProps });\n\t\t\tresultsBuilder.summarySubmitted.resolve({ success: true, data: summaryData });\n\t\t} catch (error) {\n\t\t\treturn summaryFail(\n\t\t\t\t\"submitSummaryFailure\",\n\t\t\t\twrapError(\n\t\t\t\t\terror,\n\t\t\t\t\t(message) =>\n\t\t\t\t\t\tnew RetriableSummaryError(message, getRetryDelaySecondsFromError(error)),\n\t\t\t\t),\n\t\t\t\tundefined /* properties */,\n\t\t\t\t{\n\t\t\t\t\tstage: \"unknown\",\n\t\t\t\t},\n\t\t\t);\n\t\t} finally {\n\t\t\tif (summaryData === undefined) {\n\t\t\t\tthis.heuristicData.recordAttempt();\n\t\t\t}\n\t\t\tthis.summarizeTimer.clear();\n\t\t}\n\n\t\ttelemetryContext.setCurrentSummarizeStep(\"waitForSummaryAck\");\n\n\t\ttry {\n\t\t\tconst pendingTimeoutP = this.pendingAckTimer.start();\n\t\t\tconst summary = this.summaryWatcher.watchSummary(summaryData.clientSequenceNumber);\n\n\t\t\t// Wait for broadcast\n\t\t\tconst waitBroadcastResult = await raceTimer(\n\t\t\t\tsummary.waitBroadcast(),\n\t\t\t\tpendingTimeoutP,\n\t\t\t\tcancellationToken,\n\t\t\t);\n\t\t\tif (waitBroadcastResult.result === \"cancelled\") {\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"disconnect\";\n\t\t\t\treturn summaryFail(errorCode, new RetriableSummaryError(getFailMessage(errorCode)));\n\t\t\t}\n\t\t\tif (waitBroadcastResult.result !== \"done\") {\n\t\t\t\t// The summary op may not have been received within the timeout due to a transient error. So,\n\t\t\t\t// fail with a retriable error to re-attempt the summary if possible.\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"summaryOpWaitTimeout\";\n\t\t\t\treturn summaryFail(\n\t\t\t\t\terrorCode,\n\t\t\t\t\tnew RetriableSummaryError(getFailMessage(errorCode), 0 /* retryAfterSeconds */),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst summarizeOp = waitBroadcastResult.value;\n\n\t\t\tconst broadcastDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\t\t\tresultsBuilder.summaryOpBroadcasted.resolve({\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: { summarizeOp, broadcastDuration },\n\t\t\t});\n\n\t\t\tthis.heuristicData.lastAttempt.summarySequenceNumber = summarizeOp.sequenceNumber;\n\t\t\tsummaryLogger.sendTelemetryEvent({\n\t\t\t\teventName: \"Summarize_Op\",\n\t\t\t\tduration: broadcastDuration,\n\t\t\t\treferenceSequenceNumber: summarizeOp.referenceSequenceNumber,\n\t\t\t\tsummarySequenceNumber: summarizeOp.sequenceNumber,\n\t\t\t\thandle: summarizeOp.contents.handle,\n\t\t\t});\n\n\t\t\t// Wait for ack/nack\n\t\t\tconst waitAckNackResult = await raceTimer(\n\t\t\t\tsummary.waitAckNack(),\n\t\t\t\tpendingTimeoutP,\n\t\t\t\tcancellationToken,\n\t\t\t);\n\t\t\tif (waitAckNackResult.result === \"cancelled\") {\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"disconnect\";\n\t\t\t\treturn summaryFail(errorCode, new RetriableSummaryError(getFailMessage(errorCode)));\n\t\t\t}\n\t\t\tif (waitAckNackResult.result !== \"done\") {\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"summaryAckWaitTimeout\";\n\t\t\t\t// The summary ack may not have been received within the timeout due to a transient error. So,\n\t\t\t\t// fail with a retriable error to re-attempt the summary if possible.\n\t\t\t\treturn summaryFail(\n\t\t\t\t\terrorCode,\n\t\t\t\t\tnew RetriableSummaryError(getFailMessage(errorCode), 0 /* retryAfterSeconds */),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst ackNackOp = waitAckNackResult.value;\n\t\t\tthis.pendingAckTimer.clear();\n\n\t\t\t// Update for success/failure\n\t\t\tconst ackNackDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\n\t\t\t// adding new properties\n\t\t\tsummarizeTelemetryProps = {\n\t\t\t\tackWaitDuration: ackNackDuration,\n\t\t\t\tackNackSequenceNumber: ackNackOp.sequenceNumber,\n\t\t\t\tsummarySequenceNumber: ackNackOp.contents.summaryProposal.summarySequenceNumber,\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t};\n\t\t\tif (ackNackOp.type === MessageType.SummaryAck) {\n\t\t\t\ttelemetryContext.setCurrentSummarizeStep(\"ackReceived\");\n\t\t\t\tthis.heuristicData.markLastAttemptAsSuccessful();\n\t\t\t\tthis.successfulSummaryCallback();\n\t\t\t\tsummarizeEvent.end({\n\t\t\t\t\t...summarizeTelemetryProps,\n\t\t\t\t\thandle: ackNackOp.contents.handle,\n\t\t\t\t});\n\t\t\t\t// This processes the summary ack of the successful summary. This is so that the next summary does not\n\t\t\t\t// start before the ack of the previous summary is processed.\n\t\t\t\tawait this.refreshLatestSummaryCallback({\n\t\t\t\t\tproposalHandle: summarizeOp.contents.handle,\n\t\t\t\t\tackHandle: ackNackOp.contents.handle,\n\t\t\t\t\tsummaryRefSeq: summarizeOp.referenceSequenceNumber,\n\t\t\t\t\tsummaryLogger,\n\t\t\t\t});\n\t\t\t\tresultsBuilder.receivedSummaryAckOrNack.resolve({\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tsummaryAckOp: ackNackOp,\n\t\t\t\t\t\tackNackDuration,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Check for retryDelay in summaryNack response.\n\t\t\t\tassert(ackNackOp.type === MessageType.SummaryNack, 0x274 /* \"type check\" */);\n\t\t\t\ttelemetryContext.setCurrentSummarizeStep(\"nackReceived\");\n\t\t\t\tconst summaryNack = ackNackOp.contents;\n\t\t\t\tconst errorMessage = summaryNack?.message;\n\t\t\t\tconst retryAfterSeconds = summaryNack?.retryAfter;\n\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"summaryNack\";\n\n\t\t\t\t// pre-0.58 error message prefix: summaryNack\n\t\t\t\tconst error = new RetriableSummaryError(getFailMessage(errorCode), retryAfterSeconds, {\n\t\t\t\t\terrorMessage,\n\t\t\t\t});\n\n\t\t\t\tassert(\n\t\t\t\t\tgetRetryDelaySecondsFromError(error) === retryAfterSeconds,\n\t\t\t\t\t0x25f /* \"retryAfterSeconds\" */,\n\t\t\t\t);\n\t\t\t\t// This will only set resultsBuilder.receivedSummaryAckOrNack, as other promises are already set.\n\t\t\t\treturn summaryFail(\n\t\t\t\t\terrorCode,\n\t\t\t\t\terror,\n\t\t\t\t\t{ ...summarizeTelemetryProps, nackRetryAfter: retryAfterSeconds },\n\t\t\t\t\tundefined /* submitFailureResult */,\n\t\t\t\t\t{ summaryNackOp: ackNackOp, ackNackDuration },\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.pendingAckTimer.clear();\n\t\t\tthis.activeTelemetryContext = undefined;\n\t\t}\n\t}\n\n\tprivate addSummaryDataToTelemetryProps(\n\t\tsummaryData: SubmitSummaryResult,\n\t\tinitialProps: SummaryGeneratorTelemetry,\n\t): SummaryGeneratorTelemetry {\n\t\tswitch (summaryData.stage) {\n\t\t\tcase \"base\": {\n\t\t\t\treturn initialProps;\n\t\t\t}\n\n\t\t\tcase \"generate\": {\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"upload\": {\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t\thandle: summaryData.handle,\n\t\t\t\t\tuploadDuration: summaryData.uploadDuration,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"submit\": {\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t\thandle: summaryData.handle,\n\t\t\t\t\tuploadDuration: summaryData.uploadDuration,\n\t\t\t\t\tclientSequenceNumber: summaryData.clientSequenceNumber,\n\t\t\t\t\thasMissingOpData: this.heuristicData.hasMissingOpData,\n\t\t\t\t\topsSizesSinceLastSummary: this.heuristicData.totalOpsSize,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tassert(true, 0x397 /* Unexpected summary stage */);\n\t\t\t}\n\t\t}\n\n\t\treturn initialProps;\n\t}\n\n\tprivate summarizeTimerHandler(time: number, count: number): void {\n\t\tthis.logger.sendPerformanceEvent({\n\t\t\teventName: \"SummarizeTimeout\",\n\t\t\ttimeoutTime: time,\n\t\t\ttimeoutCount: count,\n\t\t\tcurrentSummarizeStep: this.activeTelemetryContext?.getCurrentSummarizeStep(),\n\t\t});\n\t\tthis.emit(\"summarizeTimeout\", {\n\t\t\ttimeoutCount: count,\n\t\t\tcurrentSummarizeStep: this.activeTelemetryContext?.getCurrentSummarizeStep(),\n\t\t\tnumUnsummarizedRuntimeOps: this.heuristicData.numRuntimeOps,\n\t\t\tnumUnsummarizedNonRuntimeOps: this.heuristicData.numNonRuntimeOps,\n\t\t});\n\t\tif (count < maxSummarizeTimeoutCount) {\n\t\t\t// Double and start a new timer\n\t\t\tconst nextTime = time * 2;\n\t\t\tthis.summarizeTimer.start(nextTime, () =>\n\t\t\t\tthis.summarizeTimerHandler(nextTime, count + 1),\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.summarizeTimer.clear();\n\t\tthis.activeTelemetryContext = undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"summaryGenerator.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summaryGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type { ISummarizerEvents } from \"@fluidframework/container-runtime-definitions/internal\";\nimport { assert, type IPromiseTimer, Timer } from \"@fluidframework/core-utils/internal\";\nimport { DriverErrorTypes, MessageType } from \"@fluidframework/driver-definitions/internal\";\nimport { getRetryDelaySecondsFromError } from \"@fluidframework/driver-utils/internal\";\nimport { TelemetryContext } from \"@fluidframework/runtime-utils/internal\";\nimport {\n\tisFluidError,\n\tPerformanceEvent,\n\ttype TelemetryLoggerExt,\n\twrapError,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport type {\n\tIRefreshSummaryAckOptions,\n\tIRetriableFailureError,\n\tISubmitSummaryOptions,\n\tISummarizeHeuristicData,\n\tSubmitSummaryFailureData,\n\tSubmitSummaryResult,\n\tSummaryGeneratorTelemetry,\n} from \"../summarizerTypes.js\";\nimport {\n\tRetriableSummaryError,\n\tgetFailMessage,\n\traceTimer,\n\ttype SummarizeErrorCode,\n} from \"../summarizerUtils.js\";\nimport type { IClientSummaryWatcher } from \"../summaryCollection.js\";\n\nimport { SummarizeResultBuilder } from \"./summaryResultBuilder.js\";\nimport type { INackSummaryResult, ISummarizeResults } from \"./summaryResultTypes.js\";\n\n// Send some telemetry if generate summary takes too long\nconst maxSummarizeTimeoutTime = 20000; // 20 sec\nconst maxSummarizeTimeoutCount = 5; // Double and resend 5 times\n\n/**\n * This class generates and tracks a summary attempt.\n */\nexport class SummaryGenerator extends TypedEventEmitter<ISummarizerEvents> {\n\tprivate readonly summarizeTimer: Timer;\n\tprivate activeTelemetryContext?: TelemetryContext;\n\tconstructor(\n\t\tprivate readonly pendingAckTimer: IPromiseTimer,\n\t\tprivate readonly heuristicData: ISummarizeHeuristicData,\n\t\tprivate readonly submitSummaryCallback: (\n\t\t\toptions: ISubmitSummaryOptions,\n\t\t) => Promise<SubmitSummaryResult>,\n\t\tprivate readonly successfulSummaryCallback: () => void,\n\t\tprivate readonly refreshLatestSummaryCallback: (\n\t\t\toptions: IRefreshSummaryAckOptions,\n\t\t) => Promise<void>,\n\t\tprivate readonly summaryWatcher: Pick<IClientSummaryWatcher, \"watchSummary\">,\n\t\tprivate readonly logger: TelemetryLoggerExt,\n\t) {\n\t\tsuper();\n\t\tthis.summarizeTimer = new Timer(maxSummarizeTimeoutTime, () =>\n\t\t\tthis.summarizeTimerHandler(maxSummarizeTimeoutTime, 1),\n\t\t);\n\t}\n\n\t/**\n\t * Generates summary and listens for broadcast and ack/nack.\n\t * Returns true for ack, false for nack, and undefined for failure or timeout.\n\t * @param summaryOptions - options controlling how the summary is generated or submitted.\n\t * @param resultsBuilder - optional, result builder to use to build pass or fail result.\n\t */\n\tpublic summarize(\n\t\tsummaryOptions: ISubmitSummaryOptions,\n\t\tresultsBuilder = new SummarizeResultBuilder(),\n\t): ISummarizeResults {\n\t\tthis.summarizeCore(summaryOptions, resultsBuilder).catch(\n\t\t\t(error: IRetriableFailureError) => {\n\t\t\t\tconst message = \"UnexpectedSummarizeError\";\n\t\t\t\tsummaryOptions.summaryLogger.sendErrorEvent({ eventName: message }, error);\n\t\t\t\tresultsBuilder.fail(message, error);\n\t\t\t},\n\t\t);\n\n\t\treturn resultsBuilder.build();\n\t}\n\n\tprivate async summarizeCore(\n\t\tsubmitSummaryOptions: ISubmitSummaryOptions,\n\t\tresultsBuilder: SummarizeResultBuilder,\n\t): Promise<void> {\n\t\tconst {\n\t\t\tsummaryLogger,\n\t\t\tcancellationToken,\n\t\t\ttelemetryContext = new TelemetryContext(),\n\t\t\t...summarizeOptions\n\t\t} = submitSummaryOptions;\n\n\t\ttelemetryContext.setCurrentSummarizeStep(\"submitSummary\");\n\t\tconst submitOptions = { ...submitSummaryOptions, telemetryContext };\n\t\tthis.activeTelemetryContext = telemetryContext;\n\n\t\t// Note: timeSinceLastAttempt and timeSinceLastSummary for the\n\t\t// first summary are basically the time since the summarizer was loaded.\n\t\tconst timeSinceLastAttempt = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\t\tconst timeSinceLastSummary =\n\t\t\tDate.now() - this.heuristicData.lastSuccessfulSummary.summaryTime;\n\t\tlet summarizeTelemetryProps: SummaryGeneratorTelemetry = {\n\t\t\t...summarizeOptions,\n\t\t\tfullTree: summarizeOptions.fullTree ?? false,\n\t\t\ttimeSinceLastAttempt,\n\t\t\ttimeSinceLastSummary,\n\t\t\tnonRuntimeOpsSinceLastSummary: this.heuristicData.numNonRuntimeOps,\n\t\t\truntimeOpsSinceLastSummary: this.heuristicData.numRuntimeOps,\n\t\t};\n\n\t\tconst summarizeEvent = PerformanceEvent.start(\n\t\t\tsummaryLogger,\n\t\t\t{\n\t\t\t\teventName: \"Summarize\",\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t},\n\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t);\n\n\t\tlet summaryData: SubmitSummaryResult | undefined;\n\n\t\t/**\n\t\t * Summarization can fail during submit, during op broadcast or during nack.\n\t\t * For submit failures, submitFailureResult should be provided. For nack failures, nackSummaryResult should\n\t\t * be provided. For op broadcast failures, only errors / properties should be provided.\n\t\t */\n\t\tconst summaryFail = (\n\t\t\terrorCode: SummarizeErrorCode,\n\t\t\terror: IRetriableFailureError,\n\t\t\tproperties?: SummaryGeneratorTelemetry,\n\t\t\tsubmitFailureResult?: SubmitSummaryFailureData,\n\t\t\tnackSummaryResult?: INackSummaryResult,\n\t\t): void => {\n\t\t\t// Report any failure as an error unless it was due to cancellation (like \"disconnected\" error)\n\t\t\t// If failure happened on upload, we may not yet realized that socket disconnected, so check\n\t\t\t// offlineError too.\n\t\t\tconst category =\n\t\t\t\tcancellationToken.cancelled ||\n\t\t\t\t(isFluidError(error) && error?.errorType === DriverErrorTypes.offlineError)\n\t\t\t\t\t? \"generic\"\n\t\t\t\t\t: \"error\";\n\n\t\t\tconst reason = getFailMessage(errorCode);\n\t\t\tsummarizeEvent.cancel(\n\t\t\t\t{\n\t\t\t\t\t...properties,\n\t\t\t\t\treason,\n\t\t\t\t\tcategory,\n\t\t\t\t\tretryAfterSeconds: error.retryAfterSeconds,\n\t\t\t\t},\n\t\t\t\terror,\n\t\t\t); // disconnect & summaryAckTimeout do not have proper error.\n\n\t\t\tresultsBuilder.fail(reason, error, submitFailureResult, nackSummaryResult);\n\t\t};\n\n\t\t// Wait to generate and send summary\n\t\tthis.summarizeTimer.start();\n\t\ttry {\n\t\t\ttelemetryContext.setCurrentSummarizeStep(\"generateSummary\");\n\t\t\t// Need to save refSeqNum before we record new attempt (happens as part of submitSummaryCallback)\n\t\t\tconst lastAttemptRefSeqNum = this.heuristicData.lastAttempt.refSequenceNumber;\n\n\t\t\tsummaryData = await this.submitSummaryCallback(submitOptions);\n\t\t\ttelemetryContext.setCurrentSummarizeStep(\"submitSummaryOp\");\n\n\t\t\t// Cumulatively add telemetry properties based on how far generateSummary went.\n\t\t\tconst referenceSequenceNumber = summaryData.referenceSequenceNumber;\n\t\t\tsummarizeTelemetryProps = {\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t\treferenceSequenceNumber,\n\t\t\t\tminimumSequenceNumber: summaryData.minimumSequenceNumber,\n\t\t\t\topsSinceLastAttempt: referenceSequenceNumber - lastAttemptRefSeqNum,\n\t\t\t\topsSinceLastSummary:\n\t\t\t\t\treferenceSequenceNumber - this.heuristicData.lastSuccessfulSummary.refSequenceNumber,\n\t\t\t\tstage: summaryData.stage,\n\t\t\t};\n\t\t\tsummarizeTelemetryProps = this.addSummaryDataToTelemetryProps(\n\t\t\t\tsummaryData,\n\t\t\t\tsummarizeTelemetryProps,\n\t\t\t);\n\n\t\t\tif (summaryData.stage !== \"submit\") {\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"submitSummaryFailure\";\n\t\t\t\tconst retriableError =\n\t\t\t\t\tsummaryData.error ?? new RetriableSummaryError(getFailMessage(errorCode));\n\t\t\t\treturn summaryFail(errorCode, retriableError, summarizeTelemetryProps, {\n\t\t\t\t\tstage: summaryData.stage,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * With incremental summaries, if the full tree was not summarized, only data stores that changed should\n\t\t\t * be summarized. A data store is considered changed if either or both of the following is true:\n\t\t\t * - It has received an op.\n\t\t\t * - Its reference state changed, i.e., it went from referenced to unreferenced or vice-versa.\n\t\t\t *\n\t\t\t * In the extreme case, every op can be for a different data store and each op can result in the reference\n\t\t\t * state change of multiple data stores. So, the total number of data stores that are summarized should not\n\t\t\t * exceed the number of ops since last summary + number of data store whose reference state changed.\n\t\t\t */\n\t\t\tif (submitSummaryOptions.fullTree !== true) {\n\t\t\t\ttelemetryContext.setCurrentSummarizeStep(\"watchSummary\");\n\t\t\t\tconst { summarizedDataStoreCount, gcStateUpdatedDataStoreCount = 0 } =\n\t\t\t\t\tsummaryData.summaryStats;\n\t\t\t\tif (\n\t\t\t\t\tsummarizedDataStoreCount >\n\t\t\t\t\tgcStateUpdatedDataStoreCount + this.heuristicData.opsSinceLastSummary\n\t\t\t\t) {\n\t\t\t\t\tsummaryLogger.sendErrorEvent({\n\t\t\t\t\t\teventName: \"IncrementalSummaryViolation\",\n\t\t\t\t\t\tsummarizedDataStoreCount,\n\t\t\t\t\t\tgcStateUpdatedDataStoreCount,\n\t\t\t\t\t\topsSinceLastSummary: this.heuristicData.opsSinceLastSummary,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Log event here on summary success only, as Summarize_cancel duplicates failure logging.\n\t\t\tsummarizeEvent.reportEvent(\"generate\", { ...summarizeTelemetryProps });\n\t\t\tresultsBuilder.summarySubmitted.resolve({ success: true, data: summaryData });\n\t\t} catch (error) {\n\t\t\treturn summaryFail(\n\t\t\t\t\"submitSummaryFailure\",\n\t\t\t\twrapError(\n\t\t\t\t\terror,\n\t\t\t\t\t(message) =>\n\t\t\t\t\t\tnew RetriableSummaryError(message, getRetryDelaySecondsFromError(error)),\n\t\t\t\t),\n\t\t\t\tundefined /* properties */,\n\t\t\t\t{\n\t\t\t\t\tstage: \"unknown\",\n\t\t\t\t},\n\t\t\t);\n\t\t} finally {\n\t\t\tif (summaryData === undefined) {\n\t\t\t\tthis.heuristicData.recordAttempt();\n\t\t\t}\n\t\t\tthis.summarizeTimer.clear();\n\t\t}\n\n\t\ttelemetryContext.setCurrentSummarizeStep(\"waitForSummaryAck\");\n\n\t\ttry {\n\t\t\tconst pendingTimeoutP = this.pendingAckTimer.start();\n\t\t\tconst summary = this.summaryWatcher.watchSummary(summaryData.clientSequenceNumber);\n\n\t\t\t// Wait for broadcast\n\t\t\tconst waitBroadcastResult = await raceTimer(\n\t\t\t\tsummary.waitBroadcast(),\n\t\t\t\tpendingTimeoutP,\n\t\t\t\tcancellationToken,\n\t\t\t);\n\t\t\tif (waitBroadcastResult.result === \"cancelled\") {\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"disconnect\";\n\t\t\t\treturn summaryFail(errorCode, new RetriableSummaryError(getFailMessage(errorCode)));\n\t\t\t}\n\t\t\tif (waitBroadcastResult.result !== \"done\") {\n\t\t\t\t// The summary op may not have been received within the timeout due to a transient error. So,\n\t\t\t\t// fail with a retriable error to re-attempt the summary if possible.\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"summaryOpWaitTimeout\";\n\t\t\t\treturn summaryFail(\n\t\t\t\t\terrorCode,\n\t\t\t\t\tnew RetriableSummaryError(getFailMessage(errorCode), 0 /* retryAfterSeconds */),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst summarizeOp = waitBroadcastResult.value;\n\n\t\t\tconst broadcastDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\t\t\tresultsBuilder.summaryOpBroadcasted.resolve({\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: { summarizeOp, broadcastDuration },\n\t\t\t});\n\n\t\t\tthis.heuristicData.lastAttempt.summarySequenceNumber = summarizeOp.sequenceNumber;\n\t\t\tsummaryLogger.sendTelemetryEvent({\n\t\t\t\teventName: \"Summarize_Op\",\n\t\t\t\tduration: broadcastDuration,\n\t\t\t\treferenceSequenceNumber: summarizeOp.referenceSequenceNumber,\n\t\t\t\tsummarySequenceNumber: summarizeOp.sequenceNumber,\n\t\t\t\thandle: summarizeOp.contents.handle,\n\t\t\t});\n\n\t\t\t// Wait for ack/nack\n\t\t\tconst waitAckNackResult = await raceTimer(\n\t\t\t\tsummary.waitAckNack(),\n\t\t\t\tpendingTimeoutP,\n\t\t\t\tcancellationToken,\n\t\t\t);\n\t\t\tif (waitAckNackResult.result === \"cancelled\") {\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"disconnect\";\n\t\t\t\treturn summaryFail(errorCode, new RetriableSummaryError(getFailMessage(errorCode)));\n\t\t\t}\n\t\t\tif (waitAckNackResult.result !== \"done\") {\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"summaryAckWaitTimeout\";\n\t\t\t\t// The summary ack may not have been received within the timeout due to a transient error. So,\n\t\t\t\t// fail with a retriable error to re-attempt the summary if possible.\n\t\t\t\treturn summaryFail(\n\t\t\t\t\terrorCode,\n\t\t\t\t\tnew RetriableSummaryError(getFailMessage(errorCode), 0 /* retryAfterSeconds */),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst ackNackOp = waitAckNackResult.value;\n\t\t\tthis.pendingAckTimer.clear();\n\n\t\t\t// Update for success/failure\n\t\t\tconst ackNackDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\n\t\t\t// adding new properties\n\t\t\tsummarizeTelemetryProps = {\n\t\t\t\tackWaitDuration: ackNackDuration,\n\t\t\t\tackNackSequenceNumber: ackNackOp.sequenceNumber,\n\t\t\t\tsummarySequenceNumber: ackNackOp.contents.summaryProposal.summarySequenceNumber,\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t};\n\t\t\tif (ackNackOp.type === MessageType.SummaryAck) {\n\t\t\t\ttelemetryContext.setCurrentSummarizeStep(\"ackReceived\");\n\t\t\t\tthis.heuristicData.markLastAttemptAsSuccessful();\n\t\t\t\tthis.successfulSummaryCallback();\n\t\t\t\tsummarizeEvent.end({\n\t\t\t\t\t...summarizeTelemetryProps,\n\t\t\t\t\thandle: ackNackOp.contents.handle,\n\t\t\t\t});\n\t\t\t\t// This processes the summary ack of the successful summary. This is so that the next summary does not\n\t\t\t\t// start before the ack of the previous summary is processed.\n\t\t\t\tawait this.refreshLatestSummaryCallback({\n\t\t\t\t\tproposalHandle: summarizeOp.contents.handle,\n\t\t\t\t\tackHandle: ackNackOp.contents.handle,\n\t\t\t\t\tsummaryRefSeq: summarizeOp.referenceSequenceNumber,\n\t\t\t\t\tsummaryLogger,\n\t\t\t\t});\n\t\t\t\tresultsBuilder.receivedSummaryAckOrNack.resolve({\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tsummaryAckOp: ackNackOp,\n\t\t\t\t\t\tackNackDuration,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Check for retryDelay in summaryNack response.\n\t\t\t\tassert(ackNackOp.type === MessageType.SummaryNack, 0x274 /* \"type check\" */);\n\t\t\t\ttelemetryContext.setCurrentSummarizeStep(\"nackReceived\");\n\t\t\t\tconst summaryNack = ackNackOp.contents;\n\t\t\t\tconst errorMessage = summaryNack?.message;\n\t\t\t\tconst retryAfterSeconds = summaryNack?.retryAfter;\n\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"summaryNack\";\n\n\t\t\t\t// pre-0.58 error message prefix: summaryNack\n\t\t\t\tconst error = new RetriableSummaryError(getFailMessage(errorCode), retryAfterSeconds, {\n\t\t\t\t\terrorMessage,\n\t\t\t\t});\n\n\t\t\t\tassert(\n\t\t\t\t\tgetRetryDelaySecondsFromError(error) === retryAfterSeconds,\n\t\t\t\t\t0x25f /* \"retryAfterSeconds\" */,\n\t\t\t\t);\n\t\t\t\t// This will only set resultsBuilder.receivedSummaryAckOrNack, as other promises are already set.\n\t\t\t\treturn summaryFail(\n\t\t\t\t\terrorCode,\n\t\t\t\t\terror,\n\t\t\t\t\t{ ...summarizeTelemetryProps, nackRetryAfter: retryAfterSeconds },\n\t\t\t\t\tundefined /* submitFailureResult */,\n\t\t\t\t\t{ summaryNackOp: ackNackOp, ackNackDuration },\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.pendingAckTimer.clear();\n\t\t\tthis.activeTelemetryContext = undefined;\n\t\t}\n\t}\n\n\tprivate addSummaryDataToTelemetryProps(\n\t\tsummaryData: SubmitSummaryResult,\n\t\tinitialProps: SummaryGeneratorTelemetry,\n\t): SummaryGeneratorTelemetry {\n\t\tswitch (summaryData.stage) {\n\t\t\tcase \"base\": {\n\t\t\t\treturn initialProps;\n\t\t\t}\n\n\t\t\tcase \"generate\": {\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"upload\": {\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t\thandle: summaryData.handle,\n\t\t\t\t\tuploadDuration: summaryData.uploadDuration,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"submit\": {\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t\thandle: summaryData.handle,\n\t\t\t\t\tuploadDuration: summaryData.uploadDuration,\n\t\t\t\t\tclientSequenceNumber: summaryData.clientSequenceNumber,\n\t\t\t\t\thasMissingOpData: this.heuristicData.hasMissingOpData,\n\t\t\t\t\topsSizesSinceLastSummary: this.heuristicData.totalOpsSize,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tassert(true, 0x397 /* Unexpected summary stage */);\n\t\t\t}\n\t\t}\n\n\t\treturn initialProps;\n\t}\n\n\tprivate summarizeTimerHandler(time: number, count: number): void {\n\t\tthis.logger.sendPerformanceEvent({\n\t\t\teventName: \"SummarizeTimeout\",\n\t\t\ttimeoutTime: time,\n\t\t\ttimeoutCount: count,\n\t\t\tcurrentSummarizeStep: this.activeTelemetryContext?.getCurrentSummarizeStep(),\n\t\t});\n\t\tthis.emit(\"summarizeTimeout\", {\n\t\t\ttimeoutCount: count,\n\t\t\tcurrentSummarizeStep: this.activeTelemetryContext?.getCurrentSummarizeStep(),\n\t\t\tnumUnsummarizedRuntimeOps: this.heuristicData.numRuntimeOps,\n\t\t\tnumUnsummarizedNonRuntimeOps: this.heuristicData.numNonRuntimeOps,\n\t\t});\n\t\tif (count < maxSummarizeTimeoutCount) {\n\t\t\t// Double and start a new timer\n\t\t\tconst nextTime = time * 2;\n\t\t\tthis.summarizeTimer.start(nextTime, () =>\n\t\t\t\tthis.summarizeTimerHandler(nextTime, count + 1),\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.summarizeTimer.clear();\n\t\tthis.activeTelemetryContext = undefined;\n\t}\n}\n"]}
@@ -7,11 +7,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.SummarizeResultBuilder = void 0;
8
8
  const internal_1 = require("@fluidframework/core-utils/internal");
9
9
  class SummarizeResultBuilder {
10
- constructor() {
11
- this.summarySubmitted = new internal_1.Deferred();
12
- this.summaryOpBroadcasted = new internal_1.Deferred();
13
- this.receivedSummaryAckOrNack = new internal_1.Deferred();
14
- }
10
+ summarySubmitted = new internal_1.Deferred();
11
+ summaryOpBroadcasted = new internal_1.Deferred();
12
+ receivedSummaryAckOrNack = new internal_1.Deferred();
15
13
  /**
16
14
  * Fails one or more of the three results as per the passed params.
17
15
  * If submit fails, all three results fail.
@@ -1 +1 @@
1
- {"version":3,"file":"summaryResultBuilder.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summaryResultBuilder.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAAuE;AAgBvE,MAAa,sBAAsB;IAAnC;QACiB,qBAAgB,GAAG,IAAI,mBAAQ,EAE5C,CAAC;QACY,yBAAoB,GAAG,IAAI,mBAAQ,EAEhD,CAAC;QACY,6BAAwB,GAAG,IAAI,mBAAQ,EAEpD,CAAC;IAuCL,CAAC;IArCA;;;;;OAKG;IACI,IAAI,CACV,OAAe,EACf,KAA6B,EAC7B,mBAA8C,EAC9C,iBAAsC;QAEtC,IAAA,iBAAM,EACL,CAAC,IAAI,CAAC,wBAAwB,CAAC,WAAW,EAC1C,KAAK,CAAC,kEAAkE,CACxE,CAAC;QAEF,MAAM,MAAM,GAAmC;YAC9C,OAAO,EAAE,KAAK;YACd,OAAO;YACP,IAAI,EAAE,SAAS;YACf,KAAK;SACI,CAAC;QAEX,0GAA0G;QAC1G,+GAA+G;QAC/G,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC/E,CAAC;IACM,KAAK;QACX,OAAO;YACN,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO;YAC/C,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO;YACvD,wBAAwB,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO;SACtD,CAAC;IACZ,CAAC;CACD;AAhDD,wDAgDC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, Deferred } from \"@fluidframework/core-utils/internal\";\n\nimport type {\n\tIRetriableFailureError,\n\tSubmitSummaryFailureData,\n\tSubmitSummaryResult,\n\tSummarizeResultPart,\n} from \"../summarizerTypes.js\";\n\nimport type {\n\tIAckSummaryResult,\n\tIBroadcastSummaryResult,\n\tINackSummaryResult,\n\tISummarizeResults,\n} from \"./summaryResultTypes.js\";\n\nexport class SummarizeResultBuilder {\n\tpublic readonly summarySubmitted = new Deferred<\n\t\tSummarizeResultPart<SubmitSummaryResult, SubmitSummaryFailureData>\n\t>();\n\tpublic readonly summaryOpBroadcasted = new Deferred<\n\t\tSummarizeResultPart<IBroadcastSummaryResult>\n\t>();\n\tpublic readonly receivedSummaryAckOrNack = new Deferred<\n\t\tSummarizeResultPart<IAckSummaryResult, INackSummaryResult>\n\t>();\n\n\t/**\n\t * Fails one or more of the three results as per the passed params.\n\t * If submit fails, all three results fail.\n\t * If op broadcast fails, only op broadcast result and ack nack result fails.\n\t * If ack nack fails, only ack nack result fails.\n\t */\n\tpublic fail(\n\t\tmessage: string,\n\t\terror: IRetriableFailureError,\n\t\tsubmitFailureResult?: SubmitSummaryFailureData,\n\t\tnackSummaryResult?: INackSummaryResult,\n\t): void {\n\t\tassert(\n\t\t\t!this.receivedSummaryAckOrNack.isCompleted,\n\t\t\t0x25e /* \"no reason to call fail if all promises have been completed\" */,\n\t\t);\n\n\t\tconst result: SummarizeResultPart<undefined> = {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\tdata: undefined,\n\t\t\terror,\n\t\t} as const;\n\n\t\t// Note that if any of these are already resolved, it will be a no-op. For example, if ack nack failed but\n\t\t// submit summary and op broadcast has already been resolved as passed, only ack nack result will get modified.\n\t\tthis.summarySubmitted.resolve({ ...result, data: submitFailureResult });\n\t\tthis.summaryOpBroadcasted.resolve(result);\n\t\tthis.receivedSummaryAckOrNack.resolve({ ...result, data: nackSummaryResult });\n\t}\n\tpublic build(): ISummarizeResults {\n\t\treturn {\n\t\t\tsummarySubmitted: this.summarySubmitted.promise,\n\t\t\tsummaryOpBroadcasted: this.summaryOpBroadcasted.promise,\n\t\t\treceivedSummaryAckOrNack: this.receivedSummaryAckOrNack.promise,\n\t\t} as const;\n\t}\n}\n"]}
1
+ {"version":3,"file":"summaryResultBuilder.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summaryResultBuilder.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAAuE;AAgBvE,MAAa,sBAAsB;IAClB,gBAAgB,GAAG,IAAI,mBAAQ,EAE5C,CAAC;IACY,oBAAoB,GAAG,IAAI,mBAAQ,EAEhD,CAAC;IACY,wBAAwB,GAAG,IAAI,mBAAQ,EAEpD,CAAC;IAEJ;;;;;OAKG;IACI,IAAI,CACV,OAAe,EACf,KAA6B,EAC7B,mBAA8C,EAC9C,iBAAsC;QAEtC,IAAA,iBAAM,EACL,CAAC,IAAI,CAAC,wBAAwB,CAAC,WAAW,EAC1C,KAAK,CAAC,kEAAkE,CACxE,CAAC;QAEF,MAAM,MAAM,GAAmC;YAC9C,OAAO,EAAE,KAAK;YACd,OAAO;YACP,IAAI,EAAE,SAAS;YACf,KAAK;SACI,CAAC;QAEX,0GAA0G;QAC1G,+GAA+G;QAC/G,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC/E,CAAC;IACM,KAAK;QACX,OAAO;YACN,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO;YAC/C,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO;YACvD,wBAAwB,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO;SACtD,CAAC;IACZ,CAAC;CACD;AAhDD,wDAgDC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, Deferred } from \"@fluidframework/core-utils/internal\";\n\nimport type {\n\tIRetriableFailureError,\n\tSubmitSummaryFailureData,\n\tSubmitSummaryResult,\n\tSummarizeResultPart,\n} from \"../summarizerTypes.js\";\n\nimport type {\n\tIAckSummaryResult,\n\tIBroadcastSummaryResult,\n\tINackSummaryResult,\n\tISummarizeResults,\n} from \"./summaryResultTypes.js\";\n\nexport class SummarizeResultBuilder {\n\tpublic readonly summarySubmitted = new Deferred<\n\t\tSummarizeResultPart<SubmitSummaryResult, SubmitSummaryFailureData>\n\t>();\n\tpublic readonly summaryOpBroadcasted = new Deferred<\n\t\tSummarizeResultPart<IBroadcastSummaryResult>\n\t>();\n\tpublic readonly receivedSummaryAckOrNack = new Deferred<\n\t\tSummarizeResultPart<IAckSummaryResult, INackSummaryResult>\n\t>();\n\n\t/**\n\t * Fails one or more of the three results as per the passed params.\n\t * If submit fails, all three results fail.\n\t * If op broadcast fails, only op broadcast result and ack nack result fails.\n\t * If ack nack fails, only ack nack result fails.\n\t */\n\tpublic fail(\n\t\tmessage: string,\n\t\terror: IRetriableFailureError,\n\t\tsubmitFailureResult?: SubmitSummaryFailureData,\n\t\tnackSummaryResult?: INackSummaryResult,\n\t): void {\n\t\tassert(\n\t\t\t!this.receivedSummaryAckOrNack.isCompleted,\n\t\t\t0x25e /* \"no reason to call fail if all promises have been completed\" */,\n\t\t);\n\n\t\tconst result: SummarizeResultPart<undefined> = {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\tdata: undefined,\n\t\t\terror,\n\t\t} as const;\n\n\t\t// Note that if any of these are already resolved, it will be a no-op. For example, if ack nack failed but\n\t\t// submit summary and op broadcast has already been resolved as passed, only ack nack result will get modified.\n\t\tthis.summarySubmitted.resolve({ ...result, data: submitFailureResult });\n\t\tthis.summaryOpBroadcasted.resolve(result);\n\t\tthis.receivedSummaryAckOrNack.resolve({ ...result, data: nackSummaryResult });\n\t}\n\tpublic build(): ISummarizeResults {\n\t\treturn {\n\t\t\tsummarySubmitted: this.summarySubmitted.promise,\n\t\t\tsummaryOpBroadcasted: this.summaryOpBroadcasted.promise,\n\t\t\treceivedSummaryAckOrNack: this.receivedSummaryAckOrNack.promise,\n\t\t} as const;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"summaryFormat.d.ts","sourceRoot":"","sources":["../../src/summary/summaryFormat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"summaryFormat.d.ts","sourceRoot":"","sources":["../../src/summary/summaryFormat.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,13 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.blobHeadersBlobName = exports.getFluidDataStoreAttributes = exports.wrapSummaryInChannelsTree = exports.dataStoreAttributesBlobName = exports.nonDataStorePaths = exports.protocolTreeName = exports.rootHasIsolatedChannels = exports.idCompressorBlobName = exports.electedSummarizerBlobName = exports.recentBatchInfoBlobName = exports.chunksBlobName = exports.metadataBlobName = exports.aliasBlobName = exports.getMetadataFormatVersion = exports.extractSummaryMetadataMessage = exports.hasIsolatedChannels = exports.getAttributesFormatVersion = void 0;
7
+ exports.blobHeadersBlobName = exports.dataStoreAttributesBlobName = exports.nonDataStorePaths = exports.protocolTreeName = exports.idCompressorBlobName = exports.electedSummarizerBlobName = exports.recentBatchInfoBlobName = exports.chunksBlobName = exports.metadataBlobName = exports.aliasBlobName = exports.extractSummaryMetadataMessage = void 0;
8
+ exports.getAttributesFormatVersion = getAttributesFormatVersion;
9
+ exports.hasIsolatedChannels = hasIsolatedChannels;
10
+ exports.getMetadataFormatVersion = getMetadataFormatVersion;
11
+ exports.rootHasIsolatedChannels = rootHasIsolatedChannels;
12
+ exports.wrapSummaryInChannelsTree = wrapSummaryInChannelsTree;
13
+ exports.getFluidDataStoreAttributes = getFluidDataStoreAttributes;
8
14
  const internal_1 = require("@fluidframework/core-utils/internal");
9
15
  const driver_definitions_1 = require("@fluidframework/driver-definitions");
10
16
  const internal_2 = require("@fluidframework/driver-utils/internal");
@@ -31,11 +37,9 @@ function getAttributesFormatVersion(attributes) {
31
37
  */
32
38
  return 0;
33
39
  }
34
- exports.getAttributesFormatVersion = getAttributesFormatVersion;
35
40
  function hasIsolatedChannels(attributes) {
36
41
  return !!attributes.summaryFormatVersion && !attributes.disableIsolatedChannels;
37
42
  }
38
- exports.hasIsolatedChannels = hasIsolatedChannels;
39
43
  /**
40
44
  * Extracts the properties from an ISequencedDocumentMessage as defined by ISummaryMetadataMessage. This message is
41
45
  * added to the metadata blob in summary.
@@ -65,7 +69,6 @@ function getMetadataFormatVersion(metadata) {
65
69
  */
66
70
  return metadata?.summaryFormatVersion ?? 0;
67
71
  }
68
- exports.getMetadataFormatVersion = getMetadataFormatVersion;
69
72
  exports.aliasBlobName = ".aliases";
70
73
  exports.metadataBlobName = ".metadata";
71
74
  exports.chunksBlobName = ".chunks";
@@ -75,7 +78,6 @@ exports.idCompressorBlobName = ".idCompressor";
75
78
  function rootHasIsolatedChannels(metadata) {
76
79
  return !!metadata && !metadata.disableIsolatedChannels;
77
80
  }
78
- exports.rootHasIsolatedChannels = rootHasIsolatedChannels;
79
81
  exports.protocolTreeName = ".protocol";
80
82
  /**
81
83
  * List of tree IDs at the container level which are reserved.
@@ -131,7 +133,6 @@ function wrapSummaryInChannelsTree(summarizeResult) {
131
133
  };
132
134
  summarizeResult.stats.treeNodeCount++;
133
135
  }
134
- exports.wrapSummaryInChannelsTree = wrapSummaryInChannelsTree;
135
136
  async function getFluidDataStoreAttributes(storage, snapshot) {
136
137
  const attributes = await (0, internal_2.readAndParse)(storage, snapshot.blobs[exports.dataStoreAttributesBlobName]);
137
138
  // Use the snapshotFormatVersion to determine how the pkg is encoded in the snapshot.
@@ -142,7 +143,6 @@ async function getFluidDataStoreAttributes(storage, snapshot) {
142
143
  (0, internal_1.assert)(formatVersion > 0, 0x1d5 /* Invalid snapshot format version */);
143
144
  return attributes;
144
145
  }
145
- exports.getFluidDataStoreAttributes = getFluidDataStoreAttributes;
146
146
  var internal_4 = require("@fluidframework/driver-utils/internal");
147
147
  Object.defineProperty(exports, "blobHeadersBlobName", { enumerable: true, get: function () { return internal_4.blobHeadersBlobName; } });
148
148
  //# sourceMappingURL=summaryFormat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"summaryFormat.js","sourceRoot":"","sources":["../../src/summary/summaryFormat.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { SummaryType } from \"@fluidframework/driver-definitions\";\nimport type {\n\tISnapshotTree,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { readAndParse } from \"@fluidframework/driver-utils/internal\";\nimport {\n\ttype ISummaryTreeWithStats,\n\tchannelsTreeName,\n\tgcTreeKey,\n\ttype IRuntimeStorageService,\n} from \"@fluidframework/runtime-definitions/internal\";\n\nimport { blobsTreeName } from \"../blobManager/index.js\";\nimport type { IGCMetadata } from \"../gc/index.js\";\n\nimport type { IDocumentSchema } from \"./documentSchema.js\";\n\n/**\n * @deprecated This interface will no longer be exported in the future(AB#8004).\n * @legacy @beta\n */\nexport type OmitAttributesVersions<T> = Omit<\n\tT,\n\t\"snapshotFormatVersion\" | \"summaryFormatVersion\"\n>;\n\n/**\n * @deprecated This interface will no longer be exported in the future(AB#8004).\n * @legacy @beta\n */\nexport interface IFluidDataStoreAttributes0 {\n\treadonly snapshotFormatVersion?: undefined;\n\treadonly summaryFormatVersion?: undefined;\n\tpkg: string;\n\t/**\n\t * This tells whether a data store is root. Root data stores are never collected.\n\t * Non-root data stores may be collected if they are not used. If this is not present, default it to\n\t * true. This will ensure that older data stores are incorrectly collected.\n\t */\n\treadonly isRootDataStore?: boolean;\n}\n\n/**\n * @deprecated This interface will no longer be exported in the future(AB#8004).\n * @legacy @beta\n */\nexport interface IFluidDataStoreAttributes1\n\textends OmitAttributesVersions<IFluidDataStoreAttributes0> {\n\treadonly snapshotFormatVersion: \"0.1\";\n\treadonly summaryFormatVersion?: undefined;\n}\n\n/**\n * @deprecated This interface will no longer be exported in the future(AB#8004).\n * @legacy @beta\n */\nexport interface IFluidDataStoreAttributes2\n\textends OmitAttributesVersions<IFluidDataStoreAttributes1> {\n\t/**\n\t * Switch from snapshotFormatVersion to summaryFormatVersion\n\t */\n\treadonly snapshotFormatVersion?: undefined;\n\treadonly summaryFormatVersion: 2;\n\t/**\n\t * True if channels are not isolated in .channels subtrees, otherwise isolated.\n\t * This is required in both datastore attributes as well as the root container,\n\t * because reused summary handles may cause different format versions in each\n\t * datastore subtree within the summary.\n\t */\n\treadonly disableIsolatedChannels?: true;\n}\n/**\n * Added IFluidDataStoreAttributes similar to IChannelAttributes which will tell the attributes of a\n * store like the package, snapshotFormatVersion to take different decisions based on a particular\n * snapshotFormatVersion.\n *\n * @deprecated This interface will no longer be exported in the future(AB#8004).\n *\n * @legacy @beta\n *\n */\nexport type ReadFluidDataStoreAttributes =\n\t| IFluidDataStoreAttributes0\n\t| IFluidDataStoreAttributes1\n\t| IFluidDataStoreAttributes2;\nexport type WriteFluidDataStoreAttributes =\n\t| IFluidDataStoreAttributes1\n\t| IFluidDataStoreAttributes2;\n\nexport function getAttributesFormatVersion(attributes: ReadFluidDataStoreAttributes): number {\n\tif (attributes.summaryFormatVersion) {\n\t\t/**\n\t\t * Version 2+: Introduces .channels trees for isolation of\n\t\t * channel trees from data store objects.\n\t\t */\n\t\treturn attributes.summaryFormatVersion;\n\t} else if (attributes.snapshotFormatVersion === \"0.1\") {\n\t\t/**\n\t\t * Version 1: from this version the pkg within the data store\n\t\t * attributes blob is a JSON array rather than a string.\n\t\t */\n\t\treturn 1;\n\t}\n\t/**\n\t * Version 0: format version is missing from summary.\n\t * This indicates it is an older version.\n\t */\n\treturn 0;\n}\n\nexport function hasIsolatedChannels(attributes: ReadFluidDataStoreAttributes): boolean {\n\treturn !!attributes.summaryFormatVersion && !attributes.disableIsolatedChannels;\n}\n\n/**\n * @internal\n */\n\nexport interface IContainerRuntimeMetadata extends ICreateContainerMetadata, IGCMetadata {\n\treadonly summaryFormatVersion: 1;\n\t/**\n\t * @deprecated used by old (prior to 2.0 RC3) runtimes\n\t */\n\treadonly message?: ISummaryMetadataMessage;\n\t/**\n\t * The last message processed at the time of summary. Only primitive property types are added to the summary.\n\t */\n\treadonly lastMessage?: ISummaryMetadataMessage;\n\t/**\n\t * True if channels are not isolated in .channels subtrees, otherwise isolated.\n\t */\n\treadonly disableIsolatedChannels?: true;\n\t/**\n\t * The summary number for a container's summary. Incremented on summaries throughout its lifetime.\n\t */\n\treadonly summaryNumber?: number;\n\t/**\n\t * GUID to identify a document in telemetry\n\t */\n\treadonly telemetryDocumentId?: string;\n\n\treadonly documentSchema?: IDocumentSchema;\n}\n\n/**\n * @internal\n */\nexport interface ICreateContainerMetadata {\n\t/**\n\t * Runtime version of the container when it was first created\n\t */\n\tcreateContainerRuntimeVersion?: string;\n\t/**\n\t * Timestamp of the container when it was first created\n\t */\n\tcreateContainerTimestamp?: number;\n}\n\n/**\n * The properties of an ISequencedDocumentMessage to be stored in the metadata blob in summary.\n * @internal\n */\nexport type ISummaryMetadataMessage = Pick<\n\tISequencedDocumentMessage,\n\t| \"clientId\"\n\t| \"clientSequenceNumber\"\n\t| \"minimumSequenceNumber\"\n\t| \"referenceSequenceNumber\"\n\t| \"sequenceNumber\"\n\t| \"timestamp\"\n\t| \"type\"\n>;\n\n/**\n * Extracts the properties from an ISequencedDocumentMessage as defined by ISummaryMetadataMessage. This message is\n * added to the metadata blob in summary.\n */\nexport const extractSummaryMetadataMessage = (\n\tmessage?: ISequencedDocumentMessage,\n): ISummaryMetadataMessage | undefined =>\n\tmessage === undefined\n\t\t? undefined\n\t\t: {\n\t\t\t\tclientId: message.clientId,\n\t\t\t\tclientSequenceNumber: message.clientSequenceNumber,\n\t\t\t\tminimumSequenceNumber: message.minimumSequenceNumber,\n\t\t\t\treferenceSequenceNumber: message.referenceSequenceNumber,\n\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t\ttimestamp: message.timestamp,\n\t\t\t\ttype: message.type,\n\t\t\t};\n\nexport function getMetadataFormatVersion(metadata?: IContainerRuntimeMetadata): number {\n\t/**\n\t * Version 2+: Introduces runtime sequence number for data verification.\n\t *\n\t * Version 1+: Introduces .metadata blob and .channels trees for isolation of\n\t * data store trees from container-level objects.\n\t * Also introduces enableGC option stored in the summary.\n\t *\n\t * Version 0: metadata blob missing; format version is missing from summary.\n\t * This indicates it is an older version.\n\t */\n\treturn metadata?.summaryFormatVersion ?? 0;\n}\n\nexport const aliasBlobName = \".aliases\";\nexport const metadataBlobName = \".metadata\";\nexport const chunksBlobName = \".chunks\";\nexport const recentBatchInfoBlobName = \".recentBatchInfo\";\nexport const electedSummarizerBlobName = \".electedSummarizer\";\nexport const idCompressorBlobName = \".idCompressor\";\n\nexport function rootHasIsolatedChannels(metadata?: IContainerRuntimeMetadata): boolean {\n\treturn !!metadata && !metadata.disableIsolatedChannels;\n}\n\nexport const protocolTreeName = \".protocol\";\n\n/**\n * List of tree IDs at the container level which are reserved.\n * This is for older versions of summaries that do not yet have an\n * isolated data stores namespace. Without the namespace, this must\n * be used to prevent name collisions with data store IDs.\n */\nexport const nonDataStorePaths = [\n\tprotocolTreeName,\n\t\".logTail\",\n\t\".serviceProtocol\",\n\tblobsTreeName,\n\tgcTreeKey,\n\tidCompressorBlobName,\n];\n\nexport const dataStoreAttributesBlobName = \".component\";\n\n/**\n * Modifies summary tree and stats to put tree under .channels tree.\n *\n * @param summarizeResult - Summary tree and stats to modify\n *\n * @example\n *\n * Converts from:\n *\n * ```typescript\n * {\n * type: SummaryType.Tree,\n * tree: { a: {...}, b: {...}, c: {...} },\n * }\n * ```\n *\n * to:\n *\n * ```typescript\n * {\n * type: SummaryType.Tree,\n * tree: {\n * \".channels\": {\n * type: SummaryType.Tree,\n * tree: { a: {...}, b: {...}, c: {...} }\n * },\n * },\n * }\n * ```\n *\n * And adds +1 to treeNodeCount in stats.\n */\nexport function wrapSummaryInChannelsTree(summarizeResult: ISummaryTreeWithStats): void {\n\tsummarizeResult.summary = {\n\t\ttype: SummaryType.Tree,\n\t\ttree: { [channelsTreeName]: summarizeResult.summary },\n\t};\n\tsummarizeResult.stats.treeNodeCount++;\n}\n\nexport async function getFluidDataStoreAttributes(\n\tstorage: IRuntimeStorageService,\n\tsnapshot: ISnapshotTree,\n): Promise<ReadFluidDataStoreAttributes> {\n\tconst attributes = await readAndParse<ReadFluidDataStoreAttributes>(\n\t\tstorage,\n\t\tsnapshot.blobs[dataStoreAttributesBlobName],\n\t);\n\t// Use the snapshotFormatVersion to determine how the pkg is encoded in the snapshot.\n\t// For snapshotFormatVersion = \"0.1\" (1) or above, pkg is jsonified, otherwise it is just a string.\n\t// However the feature of loading a detached container from snapshot, is added when the\n\t// snapshotFormatVersion is at least \"0.1\" (1), so we don't expect it to be anything else.\n\tconst formatVersion = getAttributesFormatVersion(attributes);\n\tassert(formatVersion > 0, 0x1d5 /* Invalid snapshot format version */);\n\treturn attributes;\n}\n\nexport { blobHeadersBlobName } from \"@fluidframework/driver-utils/internal\";\n"]}
1
+ {"version":3,"file":"summaryFormat.js","sourceRoot":"","sources":["../../src/summary/summaryFormat.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { SummaryType } from \"@fluidframework/driver-definitions\";\nimport type {\n\tISnapshotTree,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { readAndParse } from \"@fluidframework/driver-utils/internal\";\nimport {\n\ttype ISummaryTreeWithStats,\n\tchannelsTreeName,\n\tgcTreeKey,\n\ttype IRuntimeStorageService,\n} from \"@fluidframework/runtime-definitions/internal\";\n\nimport { blobsTreeName } from \"../blobManager/index.js\";\nimport type { IGCMetadata } from \"../gc/index.js\";\n\nimport type { IDocumentSchema } from \"./documentSchema.js\";\n\n/**\n * @deprecated This interface will no longer be exported in the future(AB#8004).\n * @legacy @beta\n */\nexport type OmitAttributesVersions<T> = Omit<\n\tT,\n\t\"snapshotFormatVersion\" | \"summaryFormatVersion\"\n>;\n\n/**\n * @deprecated This interface will no longer be exported in the future(AB#8004).\n * @legacy @beta\n */\nexport interface IFluidDataStoreAttributes0 {\n\treadonly snapshotFormatVersion?: undefined;\n\treadonly summaryFormatVersion?: undefined;\n\tpkg: string;\n\t/**\n\t * This tells whether a data store is root. Root data stores are never collected.\n\t * Non-root data stores may be collected if they are not used. If this is not present, default it to\n\t * true. This will ensure that older data stores are incorrectly collected.\n\t */\n\treadonly isRootDataStore?: boolean;\n}\n\n/**\n * @deprecated This interface will no longer be exported in the future(AB#8004).\n * @legacy @beta\n */\nexport interface IFluidDataStoreAttributes1\n\textends OmitAttributesVersions<IFluidDataStoreAttributes0> {\n\treadonly snapshotFormatVersion: \"0.1\";\n\treadonly summaryFormatVersion?: undefined;\n}\n\n/**\n * @deprecated This interface will no longer be exported in the future(AB#8004).\n * @legacy @beta\n */\nexport interface IFluidDataStoreAttributes2\n\textends OmitAttributesVersions<IFluidDataStoreAttributes1> {\n\t/**\n\t * Switch from snapshotFormatVersion to summaryFormatVersion\n\t */\n\treadonly snapshotFormatVersion?: undefined;\n\treadonly summaryFormatVersion: 2;\n\t/**\n\t * True if channels are not isolated in .channels subtrees, otherwise isolated.\n\t * This is required in both datastore attributes as well as the root container,\n\t * because reused summary handles may cause different format versions in each\n\t * datastore subtree within the summary.\n\t */\n\treadonly disableIsolatedChannels?: true;\n}\n/**\n * Added IFluidDataStoreAttributes similar to IChannelAttributes which will tell the attributes of a\n * store like the package, snapshotFormatVersion to take different decisions based on a particular\n * snapshotFormatVersion.\n *\n * @deprecated This interface will no longer be exported in the future(AB#8004).\n *\n * @legacy @beta\n *\n */\nexport type ReadFluidDataStoreAttributes =\n\t| IFluidDataStoreAttributes0\n\t| IFluidDataStoreAttributes1\n\t| IFluidDataStoreAttributes2;\nexport type WriteFluidDataStoreAttributes =\n\t| IFluidDataStoreAttributes1\n\t| IFluidDataStoreAttributes2;\n\nexport function getAttributesFormatVersion(attributes: ReadFluidDataStoreAttributes): number {\n\tif (attributes.summaryFormatVersion) {\n\t\t/**\n\t\t * Version 2+: Introduces .channels trees for isolation of\n\t\t * channel trees from data store objects.\n\t\t */\n\t\treturn attributes.summaryFormatVersion;\n\t} else if (attributes.snapshotFormatVersion === \"0.1\") {\n\t\t/**\n\t\t * Version 1: from this version the pkg within the data store\n\t\t * attributes blob is a JSON array rather than a string.\n\t\t */\n\t\treturn 1;\n\t}\n\t/**\n\t * Version 0: format version is missing from summary.\n\t * This indicates it is an older version.\n\t */\n\treturn 0;\n}\n\nexport function hasIsolatedChannels(attributes: ReadFluidDataStoreAttributes): boolean {\n\treturn !!attributes.summaryFormatVersion && !attributes.disableIsolatedChannels;\n}\n\n/**\n * @internal\n */\n\nexport interface IContainerRuntimeMetadata extends ICreateContainerMetadata, IGCMetadata {\n\treadonly summaryFormatVersion: 1;\n\t/**\n\t * @deprecated used by old (prior to 2.0 RC3) runtimes\n\t */\n\treadonly message?: ISummaryMetadataMessage;\n\t/**\n\t * The last message processed at the time of summary. Only primitive property types are added to the summary.\n\t */\n\treadonly lastMessage?: ISummaryMetadataMessage;\n\t/**\n\t * True if channels are not isolated in .channels subtrees, otherwise isolated.\n\t */\n\treadonly disableIsolatedChannels?: true;\n\t/**\n\t * The summary number for a container's summary. Incremented on summaries throughout its lifetime.\n\t */\n\treadonly summaryNumber?: number;\n\t/**\n\t * GUID to identify a document in telemetry\n\t */\n\treadonly telemetryDocumentId?: string;\n\n\treadonly documentSchema?: IDocumentSchema;\n}\n\n/**\n * @internal\n */\nexport interface ICreateContainerMetadata {\n\t/**\n\t * Runtime version of the container when it was first created\n\t */\n\tcreateContainerRuntimeVersion?: string;\n\t/**\n\t * Timestamp of the container when it was first created\n\t */\n\tcreateContainerTimestamp?: number;\n}\n\n/**\n * The properties of an ISequencedDocumentMessage to be stored in the metadata blob in summary.\n * @internal\n */\nexport type ISummaryMetadataMessage = Pick<\n\tISequencedDocumentMessage,\n\t| \"clientId\"\n\t| \"clientSequenceNumber\"\n\t| \"minimumSequenceNumber\"\n\t| \"referenceSequenceNumber\"\n\t| \"sequenceNumber\"\n\t| \"timestamp\"\n\t| \"type\"\n>;\n\n/**\n * Extracts the properties from an ISequencedDocumentMessage as defined by ISummaryMetadataMessage. This message is\n * added to the metadata blob in summary.\n */\nexport const extractSummaryMetadataMessage = (\n\tmessage?: ISequencedDocumentMessage,\n): ISummaryMetadataMessage | undefined =>\n\tmessage === undefined\n\t\t? undefined\n\t\t: {\n\t\t\t\tclientId: message.clientId,\n\t\t\t\tclientSequenceNumber: message.clientSequenceNumber,\n\t\t\t\tminimumSequenceNumber: message.minimumSequenceNumber,\n\t\t\t\treferenceSequenceNumber: message.referenceSequenceNumber,\n\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t\ttimestamp: message.timestamp,\n\t\t\t\ttype: message.type,\n\t\t\t};\n\nexport function getMetadataFormatVersion(metadata?: IContainerRuntimeMetadata): number {\n\t/**\n\t * Version 2+: Introduces runtime sequence number for data verification.\n\t *\n\t * Version 1+: Introduces .metadata blob and .channels trees for isolation of\n\t * data store trees from container-level objects.\n\t * Also introduces enableGC option stored in the summary.\n\t *\n\t * Version 0: metadata blob missing; format version is missing from summary.\n\t * This indicates it is an older version.\n\t */\n\treturn metadata?.summaryFormatVersion ?? 0;\n}\n\nexport const aliasBlobName = \".aliases\";\nexport const metadataBlobName = \".metadata\";\nexport const chunksBlobName = \".chunks\";\nexport const recentBatchInfoBlobName = \".recentBatchInfo\";\nexport const electedSummarizerBlobName = \".electedSummarizer\";\nexport const idCompressorBlobName = \".idCompressor\";\n\nexport function rootHasIsolatedChannels(metadata?: IContainerRuntimeMetadata): boolean {\n\treturn !!metadata && !metadata.disableIsolatedChannels;\n}\n\nexport const protocolTreeName = \".protocol\";\n\n/**\n * List of tree IDs at the container level which are reserved.\n * This is for older versions of summaries that do not yet have an\n * isolated data stores namespace. Without the namespace, this must\n * be used to prevent name collisions with data store IDs.\n */\nexport const nonDataStorePaths = [\n\tprotocolTreeName,\n\t\".logTail\",\n\t\".serviceProtocol\",\n\tblobsTreeName,\n\tgcTreeKey,\n\tidCompressorBlobName,\n];\n\nexport const dataStoreAttributesBlobName = \".component\";\n\n/**\n * Modifies summary tree and stats to put tree under .channels tree.\n *\n * @param summarizeResult - Summary tree and stats to modify\n *\n * @example\n *\n * Converts from:\n *\n * ```typescript\n * {\n * type: SummaryType.Tree,\n * tree: { a: {...}, b: {...}, c: {...} },\n * }\n * ```\n *\n * to:\n *\n * ```typescript\n * {\n * type: SummaryType.Tree,\n * tree: {\n * \".channels\": {\n * type: SummaryType.Tree,\n * tree: { a: {...}, b: {...}, c: {...} }\n * },\n * },\n * }\n * ```\n *\n * And adds +1 to treeNodeCount in stats.\n */\nexport function wrapSummaryInChannelsTree(summarizeResult: ISummaryTreeWithStats): void {\n\tsummarizeResult.summary = {\n\t\ttype: SummaryType.Tree,\n\t\ttree: { [channelsTreeName]: summarizeResult.summary },\n\t};\n\tsummarizeResult.stats.treeNodeCount++;\n}\n\nexport async function getFluidDataStoreAttributes(\n\tstorage: IRuntimeStorageService,\n\tsnapshot: ISnapshotTree,\n): Promise<ReadFluidDataStoreAttributes> {\n\tconst attributes = await readAndParse<ReadFluidDataStoreAttributes>(\n\t\tstorage,\n\t\tsnapshot.blobs[dataStoreAttributesBlobName],\n\t);\n\t// Use the snapshotFormatVersion to determine how the pkg is encoded in the snapshot.\n\t// For snapshotFormatVersion = \"0.1\" (1) or above, pkg is jsonified, otherwise it is just a string.\n\t// However the feature of loading a detached container from snapshot, is added when the\n\t// snapshotFormatVersion is at least \"0.1\" (1), so we don't expect it to be anything else.\n\tconst formatVersion = getAttributesFormatVersion(attributes);\n\tassert(formatVersion > 0, 0x1d5 /* Invalid snapshot format version */);\n\treturn attributes;\n}\n\nexport { blobHeadersBlobName } from \"@fluidframework/driver-utils/internal\";\n"]}
@@ -4,7 +4,11 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.validateSummaryHeuristicConfiguration = exports.formCreateSummarizerFn = exports.DefaultSummaryConfiguration = exports.isSummaryOnRequest = exports.isSummariesDisabled = exports.summarizerRequestUrl = void 0;
7
+ exports.DefaultSummaryConfiguration = exports.summarizerRequestUrl = void 0;
8
+ exports.isSummariesDisabled = isSummariesDisabled;
9
+ exports.isSummaryOnRequest = isSummaryOnRequest;
10
+ exports.formCreateSummarizerFn = formCreateSummarizerFn;
11
+ exports.validateSummaryHeuristicConfiguration = validateSummaryHeuristicConfiguration;
8
12
  const internal_1 = require("@fluidframework/container-definitions/internal");
9
13
  const internal_2 = require("@fluidframework/driver-definitions/internal");
10
14
  const internal_3 = require("@fluidframework/runtime-utils/internal");
@@ -14,11 +18,9 @@ exports.summarizerRequestUrl = "_summarizer";
14
18
  function isSummariesDisabled(config) {
15
19
  return config.state === "disabled";
16
20
  }
17
- exports.isSummariesDisabled = isSummariesDisabled;
18
21
  function isSummaryOnRequest(config) {
19
22
  return config.state === "summaryOnRequest";
20
23
  }
21
- exports.isSummaryOnRequest = isSummaryOnRequest;
22
24
  /**
23
25
  * @legacy @beta
24
26
  */
@@ -77,7 +79,6 @@ function formCreateSummarizerFn(loader) {
77
79
  return fluidObject.ISummarizer;
78
80
  };
79
81
  }
80
- exports.formCreateSummarizerFn = formCreateSummarizerFn;
81
82
  function validateSummaryHeuristicConfiguration(configuration) {
82
83
  // eslint-disable-next-line no-restricted-syntax
83
84
  for (const prop in configuration) {
@@ -89,5 +90,4 @@ function validateSummaryHeuristicConfiguration(configuration) {
89
90
  throw new internal_4.UsageError(`"minIdleTime" [${configuration.minIdleTime}] cannot be greater than "maxIdleTime" [${configuration.maxIdleTime}]`);
90
91
  }
91
92
  }
92
- exports.validateSummaryHeuristicConfiguration = validateSummaryHeuristicConfiguration;
93
93
  //# sourceMappingURL=summaryHelpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"summaryHelpers.js","sourceRoot":"","sources":["../../src/summary/summaryHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { type ILoader, LoaderHeader } from \"@fluidframework/container-definitions/internal\";\nimport type { FluidObject, IRequest, IResponse } from \"@fluidframework/core-interfaces\";\nimport { DriverHeader } from \"@fluidframework/driver-definitions/internal\";\nimport { responseToException } from \"@fluidframework/runtime-utils/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport {\n\tsummarizerClientType,\n\ttype ISummarizer,\n\ttype ISummaryConfiguration,\n\ttype ISummaryConfigurationDisableSummarizer,\n\ttype ISummaryConfigurationHeuristics,\n} from \"./summarizerTypes.js\";\n\nexport const summarizerRequestUrl = \"_summarizer\";\n\nexport function isSummariesDisabled(\n\tconfig: ISummaryConfiguration,\n): config is ISummaryConfigurationDisableSummarizer {\n\treturn config.state === \"disabled\";\n}\n\nexport function isSummaryOnRequest(config: { state?: string }): boolean {\n\treturn config.state === \"summaryOnRequest\";\n}\n\n/**\n * @legacy @beta\n */\nexport const DefaultSummaryConfiguration: ISummaryConfiguration = {\n\tstate: \"enabled\",\n\n\tminIdleTime: 0,\n\n\tmaxIdleTime: 30 * 1000, // 30 secs.\n\n\tmaxTime: 60 * 1000, // 1 min.\n\n\tmaxOps: 100, // Summarize if 100 weighted ops received since last snapshot.\n\n\tminOpsForLastSummaryAttempt: 10,\n\n\tmaxAckWaitTime: 3 * 60 * 1000, // 3 mins.\n\n\tmaxOpsSinceLastSummary: 7000,\n\n\tinitialSummarizerDelayMs: 5 * 1000, // 5 secs.\n\n\tnonRuntimeOpWeight: 0.1,\n\n\truntimeOpWeight: 1,\n\n\tnonRuntimeHeuristicThreshold: 20,\n};\n\n/**\n * Returns a function that will create and retrieve a Summarizer.\n */\nexport function formCreateSummarizerFn(loader: ILoader): () => Promise<ISummarizer> {\n\treturn async () => {\n\t\tconst request: IRequest = {\n\t\t\theaders: {\n\t\t\t\t[LoaderHeader.cache]: false,\n\t\t\t\t[LoaderHeader.clientDetails]: {\n\t\t\t\t\tcapabilities: { interactive: false },\n\t\t\t\t\ttype: summarizerClientType,\n\t\t\t\t},\n\t\t\t\t[DriverHeader.summarizingClient]: true,\n\t\t\t\t[LoaderHeader.reconnect]: false,\n\t\t\t},\n\t\t\turl: `/${summarizerRequestUrl}`,\n\t\t};\n\n\t\tconst resolvedContainer = await loader.resolve(request);\n\t\tlet fluidObject: FluidObject<ISummarizer> | undefined;\n\n\t\t// Older containers may not have the \"getEntryPoint\" API\n\t\t// ! This check will need to stay until LTS of loader moves past 2.0.0-internal.7.0.0\n\t\tif (resolvedContainer.getEntryPoint === undefined) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-explicit-any\n\t\t\tconst response = (await (resolvedContainer as any).request({\n\t\t\t\turl: `/${summarizerRequestUrl}`,\n\t\t\t})) as IResponse;\n\t\t\tif (response.status !== 200 || response.mimeType !== \"fluid/object\") {\n\t\t\t\tthrow responseToException(response, request);\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\tfluidObject = response.value;\n\t\t} else {\n\t\t\tfluidObject = await resolvedContainer.getEntryPoint();\n\t\t}\n\n\t\tif (fluidObject?.ISummarizer === undefined) {\n\t\t\tthrow new UsageError(\"Fluid object does not implement ISummarizer\");\n\t\t}\n\t\treturn fluidObject.ISummarizer;\n\t};\n}\n\nexport function validateSummaryHeuristicConfiguration(\n\tconfiguration: ISummaryConfigurationHeuristics,\n): void {\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const prop in configuration) {\n\t\tif (typeof configuration[prop] === \"number\" && configuration[prop] < 0) {\n\t\t\tthrow new UsageError(\n\t\t\t\t`Summary heuristic configuration property \"${prop}\" cannot be less than 0`,\n\t\t\t);\n\t\t}\n\t}\n\tif (configuration.minIdleTime > configuration.maxIdleTime) {\n\t\tthrow new UsageError(\n\t\t\t`\"minIdleTime\" [${configuration.minIdleTime}] cannot be greater than \"maxIdleTime\" [${configuration.maxIdleTime}]`,\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"file":"summaryHelpers.js","sourceRoot":"","sources":["../../src/summary/summaryHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { type ILoader, LoaderHeader } from \"@fluidframework/container-definitions/internal\";\nimport type { FluidObject, IRequest, IResponse } from \"@fluidframework/core-interfaces\";\nimport { DriverHeader } from \"@fluidframework/driver-definitions/internal\";\nimport { responseToException } from \"@fluidframework/runtime-utils/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport {\n\tsummarizerClientType,\n\ttype ISummarizer,\n\ttype ISummaryConfiguration,\n\ttype ISummaryConfigurationDisableSummarizer,\n\ttype ISummaryConfigurationHeuristics,\n} from \"./summarizerTypes.js\";\n\nexport const summarizerRequestUrl = \"_summarizer\";\n\nexport function isSummariesDisabled(\n\tconfig: ISummaryConfiguration,\n): config is ISummaryConfigurationDisableSummarizer {\n\treturn config.state === \"disabled\";\n}\n\nexport function isSummaryOnRequest(config: { state?: string }): boolean {\n\treturn config.state === \"summaryOnRequest\";\n}\n\n/**\n * @legacy @beta\n */\nexport const DefaultSummaryConfiguration: ISummaryConfiguration = {\n\tstate: \"enabled\",\n\n\tminIdleTime: 0,\n\n\tmaxIdleTime: 30 * 1000, // 30 secs.\n\n\tmaxTime: 60 * 1000, // 1 min.\n\n\tmaxOps: 100, // Summarize if 100 weighted ops received since last snapshot.\n\n\tminOpsForLastSummaryAttempt: 10,\n\n\tmaxAckWaitTime: 3 * 60 * 1000, // 3 mins.\n\n\tmaxOpsSinceLastSummary: 7000,\n\n\tinitialSummarizerDelayMs: 5 * 1000, // 5 secs.\n\n\tnonRuntimeOpWeight: 0.1,\n\n\truntimeOpWeight: 1,\n\n\tnonRuntimeHeuristicThreshold: 20,\n};\n\n/**\n * Returns a function that will create and retrieve a Summarizer.\n */\nexport function formCreateSummarizerFn(loader: ILoader): () => Promise<ISummarizer> {\n\treturn async () => {\n\t\tconst request: IRequest = {\n\t\t\theaders: {\n\t\t\t\t[LoaderHeader.cache]: false,\n\t\t\t\t[LoaderHeader.clientDetails]: {\n\t\t\t\t\tcapabilities: { interactive: false },\n\t\t\t\t\ttype: summarizerClientType,\n\t\t\t\t},\n\t\t\t\t[DriverHeader.summarizingClient]: true,\n\t\t\t\t[LoaderHeader.reconnect]: false,\n\t\t\t},\n\t\t\turl: `/${summarizerRequestUrl}`,\n\t\t};\n\n\t\tconst resolvedContainer = await loader.resolve(request);\n\t\tlet fluidObject: FluidObject<ISummarizer> | undefined;\n\n\t\t// Older containers may not have the \"getEntryPoint\" API\n\t\t// ! This check will need to stay until LTS of loader moves past 2.0.0-internal.7.0.0\n\t\tif (resolvedContainer.getEntryPoint === undefined) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-explicit-any\n\t\t\tconst response = (await (resolvedContainer as any).request({\n\t\t\t\turl: `/${summarizerRequestUrl}`,\n\t\t\t})) as IResponse;\n\t\t\tif (response.status !== 200 || response.mimeType !== \"fluid/object\") {\n\t\t\t\tthrow responseToException(response, request);\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\tfluidObject = response.value;\n\t\t} else {\n\t\t\tfluidObject = await resolvedContainer.getEntryPoint();\n\t\t}\n\n\t\tif (fluidObject?.ISummarizer === undefined) {\n\t\t\tthrow new UsageError(\"Fluid object does not implement ISummarizer\");\n\t\t}\n\t\treturn fluidObject.ISummarizer;\n\t};\n}\n\nexport function validateSummaryHeuristicConfiguration(\n\tconfiguration: ISummaryConfigurationHeuristics,\n): void {\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (const prop in configuration) {\n\t\tif (typeof configuration[prop] === \"number\" && configuration[prop] < 0) {\n\t\t\tthrow new UsageError(\n\t\t\t\t`Summary heuristic configuration property \"${prop}\" cannot be less than 0`,\n\t\t\t);\n\t\t}\n\t}\n\tif (configuration.minIdleTime > configuration.maxIdleTime) {\n\t\tthrow new UsageError(\n\t\t\t`\"minIdleTime\" [${configuration.minIdleTime}] cannot be greater than \"maxIdleTime\" [${configuration.maxIdleTime}]`,\n\t\t);\n\t}\n}\n"]}
@@ -25,6 +25,28 @@ var SummaryManagerState;
25
25
  * stopping existing summarizer client.
26
26
  */
27
27
  class SummaryManager extends client_utils_1.TypedEventEmitter {
28
+ clientElection;
29
+ connectedState;
30
+ summaryCollection;
31
+ createSummarizerFn;
32
+ startThrottler;
33
+ logger;
34
+ opsToBypassInitialDelay;
35
+ initialDelayMs;
36
+ latestClientId;
37
+ state = SummaryManagerState.Off;
38
+ summarizer;
39
+ pendingStopReason;
40
+ _disposed = false;
41
+ summarizerStopTimeout;
42
+ /**
43
+ * Monotonically increasing counter that tracks summarizer lifecycle generations.
44
+ * Incremented each time {@link cleanupAfterSummarizerStop} runs. Used by the
45
+ * promise chain in {@link startSummarization} to detect that cleanup has already
46
+ * been performed by another path (e.g. the stop timeout), so it can skip
47
+ * redundant cleanup that would corrupt the state machine.
48
+ */
49
+ summarizerGeneration = 0;
28
50
  get disposed() {
29
51
  return this._disposed;
30
52
  }
@@ -43,59 +65,6 @@ class SummaryManager extends client_utils_1.TypedEventEmitter {
43
65
  this.summaryCollection = summaryCollection;
44
66
  this.createSummarizerFn = createSummarizerFn;
45
67
  this.startThrottler = startThrottler;
46
- this.state = SummaryManagerState.Off;
47
- this._disposed = false;
48
- /**
49
- * Monotonically increasing counter that tracks summarizer lifecycle generations.
50
- * Incremented each time {@link cleanupAfterSummarizerStop} runs. Used by the
51
- * promise chain in {@link startSummarization} to detect that cleanup has already
52
- * been performed by another path (e.g. the stop timeout), so it can skip
53
- * redundant cleanup that would corrupt the state machine.
54
- */
55
- this.summarizerGeneration = 0;
56
- this.handleConnected = (clientId) => {
57
- this.latestClientId = clientId;
58
- // If we have a summarizer, it should have been either cancelled on disconnected by now.
59
- // But because of lastSummary process, it can still hang around, so there is not much we can
60
- // check or assert.
61
- this.refreshSummarizer();
62
- };
63
- this.handleDisconnected = () => {
64
- this.refreshSummarizer();
65
- };
66
- this.refreshSummarizer = () => {
67
- // Transition states depending on shouldSummarize, which is a calculated property
68
- // that is only true if this client is connected and is the elected summarizer.
69
- const shouldSummarizeState = this.getShouldSummarizeState();
70
- switch (this.state) {
71
- case SummaryManagerState.Off: {
72
- if (shouldSummarizeState.shouldSummarize) {
73
- this.startSummarization();
74
- }
75
- return;
76
- }
77
- case SummaryManagerState.Starting: {
78
- // Cannot take any action until summarizer is created
79
- // state transition will occur after creation
80
- return;
81
- }
82
- case SummaryManagerState.Running: {
83
- if (shouldSummarizeState.shouldSummarize === false) {
84
- this.stop(shouldSummarizeState.stopReason);
85
- }
86
- return;
87
- }
88
- case SummaryManagerState.Stopping: {
89
- // Cannot take any action until running summarizer finishes
90
- // state transition will occur after it stops
91
- return;
92
- }
93
- default: {
94
- return;
95
- }
96
- }
97
- };
98
- this.forwardedEventsCleanup = [];
99
68
  this.logger = (0, internal_3.createChildLogger)({
100
69
  logger: parentLogger,
101
70
  namespace: "SummaryManager",
@@ -117,6 +86,17 @@ class SummaryManager extends client_utils_1.TypedEventEmitter {
117
86
  this.clientElection.on("electedSummarizerChanged", this.refreshSummarizer);
118
87
  this.refreshSummarizer();
119
88
  }
89
+ handleConnected = (clientId) => {
90
+ this.latestClientId = clientId;
91
+ // If we have a summarizer, it should have been either cancelled on disconnected by now.
92
+ // But because of lastSummary process, it can still hang around, so there is not much we can
93
+ // check or assert.
94
+ this.refreshSummarizer();
95
+ };
96
+ handleDisconnected = () => {
97
+ this.refreshSummarizer();
98
+ };
99
+ static isStartingOrRunning = (state) => state === SummaryManagerState.Starting || state === SummaryManagerState.Running;
120
100
  getShouldSummarizeState() {
121
101
  if (this.disposed) {
122
102
  return { shouldSummarize: false, stopReason: "parentNotConnected" };
@@ -139,6 +119,38 @@ class SummaryManager extends client_utils_1.TypedEventEmitter {
139
119
  }
140
120
  return { shouldSummarize: true };
141
121
  }
122
+ refreshSummarizer = () => {
123
+ // Transition states depending on shouldSummarize, which is a calculated property
124
+ // that is only true if this client is connected and is the elected summarizer.
125
+ const shouldSummarizeState = this.getShouldSummarizeState();
126
+ switch (this.state) {
127
+ case SummaryManagerState.Off: {
128
+ if (shouldSummarizeState.shouldSummarize) {
129
+ this.startSummarization();
130
+ }
131
+ return;
132
+ }
133
+ case SummaryManagerState.Starting: {
134
+ // Cannot take any action until summarizer is created
135
+ // state transition will occur after creation
136
+ return;
137
+ }
138
+ case SummaryManagerState.Running: {
139
+ if (shouldSummarizeState.shouldSummarize === false) {
140
+ this.stop(shouldSummarizeState.stopReason);
141
+ }
142
+ return;
143
+ }
144
+ case SummaryManagerState.Stopping: {
145
+ // Cannot take any action until running summarizer finishes
146
+ // state transition will occur after it stops
147
+ return;
148
+ }
149
+ default: {
150
+ return;
151
+ }
152
+ }
153
+ };
142
154
  startSummarization() {
143
155
  (0, internal_1.assert)(this.state === SummaryManagerState.Off, 0x261 /* "Expected: off" */);
144
156
  this.state = SummaryManagerState.Starting;
@@ -370,6 +382,7 @@ class SummaryManager extends client_utils_1.TypedEventEmitter {
370
382
  }
371
383
  this._disposed = true;
372
384
  }
385
+ forwardedEventsCleanup = [];
373
386
  setupForwardedEvents(summarizer) {
374
387
  for (const event of [
375
388
  "summarize",
@@ -397,5 +410,4 @@ class SummaryManager extends client_utils_1.TypedEventEmitter {
397
410
  }
398
411
  }
399
412
  exports.SummaryManager = SummaryManager;
400
- SummaryManager.isStartingOrRunning = (state) => state === SummaryManagerState.Starting || state === SummaryManagerState.Running;
401
413
  //# sourceMappingURL=summaryManager.js.map