@fluidframework/container-runtime 2.31.1 → 2.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/container-runtime.test-files.tar +0 -0
  3. package/dist/channelCollection.d.ts +0 -14
  4. package/dist/channelCollection.d.ts.map +1 -1
  5. package/dist/channelCollection.js +10 -25
  6. package/dist/channelCollection.js.map +1 -1
  7. package/dist/containerRuntime.d.ts +16 -9
  8. package/dist/containerRuntime.d.ts.map +1 -1
  9. package/dist/containerRuntime.js +137 -103
  10. package/dist/containerRuntime.js.map +1 -1
  11. package/dist/dataStoreContext.d.ts +1 -5
  12. package/dist/dataStoreContext.d.ts.map +1 -1
  13. package/dist/dataStoreContext.js +0 -8
  14. package/dist/dataStoreContext.js.map +1 -1
  15. package/dist/index.d.ts +1 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +1 -2
  18. package/dist/index.js.map +1 -1
  19. package/dist/messageTypes.d.ts +3 -7
  20. package/dist/messageTypes.d.ts.map +1 -1
  21. package/dist/messageTypes.js.map +1 -1
  22. package/dist/opLifecycle/batchManager.d.ts +4 -4
  23. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  24. package/dist/opLifecycle/batchManager.js +4 -4
  25. package/dist/opLifecycle/batchManager.js.map +1 -1
  26. package/dist/opLifecycle/definitions.d.ts +40 -6
  27. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  28. package/dist/opLifecycle/definitions.js.map +1 -1
  29. package/dist/opLifecycle/index.d.ts +4 -3
  30. package/dist/opLifecycle/index.d.ts.map +1 -1
  31. package/dist/opLifecycle/index.js +4 -3
  32. package/dist/opLifecycle/index.js.map +1 -1
  33. package/dist/opLifecycle/opCompressor.d.ts +10 -11
  34. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  35. package/dist/opLifecycle/opCompressor.js +19 -18
  36. package/dist/opLifecycle/opCompressor.js.map +1 -1
  37. package/dist/opLifecycle/opGroupingManager.d.ts +9 -5
  38. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  39. package/dist/opLifecycle/opGroupingManager.js +18 -22
  40. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  41. package/dist/opLifecycle/opSerialization.d.ts +20 -0
  42. package/dist/opLifecycle/opSerialization.d.ts.map +1 -0
  43. package/dist/opLifecycle/opSerialization.js +40 -0
  44. package/dist/opLifecycle/opSerialization.js.map +1 -0
  45. package/dist/opLifecycle/opSplitter.d.ts +12 -13
  46. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  47. package/dist/opLifecycle/opSplitter.js +13 -13
  48. package/dist/opLifecycle/opSplitter.js.map +1 -1
  49. package/dist/opLifecycle/outbox.d.ts +16 -18
  50. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  51. package/dist/opLifecycle/outbox.js +57 -43
  52. package/dist/opLifecycle/outbox.js.map +1 -1
  53. package/dist/opLifecycle/remoteMessageProcessor.d.ts +0 -7
  54. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  55. package/dist/opLifecycle/remoteMessageProcessor.js +1 -15
  56. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  57. package/dist/packageVersion.d.ts +1 -1
  58. package/dist/packageVersion.js +1 -1
  59. package/dist/packageVersion.js.map +1 -1
  60. package/dist/pendingStateManager.d.ts +2 -2
  61. package/dist/pendingStateManager.d.ts.map +1 -1
  62. package/dist/pendingStateManager.js +1 -1
  63. package/dist/pendingStateManager.js.map +1 -1
  64. package/dist/runtimeLayerCompatState.d.ts.map +1 -1
  65. package/dist/runtimeLayerCompatState.js +6 -5
  66. package/dist/runtimeLayerCompatState.js.map +1 -1
  67. package/dist/summary/index.d.ts +5 -8
  68. package/dist/summary/index.d.ts.map +1 -1
  69. package/dist/summary/index.js +20 -21
  70. package/dist/summary/index.js.map +1 -1
  71. package/dist/summary/orderedClientElection.js +9 -9
  72. package/dist/summary/orderedClientElection.js.map +1 -1
  73. package/dist/summary/summarizerClientElection.d.ts +0 -1
  74. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  75. package/dist/summary/summarizerClientElection.js +3 -3
  76. package/dist/summary/summarizerClientElection.js.map +1 -1
  77. package/dist/summary/summarizerTypes.d.ts +3 -75
  78. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  79. package/dist/summary/summarizerTypes.js +2 -0
  80. package/dist/summary/summarizerTypes.js.map +1 -1
  81. package/{lib/summary/summaryGenerator.d.ts → dist/summary/summarizerUtils.d.ts} +12 -43
  82. package/dist/summary/summarizerUtils.d.ts.map +1 -0
  83. package/dist/summary/summarizerUtils.js +71 -0
  84. package/dist/summary/summarizerUtils.js.map +1 -0
  85. package/dist/summary/summaryDelayLoadedModule/index.d.ts +10 -0
  86. package/dist/summary/summaryDelayLoadedModule/index.d.ts.map +1 -0
  87. package/dist/summary/summaryDelayLoadedModule/index.js +20 -0
  88. package/dist/summary/summaryDelayLoadedModule/index.js.map +1 -0
  89. package/dist/summary/{runWhileConnectedCoordinator.d.ts → summaryDelayLoadedModule/runWhileConnectedCoordinator.d.ts} +1 -1
  90. package/dist/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.d.ts.map +1 -0
  91. package/dist/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.js.map +1 -0
  92. package/dist/summary/{runningSummarizer.d.ts → summaryDelayLoadedModule/runningSummarizer.d.ts} +4 -13
  93. package/dist/summary/summaryDelayLoadedModule/runningSummarizer.d.ts.map +1 -0
  94. package/dist/summary/{runningSummarizer.js → summaryDelayLoadedModule/runningSummarizer.js} +17 -24
  95. package/dist/summary/summaryDelayLoadedModule/runningSummarizer.js.map +1 -0
  96. package/dist/summary/{summarizer.d.ts → summaryDelayLoadedModule/summarizer.d.ts} +13 -2
  97. package/dist/summary/summaryDelayLoadedModule/summarizer.d.ts.map +1 -0
  98. package/dist/summary/{summarizer.js → summaryDelayLoadedModule/summarizer.js} +13 -3
  99. package/dist/summary/summaryDelayLoadedModule/summarizer.js.map +1 -0
  100. package/{lib/summary → dist/summary/summaryDelayLoadedModule}/summarizerHeuristics.d.ts +3 -3
  101. package/dist/summary/summaryDelayLoadedModule/summarizerHeuristics.d.ts.map +1 -0
  102. package/dist/summary/summaryDelayLoadedModule/summarizerHeuristics.js.map +1 -0
  103. package/dist/summary/summaryDelayLoadedModule/summaryGenerator.d.ts +36 -0
  104. package/dist/summary/summaryDelayLoadedModule/summaryGenerator.d.ts.map +1 -0
  105. package/dist/summary/{summaryGenerator.js → summaryDelayLoadedModule/summaryGenerator.js} +14 -99
  106. package/dist/summary/summaryDelayLoadedModule/summaryGenerator.js.map +1 -0
  107. package/dist/summary/summaryDelayLoadedModule/summaryResultBuilder.d.ts +21 -0
  108. package/dist/summary/summaryDelayLoadedModule/summaryResultBuilder.d.ts.map +1 -0
  109. package/dist/summary/summaryDelayLoadedModule/summaryResultBuilder.js +44 -0
  110. package/dist/summary/summaryDelayLoadedModule/summaryResultBuilder.js.map +1 -0
  111. package/dist/summary/summaryDelayLoadedModule/summaryResultTypes.d.ts +80 -0
  112. package/dist/summary/summaryDelayLoadedModule/summaryResultTypes.d.ts.map +1 -0
  113. package/dist/summary/summaryDelayLoadedModule/summaryResultTypes.js +7 -0
  114. package/dist/summary/summaryDelayLoadedModule/summaryResultTypes.js.map +1 -0
  115. package/dist/summary/summaryHelpers.d.ts +1 -1
  116. package/dist/summary/summaryHelpers.d.ts.map +1 -1
  117. package/dist/summary/summaryHelpers.js +2 -2
  118. package/dist/summary/summaryHelpers.js.map +1 -1
  119. package/dist/summary/summaryManager.d.ts +4 -3
  120. package/dist/summary/summaryManager.d.ts.map +1 -1
  121. package/dist/summary/summaryManager.js +2 -2
  122. package/dist/summary/summaryManager.js.map +1 -1
  123. package/lib/channelCollection.d.ts +0 -14
  124. package/lib/channelCollection.d.ts.map +1 -1
  125. package/lib/channelCollection.js +6 -21
  126. package/lib/channelCollection.js.map +1 -1
  127. package/lib/containerRuntime.d.ts +16 -9
  128. package/lib/containerRuntime.d.ts.map +1 -1
  129. package/lib/containerRuntime.js +140 -106
  130. package/lib/containerRuntime.js.map +1 -1
  131. package/lib/dataStoreContext.d.ts +1 -5
  132. package/lib/dataStoreContext.d.ts.map +1 -1
  133. package/lib/dataStoreContext.js +0 -8
  134. package/lib/dataStoreContext.js.map +1 -1
  135. package/lib/index.d.ts +1 -1
  136. package/lib/index.d.ts.map +1 -1
  137. package/lib/index.js +1 -1
  138. package/lib/index.js.map +1 -1
  139. package/lib/messageTypes.d.ts +3 -7
  140. package/lib/messageTypes.d.ts.map +1 -1
  141. package/lib/messageTypes.js.map +1 -1
  142. package/lib/opLifecycle/batchManager.d.ts +4 -4
  143. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  144. package/lib/opLifecycle/batchManager.js +4 -4
  145. package/lib/opLifecycle/batchManager.js.map +1 -1
  146. package/lib/opLifecycle/definitions.d.ts +40 -6
  147. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  148. package/lib/opLifecycle/definitions.js.map +1 -1
  149. package/lib/opLifecycle/index.d.ts +4 -3
  150. package/lib/opLifecycle/index.d.ts.map +1 -1
  151. package/lib/opLifecycle/index.js +3 -2
  152. package/lib/opLifecycle/index.js.map +1 -1
  153. package/lib/opLifecycle/opCompressor.d.ts +10 -11
  154. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  155. package/lib/opLifecycle/opCompressor.js +20 -19
  156. package/lib/opLifecycle/opCompressor.js.map +1 -1
  157. package/lib/opLifecycle/opGroupingManager.d.ts +9 -5
  158. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  159. package/lib/opLifecycle/opGroupingManager.js +18 -22
  160. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  161. package/lib/opLifecycle/opSerialization.d.ts +20 -0
  162. package/lib/opLifecycle/opSerialization.d.ts.map +1 -0
  163. package/lib/opLifecycle/opSerialization.js +35 -0
  164. package/lib/opLifecycle/opSerialization.js.map +1 -0
  165. package/lib/opLifecycle/opSplitter.d.ts +12 -13
  166. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  167. package/lib/opLifecycle/opSplitter.js +13 -13
  168. package/lib/opLifecycle/opSplitter.js.map +1 -1
  169. package/lib/opLifecycle/outbox.d.ts +16 -18
  170. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  171. package/lib/opLifecycle/outbox.js +56 -41
  172. package/lib/opLifecycle/outbox.js.map +1 -1
  173. package/lib/opLifecycle/remoteMessageProcessor.d.ts +0 -7
  174. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  175. package/lib/opLifecycle/remoteMessageProcessor.js +0 -13
  176. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  177. package/lib/packageVersion.d.ts +1 -1
  178. package/lib/packageVersion.js +1 -1
  179. package/lib/packageVersion.js.map +1 -1
  180. package/lib/pendingStateManager.d.ts +2 -2
  181. package/lib/pendingStateManager.d.ts.map +1 -1
  182. package/lib/pendingStateManager.js +1 -1
  183. package/lib/pendingStateManager.js.map +1 -1
  184. package/lib/runtimeLayerCompatState.d.ts.map +1 -1
  185. package/lib/runtimeLayerCompatState.js +3 -2
  186. package/lib/runtimeLayerCompatState.js.map +1 -1
  187. package/lib/summary/index.d.ts +5 -8
  188. package/lib/summary/index.d.ts.map +1 -1
  189. package/lib/summary/index.js +5 -7
  190. package/lib/summary/index.js.map +1 -1
  191. package/lib/summary/orderedClientElection.js +1 -1
  192. package/lib/summary/orderedClientElection.js.map +1 -1
  193. package/lib/summary/summarizerClientElection.d.ts +0 -1
  194. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  195. package/lib/summary/summarizerClientElection.js +1 -1
  196. package/lib/summary/summarizerClientElection.js.map +1 -1
  197. package/lib/summary/summarizerTypes.d.ts +3 -75
  198. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  199. package/lib/summary/summarizerTypes.js +1 -1
  200. package/lib/summary/summarizerTypes.js.map +1 -1
  201. package/{dist/summary/summaryGenerator.d.ts → lib/summary/summarizerUtils.d.ts} +12 -43
  202. package/lib/summary/summarizerUtils.d.ts.map +1 -0
  203. package/lib/summary/summarizerUtils.js +64 -0
  204. package/lib/summary/summarizerUtils.js.map +1 -0
  205. package/lib/summary/summaryDelayLoadedModule/index.d.ts +10 -0
  206. package/lib/summary/summaryDelayLoadedModule/index.d.ts.map +1 -0
  207. package/lib/summary/summaryDelayLoadedModule/index.js +9 -0
  208. package/lib/summary/summaryDelayLoadedModule/index.js.map +1 -0
  209. package/lib/summary/{runWhileConnectedCoordinator.d.ts → summaryDelayLoadedModule/runWhileConnectedCoordinator.d.ts} +1 -1
  210. package/lib/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.d.ts.map +1 -0
  211. package/lib/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.js.map +1 -0
  212. package/lib/summary/{runningSummarizer.d.ts → summaryDelayLoadedModule/runningSummarizer.d.ts} +4 -13
  213. package/lib/summary/summaryDelayLoadedModule/runningSummarizer.d.ts.map +1 -0
  214. package/lib/summary/{runningSummarizer.js → summaryDelayLoadedModule/runningSummarizer.js} +5 -12
  215. package/lib/summary/summaryDelayLoadedModule/runningSummarizer.js.map +1 -0
  216. package/lib/summary/{summarizer.d.ts → summaryDelayLoadedModule/summarizer.d.ts} +13 -2
  217. package/lib/summary/summaryDelayLoadedModule/summarizer.d.ts.map +1 -0
  218. package/lib/summary/{summarizer.js → summaryDelayLoadedModule/summarizer.js} +11 -1
  219. package/lib/summary/summaryDelayLoadedModule/summarizer.js.map +1 -0
  220. package/{dist/summary → lib/summary/summaryDelayLoadedModule}/summarizerHeuristics.d.ts +3 -3
  221. package/lib/summary/summaryDelayLoadedModule/summarizerHeuristics.d.ts.map +1 -0
  222. package/lib/summary/summaryDelayLoadedModule/summarizerHeuristics.js.map +1 -0
  223. package/lib/summary/summaryDelayLoadedModule/summaryGenerator.d.ts +36 -0
  224. package/lib/summary/summaryDelayLoadedModule/summaryGenerator.d.ts.map +1 -0
  225. package/lib/summary/{summaryGenerator.js → summaryDelayLoadedModule/summaryGenerator.js} +4 -85
  226. package/lib/summary/summaryDelayLoadedModule/summaryGenerator.js.map +1 -0
  227. package/lib/summary/summaryDelayLoadedModule/summaryResultBuilder.d.ts +21 -0
  228. package/lib/summary/summaryDelayLoadedModule/summaryResultBuilder.d.ts.map +1 -0
  229. package/lib/summary/summaryDelayLoadedModule/summaryResultBuilder.js +40 -0
  230. package/lib/summary/summaryDelayLoadedModule/summaryResultBuilder.js.map +1 -0
  231. package/lib/summary/summaryDelayLoadedModule/summaryResultTypes.d.ts +80 -0
  232. package/lib/summary/summaryDelayLoadedModule/summaryResultTypes.d.ts.map +1 -0
  233. package/lib/summary/summaryDelayLoadedModule/summaryResultTypes.js +6 -0
  234. package/lib/summary/summaryDelayLoadedModule/summaryResultTypes.js.map +1 -0
  235. package/lib/summary/summaryHelpers.d.ts +1 -1
  236. package/lib/summary/summaryHelpers.d.ts.map +1 -1
  237. package/lib/summary/summaryHelpers.js +1 -1
  238. package/lib/summary/summaryHelpers.js.map +1 -1
  239. package/lib/summary/summaryManager.d.ts +4 -3
  240. package/lib/summary/summaryManager.d.ts.map +1 -1
  241. package/lib/summary/summaryManager.js +2 -2
  242. package/lib/summary/summaryManager.js.map +1 -1
  243. package/package.json +20 -19
  244. package/src/channelCollection.ts +5 -20
  245. package/src/containerRuntime.ts +220 -178
  246. package/src/dataStoreContext.ts +0 -11
  247. package/src/index.ts +0 -1
  248. package/src/messageTypes.ts +5 -19
  249. package/src/opLifecycle/batchManager.ts +19 -12
  250. package/src/opLifecycle/definitions.ts +45 -6
  251. package/src/opLifecycle/index.ts +14 -3
  252. package/src/opLifecycle/opCompressor.ts +25 -24
  253. package/src/opLifecycle/opGroupingManager.ts +27 -26
  254. package/src/opLifecycle/opSerialization.ts +46 -0
  255. package/src/opLifecycle/opSplitter.ts +20 -16
  256. package/src/opLifecycle/outbox.ts +101 -66
  257. package/src/opLifecycle/remoteMessageProcessor.ts +0 -17
  258. package/src/packageVersion.ts +1 -1
  259. package/src/pendingStateManager.ts +3 -3
  260. package/src/runtimeLayerCompatState.ts +3 -2
  261. package/src/summary/index.ts +35 -31
  262. package/src/summary/orderedClientElection.ts +1 -1
  263. package/src/summary/summarizerClientElection.ts +1 -2
  264. package/src/summary/summarizerTypes.ts +7 -91
  265. package/src/summary/summarizerUtils.ts +132 -0
  266. package/src/summary/summaryDelayLoadedModule/index.ts +28 -0
  267. package/src/summary/{runWhileConnectedCoordinator.ts → summaryDelayLoadedModule/runWhileConnectedCoordinator.ts} +1 -1
  268. package/src/summary/{runningSummarizer.ts → summaryDelayLoadedModule/runningSummarizer.ts} +13 -28
  269. package/src/summary/{summarizer.ts → summaryDelayLoadedModule/summarizer.ts} +19 -8
  270. package/src/summary/{summarizerHeuristics.ts → summaryDelayLoadedModule/summarizerHeuristics.ts} +3 -3
  271. package/src/summary/{summaryGenerator.ts → summaryDelayLoadedModule/summaryGenerator.ts} +13 -179
  272. package/src/summary/summaryDelayLoadedModule/summaryResultBuilder.ts +70 -0
  273. package/src/summary/summaryDelayLoadedModule/summaryResultTypes.ts +100 -0
  274. package/src/summary/summaryHelpers.ts +6 -6
  275. package/src/summary/summaryManager.ts +8 -6
  276. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +0 -1
  277. package/dist/summary/runWhileConnectedCoordinator.js.map +0 -1
  278. package/dist/summary/runningSummarizer.d.ts.map +0 -1
  279. package/dist/summary/runningSummarizer.js.map +0 -1
  280. package/dist/summary/summarizer.d.ts.map +0 -1
  281. package/dist/summary/summarizer.js.map +0 -1
  282. package/dist/summary/summarizerHeuristics.d.ts.map +0 -1
  283. package/dist/summary/summarizerHeuristics.js.map +0 -1
  284. package/dist/summary/summaryGenerator.d.ts.map +0 -1
  285. package/dist/summary/summaryGenerator.js.map +0 -1
  286. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +0 -1
  287. package/lib/summary/runWhileConnectedCoordinator.js.map +0 -1
  288. package/lib/summary/runningSummarizer.d.ts.map +0 -1
  289. package/lib/summary/runningSummarizer.js.map +0 -1
  290. package/lib/summary/summarizer.d.ts.map +0 -1
  291. package/lib/summary/summarizer.js.map +0 -1
  292. package/lib/summary/summarizerHeuristics.d.ts.map +0 -1
  293. package/lib/summary/summarizerHeuristics.js.map +0 -1
  294. package/lib/summary/summaryGenerator.d.ts.map +0 -1
  295. package/lib/summary/summaryGenerator.js.map +0 -1
  296. /package/dist/summary/{runWhileConnectedCoordinator.js → summaryDelayLoadedModule/runWhileConnectedCoordinator.js} +0 -0
  297. /package/dist/summary/{summarizerHeuristics.js → summaryDelayLoadedModule/summarizerHeuristics.js} +0 -0
  298. /package/lib/summary/{runWhileConnectedCoordinator.js → summaryDelayLoadedModule/runWhileConnectedCoordinator.js} +0 -0
  299. /package/lib/summary/{summarizerHeuristics.js → summaryDelayLoadedModule/summarizerHeuristics.js} +0 -0
@@ -2,11 +2,11 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ import type { SummarizerStopReason } from "@fluidframework/container-runtime-definitions/internal";
5
6
  import { ITelemetryBaseProperties } from "@fluidframework/core-interfaces";
6
- import { Deferred, IPromiseTimer, IPromiseTimerResult } from "@fluidframework/core-utils/internal";
7
- import { ITelemetryLoggerExt, LoggingError } from "@fluidframework/telemetry-utils/internal";
8
- import { IAckSummaryResult, IBroadcastSummaryResult, INackSummaryResult, IRefreshSummaryAckOptions, ISubmitSummaryOptions, ISummarizeHeuristicData, ISummarizeResults, ISummaryCancellationToken, SubmitSummaryFailureData, SubmitSummaryResult, SummarizeResultPart, type IRetriableFailureError } from "./summarizerTypes.js";
9
- import { IClientSummaryWatcher } from "./summaryCollection.js";
7
+ import { IPromiseTimerResult } from "@fluidframework/core-utils/internal";
8
+ import { LoggingError } from "@fluidframework/telemetry-utils/internal";
9
+ import { ISummaryCancellationToken, type IRetriableFailureError } from "./summarizerTypes.js";
10
10
  export type raceTimerResult<T> = {
11
11
  result: "done";
12
12
  value: T;
@@ -19,6 +19,13 @@ export type raceTimerResult<T> = {
19
19
  * Wait for a promise or PromiseTimer to elapse.
20
20
  */
21
21
  export declare function raceTimer<T>(promise: Promise<T>, timer: Promise<IPromiseTimerResult>, cancellationToken?: ISummaryCancellationToken): Promise<raceTimerResult<T>>;
22
+ /**
23
+ * Should we try to run a last summary for the given stop reason?
24
+ * Currently only allows "parentNotConnected"
25
+ * @param stopReason - SummarizerStopReason
26
+ * @returns `true` if the stop reason can run a last summary, otherwise `false`.
27
+ */
28
+ export declare function stopReasonCanRunLastSummary(stopReason: SummarizerStopReason): boolean;
22
29
  export type SummarizeReason =
23
30
  /**
24
31
  * Attempt to summarize after idle timeout has elapsed.
@@ -84,19 +91,6 @@ declare const summarizeErrors: {
84
91
  };
85
92
  export type SummarizeErrorCode = keyof typeof summarizeErrors;
86
93
  export declare const getFailMessage: (errorCode: SummarizeErrorCode) => string;
87
- export declare class SummarizeResultBuilder {
88
- readonly summarySubmitted: Deferred<SummarizeResultPart<SubmitSummaryResult, SubmitSummaryFailureData>>;
89
- readonly summaryOpBroadcasted: Deferred<SummarizeResultPart<IBroadcastSummaryResult>>;
90
- readonly receivedSummaryAckOrNack: Deferred<SummarizeResultPart<IAckSummaryResult, INackSummaryResult>>;
91
- /**
92
- * Fails one or more of the three results as per the passed params.
93
- * If submit fails, all three results fail.
94
- * If op broadcast fails, only op broadcast result and ack nack result fails.
95
- * If ack nack fails, only ack nack result fails.
96
- */
97
- fail(message: string, error: IRetriableFailureError, submitFailureResult?: SubmitSummaryFailureData, nackSummaryResult?: INackSummaryResult): void;
98
- build(): ISummarizeResults;
99
- }
100
94
  /**
101
95
  * Errors type for errors hit during summary that may be retriable.
102
96
  */
@@ -104,30 +98,5 @@ export declare class RetriableSummaryError extends LoggingError implements IRetr
104
98
  readonly retryAfterSeconds?: number | undefined;
105
99
  constructor(message: string, retryAfterSeconds?: number | undefined, props?: ITelemetryBaseProperties);
106
100
  }
107
- /**
108
- * This class generates and tracks a summary attempt.
109
- */
110
- export declare class SummaryGenerator {
111
- private readonly pendingAckTimer;
112
- private readonly heuristicData;
113
- private readonly submitSummaryCallback;
114
- private readonly successfulSummaryCallback;
115
- private readonly refreshLatestSummaryCallback;
116
- private readonly summaryWatcher;
117
- private readonly logger;
118
- private readonly summarizeTimer;
119
- constructor(pendingAckTimer: IPromiseTimer, heuristicData: ISummarizeHeuristicData, submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>, successfulSummaryCallback: () => void, refreshLatestSummaryCallback: (options: IRefreshSummaryAckOptions) => Promise<void>, summaryWatcher: Pick<IClientSummaryWatcher, "watchSummary">, logger: ITelemetryLoggerExt);
120
- /**
121
- * Generates summary and listens for broadcast and ack/nack.
122
- * Returns true for ack, false for nack, and undefined for failure or timeout.
123
- * @param summaryOptions - options controlling how the summary is generated or submitted.
124
- * @param resultsBuilder - optional, result builder to use to build pass or fail result.
125
- */
126
- summarize(summaryOptions: ISubmitSummaryOptions, resultsBuilder?: SummarizeResultBuilder): ISummarizeResults;
127
- private summarizeCore;
128
- private addSummaryDataToTelemetryProps;
129
- private summarizeTimerHandler;
130
- dispose(): void;
131
- }
132
101
  export {};
133
- //# sourceMappingURL=summaryGenerator.d.ts.map
102
+ //# sourceMappingURL=summarizerUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizerUtils.d.ts","sourceRoot":"","sources":["../../src/summary/summarizerUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wDAAwD,CAAC;AACnG,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAExE,OAAO,EAAE,yBAAyB,EAAE,KAAK,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9F,MAAM,MAAM,eAAe,CAAC,CAAC,IAC1B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAC5B;IAAE,MAAM,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAA;CAAE,GAC9C;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC;AAE3B;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAChC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,EAEnC,iBAAiB,CAAC,EAAE,yBAAyB,GAC3C,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAW7B;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,oBAAoB,GAAG,OAAO,CAErF;AAED,MAAM,MAAM,eAAe;AAC1B;;;;;GAKG;AACD,MAAM;AACR;;;;GAIG;GACD,SAAS;AACX;;;;;;GAMG;GACD,QAAQ;AACV;;;;;;GAMG;GACD,aAAa;AACf;;GAEG;GACD,YAAY,MAAM,EAAE;AACtB;;GAEG;GACD,WAAW,MAAM,EAAE,CAAC;AAEvB,QAAA,MAAM,eAAe;IACpB;;;;OAIG;;IAEH;;;OAGG;;IAEH;;;;OAIG;;IAEH;;;OAGG;;;CAIM,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,eAAe,CAAC;AAG9D,eAAO,MAAM,cAAc,cAAe,kBAAkB,KAAG,MACjB,CAAC;AAE/C;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,YAAa,YAAW,sBAAsB;aAGvE,iBAAiB,CAAC;gBADlC,OAAO,EAAE,MAAM,EACC,iBAAiB,CAAC,oBAAQ,EAC1C,KAAK,CAAC,EAAE,wBAAwB;CAIjC"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RetriableSummaryError = exports.getFailMessage = exports.stopReasonCanRunLastSummary = exports.raceTimer = void 0;
8
+ const internal_1 = require("@fluidframework/telemetry-utils/internal");
9
+ /**
10
+ * Wait for a promise or PromiseTimer to elapse.
11
+ */
12
+ async function raceTimer(promise, timer, cancellationToken) {
13
+ const promises = [
14
+ promise.then((value) => ({ result: "done", value })),
15
+ timer.then(({ timerResult: result }) => ({ result })),
16
+ ];
17
+ if (cancellationToken !== undefined) {
18
+ promises.push(cancellationToken.waitCancelled.then(() => ({ result: "cancelled" })));
19
+ }
20
+ return Promise.race(promises);
21
+ }
22
+ exports.raceTimer = raceTimer;
23
+ /**
24
+ * Should we try to run a last summary for the given stop reason?
25
+ * Currently only allows "parentNotConnected"
26
+ * @param stopReason - SummarizerStopReason
27
+ * @returns `true` if the stop reason can run a last summary, otherwise `false`.
28
+ */
29
+ function stopReasonCanRunLastSummary(stopReason) {
30
+ return stopReason === "parentNotConnected";
31
+ }
32
+ exports.stopReasonCanRunLastSummary = stopReasonCanRunLastSummary;
33
+ const summarizeErrors = {
34
+ /**
35
+ * Error encountered while generating the summary tree, uploading
36
+ * it to storage, or submitting the op. It could be a result of
37
+ * the client becoming disconnected while generating or an actual error.
38
+ */
39
+ submitSummaryFailure: "Error while generating, uploading, or submitting summary",
40
+ /**
41
+ * The summaryAckWaitTimeout time has elapsed before receiving the summarize op
42
+ * sent by this summarize attempt. It is expected to be broadcast quickly.
43
+ */
44
+ summaryOpWaitTimeout: "Timeout while waiting for summarize op broadcast",
45
+ /**
46
+ * The summaryAckWaitTimeout time has elapsed before receiving either a
47
+ * summaryAck or summaryNack op from the server in response to this
48
+ * summarize attempt. It is expected that the server should respond.
49
+ */
50
+ summaryAckWaitTimeout: "Timeout while waiting for summaryAck/summaryNack op",
51
+ /**
52
+ * The server responded with a summaryNack op, thus rejecting this
53
+ * summarize attempt.
54
+ */
55
+ summaryNack: "Server rejected summary via summaryNack op",
56
+ disconnect: "Summary cancelled due to summarizer or main client disconnect",
57
+ };
58
+ // Helper functions to report failures and return.
59
+ const getFailMessage = (errorCode) => `${errorCode}: ${summarizeErrors[errorCode]}`;
60
+ exports.getFailMessage = getFailMessage;
61
+ /**
62
+ * Errors type for errors hit during summary that may be retriable.
63
+ */
64
+ class RetriableSummaryError extends internal_1.LoggingError {
65
+ constructor(message, retryAfterSeconds, props) {
66
+ super(message, props);
67
+ this.retryAfterSeconds = retryAfterSeconds;
68
+ }
69
+ }
70
+ exports.RetriableSummaryError = RetriableSummaryError;
71
+ //# sourceMappingURL=summarizerUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizerUtils.js","sourceRoot":"","sources":["../../src/summary/summarizerUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAKH,uEAAwE;AASxE;;GAEG;AACI,KAAK,UAAU,SAAS,CAC9B,OAAmB,EACnB,KAAmC,EAEnC,iBAA6C;IAE7C,MAAM,QAAQ,GAAkC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAU,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAU,CAAC;KAC9D,CAAC;IACF,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACrC,QAAQ,CAAC,IAAI,CACZ,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAU,CAAC,CAC9E,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAhBD,8BAgBC;AAED;;;;;GAKG;AACH,SAAgB,2BAA2B,CAAC,UAAgC;IAC3E,OAAO,UAAU,KAAK,oBAAoB,CAAC;AAC5C,CAAC;AAFD,kEAEC;AAyCD,MAAM,eAAe,GAAG;IACvB;;;;OAIG;IACH,oBAAoB,EAAE,0DAA0D;IAChF;;;OAGG;IACH,oBAAoB,EAAE,kDAAkD;IACxE;;;;OAIG;IACH,qBAAqB,EAAE,qDAAqD;IAC5E;;;OAGG;IACH,WAAW,EAAE,4CAA4C;IAEzD,UAAU,EAAE,+DAA+D;CAClE,CAAC;AAIX,kDAAkD;AAC3C,MAAM,cAAc,GAAG,CAAC,SAA6B,EAAU,EAAE,CACvE,GAAG,SAAS,KAAK,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;AADlC,QAAA,cAAc,kBACoB;AAE/C;;GAEG;AACH,MAAa,qBAAsB,SAAQ,uBAAY;IACtD,YACC,OAAe,EACC,iBAA0B,EAC1C,KAAgC;QAEhC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAHN,sBAAiB,GAAjB,iBAAiB,CAAS;IAI3C,CAAC;CACD;AARD,sDAQC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { SummarizerStopReason } from \"@fluidframework/container-runtime-definitions/internal\";\nimport { ITelemetryBaseProperties } from \"@fluidframework/core-interfaces\";\nimport { IPromiseTimerResult } from \"@fluidframework/core-utils/internal\";\nimport { LoggingError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { ISummaryCancellationToken, type IRetriableFailureError } from \"./summarizerTypes.js\";\n\nexport type raceTimerResult<T> =\n\t| { result: \"done\"; value: T }\n\t| { result: IPromiseTimerResult[\"timerResult\"] }\n\t| { result: \"cancelled\" };\n\n/**\n * Wait for a promise or PromiseTimer to elapse.\n */\nexport async function raceTimer<T>(\n\tpromise: Promise<T>,\n\ttimer: Promise<IPromiseTimerResult>,\n\n\tcancellationToken?: ISummaryCancellationToken,\n): Promise<raceTimerResult<T>> {\n\tconst promises: Promise<raceTimerResult<T>>[] = [\n\t\tpromise.then((value) => ({ result: \"done\", value }) as const),\n\t\ttimer.then(({ timerResult: result }) => ({ result }) as const),\n\t];\n\tif (cancellationToken !== undefined) {\n\t\tpromises.push(\n\t\t\tcancellationToken.waitCancelled.then(() => ({ result: \"cancelled\" }) as const),\n\t\t);\n\t}\n\treturn Promise.race(promises);\n}\n\n/**\n * Should we try to run a last summary for the given stop reason?\n * Currently only allows \"parentNotConnected\"\n * @param stopReason - SummarizerStopReason\n * @returns `true` if the stop reason can run a last summary, otherwise `false`.\n */\nexport function stopReasonCanRunLastSummary(stopReason: SummarizerStopReason): boolean {\n\treturn stopReason === \"parentNotConnected\";\n}\n\nexport type SummarizeReason =\n\t/**\n\t * Attempt to summarize after idle timeout has elapsed.\n\t * Idle timer restarts whenever an op is received. So this\n\t * triggers only after some amount of time has passed with\n\t * no ops being received.\n\t */\n\t| \"idle\"\n\t/**\n\t * Attempt to summarize after a maximum time since last\n\t * successful summary has passed. This measures time since\n\t * last summary ack op was processed.\n\t */\n\t| \"maxTime\"\n\t/**\n\t * Attempt to summarize after a maximum number of ops have\n\t * passed since the last successful summary. This compares\n\t * op sequence numbers with the reference sequence number\n\t * of the summarize op corresponding to the last summary\n\t * ack op.\n\t */\n\t| \"maxOps\"\n\t/**\n\t * Special case to attempt to summarize one last time before the\n\t * summarizer client closes itself. This is to prevent cases where\n\t * the summarizer client never gets a chance to summarize, because\n\t * there are too many outstanding ops and/or parent client cannot\n\t * stay connected long enough for summarizer client to catch up.\n\t */\n\t| \"lastSummary\"\n\t/**\n\t * On-demand summary requested with specified reason.\n\t */\n\t| `onDemand;${string}`\n\t/**\n\t * Enqueue summarize attempt with specified reason.\n\t */\n\t| `enqueue;${string}`;\n\nconst summarizeErrors = {\n\t/**\n\t * Error encountered while generating the summary tree, uploading\n\t * it to storage, or submitting the op. It could be a result of\n\t * the client becoming disconnected while generating or an actual error.\n\t */\n\tsubmitSummaryFailure: \"Error while generating, uploading, or submitting summary\",\n\t/**\n\t * The summaryAckWaitTimeout time has elapsed before receiving the summarize op\n\t * sent by this summarize attempt. It is expected to be broadcast quickly.\n\t */\n\tsummaryOpWaitTimeout: \"Timeout while waiting for summarize op broadcast\",\n\t/**\n\t * The summaryAckWaitTimeout time has elapsed before receiving either a\n\t * summaryAck or summaryNack op from the server in response to this\n\t * summarize attempt. It is expected that the server should respond.\n\t */\n\tsummaryAckWaitTimeout: \"Timeout while waiting for summaryAck/summaryNack op\",\n\t/**\n\t * The server responded with a summaryNack op, thus rejecting this\n\t * summarize attempt.\n\t */\n\tsummaryNack: \"Server rejected summary via summaryNack op\",\n\n\tdisconnect: \"Summary cancelled due to summarizer or main client disconnect\",\n} as const;\n\nexport type SummarizeErrorCode = keyof typeof summarizeErrors;\n\n// Helper functions to report failures and return.\nexport const getFailMessage = (errorCode: SummarizeErrorCode): string =>\n\t`${errorCode}: ${summarizeErrors[errorCode]}`;\n\n/**\n * Errors type for errors hit during summary that may be retriable.\n */\nexport class RetriableSummaryError extends LoggingError implements IRetriableFailureError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly retryAfterSeconds?: number,\n\t\tprops?: ITelemetryBaseProperties,\n\t) {\n\t\tsuper(message, props);\n\t}\n}\n"]}
@@ -0,0 +1,10 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ export { defaultMaxAttempts, defaultMaxAttemptsForSubmitFailures, Summarizer, } from "./summarizer.js";
6
+ export { ICancellableSummarizerController, neverCancelledSummaryToken, RunWhileConnectedCoordinator, } from "./runWhileConnectedCoordinator.js";
7
+ export { EnqueueSummarizeResult, IAckSummaryResult, INackSummaryResult, IBroadcastSummaryResult, ISummarizeResults, } from "./summaryResultTypes.js";
8
+ export { RunningSummarizer } from "./runningSummarizer.js";
9
+ export { SummarizeHeuristicData, SummarizeHeuristicRunner, } from "./summarizerHeuristics.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,mCAAmC,EACnC,UAAU,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,gCAAgC,EAChC,0BAA0B,EAC1B,4BAA4B,GAC5B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EACN,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACN,sBAAsB,EACtB,wBAAwB,GACxB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SummarizeHeuristicRunner = exports.SummarizeHeuristicData = exports.RunningSummarizer = exports.RunWhileConnectedCoordinator = exports.neverCancelledSummaryToken = exports.Summarizer = exports.defaultMaxAttemptsForSubmitFailures = exports.defaultMaxAttempts = void 0;
8
+ var summarizer_js_1 = require("./summarizer.js");
9
+ Object.defineProperty(exports, "defaultMaxAttempts", { enumerable: true, get: function () { return summarizer_js_1.defaultMaxAttempts; } });
10
+ Object.defineProperty(exports, "defaultMaxAttemptsForSubmitFailures", { enumerable: true, get: function () { return summarizer_js_1.defaultMaxAttemptsForSubmitFailures; } });
11
+ Object.defineProperty(exports, "Summarizer", { enumerable: true, get: function () { return summarizer_js_1.Summarizer; } });
12
+ var runWhileConnectedCoordinator_js_1 = require("./runWhileConnectedCoordinator.js");
13
+ Object.defineProperty(exports, "neverCancelledSummaryToken", { enumerable: true, get: function () { return runWhileConnectedCoordinator_js_1.neverCancelledSummaryToken; } });
14
+ Object.defineProperty(exports, "RunWhileConnectedCoordinator", { enumerable: true, get: function () { return runWhileConnectedCoordinator_js_1.RunWhileConnectedCoordinator; } });
15
+ var runningSummarizer_js_1 = require("./runningSummarizer.js");
16
+ Object.defineProperty(exports, "RunningSummarizer", { enumerable: true, get: function () { return runningSummarizer_js_1.RunningSummarizer; } });
17
+ var summarizerHeuristics_js_1 = require("./summarizerHeuristics.js");
18
+ Object.defineProperty(exports, "SummarizeHeuristicData", { enumerable: true, get: function () { return summarizerHeuristics_js_1.SummarizeHeuristicData; } });
19
+ Object.defineProperty(exports, "SummarizeHeuristicRunner", { enumerable: true, get: function () { return summarizerHeuristics_js_1.SummarizeHeuristicRunner; } });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iDAIyB;AAHxB,mHAAA,kBAAkB,OAAA;AAClB,oIAAA,mCAAmC,OAAA;AACnC,2GAAA,UAAU,OAAA;AAEX,qFAI2C;AAF1C,6IAAA,0BAA0B,OAAA;AAC1B,+IAAA,4BAA4B,OAAA;AAU7B,+DAA2D;AAAlD,yHAAA,iBAAiB,OAAA;AAC1B,qEAGmC;AAFlC,iIAAA,sBAAsB,OAAA;AACtB,mIAAA,wBAAwB,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport {\n\tdefaultMaxAttempts,\n\tdefaultMaxAttemptsForSubmitFailures,\n\tSummarizer,\n} from \"./summarizer.js\";\nexport {\n\tICancellableSummarizerController,\n\tneverCancelledSummaryToken,\n\tRunWhileConnectedCoordinator,\n} from \"./runWhileConnectedCoordinator.js\";\n\nexport {\n\tEnqueueSummarizeResult,\n\tIAckSummaryResult,\n\tINackSummaryResult,\n\tIBroadcastSummaryResult,\n\tISummarizeResults,\n} from \"./summaryResultTypes.js\";\nexport { RunningSummarizer } from \"./runningSummarizer.js\";\nexport {\n\tSummarizeHeuristicData,\n\tSummarizeHeuristicRunner,\n} from \"./summarizerHeuristics.js\";\n"]}
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import type { SummarizerStopReason } from "@fluidframework/container-runtime-definitions/internal";
6
- import { IConnectableRuntime, ISummaryCancellationToken } from "./summarizerTypes.js";
6
+ import { IConnectableRuntime, ISummaryCancellationToken } from "../summarizerTypes.js";
7
7
  /**
8
8
  * Similar to AbortController, but using promise instead of events
9
9
  * @internal
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runWhileConnectedCoordinator.d.ts","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wDAAwD,CAAC;AAGnG,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEvF;;;GAGG;AAEH,MAAM,WAAW,gCAAiC,SAAQ,yBAAyB;IAClF,IAAI,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACzC;AAED;;;;GAIG;AAEH,eAAO,MAAM,0BAA0B,EAAE,yBAGxC,CAAC;AAEF;;;;GAIG;AACH,qBAAa,4BAA6B,YAAW,gCAAgC;IAyCnF,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAzCxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IAErE,IAAW,SAAS,IAAI,OAAO,CAkB9B;IAED;;OAEG;IACH,IAAW,aAAa,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAExD;WAEmB,MAAM,CACzB,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,MAAM,OAAO,GACnB,OAAO,CAAC,4BAA4B,CAAC;IAMxC,SAAS,aACS,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,MAAM,OAAO;IAGvC;;;;;;;;;;;;OAYG;cACa,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB1C;;OAEG;IACI,IAAI,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;CAM/C"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runWhileConnectedCoordinator.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,kEAAuE;AAavE;;;;GAIG;AAEU,QAAA,0BAA0B,GAA8B;IACpE,SAAS,EAAE,KAAK;IAChB,aAAa,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;CACpC,CAAC;AAEF;;;;GAIG;AACH,MAAa,4BAA4B;IAIxC,IAAW,SAAS;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACtB,IAAA,iBAAM,EAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAEvE,+EAA+E;YAC/E,iFAAiF;YACjF,4EAA4E;YAC5E,oCAAoC;YACpC,6CAA6C;YAC7C,mGAAmG;YACnG,yBAAyB;YACzB,oFAAoF;YACpF,EAAE;YACF,wEAAwE;YACxE,uFAAuF;QACxF,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IAClC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,MAAM,CACzB,OAA4B,EAC5B,MAAqB;QAErB,MAAM,GAAG,GAAG,IAAI,4BAA4B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,YACkB,OAA4B,EAC5B,MAAqB;QADrB,YAAO,GAAP,OAAO,CAAqB;QAC5B,WAAM,GAAN,MAAM,CAAe;QAzC/B,eAAU,GAAG,KAAK,CAAC;QACV,iBAAY,GAAG,IAAI,mBAAQ,EAAwB,CAAC;IAyClE,CAAC;IAEJ;;;;;;;;;;;;OAYG;IACO,KAAK,CAAC,SAAS;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC1C,OAAO;QACR,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAE9E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC7B,MAAM,aAAa,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CACnD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CACvC,CAAC;YACF,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACpF,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,MAA4B;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;CACD;AApFD,oEAoFC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { SummarizerStopReason } from \"@fluidframework/container-runtime-definitions/internal\";\nimport { assert, Deferred } from \"@fluidframework/core-utils/internal\";\n\nimport { IConnectableRuntime, ISummaryCancellationToken } from \"../summarizerTypes.js\";\n\n/**\n * Similar to AbortController, but using promise instead of events\n * @internal\n */\n\nexport interface ICancellableSummarizerController extends ISummaryCancellationToken {\n\tstop(reason: SummarizerStopReason): void;\n}\n\n/**\n * Can be useful in testing as well as in places where caller does not use cancellation.\n * This object implements ISummaryCancellationToken interface but cancellation is never leveraged.\n * @internal\n */\n\nexport const neverCancelledSummaryToken: ISummaryCancellationToken = {\n\tcancelled: false,\n\twaitCancelled: new Promise(() => {}),\n};\n\n/**\n * Helper class to coordinate something that needs to run only while connected.\n * This provides promises that resolve as it starts or stops. Stopping happens\n * when disconnected or if stop() is called.\n */\nexport class RunWhileConnectedCoordinator implements ICancellableSummarizerController {\n\tprivate _cancelled = false;\n\tprivate readonly stopDeferred = new Deferred<SummarizerStopReason>();\n\n\tpublic get cancelled(): boolean {\n\t\tif (!this._cancelled) {\n\t\t\tassert(this.active(), 0x25d /* \"We should never connect as 'read'\" */);\n\n\t\t\t// This check can't be enabled in current design due to lastSummary flow, where\n\t\t\t// summarizer for closed container stays around and can produce one more summary.\n\t\t\t// Currently we solve the problem of overlapping summarizer by doing wait in\n\t\t\t// SummaryManager.createSummarizer()\n\t\t\t// Better solution would involve these steps:\n\t\t\t// 1. Summarizer selection logic should chose summarizing client (with clientType === \"summarizer\")\n\t\t\t// if such client exists.\n\t\t\t// 2. Summarizer should be updated about such changes (to update onBehalfOfClientId)\n\t\t\t//\n\t\t\t// assert(this.runtime.summarizerClientId === this.onBehalfOfClientId ||\n\t\t\t// this.runtime.summarizerClientId === this.runtime.clientId, \"onBehalfOfClientId\");\n\t\t}\n\n\t\treturn this._cancelled;\n\t}\n\n\t/**\n\t * Returns a promise that resolves once stopped either externally or by disconnect.\n\t */\n\tpublic get waitCancelled(): Promise<SummarizerStopReason> {\n\t\treturn this.stopDeferred.promise;\n\t}\n\n\tpublic static async create(\n\t\truntime: IConnectableRuntime,\n\t\tactive: () => boolean,\n\t): Promise<RunWhileConnectedCoordinator> {\n\t\tconst obj = new RunWhileConnectedCoordinator(runtime, active);\n\t\tawait obj.waitStart();\n\t\treturn obj;\n\t}\n\n\tprotected constructor(\n\t\tprivate readonly runtime: IConnectableRuntime,\n\t\tprivate readonly active: () => boolean,\n\t) {}\n\n\t/**\n\t * Starts and waits for a promise which resolves when connected.\n\t * The promise will also resolve if stopped either externally or by disconnect.\n\t *\n\t * We only listen on disconnected event for clientType === \"summarizer\" container!\n\t * And only do it here - no other place should check it! That way we have only one place\n\t * that controls policy and it's easy to change policy in the future if we want to!\n\t * We do not listen for \"main\" (aka interactive) container disconnect here, as it's\n\t * responsibility of SummaryManager to decide if that's material or not. There are cases\n\t * like \"lastSummary\", or main client experiencing nacks / disconnects due to hitting limit\n\t * of non-summarized ops, where can make determination to continue with summary even if main\n\t * client is disconnected.\n\t */\n\tprotected async waitStart(): Promise<void> {\n\t\tif (this.runtime.disposed) {\n\t\t\tthis.stop(\"summarizerClientDisconnected\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis.runtime.once(\"dispose\", () => this.stop(\"summarizerClientDisconnected\"));\n\n\t\tif (!this.runtime.connected) {\n\t\t\tconst waitConnected = new Promise<void>((resolve) =>\n\t\t\t\tthis.runtime.once(\"connected\", resolve),\n\t\t\t);\n\t\t\tawait Promise.race([waitConnected, this.waitCancelled]);\n\t\t}\n\t\tthis.runtime.once(\"disconnected\", () => this.stop(\"summarizerClientDisconnected\"));\n\t}\n\n\t/**\n\t * Stops running.\n\t */\n\tpublic stop(reason: SummarizerStopReason): void {\n\t\tif (!this._cancelled) {\n\t\t\tthis._cancelled = true;\n\t\t\tthis.stopDeferred.resolve(reason);\n\t\t}\n\t}\n}\n"]}
@@ -7,19 +7,10 @@ import type { ISummarizerEvents, SummarizerStopReason } from "@fluidframework/co
7
7
  import { IDisposable, ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
8
8
  import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
9
9
  import { type ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
10
- import type { ISummaryConfiguration, EnqueueSummarizeResult, IEnqueueSummarizeOptions, IOnDemandSummarizeOptions, IRefreshSummaryAckOptions, ISubmitSummaryOptions, ISummarizeHeuristicData, ISummarizeResults, ISummarizerRuntime, ISummaryCancellationToken, SubmitSummaryResult } from "./summarizerTypes.js";
11
- import { IClientSummaryWatcher, SummaryCollection } from "./summaryCollection.js";
12
- import { SummarizeResultBuilder } from "./summaryGenerator.js";
13
- /**
14
- * The maximum number of summarization attempts that will be done by default in case of failures
15
- * that can be retried.
16
- */
17
- export declare const defaultMaxAttempts = 2;
18
- /**
19
- * The default value for maximum number of summarization attempts that will be done for summarization failures where
20
- * submit fails and the failure can be retried.
21
- */
22
- export declare const defaultMaxAttemptsForSubmitFailures = 5;
10
+ import type { IEnqueueSummarizeOptions, IOnDemandSummarizeOptions, IRefreshSummaryAckOptions, ISubmitSummaryOptions, ISummarizeHeuristicData, ISummarizerRuntime, ISummaryCancellationToken, ISummaryConfiguration, SubmitSummaryResult } from "../summarizerTypes.js";
11
+ import { IClientSummaryWatcher, SummaryCollection } from "../summaryCollection.js";
12
+ import { SummarizeResultBuilder } from "./summaryResultBuilder.js";
13
+ import type { EnqueueSummarizeResult, ISummarizeResults } from "./summaryResultTypes.js";
23
14
  /**
24
15
  * An instance of RunningSummarizer manages the heuristics for summarizing.
25
16
  * Until disposed, the instance of RunningSummarizer can assume that it is
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runningSummarizer.d.ts","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/runningSummarizer.ts"],"names":[],"mappings":"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"}
@@ -4,25 +4,18 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.RunningSummarizer = exports.defaultMaxAttemptsForSubmitFailures = exports.defaultMaxAttempts = void 0;
7
+ exports.RunningSummarizer = void 0;
8
8
  const client_utils_1 = require("@fluid-internal/client-utils");
9
9
  const internal_1 = require("@fluidframework/core-utils/internal");
10
10
  const internal_2 = require("@fluidframework/driver-definitions/internal");
11
11
  const internal_3 = require("@fluidframework/telemetry-utils/internal");
12
- const opProperties_js_1 = require("../opProperties.js");
12
+ const opProperties_js_1 = require("../../opProperties.js");
13
+ const summarizerUtils_js_1 = require("../summarizerUtils.js");
14
+ const summarizer_js_1 = require("./summarizer.js");
13
15
  const summarizerHeuristics_js_1 = require("./summarizerHeuristics.js");
14
16
  const summaryGenerator_js_1 = require("./summaryGenerator.js");
17
+ const summaryResultBuilder_js_1 = require("./summaryResultBuilder.js");
15
18
  const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
16
- /**
17
- * The maximum number of summarization attempts that will be done by default in case of failures
18
- * that can be retried.
19
- */
20
- exports.defaultMaxAttempts = 2;
21
- /**
22
- * The default value for maximum number of summarization attempts that will be done for summarization failures where
23
- * submit fails and the failure can be retried.
24
- */
25
- exports.defaultMaxAttemptsForSubmitFailures = 5;
26
19
  /**
27
20
  * An instance of RunningSummarizer manages the heuristics for summarizing.
28
21
  * Until disposed, the instance of RunningSummarizer can assume that it is
@@ -194,9 +187,9 @@ class RunningSummarizer extends client_utils_1.TypedEventEmitter {
194
187
  // If its set to a number higher than `defaultMaxAttemptsForSubmitFailures`, it will be ignored.
195
188
  const overrideMaxAttempts = this.mc.config.getNumber("Fluid.Summarizer.AttemptsForSubmitFailures");
196
189
  this.maxAttemptsForSubmitFailures =
197
- overrideMaxAttempts && overrideMaxAttempts < exports.defaultMaxAttemptsForSubmitFailures
190
+ overrideMaxAttempts && overrideMaxAttempts < summarizer_js_1.defaultMaxAttemptsForSubmitFailures
198
191
  ? overrideMaxAttempts
199
- : exports.defaultMaxAttemptsForSubmitFailures;
192
+ : summarizer_js_1.defaultMaxAttemptsForSubmitFailures;
200
193
  }
201
194
  async handleSummaryAck(ack) {
202
195
  const refSequenceNumber = ack.summaryOp.referenceSequenceNumber;
@@ -334,7 +327,7 @@ class RunningSummarizer extends client_utils_1.TypedEventEmitter {
334
327
  }
335
328
  async waitStart() {
336
329
  // Wait no longer than ack timeout for all pending
337
- const waitStartResult = await (0, summaryGenerator_js_1.raceTimer)(this.summaryWatcher.waitFlushed(), this.pendingAckTimer.start());
330
+ const waitStartResult = await (0, summarizerUtils_js_1.raceTimer)(this.summaryWatcher.waitFlushed(), this.pendingAckTimer.start());
338
331
  this.pendingAckTimer.clear();
339
332
  // Remove pending ack wait timeout by op timestamp comparison, because
340
333
  // it has race conditions with summaries submitted by this same client.
@@ -390,7 +383,7 @@ class RunningSummarizer extends client_utils_1.TypedEventEmitter {
390
383
  * @param isLastSummary - optional, is the call to this method for a last summary when shutting down the summarizer?
391
384
  * @returns ISummarizeResult - result of running a summary.
392
385
  */
393
- trySummarizeOnce(summarizeProps, options, resultsBuilder = new summaryGenerator_js_1.SummarizeResultBuilder(), isLastSummary = false) {
386
+ trySummarizeOnce(summarizeProps, options, resultsBuilder = new summaryResultBuilder_js_1.SummarizeResultBuilder(), isLastSummary = false) {
394
387
  this.lockedSummaryAction(() => {
395
388
  this.beforeSummaryAction();
396
389
  }, async () => {
@@ -512,7 +505,7 @@ class RunningSummarizer extends client_utils_1.TypedEventEmitter {
512
505
  // such scenarios are very unlikely and even if it happens, it would resolve when a new summarizer starts over.
513
506
  // For example - When failure switches from one the submit failures to nack failure, only one more retry will
514
507
  // happen irrespective of the value of `defaultMaxAttempts`.
515
- let maxAttempts = exports.defaultMaxAttempts;
508
+ let maxAttempts = summarizer_js_1.defaultMaxAttempts;
516
509
  let currentAttempt = 0;
517
510
  let retryAfterSeconds;
518
511
  let done = false;
@@ -541,7 +534,7 @@ class RunningSummarizer extends client_utils_1.TypedEventEmitter {
541
534
  // Note: Check "summarySubmitted" result first because if it fails, ack nack would fail as well.
542
535
  const submitSummaryResult = await results.summarySubmitted;
543
536
  maxAttempts = submitSummaryResult.success
544
- ? exports.defaultMaxAttempts
537
+ ? summarizer_js_1.defaultMaxAttempts
545
538
  : this.maxAttemptsForSubmitFailures;
546
539
  // Emit "summarize" event for this failed attempt.
547
540
  status = "failure";
@@ -631,7 +624,7 @@ class RunningSummarizer extends client_utils_1.TypedEventEmitter {
631
624
  async summarizeOnDemandWithRetries(reason, resultsBuilder) {
632
625
  const results = await this.trySummarizeWithRetries(reason);
633
626
  if (results === undefined) {
634
- resultsBuilder.fail("Summarization was canceled", new summaryGenerator_js_1.RetriableSummaryError("Summarization was canceled"));
627
+ resultsBuilder.fail("Summarization was canceled", new summarizerUtils_js_1.RetriableSummaryError("Summarization was canceled"));
635
628
  return resultsBuilder.build();
636
629
  }
637
630
  const submitResult = await results.summarySubmitted;
@@ -645,9 +638,9 @@ class RunningSummarizer extends client_utils_1.TypedEventEmitter {
645
638
  /**
646
639
  *{@inheritdoc (ISummarizer:interface).summarizeOnDemand}
647
640
  */
648
- summarizeOnDemand(options, resultsBuilder = new summaryGenerator_js_1.SummarizeResultBuilder()) {
641
+ summarizeOnDemand(options, resultsBuilder = new summaryResultBuilder_js_1.SummarizeResultBuilder()) {
649
642
  if (this.stopping) {
650
- resultsBuilder.fail("RunningSummarizer stopped or disposed", new summaryGenerator_js_1.RetriableSummaryError("RunningSummarizer stopped or disposed"));
643
+ resultsBuilder.fail("RunningSummarizer stopped or disposed", new summarizerUtils_js_1.RetriableSummaryError("RunningSummarizer stopped or disposed"));
651
644
  return resultsBuilder.build();
652
645
  }
653
646
  // Check for concurrent summary attempts. If one is found,
@@ -678,7 +671,7 @@ class RunningSummarizer extends client_utils_1.TypedEventEmitter {
678
671
  return { alreadyEnqueued: true };
679
672
  }
680
673
  // Override existing enqueued summarize attempt.
681
- this.enqueuedSummary.resultsBuilder.fail("Aborted; overridden by another enqueue summarize attempt", new summaryGenerator_js_1.RetriableSummaryError("Summary was overridden by another enqueue summarize attempt"));
674
+ this.enqueuedSummary.resultsBuilder.fail("Aborted; overridden by another enqueue summarize attempt", new summarizerUtils_js_1.RetriableSummaryError("Summary was overridden by another enqueue summarize attempt"));
682
675
  this.enqueuedSummary = undefined;
683
676
  overridden = true;
684
677
  }
@@ -686,7 +679,7 @@ class RunningSummarizer extends client_utils_1.TypedEventEmitter {
686
679
  reason: `enqueue;${reason}`,
687
680
  afterSequenceNumber,
688
681
  summarizeOptions,
689
- resultsBuilder: new summaryGenerator_js_1.SummarizeResultBuilder(),
682
+ resultsBuilder: new summaryResultBuilder_js_1.SummarizeResultBuilder(),
690
683
  };
691
684
  const results = this.enqueuedSummary.resultsBuilder.build();
692
685
  this.tryRunEnqueuedSummary();
@@ -717,7 +710,7 @@ class RunningSummarizer extends client_utils_1.TypedEventEmitter {
717
710
  }
718
711
  disposeEnqueuedSummary() {
719
712
  if (this.enqueuedSummary !== undefined) {
720
- this.enqueuedSummary.resultsBuilder.fail("RunningSummarizer stopped or disposed", new summaryGenerator_js_1.RetriableSummaryError("RunningSummarizer stopped or disposed"));
713
+ this.enqueuedSummary.resultsBuilder.fail("RunningSummarizer stopped or disposed", new summarizerUtils_js_1.RetriableSummaryError("RunningSummarizer stopped or disposed"));
721
714
  this.enqueuedSummary = undefined;
722
715
  }
723
716
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runningSummarizer.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/runningSummarizer.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 {\n\tISummarizeEventProps,\n\tISummarizerEvents,\n\tISummarizerObservabilityProps,\n\tSummarizerStopReason,\n} from \"@fluidframework/container-runtime-definitions/internal\";\nimport { IDisposable, ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\nimport { assert, Deferred, PromiseTimer, delay } from \"@fluidframework/core-utils/internal\";\nimport {\n\tDriverErrorTypes,\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tMonitoringContext,\n\tUsageError,\n\tcreateChildLogger,\n\tcreateChildMonitoringContext,\n\tisFluidError,\n\ttype ITelemetryLoggerExt,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport { opSize } from \"../../opProperties.js\";\nimport type {\n\tIEnqueueSummarizeOptions,\n\tIOnDemandSummarizeOptions,\n\tIRefreshSummaryAckOptions,\n\tIRetriableFailureError,\n\tISubmitSummaryOptions,\n\tISummarizeHeuristicData,\n\tISummarizeHeuristicRunner,\n\tISummarizeOptions,\n\tISummarizerRuntime,\n\tISummarizeRunnerTelemetry,\n\tISummarizeTelemetryProperties,\n\tISummaryCancellationToken,\n\tISummaryConfiguration,\n\tSubmitSummaryResult,\n} from \"../summarizerTypes.js\";\nimport { raceTimer, RetriableSummaryError, type SummarizeReason } from \"../summarizerUtils.js\";\nimport {\n\tIAckedSummary,\n\tIClientSummaryWatcher,\n\tSummaryCollection,\n} from \"../summaryCollection.js\";\n\nimport { defaultMaxAttempts, defaultMaxAttemptsForSubmitFailures } from \"./summarizer.js\";\nimport { SummarizeHeuristicRunner } from \"./summarizerHeuristics.js\";\nimport { SummaryGenerator } from \"./summaryGenerator.js\";\nimport { SummarizeResultBuilder } from \"./summaryResultBuilder.js\";\nimport type { EnqueueSummarizeResult, ISummarizeResults } from \"./summaryResultTypes.js\";\n\nconst maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes\n\n/**\n * An instance of RunningSummarizer manages the heuristics for summarizing.\n * Until disposed, the instance of RunningSummarizer can assume that it is\n * in a state of running, meaning it is connected and initialized. It keeps\n * track of summaries that it is generating as they are broadcast and acked/nacked.\n * This object is created and controlled by Summarizer object.\n */\nexport class RunningSummarizer\n\textends TypedEventEmitter<ISummarizerEvents>\n\timplements IDisposable\n{\n\tpublic static async start(\n\t\tlogger: ITelemetryBaseLogger,\n\t\tsummaryWatcher: IClientSummaryWatcher,\n\t\tconfiguration: ISummaryConfiguration,\n\n\t\tsubmitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,\n\n\t\trefreshLatestSummaryAckCallback: (options: IRefreshSummaryAckOptions) => Promise<void>,\n\t\theuristicData: ISummarizeHeuristicData,\n\t\tsummaryCollection: SummaryCollection,\n\n\t\tcancellationToken: ISummaryCancellationToken,\n\t\tstopSummarizerCallback: (reason: SummarizerStopReason) => void,\n\n\t\truntime: ISummarizerRuntime,\n\t): Promise<RunningSummarizer> {\n\t\tconst summarizer = new RunningSummarizer(\n\t\t\tlogger,\n\t\t\tsummaryWatcher,\n\t\t\tconfiguration,\n\t\t\tsubmitSummaryCallback,\n\t\t\trefreshLatestSummaryAckCallback,\n\t\t\theuristicData,\n\t\t\tsummaryCollection,\n\t\t\tcancellationToken,\n\t\t\tstopSummarizerCallback,\n\t\t\truntime,\n\t\t);\n\n\t\t// If there have been any acks newer that the one this client loaded from until now, process them before\n\t\t// starting the running summarizer which will trigger summary heuristics.\n\t\t// This is done primarily to handle scenarios where the summarizer loads from a cached snapshot and there\n\t\t// is newer one available. The ack for the newer summary is processed before summarizing because otherwise\n\t\t// that summary would fail as it has an older parent.\n\t\tlet nextReferenceSequenceNumber = runtime.deltaManager.initialSequenceNumber + 1;\n\t\tconst latestAck = summaryCollection.latestAck;\n\t\tif (\n\t\t\tlatestAck !== undefined &&\n\t\t\tlatestAck.summaryOp.referenceSequenceNumber >= nextReferenceSequenceNumber\n\t\t) {\n\t\t\tawait summarizer.handleSummaryAck(latestAck);\n\t\t\tnextReferenceSequenceNumber = latestAck.summaryOp.referenceSequenceNumber + 1;\n\t\t}\n\n\t\tawait summarizer.waitStart();\n\n\t\t// Process summary acks asynchronously\n\t\t// Note: no exceptions are thrown from processIncomingSummaryAcks handler as it handles all exceptions\n\t\tsummarizer.processIncomingSummaryAcks(nextReferenceSequenceNumber).catch((error) => {\n\t\t\tcreateChildLogger({ logger }).sendErrorEvent(\n\t\t\t\t{ eventName: \"HandleSummaryAckFatalError\" },\n\t\t\t\terror,\n\t\t\t);\n\t\t});\n\n\t\t// Update heuristic counts\n\t\t// By the time we get here, there are potentially ops missing from the heuristic summary counts\n\t\t// Examples of where this could happen:\n\t\t// 1. Op is processed during the time that we are initiating the RunningSummarizer instance but before we\n\t\t// listen for the op events (will get missed by the handlers in the current workflow)\n\t\t// 2. Op was sequenced after the last time we summarized (op sequence number > summarize ref sequence number)\n\t\tconst diff =\n\t\t\truntime.deltaManager.lastSequenceNumber -\n\t\t\t(heuristicData.lastSuccessfulSummary.refSequenceNumber +\n\t\t\t\theuristicData.numNonRuntimeOps +\n\t\t\t\theuristicData.numRuntimeOps);\n\t\theuristicData.hasMissingOpData = diff > 0;\n\n\t\tif (heuristicData.hasMissingOpData) {\n\t\t\t// Split the diff 50-50 and increment the counts appropriately\n\t\t\theuristicData.numNonRuntimeOps += Math.ceil(diff / 2);\n\t\t\theuristicData.numRuntimeOps += Math.floor(diff / 2);\n\t\t}\n\n\t\t// Update last seq number (in case the handlers haven't processed anything yet)\n\t\theuristicData.lastOpSequenceNumber = runtime.deltaManager.lastSequenceNumber;\n\n\t\t// Start heuristics\n\t\tsummarizer.heuristicRunner?.start();\n\t\tsummarizer.heuristicRunner?.run();\n\n\t\treturn summarizer;\n\t}\n\n\tpublic get disposed(): boolean {\n\t\treturn this._disposed;\n\t}\n\tprivate stopping = false;\n\tprivate _disposed = false;\n\tprivate summarizingLock: Promise<void> | undefined;\n\tprivate tryWhileSummarizing = false;\n\tprivate readonly pendingAckTimer: PromiseTimer;\n\tprivate heuristicRunner?: ISummarizeHeuristicRunner;\n\tprivate readonly generator: SummaryGenerator;\n\tprivate readonly mc: MonitoringContext;\n\n\tprivate enqueuedSummary:\n\t\t| {\n\t\t\t\treason: SummarizeReason;\n\t\t\t\tafterSequenceNumber: number;\n\t\t\t\tsummarizeOptions: ISummarizeOptions;\n\t\t\t\treadonly resultsBuilder: SummarizeResultBuilder;\n\t\t }\n\t\t| undefined;\n\tprivate summarizeCount = 0;\n\tprivate totalSuccessfulAttempts = 0;\n\tprivate initialized = false;\n\n\tprivate readonly runtimeListener: (\n\t\top: ISequencedDocumentMessage,\n\t\truntimeMessage?: boolean,\n\t) => void;\n\n\t/**\n\t * The maximum number of summary attempts to do when submit summary fails.\n\t */\n\tprivate readonly maxAttemptsForSubmitFailures: number;\n\n\t/**\n\t * These are necessary to store outside of methods because of the logic around runnning a lastSummary.\n\t * We want the lastSummary to also be captured as \"all attempts failed\".\n\t */\n\tprivate lastSummarizeFailureEventProps: Omit<ISummarizeEventProps, \"result\"> | undefined =\n\t\tundefined;\n\n\tprivate constructor(\n\t\tbaseLogger: ITelemetryBaseLogger,\n\t\tprivate readonly summaryWatcher: IClientSummaryWatcher,\n\t\tprivate readonly configuration: ISummaryConfiguration,\n\t\tprivate readonly submitSummaryCallback: (\n\t\t\toptions: ISubmitSummaryOptions,\n\t\t) => Promise<SubmitSummaryResult>,\n\t\tprivate readonly refreshLatestSummaryAckCallback: (\n\t\t\toptions: IRefreshSummaryAckOptions,\n\t\t) => Promise<void>,\n\t\tprivate readonly heuristicData: ISummarizeHeuristicData,\n\t\tprivate readonly summaryCollection: SummaryCollection,\n\n\t\tprivate readonly cancellationToken: ISummaryCancellationToken,\n\t\tprivate readonly stopSummarizerCallback: (reason: SummarizerStopReason) => void,\n\n\t\tprivate readonly runtime: ISummarizerRuntime,\n\t) {\n\t\tsuper();\n\n\t\tconst telemetryProps: ISummarizeRunnerTelemetry = {\n\t\t\tsummarizeCount: () => this.summarizeCount,\n\t\t\tsummarizerSuccessfulAttempts: () => this.totalSuccessfulAttempts,\n\t\t};\n\n\t\tthis.mc = createChildMonitoringContext({\n\t\t\tlogger: baseLogger,\n\t\t\tnamespace: \"Running\",\n\t\t\tproperties: {\n\t\t\t\tall: telemetryProps,\n\t\t\t},\n\t\t});\n\n\t\tif (configuration.state !== \"disableHeuristics\") {\n\t\t\tassert(\n\t\t\t\tthis.configuration.state === \"enabled\",\n\t\t\t\t0x2ea /* \"Configuration state should be enabled\" */,\n\t\t\t);\n\t\t\tthis.heuristicRunner = new SummarizeHeuristicRunner(\n\t\t\t\theuristicData,\n\t\t\t\tthis.configuration,\n\t\t\t\t(reason) => this.trySummarize(reason),\n\t\t\t\tthis.mc.logger,\n\t\t\t);\n\t\t}\n\n\t\tassert(\n\t\t\tthis.configuration.state !== \"disabled\",\n\t\t\t0x2eb /* \"Summary not supported with configuration disabled\" */,\n\t\t);\n\n\t\t// Cap the maximum amount of time client will wait for a summarize op ack to maxSummarizeAckWaitTime\n\t\t// configuration.maxAckWaitTime is composed from defaults, server values, and runtime overrides\n\n\t\tconst maxAckWaitTime = Math.min(\n\t\t\tthis.configuration.maxAckWaitTime,\n\t\t\tmaxSummarizeAckWaitTime,\n\t\t);\n\n\t\tthis.pendingAckTimer = new PromiseTimer(maxAckWaitTime, () => {\n\t\t\t// Note: summarizeCount (from ChildLogger definition) may be 0,\n\t\t\t// since this code path is hit when RunningSummarizer first starts up,\n\t\t\t// before this instance has kicked off a new summarize run.\n\t\t\tthis.mc.logger.sendErrorEvent({\n\t\t\t\teventName: \"SummaryAckWaitTimeout\",\n\t\t\t\tmessage: \"Pending summary ack not received in time\",\n\t\t\t\tmaxAckWaitTime,\n\t\t\t\treferenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,\n\t\t\t\tsummarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,\n\t\t\t\ttimePending: Date.now() - this.heuristicData.lastAttempt.summaryTime,\n\t\t\t});\n\t\t});\n\t\t// Set up pending ack timeout by op timestamp differences for previous summaries.\n\t\tsummaryCollection.setPendingAckTimerTimeoutCallback(maxAckWaitTime, () => {\n\t\t\tif (this.pendingAckTimer.hasTimer) {\n\t\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\t\teventName: \"MissingSummaryAckFoundByOps\",\n\t\t\t\t\treferenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,\n\t\t\t\t\tsummarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,\n\t\t\t\t});\n\t\t\t\tthis.pendingAckTimer.clear();\n\t\t\t}\n\t\t});\n\n\t\tconst immediatelyRefreshLatestSummaryAck =\n\t\t\tthis.mc.config.getBoolean(\"Fluid.Summarizer.immediatelyRefreshLatestSummaryAck\") ?? true;\n\t\tthis.generator = new SummaryGenerator(\n\t\t\tthis.pendingAckTimer,\n\t\t\tthis.heuristicData,\n\t\t\tthis.submitSummaryCallback,\n\t\t\t() => {\n\t\t\t\tthis.totalSuccessfulAttempts++;\n\t\t\t},\n\n\t\t\tasync (options: IRefreshSummaryAckOptions) => {\n\t\t\t\tif (immediatelyRefreshLatestSummaryAck) {\n\t\t\t\t\tawait this.refreshLatestSummaryAckAndHandleError(options);\n\t\t\t\t}\n\t\t\t},\n\t\t\tthis.summaryWatcher,\n\t\t\tthis.mc.logger,\n\t\t);\n\n\t\t// Listen to runtime for ops\n\t\tthis.runtimeListener = (op: ISequencedDocumentMessage, runtimeMessage?: boolean) => {\n\t\t\tthis.handleOp(op, runtimeMessage === true);\n\t\t};\n\t\tthis.runtime.on(\"op\", this.runtimeListener);\n\n\t\t// The max attempts for submit failures can be overridden via a feature flag. This allows us to\n\t\t// tweak this as per telemetry data until we arrive at a stable number.\n\t\t// If its set to a number higher than `defaultMaxAttemptsForSubmitFailures`, it will be ignored.\n\t\tconst overrideMaxAttempts = this.mc.config.getNumber(\n\t\t\t\"Fluid.Summarizer.AttemptsForSubmitFailures\",\n\t\t);\n\t\tthis.maxAttemptsForSubmitFailures =\n\t\t\toverrideMaxAttempts && overrideMaxAttempts < defaultMaxAttemptsForSubmitFailures\n\t\t\t\t? overrideMaxAttempts\n\t\t\t\t: defaultMaxAttemptsForSubmitFailures;\n\t}\n\n\tprivate async handleSummaryAck(ack: IAckedSummary): Promise<void> {\n\t\tconst refSequenceNumber = ack.summaryOp.referenceSequenceNumber;\n\t\tconst summaryLogger = this.tryGetCorrelatedLogger(refSequenceNumber) ?? this.mc.logger;\n\t\tconst summaryOpHandle = ack.summaryOp.contents.handle;\n\t\tconst summaryAckHandle = ack.summaryAck.contents.handle;\n\t\twhile (this.summarizingLock !== undefined) {\n\t\t\tsummaryLogger.sendTelemetryEvent({\n\t\t\t\teventName: \"RefreshAttemptWithSummarizerRunning\",\n\t\t\t\treferenceSequenceNumber: refSequenceNumber,\n\t\t\t\tproposalHandle: summaryOpHandle,\n\t\t\t\tackHandle: summaryAckHandle,\n\t\t\t});\n\t\t\tawait this.summarizingLock;\n\t\t}\n\n\t\t// Make sure we block any summarizer from being executed/enqueued while\n\t\t// executing the refreshLatestSummaryAck.\n\t\t// https://dev.azure.com/fluidframework/internal/_workitems/edit/779\n\t\tawait this.lockedSummaryAction(\n\t\t\t() => {},\n\t\t\tasync () => {\n\t\t\t\tconst options: IRefreshSummaryAckOptions = {\n\t\t\t\t\tproposalHandle: summaryOpHandle,\n\t\t\t\t\tackHandle: summaryAckHandle,\n\t\t\t\t\tsummaryRefSeq: refSequenceNumber,\n\t\t\t\t\tsummaryLogger,\n\t\t\t\t};\n\t\t\t\tawait this.refreshLatestSummaryAckAndHandleError(options);\n\t\t\t},\n\t\t\t() => {},\n\t\t);\n\t}\n\n\tprivate readonly refreshLatestSummaryAckAndHandleError = async (\n\t\toptions: IRefreshSummaryAckOptions,\n\t): Promise<void> => {\n\t\treturn this.refreshLatestSummaryAckCallback(options).catch(async (error) => {\n\t\t\t// If the error is 404, so maybe the fetched version no longer exists on server. We just\n\t\t\t// ignore this error in that case, as that means we will have another summaryAck for the\n\t\t\t// latest version with which we will refresh the state. However in case of single commit\n\t\t\t// summary, we might be missing a summary ack, so in that case we are still fine as the\n\t\t\t// code in `submitSummary` function in container runtime, will refresh the latest state\n\t\t\t// by calling `prefetchLatestSummaryThenClose`. We will load the next summarizer from the\n\t\t\t// updated state and be fine.\n\t\t\tconst isIgnoredError =\n\t\t\t\tisFluidError(error) &&\n\t\t\t\terror.errorType === DriverErrorTypes.fileNotFoundOrAccessDeniedError;\n\n\t\t\toptions.summaryLogger.sendTelemetryEvent(\n\t\t\t\t{\n\t\t\t\t\teventName: isIgnoredError\n\t\t\t\t\t\t? \"HandleSummaryAckErrorIgnored\"\n\t\t\t\t\t\t: \"HandleLastSummaryAckError\",\n\t\t\t\t\treferenceSequenceNumber: options.summaryRefSeq,\n\t\t\t\t\tproposalHandle: options.proposalHandle,\n\t\t\t\t\tackHandle: options.ackHandle,\n\t\t\t\t},\n\t\t\t\terror,\n\t\t\t);\n\t\t});\n\t};\n\n\t/**\n\t * Responsible for receiving and processing all the summary acks.\n\t * It starts processing ACKs after the one for the summary this client loaded from (initialSequenceNumber). Any\n\t * ACK before that is not interesting as it will simply be ignored.\n\t *\n\t * @param referenceSequenceNumber - The referenceSequenceNumber of the summary from which to start processing\n\t * acks.\n\t */\n\tprivate async processIncomingSummaryAcks(referenceSequenceNumber: number): Promise<void> {\n\t\t// Start waiting for acks that are for summaries newer that the one this client loaded from.\n\t\tlet nextReferenceSequenceNumber = referenceSequenceNumber;\n\t\twhile (!this.disposed) {\n\t\t\tconst ackedSummary = await this.summaryCollection.waitSummaryAck(\n\t\t\t\tnextReferenceSequenceNumber,\n\t\t\t);\n\t\t\tawait this.handleSummaryAck(ackedSummary);\n\t\t\tnextReferenceSequenceNumber = ackedSummary.summaryOp.referenceSequenceNumber + 1;\n\t\t}\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.runtime.off(\"op\", this.runtimeListener);\n\t\tthis.summaryWatcher.dispose();\n\t\tthis.heuristicRunner?.dispose();\n\t\tthis.heuristicRunner = undefined;\n\t\tthis.generator.dispose();\n\t\tthis.pendingAckTimer.clear();\n\t\tthis.disposeEnqueuedSummary();\n\t\tthis._disposed = true;\n\t\tthis.stopping = true;\n\t}\n\n\t/**\n\t * RunningSummarizer's logger includes the sequenced index of the current summary on each event.\n\t * If some other Summarizer code wants that event on their logs they can get it here,\n\t * but only if they're logging about that same summary.\n\t * @param summaryOpRefSeq - RefSeq number of the summary op, to ensure the log correlation will be correct\n\t */\n\tpublic tryGetCorrelatedLogger = (\n\t\tsummaryOpRefSeq: number,\n\t): ITelemetryLoggerExt | undefined =>\n\t\tthis.heuristicData.lastAttempt.refSequenceNumber === summaryOpRefSeq\n\t\t\t? this.mc.logger\n\t\t\t: undefined;\n\n\t/**\n\t * We only want a single heuristic runner micro-task (will provide better optimized grouping of ops)\n\t */\n\tprivate heuristicRunnerMicroTaskExists = false;\n\n\tpublic handleOp(op: ISequencedDocumentMessage, runtimeMessage: boolean): void {\n\t\tthis.heuristicData.lastOpSequenceNumber = op.sequenceNumber;\n\n\t\tif (runtimeMessage) {\n\t\t\tthis.heuristicData.numRuntimeOps++;\n\t\t} else {\n\t\t\tthis.heuristicData.numNonRuntimeOps++;\n\t\t}\n\n\t\tthis.heuristicData.totalOpsSize += opSize(op);\n\n\t\t// Check for enqueued on-demand summaries; Intentionally do nothing otherwise\n\t\tif (\n\t\t\tthis.initialized &&\n\t\t\tthis.opCanTriggerSummary(op, runtimeMessage) &&\n\t\t\t!this.tryRunEnqueuedSummary() &&\n\t\t\t!this.heuristicRunnerMicroTaskExists\n\t\t) {\n\t\t\tthis.heuristicRunnerMicroTaskExists = true;\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\t\tPromise.resolve()\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.heuristicRunner?.run();\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tthis.heuristicRunnerMicroTaskExists = false;\n\t\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Can the given op trigger a summary?\n\t * # Currently always prevents summaries for Summarize and SummaryAck/Nack ops\n\t * @param op - op to check\n\t * @returns true if this op can trigger a summary\n\t */\n\tprivate opCanTriggerSummary(\n\t\top: ISequencedDocumentMessage,\n\t\truntimeMessage: boolean,\n\t): boolean {\n\t\tswitch (op.type) {\n\t\t\tcase MessageType.Summarize:\n\t\t\tcase MessageType.SummaryAck:\n\t\t\tcase MessageType.SummaryNack: {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\treturn runtimeMessage || this.nonRuntimeOpCanTriggerSummary();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate nonRuntimeOpCanTriggerSummary(): boolean {\n\t\tconst opsSinceLastAck =\n\t\t\tthis.heuristicData.lastOpSequenceNumber -\n\t\t\tthis.heuristicData.lastSuccessfulSummary.refSequenceNumber;\n\t\treturn (\n\t\t\tthis.configuration.state === \"enabled\" &&\n\t\t\t(this.configuration.nonRuntimeHeuristicThreshold === undefined ||\n\t\t\t\tthis.configuration.nonRuntimeHeuristicThreshold <= opsSinceLastAck)\n\t\t);\n\t}\n\n\tpublic async waitStop(allowLastSummary: boolean): Promise<void> {\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.stopping = true;\n\n\t\tthis.disposeEnqueuedSummary();\n\n\t\t// This will try to run lastSummary if needed.\n\t\tif (\n\t\t\tallowLastSummary &&\n\t\t\tthis.heuristicRunner?.shouldRunLastSummary() &&\n\t\t\tthis.summarizingLock === undefined\n\t\t) {\n\t\t\tthis.trySummarizeOnce(\n\t\t\t\t// summarizeProps\n\t\t\t\t{ summarizeReason: \"lastSummary\" },\n\t\t\t\t{},\n\t\t\t\tundefined,\n\t\t\t\ttrue /* isLastSummary */,\n\t\t\t);\n\t\t}\n\n\t\t// Note that trySummarizeOnce() call above returns right away, without waiting.\n\t\t// So we need to wait for its completion, otherwise it would be destroyed right away.\n\t\t// That said, if summary lock was taken upfront, this wait might wait on multiple retries to\n\t\t// submit summary. We should reconsider this flow and make summarizer move to exit faster.\n\t\t// This resolves when the current pending summary gets an ack or fails.\n\t\tawait this.summarizingLock;\n\n\t\tif (this.lastSummarizeFailureEventProps !== undefined) {\n\t\t\tthis.emit(\"summarizeAllAttemptsFailed\", {\n\t\t\t\t...this.lastSummarizeFailureEventProps,\n\t\t\t\tnumUnsummarizedRuntimeOps: this.heuristicData.numRuntimeOps,\n\t\t\t\tnumUnsummarizedNonRuntimeOps: this.heuristicData.numNonRuntimeOps,\n\t\t\t});\n\t\t}\n\t\tthis.lastSummarizeFailureEventProps = undefined;\n\t}\n\n\tprivate async waitStart(): Promise<void> {\n\t\t// Wait no longer than ack timeout for all pending\n\t\tconst waitStartResult = await raceTimer(\n\t\t\tthis.summaryWatcher.waitFlushed(),\n\t\t\tthis.pendingAckTimer.start(),\n\t\t);\n\t\tthis.pendingAckTimer.clear();\n\n\t\t// Remove pending ack wait timeout by op timestamp comparison, because\n\t\t// it has race conditions with summaries submitted by this same client.\n\t\tthis.summaryCollection.unsetPendingAckTimerTimeoutCallback();\n\n\t\tif (waitStartResult.result === \"done\" && waitStartResult.value !== undefined) {\n\t\t\tthis.heuristicData.updateWithLastSummaryAckInfo({\n\t\t\t\trefSequenceNumber: waitStartResult.value.summaryOp.referenceSequenceNumber,\n\t\t\t\t// This will be the Summarizer starting point so only use timestamps from client's machine.\n\t\t\t\tsummaryTime: Date.now(),\n\t\t\t\tsummarySequenceNumber: waitStartResult.value.summaryOp.sequenceNumber,\n\t\t\t});\n\t\t}\n\t\tthis.initialized = true;\n\t}\n\n\tprivate beforeSummaryAction(): void {\n\t\tthis.summarizeCount++;\n\t}\n\n\tprivate afterSummaryAction(): void {\n\t\tconst retry = this.tryWhileSummarizing;\n\t\tthis.tryWhileSummarizing = false;\n\n\t\t// After summarizing, we should check to see if we need to summarize again.\n\t\t// Rerun the heuristics and check for enqueued summaries.\n\t\tif (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {\n\t\t\tthis.heuristicRunner?.run();\n\t\t}\n\t}\n\n\t/**\n\t * Runs single summary action that prevents any other concurrent actions.\n\t * Assumes that caller checked upfront for lack of concurrent action (this.summarizingLock)\n\t * before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.\n\t * @param before - set of instructions to run before running the action.\n\t * @param action - action to perform.\n\t * @param after - set of instructions to run after running the action.\n\t * @returns The result of the action.\n\t */\n\tprivate async lockedSummaryAction<T>(\n\t\tbefore: () => void,\n\t\taction: () => Promise<T>,\n\t\tafter: () => void,\n\t): Promise<T> {\n\t\tassert(\n\t\t\tthis.summarizingLock === undefined,\n\t\t\t0x25b /* \"Caller is responsible for checking lock\" */,\n\t\t);\n\n\t\tconst summarizingLock = new Deferred<void>();\n\t\tthis.summarizingLock = summarizingLock.promise;\n\n\t\tbefore();\n\n\t\treturn action().finally(() => {\n\t\t\tsummarizingLock.resolve();\n\t\t\tthis.summarizingLock = undefined;\n\t\t\tafter();\n\t\t});\n\t}\n\n\t/**\n\t * Runs single summarize attempt\n\t * @param summarizeProps - props to log with each telemetry event associated with this attempt\n\t * @param options - summary options\n\t * @param cancellationToken - cancellation token to use to be able to cancel this summary, if needed\n\t * @param resultsBuilder - optional, result builder to use.\n\t * @param isLastSummary - optional, is the call to this method for a last summary when shutting down the summarizer?\n\t * @returns ISummarizeResult - result of running a summary.\n\t */\n\tprivate trySummarizeOnce(\n\t\tsummarizeProps: ISummarizeTelemetryProperties,\n\t\toptions: ISummarizeOptions,\n\t\tresultsBuilder = new SummarizeResultBuilder(),\n\t\tisLastSummary = false,\n\t): ISummarizeResults {\n\t\tthis.lockedSummaryAction(\n\t\t\t() => {\n\t\t\t\tthis.beforeSummaryAction();\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tconst summaryLogger = createChildLogger({\n\t\t\t\t\tlogger: this.mc.logger,\n\t\t\t\t\tproperties: { all: summarizeProps },\n\t\t\t\t});\n\n\t\t\t\tconst summaryOptions: ISubmitSummaryOptions = {\n\t\t\t\t\t...options,\n\t\t\t\t\tsummaryLogger,\n\t\t\t\t\tcancellationToken: this.cancellationToken,\n\t\t\t\t\tlatestSummaryRefSeqNum: this.heuristicData.lastSuccessfulSummary.refSequenceNumber,\n\t\t\t\t};\n\t\t\t\tconst summarizeResult = this.generator.summarize(summaryOptions, resultsBuilder);\n\t\t\t\t// ensure we wait till the end of the process\n\t\t\t\tconst result = await summarizeResult.receivedSummaryAckOrNack;\n\n\t\t\t\tif (result.success) {\n\t\t\t\t\tthis.emit(\"summarize\", {\n\t\t\t\t\t\tresult: \"success\",\n\t\t\t\t\t\tcurrentAttempt: 1,\n\t\t\t\t\t\tmaxAttempts: 1,\n\t\t\t\t\t\tnumUnsummarizedRuntimeOps: this.heuristicData.numRuntimeOps,\n\t\t\t\t\t\tnumUnsummarizedNonRuntimeOps: this.heuristicData.numNonRuntimeOps,\n\t\t\t\t\t\tisLastSummary,\n\t\t\t\t\t});\n\t\t\t\t\tthis.lastSummarizeFailureEventProps = undefined;\n\t\t\t\t} else {\n\t\t\t\t\tthis.emit(\"summarize\", {\n\t\t\t\t\t\tresult: \"failure\",\n\t\t\t\t\t\tcurrentAttempt: 1,\n\t\t\t\t\t\tmaxAttempts: 1,\n\t\t\t\t\t\terror: result.error,\n\t\t\t\t\t\tfailureMessage: result.message,\n\t\t\t\t\t\tnumUnsummarizedRuntimeOps: this.heuristicData.numRuntimeOps,\n\t\t\t\t\t\tnumUnsummarizedNonRuntimeOps: this.heuristicData.numNonRuntimeOps,\n\t\t\t\t\t\tisLastSummary,\n\t\t\t\t\t});\n\t\t\t\t\tthis.mc.logger.sendErrorEvent(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"SummarizeFailed\",\n\t\t\t\t\t\t\tmaxAttempts: 1,\n\t\t\t\t\t\t\tsummaryAttempts: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tresult.error,\n\t\t\t\t\t);\n\t\t\t\t\tif (isLastSummary) {\n\t\t\t\t\t\tthis.lastSummarizeFailureEventProps = {\n\t\t\t\t\t\t\tcurrentAttempt: (this.lastSummarizeFailureEventProps?.currentAttempt ?? 0) + 1,\n\t\t\t\t\t\t\tmaxAttempts: (this.lastSummarizeFailureEventProps?.currentAttempt ?? 0) + 1,\n\t\t\t\t\t\t\terror: result.error,\n\t\t\t\t\t\t\tfailureMessage: result.message,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tthis.afterSummaryAction();\n\t\t\t},\n\t\t).catch((error) => {\n\t\t\t// SummaryGenerator.summarize() does not throw exceptions - it converts them to failed result\n\t\t\t// on resultsBuilder\n\t\t\t// We do not care about exceptions on receivedSummaryAckOrNack - caller should check results\n\t\t\t// and take a appropriate action.\n\t\t});\n\n\t\treturn resultsBuilder.build();\n\t}\n\n\t/**\n\t * Heuristics summarize attempt.\n\t */\n\tprivate trySummarize(reason: SummarizeReason): void {\n\t\tif (this.summarizingLock !== undefined) {\n\t\t\t// lockedSummaryAction() will retry heuristic-based summary at the end of current attempt\n\t\t\t// if it's still needed\n\t\t\tthis.tryWhileSummarizing = true;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.lockedSummaryAction(\n\t\t\t() => {\n\t\t\t\tthis.beforeSummaryAction();\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\treturn this.trySummarizeWithRetries(reason);\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tthis.afterSummaryAction();\n\t\t\t},\n\t\t).catch((error) => {\n\t\t\tthis.mc.logger.sendErrorEvent({ eventName: \"UnexpectedSummarizeError\" }, error);\n\t\t});\n\t}\n\n\t/**\n\t * Tries to summarize with retries where retry is based on the failure params.\n\t * For example, summarization may be retried for failures with \"retryAfterSeconds\" param.\n\t */\n\tprivate async trySummarizeWithRetries(\n\t\treason: SummarizeReason,\n\t): Promise<ISummarizeResults | undefined> {\n\t\t// Helper to set summarize options, telemetry properties and call summarize.\n\t\tconst attemptSummarize = (\n\t\t\tattemptNumber: number,\n\t\t\tfinalAttempt: boolean,\n\t\t): {\n\t\t\tsummarizeProps: ISummarizeTelemetryProperties;\n\t\t\tsummarizeResult: ISummarizeResults;\n\t\t} => {\n\t\t\tconst summarizeOptions: ISummarizeOptions = {\n\t\t\t\tfullTree: false,\n\t\t\t};\n\t\t\tconst summarizeProps: ISummarizeTelemetryProperties = {\n\t\t\t\tsummarizeReason: reason,\n\t\t\t\tsummaryAttempts: attemptNumber,\n\t\t\t\t...summarizeOptions,\n\t\t\t\tfinalAttempt,\n\t\t\t};\n\t\t\tconst summaryLogger = createChildLogger({\n\t\t\t\tlogger: this.mc.logger,\n\t\t\t\tproperties: { all: summarizeProps },\n\t\t\t});\n\n\t\t\tconst summaryOptions: ISubmitSummaryOptions = {\n\t\t\t\t...summarizeOptions,\n\t\t\t\tsummaryLogger,\n\t\t\t\tcancellationToken: this.cancellationToken,\n\t\t\t\tfinalAttempt,\n\t\t\t\tlatestSummaryRefSeqNum: this.heuristicData.lastSuccessfulSummary.refSequenceNumber,\n\t\t\t};\n\t\t\tconst summarizeResult = this.generator.summarize(summaryOptions);\n\t\t\treturn { summarizeProps, summarizeResult };\n\t\t};\n\n\t\t// The max number of attempts are based on the stage at which summarization failed. If it fails before it is\n\t\t// submitted, a different value is used compared to if it fails after submission. Usually, in the former case,\n\t\t// we would retry more often as its cheaper and retries are likely to succeed.\n\t\t// This makes it harder to predict how many attempts would actually happen as that depends on how far an attempt\n\t\t// made. To keep things simple, the max attempts is reset after every attempt based on where it failed. This may\n\t\t// result in some failures not being retried depending on what happened before this attempt. That's fine because\n\t\t// such scenarios are very unlikely and even if it happens, it would resolve when a new summarizer starts over.\n\t\t// For example - When failure switches from one the submit failures to nack failure, only one more retry will\n\t\t// happen irrespective of the value of `defaultMaxAttempts`.\n\t\tlet maxAttempts = defaultMaxAttempts;\n\t\tlet currentAttempt = 0;\n\t\tlet retryAfterSeconds: number | undefined;\n\t\tlet done = false;\n\t\tlet status: \"success\" | \"failure\" | \"canceled\" = \"success\";\n\t\tlet results: ISummarizeResults | undefined;\n\t\tlet error: IRetriableFailureError | undefined;\n\t\tlet failureMessage: string | undefined;\n\t\tdo {\n\t\t\tcurrentAttempt++;\n\t\t\tif (this.cancellationToken.cancelled) {\n\t\t\t\tstatus = \"canceled\";\n\t\t\t\tdone = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst attemptResult = attemptSummarize(currentAttempt, false /* finalAttempt */);\n\t\t\tresults = attemptResult.summarizeResult;\n\n\t\t\t// Ack / nack is the final step, so if it succeeds we're done.\n\t\t\tconst ackNackResult = await results.receivedSummaryAckOrNack;\n\t\t\tif (ackNackResult.success) {\n\t\t\t\tstatus = \"success\";\n\t\t\t\tdone = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Update max attempts from the failure result.\n\t\t\t// If submit summary failed, use maxAttemptsForSubmitFailures. Else use the defaultMaxAttempts.\n\t\t\t// Note: Check \"summarySubmitted\" result first because if it fails, ack nack would fail as well.\n\t\t\tconst submitSummaryResult = await results.summarySubmitted;\n\t\t\tmaxAttempts = submitSummaryResult.success\n\t\t\t\t? defaultMaxAttempts\n\t\t\t\t: this.maxAttemptsForSubmitFailures;\n\n\t\t\t// Emit \"summarize\" event for this failed attempt.\n\t\t\tstatus = \"failure\";\n\t\t\terror = ackNackResult.error;\n\t\t\tfailureMessage = ackNackResult.message;\n\t\t\tretryAfterSeconds = error.retryAfterSeconds;\n\t\t\tconst eventProps: ISummarizeEventProps & ISummarizerObservabilityProps = {\n\t\t\t\tresult: status,\n\t\t\t\tcurrentAttempt,\n\t\t\t\tmaxAttempts,\n\t\t\t\terror,\n\t\t\t\tfailureMessage,\n\t\t\t\tnumUnsummarizedRuntimeOps: this.heuristicData.numRuntimeOps,\n\t\t\t\tnumUnsummarizedNonRuntimeOps: this.heuristicData.numNonRuntimeOps,\n\t\t\t};\n\t\t\tthis.emit(\"summarize\", eventProps);\n\n\t\t\t// Break if the failure doesn't have \"retryAfterSeconds\" or we are one less from max number of attempts.\n\t\t\t// Note that the final attempt if \"retryAfterSeconds\" does exist happens outside of the do..while loop.\n\t\t\tif (retryAfterSeconds === undefined || currentAttempt >= maxAttempts - 1) {\n\t\t\t\tdone = true;\n\t\t\t}\n\n\t\t\t// If the failure has \"retryAfterSeconds\", add a delay of that time before starting the next attempt.\n\t\t\tif (retryAfterSeconds !== undefined && retryAfterSeconds > 0) {\n\t\t\t\tthis.mc.logger.sendPerformanceEvent({\n\t\t\t\t\teventName: \"SummarizeAttemptDelay\",\n\t\t\t\t\tduration: retryAfterSeconds * 1000,\n\t\t\t\t\tsummaryNackDelay: ackNackResult.data !== undefined, // This will only be defined only for nack failures.\n\t\t\t\t\tstage: submitSummaryResult.data?.stage,\n\t\t\t\t\t...attemptResult.summarizeProps,\n\t\t\t\t});\n\t\t\t\tawait delay(retryAfterSeconds * 1000);\n\t\t\t}\n\t\t} while (!done);\n\n\t\t// If the attempt was successful, emit \"summarize\" event and return. A failed attempt may be retried below.\n\t\tif (status !== \"failure\") {\n\t\t\tthis.emit(\"summarize\", {\n\t\t\t\tresult: status,\n\t\t\t\tcurrentAttempt,\n\t\t\t\tmaxAttempts,\n\t\t\t\tnumUnsummarizedRuntimeOps: this.heuristicData.numRuntimeOps,\n\t\t\t\tnumUnsummarizedNonRuntimeOps: this.heuristicData.numNonRuntimeOps,\n\t\t\t});\n\t\t\treturn results;\n\t\t}\n\n\t\t// If summarization wasn't successful above and the failure contains \"retryAfterSeconds\", perform one last\n\t\t// attempt. This gives a chance to the runtime to perform additional steps in the last attempt.\n\t\tif (retryAfterSeconds !== undefined) {\n\t\t\tconst { summarizeResult } = attemptSummarize(++currentAttempt, true /* finalAttempt */);\n\t\t\t// Ack / nack is the final step, so if it succeeds we're done.\n\t\t\tconst ackNackResult = await summarizeResult.receivedSummaryAckOrNack;\n\t\t\tstatus = ackNackResult.success ? \"success\" : \"failure\";\n\t\t\terror = ackNackResult.success ? undefined : ackNackResult.error;\n\t\t\tfailureMessage = ackNackResult.success ? undefined : ackNackResult.message;\n\t\t\tconst eventProps: ISummarizeEventProps & ISummarizerObservabilityProps = {\n\t\t\t\tresult: status,\n\t\t\t\tcurrentAttempt,\n\t\t\t\tmaxAttempts,\n\t\t\t\terror,\n\t\t\t\tfailureMessage,\n\t\t\t\tnumUnsummarizedRuntimeOps: this.heuristicData.numRuntimeOps,\n\t\t\t\tnumUnsummarizedNonRuntimeOps: this.heuristicData.numNonRuntimeOps,\n\t\t\t};\n\t\t\tthis.emit(\"summarize\", eventProps);\n\t\t\tresults = summarizeResult;\n\t\t}\n\n\t\t// If summarization is still unsuccessful, stop the summarizer.\n\t\tif (status === \"failure\") {\n\t\t\tthis.mc.logger.sendErrorEvent(\n\t\t\t\t{\n\t\t\t\t\teventName: \"SummarizeFailed\",\n\t\t\t\t\tmaxAttempts,\n\t\t\t\t\tsummaryAttempts: currentAttempt,\n\t\t\t\t},\n\t\t\t\terror,\n\t\t\t);\n\t\t\tthis.lastSummarizeFailureEventProps = {\n\t\t\t\tcurrentAttempt,\n\t\t\t\tmaxAttempts,\n\t\t\t\terror,\n\t\t\t\tfailureMessage,\n\t\t\t};\n\t\t\tthis.stopSummarizerCallback(\"failToSummarize\");\n\t\t}\n\t\treturn results;\n\t}\n\n\t/**\n\t * Attempts to generate a summary on demand with retries in case of failures. The retry logic is the same\n\t * as heuristics based summaries.\n\t */\n\tprivate async summarizeOnDemandWithRetries(\n\t\treason: SummarizeReason,\n\t\tresultsBuilder: SummarizeResultBuilder,\n\t): Promise<ISummarizeResults> {\n\t\tconst results = await this.trySummarizeWithRetries(reason);\n\t\tif (results === undefined) {\n\t\t\tresultsBuilder.fail(\n\t\t\t\t\"Summarization was canceled\",\n\t\t\t\tnew RetriableSummaryError(\"Summarization was canceled\"),\n\t\t\t);\n\t\t\treturn resultsBuilder.build();\n\t\t}\n\t\tconst submitResult = await results.summarySubmitted;\n\t\tconst summaryOpBroadcastedResult = await results.summaryOpBroadcasted;\n\t\tconst ackNackResult = await results.receivedSummaryAckOrNack;\n\t\tresultsBuilder.summarySubmitted.resolve(submitResult);\n\t\tresultsBuilder.summaryOpBroadcasted.resolve(summaryOpBroadcastedResult);\n\t\tresultsBuilder.receivedSummaryAckOrNack.resolve(ackNackResult);\n\t\treturn resultsBuilder.build();\n\t}\n\n\t/**\n\t *{@inheritdoc (ISummarizer:interface).summarizeOnDemand}\n\t */\n\tpublic summarizeOnDemand(\n\t\toptions: IOnDemandSummarizeOptions,\n\t\tresultsBuilder: SummarizeResultBuilder = new SummarizeResultBuilder(),\n\t): ISummarizeResults {\n\t\tif (this.stopping) {\n\t\t\tresultsBuilder.fail(\n\t\t\t\t\"RunningSummarizer stopped or disposed\",\n\t\t\t\tnew RetriableSummaryError(\"RunningSummarizer stopped or disposed\"),\n\t\t\t);\n\t\t\treturn resultsBuilder.build();\n\t\t}\n\t\t// Check for concurrent summary attempts. If one is found,\n\t\t// return a promise that caller can await before trying again.\n\t\tif (this.summarizingLock !== undefined) {\n\t\t\t// The heuristics are blocking concurrent summarize attempts.\n\t\t\tthrow new UsageError(\"Attempted to run an already-running summarizer on demand\");\n\t\t}\n\n\t\tconst { reason, ...summarizeOptions } = options;\n\t\tif (options.retryOnFailure === true) {\n\t\t\tthis.summarizeOnDemandWithRetries(`onDemand;${reason}`, resultsBuilder).catch(\n\t\t\t\t(error: IRetriableFailureError) => {\n\t\t\t\t\tresultsBuilder.fail(\"summarize failed\", error);\n\t\t\t\t},\n\t\t\t);\n\t\t} else {\n\t\t\tthis.trySummarizeOnce(\n\t\t\t\t{ summarizeReason: `onDemand/${reason}` },\n\t\t\t\tsummarizeOptions,\n\t\t\t\tresultsBuilder,\n\t\t\t);\n\t\t}\n\t\treturn resultsBuilder.build();\n\t}\n\n\t/**\n\t *{@inheritdoc (ISummarizer:interface).enqueueSummarize}\n\t */\n\tpublic enqueueSummarize(options: IEnqueueSummarizeOptions): EnqueueSummarizeResult {\n\t\tconst { reason, afterSequenceNumber = 0, override = false, ...summarizeOptions } = options;\n\t\tlet overridden = false;\n\t\tif (this.enqueuedSummary !== undefined) {\n\t\t\tif (!override) {\n\t\t\t\treturn { alreadyEnqueued: true };\n\t\t\t}\n\t\t\t// Override existing enqueued summarize attempt.\n\t\t\tthis.enqueuedSummary.resultsBuilder.fail(\n\t\t\t\t\"Aborted; overridden by another enqueue summarize attempt\",\n\t\t\t\tnew RetriableSummaryError(\n\t\t\t\t\t\"Summary was overridden by another enqueue summarize attempt\",\n\t\t\t\t),\n\t\t\t);\n\t\t\tthis.enqueuedSummary = undefined;\n\t\t\toverridden = true;\n\t\t}\n\n\t\tthis.enqueuedSummary = {\n\t\t\treason: `enqueue;${reason}`,\n\t\t\tafterSequenceNumber,\n\t\t\tsummarizeOptions,\n\t\t\tresultsBuilder: new SummarizeResultBuilder(),\n\t\t};\n\t\tconst results = this.enqueuedSummary.resultsBuilder.build();\n\t\tthis.tryRunEnqueuedSummary();\n\t\treturn overridden\n\t\t\t? {\n\t\t\t\t\t...results,\n\t\t\t\t\talreadyEnqueued: true,\n\t\t\t\t\toverridden: true,\n\t\t\t\t}\n\t\t\t: results;\n\t}\n\n\tprivate tryRunEnqueuedSummary(): boolean {\n\t\tif (this.stopping) {\n\t\t\tthis.disposeEnqueuedSummary();\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\tthis.enqueuedSummary === undefined ||\n\t\t\tthis.heuristicData.lastOpSequenceNumber < this.enqueuedSummary.afterSequenceNumber ||\n\t\t\tthis.summarizingLock !== undefined\n\t\t) {\n\t\t\t// If no enqueued summary is ready or a summary is already in progress, take no action.\n\t\t\treturn false;\n\t\t}\n\t\tconst { reason, resultsBuilder, summarizeOptions } = this.enqueuedSummary;\n\t\t// Set to undefined first, so that subsequent enqueue attempt while summarize will occur later.\n\t\tthis.enqueuedSummary = undefined;\n\t\tthis.trySummarizeOnce(\n\t\t\t{ summarizeReason: `enqueuedSummary/${reason}` },\n\t\t\tsummarizeOptions,\n\t\t\tresultsBuilder,\n\t\t);\n\t\treturn true;\n\t}\n\n\tprivate disposeEnqueuedSummary(): void {\n\t\tif (this.enqueuedSummary !== undefined) {\n\t\t\tthis.enqueuedSummary.resultsBuilder.fail(\n\t\t\t\t\"RunningSummarizer stopped or disposed\",\n\t\t\t\tnew RetriableSummaryError(\"RunningSummarizer stopped or disposed\"),\n\t\t\t);\n\t\t\tthis.enqueuedSummary = undefined;\n\t\t}\n\t}\n}\n"]}
@@ -6,9 +6,20 @@ import { TypedEventEmitter } from "@fluid-internal/client-utils";
6
6
  import type { ISummarizerEvents, SummarizerStopReason } from "@fluidframework/container-runtime-definitions/internal";
7
7
  import { IFluidHandleContext } from "@fluidframework/core-interfaces/internal";
8
8
  import { IFluidErrorBase, ITelemetryLoggerExt, LoggingError } from "@fluidframework/telemetry-utils/internal";
9
+ import { IConnectableRuntime, IEnqueueSummarizeOptions, IOnDemandSummarizeOptions, ISummarizer, ISummarizerInternalsProvider, ISummarizerRuntime, ISummarizingWarning, type ISummaryConfiguration } from "../summarizerTypes.js";
10
+ import { SummaryCollection } from "../summaryCollection.js";
9
11
  import { ICancellableSummarizerController } from "./runWhileConnectedCoordinator.js";
10
- import { EnqueueSummarizeResult, IConnectableRuntime, IEnqueueSummarizeOptions, IOnDemandSummarizeOptions, ISummarizeResults, ISummarizer, ISummarizerInternalsProvider, ISummarizerRuntime, ISummarizingWarning, type ISummaryConfiguration } from "./summarizerTypes.js";
11
- import { SummaryCollection } from "./summaryCollection.js";
12
+ import type { EnqueueSummarizeResult, ISummarizeResults } from "./summaryResultTypes.js";
13
+ /**
14
+ * The maximum number of summarization attempts that will be done by default in case of failures
15
+ * that can be retried.
16
+ */
17
+ export declare const defaultMaxAttempts = 2;
18
+ /**
19
+ * The default value for maximum number of summarization attempts that will be done for summarization failures where
20
+ * submit fails and the failure can be retried.
21
+ */
22
+ export declare const defaultMaxAttemptsForSubmitFailures = 5;
12
23
  export declare class SummarizingWarning extends LoggingError implements ISummarizingWarning, IFluidErrorBase {
13
24
  readonly logged: boolean;
14
25
  readonly errorType = "summarizingError";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summarizer.ts"],"names":[],"mappings":"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"}