@fluidframework/container-runtime 2.0.0-internal.3.0.2 → 2.0.0-internal.3.2.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 (474) hide show
  1. package/.eslintrc.js +19 -19
  2. package/.mocharc.js +2 -2
  3. package/api-extractor.json +2 -2
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +2 -1
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +15 -2
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +109 -37
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/connectionTelemetry.d.ts.map +1 -1
  12. package/dist/connectionTelemetry.js +11 -9
  13. package/dist/connectionTelemetry.js.map +1 -1
  14. package/dist/containerHandleContext.d.ts.map +1 -1
  15. package/dist/containerHandleContext.js +3 -1
  16. package/dist/containerHandleContext.js.map +1 -1
  17. package/dist/containerRuntime.d.ts +23 -11
  18. package/dist/containerRuntime.d.ts.map +1 -1
  19. package/dist/containerRuntime.js +225 -132
  20. package/dist/containerRuntime.js.map +1 -1
  21. package/dist/dataStore.d.ts.map +1 -1
  22. package/dist/dataStore.js +11 -9
  23. package/dist/dataStore.js.map +1 -1
  24. package/dist/dataStoreContext.d.ts +27 -13
  25. package/dist/dataStoreContext.d.ts.map +1 -1
  26. package/dist/dataStoreContext.js +95 -56
  27. package/dist/dataStoreContext.js.map +1 -1
  28. package/dist/dataStoreContexts.d.ts.map +1 -1
  29. package/dist/dataStoreContexts.js +7 -3
  30. package/dist/dataStoreContexts.js.map +1 -1
  31. package/dist/dataStoreRegistry.d.ts.map +1 -1
  32. package/dist/dataStoreRegistry.js +3 -1
  33. package/dist/dataStoreRegistry.js.map +1 -1
  34. package/dist/dataStores.d.ts +28 -4
  35. package/dist/dataStores.d.ts.map +1 -1
  36. package/dist/dataStores.js +122 -44
  37. package/dist/dataStores.js.map +1 -1
  38. package/dist/deltaScheduler.d.ts.map +1 -1
  39. package/dist/deltaScheduler.js +8 -3
  40. package/dist/deltaScheduler.js.map +1 -1
  41. package/dist/{garbageCollection.d.ts → gc/garbageCollection.d.ts} +27 -203
  42. package/dist/gc/garbageCollection.d.ts.map +1 -0
  43. package/dist/{garbageCollection.js → gc/garbageCollection.js} +210 -400
  44. package/dist/gc/garbageCollection.js.map +1 -0
  45. package/dist/gc/gcDefinitions.d.ts +189 -0
  46. package/dist/gc/gcDefinitions.d.ts.map +1 -0
  47. package/dist/{garbageCollectionConstants.js → gc/gcDefinitions.js} +27 -2
  48. package/dist/gc/gcDefinitions.js.map +1 -0
  49. package/dist/gc/gcHelpers.d.ts +30 -0
  50. package/dist/gc/gcHelpers.d.ts.map +1 -0
  51. package/dist/gc/gcHelpers.js +65 -0
  52. package/dist/gc/gcHelpers.js.map +1 -0
  53. package/dist/gc/gcSummaryStateTracker.d.ts +86 -0
  54. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
  55. package/dist/gc/gcSummaryStateTracker.js +246 -0
  56. package/dist/gc/gcSummaryStateTracker.js.map +1 -0
  57. package/{lib → dist/gc}/gcSweepReadyUsageDetection.d.ts +5 -5
  58. package/dist/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
  59. package/dist/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +15 -11
  60. package/dist/gc/gcSweepReadyUsageDetection.js.map +1 -0
  61. package/dist/gc/gcUnreferencedStateTracker.d.ts +34 -0
  62. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  63. package/dist/gc/gcUnreferencedStateTracker.js +94 -0
  64. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -0
  65. package/dist/gc/index.d.ts +11 -0
  66. package/dist/gc/index.d.ts.map +1 -0
  67. package/dist/gc/index.js +40 -0
  68. package/dist/gc/index.js.map +1 -0
  69. package/dist/index.d.ts +2 -5
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +6 -9
  72. package/dist/index.js.map +1 -1
  73. package/dist/opLifecycle/batchManager.d.ts +2 -13
  74. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  75. package/dist/opLifecycle/batchManager.js +19 -41
  76. package/dist/opLifecycle/batchManager.js.map +1 -1
  77. package/dist/opLifecycle/definitions.d.ts +4 -0
  78. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  79. package/dist/opLifecycle/definitions.js.map +1 -1
  80. package/dist/opLifecycle/index.d.ts.map +1 -1
  81. package/dist/opLifecycle/index.js.map +1 -1
  82. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  83. package/dist/opLifecycle/opCompressor.js +1 -0
  84. package/dist/opLifecycle/opCompressor.js.map +1 -1
  85. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  86. package/dist/opLifecycle/opDecompressor.js +5 -2
  87. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  88. package/dist/opLifecycle/opSplitter.d.ts +1 -1
  89. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  90. package/dist/opLifecycle/opSplitter.js +24 -13
  91. package/dist/opLifecycle/opSplitter.js.map +1 -1
  92. package/dist/opLifecycle/outbox.d.ts +19 -3
  93. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  94. package/dist/opLifecycle/outbox.js +78 -45
  95. package/dist/opLifecycle/outbox.js.map +1 -1
  96. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  97. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  98. package/dist/opProperties.d.ts.map +1 -1
  99. package/dist/opProperties.js +1 -3
  100. package/dist/opProperties.js.map +1 -1
  101. package/dist/packageVersion.d.ts +1 -1
  102. package/dist/packageVersion.js +1 -1
  103. package/dist/packageVersion.js.map +1 -1
  104. package/dist/pendingStateManager.d.ts +8 -2
  105. package/dist/pendingStateManager.d.ts.map +1 -1
  106. package/dist/pendingStateManager.js +21 -13
  107. package/dist/pendingStateManager.js.map +1 -1
  108. package/dist/scheduleManager.d.ts.map +1 -1
  109. package/dist/scheduleManager.js +3 -2
  110. package/dist/scheduleManager.js.map +1 -1
  111. package/dist/serializedSnapshotStorage.d.ts +2 -2
  112. package/dist/serializedSnapshotStorage.d.ts.map +1 -1
  113. package/dist/serializedSnapshotStorage.js +5 -3
  114. package/dist/serializedSnapshotStorage.js.map +1 -1
  115. package/dist/summary/index.d.ts +17 -0
  116. package/dist/summary/index.d.ts.map +1 -0
  117. package/dist/summary/index.js +47 -0
  118. package/dist/summary/index.js.map +1 -0
  119. package/dist/summary/orderedClientElection.d.ts.map +1 -0
  120. package/dist/{orderedClientElection.js → summary/orderedClientElection.js} +10 -4
  121. package/dist/summary/orderedClientElection.js.map +1 -0
  122. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  123. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
  124. package/{lib → dist/summary}/runningSummarizer.d.ts +19 -18
  125. package/dist/summary/runningSummarizer.d.ts.map +1 -0
  126. package/dist/{runningSummarizer.js → summary/runningSummarizer.js} +191 -76
  127. package/dist/summary/runningSummarizer.js.map +1 -0
  128. package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +4 -6
  129. package/dist/summary/summarizer.d.ts.map +1 -0
  130. package/dist/{summarizer.js → summary/summarizer.js} +31 -71
  131. package/dist/summary/summarizer.js.map +1 -0
  132. package/dist/summary/summarizerClientElection.d.ts.map +1 -0
  133. package/dist/summary/summarizerClientElection.js.map +1 -0
  134. package/dist/summary/summarizerHandle.d.ts.map +1 -0
  135. package/dist/summary/summarizerHandle.js.map +1 -0
  136. package/{lib → dist/summary}/summarizerHeuristics.d.ts +1 -1
  137. package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
  138. package/dist/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +6 -9
  139. package/dist/summary/summarizerHeuristics.js.map +1 -0
  140. package/{lib → dist/summary}/summarizerTypes.d.ts +22 -22
  141. package/dist/summary/summarizerTypes.d.ts.map +1 -0
  142. package/dist/summary/summarizerTypes.js.map +1 -0
  143. package/dist/summary/summaryCollection.d.ts.map +1 -0
  144. package/dist/{summaryCollection.js → summary/summaryCollection.js} +18 -8
  145. package/dist/summary/summaryCollection.js.map +1 -0
  146. package/{lib → dist/summary}/summaryFormat.d.ts +1 -40
  147. package/dist/summary/summaryFormat.d.ts.map +1 -0
  148. package/dist/{summaryFormat.js → summary/summaryFormat.js} +19 -20
  149. package/dist/summary/summaryFormat.js.map +1 -0
  150. package/dist/summary/summaryGenerator.d.ts.map +1 -0
  151. package/dist/{summaryGenerator.js → summary/summaryGenerator.js} +33 -15
  152. package/dist/summary/summaryGenerator.js.map +1 -0
  153. package/dist/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
  154. package/dist/summary/summaryManager.d.ts.map +1 -0
  155. package/dist/{summaryManager.js → summary/summaryManager.js} +21 -9
  156. package/dist/summary/summaryManager.js.map +1 -0
  157. package/dist/throttler.d.ts +2 -2
  158. package/dist/throttler.d.ts.map +1 -1
  159. package/dist/throttler.js +4 -4
  160. package/dist/throttler.js.map +1 -1
  161. package/lib/batchTracker.d.ts.map +1 -1
  162. package/lib/batchTracker.js +2 -1
  163. package/lib/batchTracker.js.map +1 -1
  164. package/lib/blobManager.d.ts +15 -2
  165. package/lib/blobManager.d.ts.map +1 -1
  166. package/lib/blobManager.js +109 -37
  167. package/lib/blobManager.js.map +1 -1
  168. package/lib/connectionTelemetry.d.ts.map +1 -1
  169. package/lib/connectionTelemetry.js +11 -9
  170. package/lib/connectionTelemetry.js.map +1 -1
  171. package/lib/containerHandleContext.d.ts.map +1 -1
  172. package/lib/containerHandleContext.js +3 -1
  173. package/lib/containerHandleContext.js.map +1 -1
  174. package/lib/containerRuntime.d.ts +23 -11
  175. package/lib/containerRuntime.d.ts.map +1 -1
  176. package/lib/containerRuntime.js +201 -108
  177. package/lib/containerRuntime.js.map +1 -1
  178. package/lib/dataStore.d.ts.map +1 -1
  179. package/lib/dataStore.js +11 -9
  180. package/lib/dataStore.js.map +1 -1
  181. package/lib/dataStoreContext.d.ts +27 -13
  182. package/lib/dataStoreContext.d.ts.map +1 -1
  183. package/lib/dataStoreContext.js +84 -45
  184. package/lib/dataStoreContext.js.map +1 -1
  185. package/lib/dataStoreContexts.d.ts.map +1 -1
  186. package/lib/dataStoreContexts.js +7 -3
  187. package/lib/dataStoreContexts.js.map +1 -1
  188. package/lib/dataStoreRegistry.d.ts.map +1 -1
  189. package/lib/dataStoreRegistry.js +3 -1
  190. package/lib/dataStoreRegistry.js.map +1 -1
  191. package/lib/dataStores.d.ts +28 -4
  192. package/lib/dataStores.d.ts.map +1 -1
  193. package/lib/dataStores.js +120 -42
  194. package/lib/dataStores.js.map +1 -1
  195. package/lib/deltaScheduler.d.ts.map +1 -1
  196. package/lib/deltaScheduler.js +9 -4
  197. package/lib/deltaScheduler.js.map +1 -1
  198. package/lib/{garbageCollection.d.ts → gc/garbageCollection.d.ts} +27 -203
  199. package/lib/gc/garbageCollection.d.ts.map +1 -0
  200. package/lib/{garbageCollection.js → gc/garbageCollection.js} +190 -379
  201. package/lib/gc/garbageCollection.js.map +1 -0
  202. package/lib/gc/gcDefinitions.d.ts +189 -0
  203. package/lib/gc/gcDefinitions.d.ts.map +1 -0
  204. package/lib/{garbageCollectionConstants.js → gc/gcDefinitions.js} +26 -1
  205. package/lib/gc/gcDefinitions.js.map +1 -0
  206. package/lib/gc/gcHelpers.d.ts +30 -0
  207. package/lib/gc/gcHelpers.d.ts.map +1 -0
  208. package/lib/gc/gcHelpers.js +58 -0
  209. package/lib/gc/gcHelpers.js.map +1 -0
  210. package/lib/gc/gcSummaryStateTracker.d.ts +86 -0
  211. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
  212. package/lib/gc/gcSummaryStateTracker.js +242 -0
  213. package/lib/gc/gcSummaryStateTracker.js.map +1 -0
  214. package/{dist → lib/gc}/gcSweepReadyUsageDetection.d.ts +5 -5
  215. package/lib/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
  216. package/lib/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +15 -11
  217. package/lib/gc/gcSweepReadyUsageDetection.js.map +1 -0
  218. package/lib/gc/gcUnreferencedStateTracker.d.ts +34 -0
  219. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  220. package/lib/gc/gcUnreferencedStateTracker.js +90 -0
  221. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -0
  222. package/lib/gc/index.d.ts +11 -0
  223. package/lib/gc/index.d.ts.map +1 -0
  224. package/lib/gc/index.js +11 -0
  225. package/lib/gc/index.js.map +1 -0
  226. package/lib/index.d.ts +2 -5
  227. package/lib/index.d.ts.map +1 -1
  228. package/lib/index.js +1 -4
  229. package/lib/index.js.map +1 -1
  230. package/lib/opLifecycle/batchManager.d.ts +2 -13
  231. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  232. package/lib/opLifecycle/batchManager.js +19 -41
  233. package/lib/opLifecycle/batchManager.js.map +1 -1
  234. package/lib/opLifecycle/definitions.d.ts +4 -0
  235. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  236. package/lib/opLifecycle/definitions.js.map +1 -1
  237. package/lib/opLifecycle/index.d.ts.map +1 -1
  238. package/lib/opLifecycle/index.js.map +1 -1
  239. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  240. package/lib/opLifecycle/opCompressor.js +1 -0
  241. package/lib/opLifecycle/opCompressor.js.map +1 -1
  242. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  243. package/lib/opLifecycle/opDecompressor.js +5 -2
  244. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  245. package/lib/opLifecycle/opSplitter.d.ts +1 -1
  246. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  247. package/lib/opLifecycle/opSplitter.js +25 -14
  248. package/lib/opLifecycle/opSplitter.js.map +1 -1
  249. package/lib/opLifecycle/outbox.d.ts +19 -3
  250. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  251. package/lib/opLifecycle/outbox.js +79 -46
  252. package/lib/opLifecycle/outbox.js.map +1 -1
  253. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  254. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  255. package/lib/opProperties.d.ts.map +1 -1
  256. package/lib/opProperties.js +1 -3
  257. package/lib/opProperties.js.map +1 -1
  258. package/lib/packageVersion.d.ts +1 -1
  259. package/lib/packageVersion.js +1 -1
  260. package/lib/packageVersion.js.map +1 -1
  261. package/lib/pendingStateManager.d.ts +8 -2
  262. package/lib/pendingStateManager.d.ts.map +1 -1
  263. package/lib/pendingStateManager.js +21 -13
  264. package/lib/pendingStateManager.js.map +1 -1
  265. package/lib/scheduleManager.d.ts.map +1 -1
  266. package/lib/scheduleManager.js +3 -2
  267. package/lib/scheduleManager.js.map +1 -1
  268. package/lib/serializedSnapshotStorage.d.ts +2 -2
  269. package/lib/serializedSnapshotStorage.d.ts.map +1 -1
  270. package/lib/serializedSnapshotStorage.js +5 -3
  271. package/lib/serializedSnapshotStorage.js.map +1 -1
  272. package/lib/summary/index.d.ts +17 -0
  273. package/lib/summary/index.d.ts.map +1 -0
  274. package/lib/summary/index.js +16 -0
  275. package/lib/summary/index.js.map +1 -0
  276. package/lib/summary/orderedClientElection.d.ts.map +1 -0
  277. package/lib/{orderedClientElection.js → summary/orderedClientElection.js} +10 -4
  278. package/lib/summary/orderedClientElection.js.map +1 -0
  279. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  280. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -0
  281. package/{dist → lib/summary}/runningSummarizer.d.ts +19 -18
  282. package/lib/summary/runningSummarizer.d.ts.map +1 -0
  283. package/lib/{runningSummarizer.js → summary/runningSummarizer.js} +193 -78
  284. package/lib/summary/runningSummarizer.js.map +1 -0
  285. package/lib/{summarizer.d.ts → summary/summarizer.d.ts} +4 -6
  286. package/lib/summary/summarizer.d.ts.map +1 -0
  287. package/lib/{summarizer.js → summary/summarizer.js} +33 -73
  288. package/lib/summary/summarizer.js.map +1 -0
  289. package/lib/summary/summarizerClientElection.d.ts.map +1 -0
  290. package/lib/summary/summarizerClientElection.js.map +1 -0
  291. package/lib/summary/summarizerHandle.d.ts.map +1 -0
  292. package/lib/summary/summarizerHandle.js.map +1 -0
  293. package/{dist → lib/summary}/summarizerHeuristics.d.ts +1 -1
  294. package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
  295. package/lib/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +6 -9
  296. package/lib/summary/summarizerHeuristics.js.map +1 -0
  297. package/{dist → lib/summary}/summarizerTypes.d.ts +22 -22
  298. package/lib/summary/summarizerTypes.d.ts.map +1 -0
  299. package/lib/summary/summarizerTypes.js.map +1 -0
  300. package/lib/summary/summaryCollection.d.ts.map +1 -0
  301. package/lib/{summaryCollection.js → summary/summaryCollection.js} +18 -8
  302. package/lib/summary/summaryCollection.js.map +1 -0
  303. package/{dist → lib/summary}/summaryFormat.d.ts +1 -40
  304. package/lib/summary/summaryFormat.d.ts.map +1 -0
  305. package/lib/{summaryFormat.js → summary/summaryFormat.js} +20 -20
  306. package/lib/summary/summaryFormat.js.map +1 -0
  307. package/lib/summary/summaryGenerator.d.ts.map +1 -0
  308. package/lib/{summaryGenerator.js → summary/summaryGenerator.js} +33 -15
  309. package/lib/summary/summaryGenerator.js.map +1 -0
  310. package/lib/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
  311. package/lib/summary/summaryManager.d.ts.map +1 -0
  312. package/lib/{summaryManager.js → summary/summaryManager.js} +21 -9
  313. package/lib/summary/summaryManager.js.map +1 -0
  314. package/lib/throttler.d.ts +2 -2
  315. package/lib/throttler.d.ts.map +1 -1
  316. package/lib/throttler.js +4 -4
  317. package/lib/throttler.js.map +1 -1
  318. package/package.json +60 -51
  319. package/prettier.config.cjs +1 -1
  320. package/src/batchTracker.ts +54 -49
  321. package/src/blobManager.ts +825 -674
  322. package/src/connectionTelemetry.ts +280 -249
  323. package/src/containerHandleContext.ts +27 -29
  324. package/src/containerRuntime.ts +3249 -2978
  325. package/src/dataStore.ts +172 -159
  326. package/src/dataStoreContext.ts +1141 -1057
  327. package/src/dataStoreContexts.ts +178 -161
  328. package/src/dataStoreRegistry.ts +25 -20
  329. package/src/dataStores.ts +880 -731
  330. package/src/deltaScheduler.ts +158 -150
  331. package/{garbageCollection.md → src/gc/garbageCollection.md} +16 -3
  332. package/src/gc/garbageCollection.ts +1506 -0
  333. package/src/gc/gcDefinitions.ts +244 -0
  334. package/src/gc/gcHelpers.ts +86 -0
  335. package/src/gc/gcSummaryStateTracker.ts +339 -0
  336. package/src/gc/gcSweepReadyUsageDetection.ts +145 -0
  337. package/src/gc/gcUnreferencedStateTracker.ts +114 -0
  338. package/src/gc/index.ts +40 -0
  339. package/src/index.ts +67 -70
  340. package/src/opLifecycle/README.md +152 -0
  341. package/src/opLifecycle/batchManager.ts +101 -144
  342. package/src/opLifecycle/definitions.ts +33 -29
  343. package/src/opLifecycle/index.ts +5 -5
  344. package/src/opLifecycle/opCompressor.ts +55 -53
  345. package/src/opLifecycle/opDecompressor.ts +100 -81
  346. package/src/opLifecycle/opSplitter.ts +233 -188
  347. package/src/opLifecycle/outbox.ts +251 -195
  348. package/src/opLifecycle/remoteMessageProcessor.ts +62 -62
  349. package/src/opProperties.ts +11 -9
  350. package/src/packageVersion.ts +1 -1
  351. package/src/pendingStateManager.ts +396 -338
  352. package/src/scheduleManager.ts +299 -269
  353. package/src/serializedSnapshotStorage.ts +126 -112
  354. package/src/summary/index.ts +99 -0
  355. package/src/summary/orderedClientElection.ts +564 -0
  356. package/src/summary/runWhileConnectedCoordinator.ts +113 -0
  357. package/src/summary/runningSummarizer.ts +788 -0
  358. package/src/summary/summarizer.ts +386 -0
  359. package/src/summary/summarizerClientElection.ts +139 -0
  360. package/src/{summarizerHandle.ts → summary/summarizerHandle.ts} +11 -9
  361. package/src/summary/summarizerHeuristics.ts +219 -0
  362. package/src/summary/summarizerTypes.ts +521 -0
  363. package/src/summary/summaryCollection.ts +450 -0
  364. package/src/summary/summaryFormat.ts +226 -0
  365. package/src/summary/summaryGenerator.ts +505 -0
  366. package/src/summary/summaryManager.ts +423 -0
  367. package/src/throttler.ts +131 -122
  368. package/tsconfig.esnext.json +6 -6
  369. package/tsconfig.json +9 -13
  370. package/dist/garbageCollection.d.ts.map +0 -1
  371. package/dist/garbageCollection.js.map +0 -1
  372. package/dist/garbageCollectionConstants.d.ts +0 -25
  373. package/dist/garbageCollectionConstants.d.ts.map +0 -1
  374. package/dist/garbageCollectionConstants.js.map +0 -1
  375. package/dist/garbageCollectionTombstoneUtils.d.ts +0 -14
  376. package/dist/garbageCollectionTombstoneUtils.d.ts.map +0 -1
  377. package/dist/garbageCollectionTombstoneUtils.js +0 -23
  378. package/dist/garbageCollectionTombstoneUtils.js.map +0 -1
  379. package/dist/gcSweepReadyUsageDetection.d.ts.map +0 -1
  380. package/dist/gcSweepReadyUsageDetection.js.map +0 -1
  381. package/dist/orderedClientElection.d.ts.map +0 -1
  382. package/dist/orderedClientElection.js.map +0 -1
  383. package/dist/runWhileConnectedCoordinator.d.ts.map +0 -1
  384. package/dist/runWhileConnectedCoordinator.js.map +0 -1
  385. package/dist/runningSummarizer.d.ts.map +0 -1
  386. package/dist/runningSummarizer.js.map +0 -1
  387. package/dist/summarizer.d.ts.map +0 -1
  388. package/dist/summarizer.js.map +0 -1
  389. package/dist/summarizerClientElection.d.ts.map +0 -1
  390. package/dist/summarizerClientElection.js.map +0 -1
  391. package/dist/summarizerHandle.d.ts.map +0 -1
  392. package/dist/summarizerHandle.js.map +0 -1
  393. package/dist/summarizerHeuristics.d.ts.map +0 -1
  394. package/dist/summarizerHeuristics.js.map +0 -1
  395. package/dist/summarizerTypes.d.ts.map +0 -1
  396. package/dist/summarizerTypes.js.map +0 -1
  397. package/dist/summaryCollection.d.ts.map +0 -1
  398. package/dist/summaryCollection.js.map +0 -1
  399. package/dist/summaryFormat.d.ts.map +0 -1
  400. package/dist/summaryFormat.js.map +0 -1
  401. package/dist/summaryGenerator.d.ts.map +0 -1
  402. package/dist/summaryGenerator.js.map +0 -1
  403. package/dist/summaryManager.d.ts.map +0 -1
  404. package/dist/summaryManager.js.map +0 -1
  405. package/lib/garbageCollection.d.ts.map +0 -1
  406. package/lib/garbageCollection.js.map +0 -1
  407. package/lib/garbageCollectionConstants.d.ts +0 -25
  408. package/lib/garbageCollectionConstants.d.ts.map +0 -1
  409. package/lib/garbageCollectionConstants.js.map +0 -1
  410. package/lib/garbageCollectionTombstoneUtils.d.ts +0 -14
  411. package/lib/garbageCollectionTombstoneUtils.d.ts.map +0 -1
  412. package/lib/garbageCollectionTombstoneUtils.js +0 -19
  413. package/lib/garbageCollectionTombstoneUtils.js.map +0 -1
  414. package/lib/gcSweepReadyUsageDetection.d.ts.map +0 -1
  415. package/lib/gcSweepReadyUsageDetection.js.map +0 -1
  416. package/lib/orderedClientElection.d.ts.map +0 -1
  417. package/lib/orderedClientElection.js.map +0 -1
  418. package/lib/runWhileConnectedCoordinator.d.ts.map +0 -1
  419. package/lib/runWhileConnectedCoordinator.js.map +0 -1
  420. package/lib/runningSummarizer.d.ts.map +0 -1
  421. package/lib/runningSummarizer.js.map +0 -1
  422. package/lib/summarizer.d.ts.map +0 -1
  423. package/lib/summarizer.js.map +0 -1
  424. package/lib/summarizerClientElection.d.ts.map +0 -1
  425. package/lib/summarizerClientElection.js.map +0 -1
  426. package/lib/summarizerHandle.d.ts.map +0 -1
  427. package/lib/summarizerHandle.js.map +0 -1
  428. package/lib/summarizerHeuristics.d.ts.map +0 -1
  429. package/lib/summarizerHeuristics.js.map +0 -1
  430. package/lib/summarizerTypes.d.ts.map +0 -1
  431. package/lib/summarizerTypes.js.map +0 -1
  432. package/lib/summaryCollection.d.ts.map +0 -1
  433. package/lib/summaryCollection.js.map +0 -1
  434. package/lib/summaryFormat.d.ts.map +0 -1
  435. package/lib/summaryFormat.js.map +0 -1
  436. package/lib/summaryGenerator.d.ts.map +0 -1
  437. package/lib/summaryGenerator.js.map +0 -1
  438. package/lib/summaryManager.d.ts.map +0 -1
  439. package/lib/summaryManager.js.map +0 -1
  440. package/src/garbageCollection.ts +0 -1800
  441. package/src/garbageCollectionConstants.ts +0 -41
  442. package/src/garbageCollectionTombstoneUtils.ts +0 -28
  443. package/src/gcSweepReadyUsageDetection.ts +0 -139
  444. package/src/orderedClientElection.ts +0 -532
  445. package/src/runWhileConnectedCoordinator.ts +0 -106
  446. package/src/runningSummarizer.ts +0 -610
  447. package/src/summarizer.ts +0 -421
  448. package/src/summarizerClientElection.ts +0 -132
  449. package/src/summarizerHeuristics.ts +0 -222
  450. package/src/summarizerTypes.ts +0 -507
  451. package/src/summaryCollection.ts +0 -421
  452. package/src/summaryFormat.ts +0 -256
  453. package/src/summaryGenerator.ts +0 -450
  454. package/src/summaryManager.ts +0 -394
  455. /package/dist/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
  456. /package/dist/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +0 -0
  457. /package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +0 -0
  458. /package/dist/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
  459. /package/dist/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
  460. /package/dist/{summarizerHandle.d.ts → summary/summarizerHandle.d.ts} +0 -0
  461. /package/dist/{summarizerHandle.js → summary/summarizerHandle.js} +0 -0
  462. /package/dist/{summarizerTypes.js → summary/summarizerTypes.js} +0 -0
  463. /package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
  464. /package/dist/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
  465. /package/lib/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
  466. /package/lib/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +0 -0
  467. /package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +0 -0
  468. /package/lib/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
  469. /package/lib/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
  470. /package/lib/{summarizerHandle.d.ts → summary/summarizerHandle.d.ts} +0 -0
  471. /package/lib/{summarizerHandle.js → summary/summarizerHandle.js} +0 -0
  472. /package/lib/{summarizerTypes.js → summary/summarizerTypes.js} +0 -0
  473. /package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
  474. /package/lib/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
@@ -0,0 +1,505 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { ITelemetryLogger } from "@fluidframework/common-definitions";
7
+ import {
8
+ assert,
9
+ Deferred,
10
+ IPromiseTimer,
11
+ IPromiseTimerResult,
12
+ Timer,
13
+ } from "@fluidframework/common-utils";
14
+ import { MessageType } from "@fluidframework/protocol-definitions";
15
+ import { PerformanceEvent, LoggingError, ChildLogger } from "@fluidframework/telemetry-utils";
16
+ import { getRetryDelaySecondsFromError } from "@fluidframework/driver-utils";
17
+ import { DriverErrorType } from "@fluidframework/driver-definitions";
18
+ import {
19
+ IAckSummaryResult,
20
+ INackSummaryResult,
21
+ ISummarizeOptions,
22
+ IBroadcastSummaryResult,
23
+ ISummarizeResults,
24
+ ISummarizeHeuristicData,
25
+ ISubmitSummaryOptions,
26
+ SubmitSummaryResult,
27
+ SummarizeResultPart,
28
+ ISummaryCancellationToken,
29
+ ISummarizeTelemetryProperties,
30
+ SummaryGeneratorTelemetry,
31
+ } from "./summarizerTypes";
32
+ import { IClientSummaryWatcher } from "./summaryCollection";
33
+
34
+ export type raceTimerResult<T> =
35
+ | { result: "done"; value: T }
36
+ | { result: IPromiseTimerResult["timerResult"] }
37
+ | { result: "cancelled" };
38
+
39
+ /** Helper function to wait for a promise or PromiseTimer to elapse. */
40
+ export async function raceTimer<T>(
41
+ promise: Promise<T>,
42
+ timer: Promise<IPromiseTimerResult>,
43
+ cancellationToken?: ISummaryCancellationToken,
44
+ ): Promise<raceTimerResult<T>> {
45
+ const promises: Promise<raceTimerResult<T>>[] = [
46
+ promise.then((value) => ({ result: "done", value } as const)),
47
+ timer.then(({ timerResult: result }) => ({ result } as const)),
48
+ ];
49
+ if (cancellationToken !== undefined) {
50
+ promises.push(
51
+ cancellationToken.waitCancelled.then(() => ({ result: "cancelled" } as const)),
52
+ );
53
+ }
54
+ return Promise.race(promises);
55
+ }
56
+
57
+ // Send some telemetry if generate summary takes too long
58
+ const maxSummarizeTimeoutTime = 20000; // 20 sec
59
+ const maxSummarizeTimeoutCount = 5; // Double and resend 5 times
60
+
61
+ export type SummarizeReason =
62
+ /**
63
+ * Attempt to summarize after idle timeout has elapsed.
64
+ * Idle timer restarts whenever an op is received. So this
65
+ * triggers only after some amount of time has passed with
66
+ * no ops being received.
67
+ */
68
+ | "idle"
69
+ /**
70
+ * Attempt to summarize after a maximum time since last
71
+ * successful summary has passed. This measures time since
72
+ * last summary ack op was processed.
73
+ */
74
+ | "maxTime"
75
+ /**
76
+ * Attempt to summarize after a maximum number of ops have
77
+ * passed since the last successful summary. This compares
78
+ * op sequence numbers with the reference sequence number
79
+ * of the summarize op corresponding to the last summary
80
+ * ack op.
81
+ */
82
+ | "maxOps"
83
+ /**
84
+ * Special case to attempt to summarize one last time before the
85
+ * summarizer client closes itself. This is to prevent cases where
86
+ * the summarizer client never gets a chance to summarize, because
87
+ * there are too many outstanding ops and/or parent client cannot
88
+ * stay connected long enough for summarizer client to catch up.
89
+ */
90
+ | "lastSummary"
91
+ /** On-demand summary requested with specified reason. */
92
+ | `onDemand;${string}`
93
+ /** Enqueue summarize attempt with specified reason. */
94
+ | `enqueue;${string}`;
95
+
96
+ const summarizeErrors = {
97
+ /**
98
+ * Error encountered while generating the summary tree, uploading
99
+ * it to storage, or submitting the op. It could be a result of
100
+ * the client becoming disconnected while generating or an actual error.
101
+ */
102
+ submitSummaryFailure: "Error while generating, uploading, or submitting summary",
103
+ /**
104
+ * The summaryAckWaitTimeout time has elapsed before receiving the summarize op
105
+ * sent by this summarize attempt. It is expected to be broadcast quickly.
106
+ */
107
+ summaryOpWaitTimeout: "Timeout while waiting for summarize op broadcast",
108
+ /**
109
+ * The summaryAckWaitTimeout time has elapsed before receiving either a
110
+ * summaryAck or summaryNack op from the server in response to this
111
+ * summarize attempt. It is expected that the server should respond.
112
+ */
113
+ summaryAckWaitTimeout: "Timeout while waiting for summaryAck/summaryNack op",
114
+ /**
115
+ * The server responded with a summaryNack op, thus rejecting this
116
+ * summarize attempt.
117
+ */
118
+ summaryNack: "Server rejected summary via summaryNack op",
119
+
120
+ disconnect: "Summary cancelled due to summarizer or main client disconnect",
121
+ } as const;
122
+
123
+ export class SummarizeResultBuilder {
124
+ public readonly summarySubmitted = new Deferred<SummarizeResultPart<SubmitSummaryResult>>();
125
+ public readonly summaryOpBroadcasted = new Deferred<
126
+ SummarizeResultPart<IBroadcastSummaryResult>
127
+ >();
128
+ public readonly receivedSummaryAckOrNack = new Deferred<
129
+ SummarizeResultPart<IAckSummaryResult, INackSummaryResult>
130
+ >();
131
+
132
+ public fail(
133
+ message: string,
134
+ error: any,
135
+ nackSummaryResult?: INackSummaryResult,
136
+ retryAfterSeconds?: number,
137
+ ) {
138
+ assert(
139
+ !this.receivedSummaryAckOrNack.isCompleted,
140
+ 0x25e /* "no reason to call fail if all promises have been completed" */,
141
+ );
142
+
143
+ const result: SummarizeResultPart<undefined> = {
144
+ success: false,
145
+ message,
146
+ data: undefined,
147
+ error,
148
+ retryAfterSeconds,
149
+ } as const;
150
+ this.summarySubmitted.resolve(result);
151
+ this.summaryOpBroadcasted.resolve(result);
152
+ this.receivedSummaryAckOrNack.resolve({ ...result, data: nackSummaryResult });
153
+ }
154
+ public build(): ISummarizeResults {
155
+ return {
156
+ summarySubmitted: this.summarySubmitted.promise,
157
+ summaryOpBroadcasted: this.summaryOpBroadcasted.promise,
158
+ receivedSummaryAckOrNack: this.receivedSummaryAckOrNack.promise,
159
+ } as const;
160
+ }
161
+ }
162
+
163
+ /**
164
+ * This class generates and tracks a summary attempt.
165
+ */
166
+ export class SummaryGenerator {
167
+ private readonly summarizeTimer: Timer;
168
+ constructor(
169
+ private readonly pendingAckTimer: IPromiseTimer,
170
+ private readonly heuristicData: ISummarizeHeuristicData,
171
+ private readonly submitSummaryCallback: (
172
+ options: ISubmitSummaryOptions,
173
+ ) => Promise<SubmitSummaryResult>,
174
+ private readonly raiseSummarizingError: (errorMessage: string) => void,
175
+ private readonly successfulSummaryCallback: () => void,
176
+ private readonly summaryWatcher: Pick<IClientSummaryWatcher, "watchSummary">,
177
+ private readonly logger: ITelemetryLogger,
178
+ ) {
179
+ this.summarizeTimer = new Timer(maxSummarizeTimeoutTime, () =>
180
+ this.summarizeTimerHandler(maxSummarizeTimeoutTime, 1),
181
+ );
182
+ }
183
+
184
+ /**
185
+ * Generates summary and listens for broadcast and ack/nack.
186
+ * Returns true for ack, false for nack, and undefined for failure or timeout.
187
+ * @param reason - reason for summarizing
188
+ * @param options - refreshLatestAck to fetch summary ack info from server,
189
+ * fullTree to generate tree without any summary handles even if unchanged
190
+ */
191
+ public summarize(
192
+ summarizeProps: ISummarizeTelemetryProperties,
193
+ options: ISummarizeOptions,
194
+ cancellationToken: ISummaryCancellationToken,
195
+ resultsBuilder = new SummarizeResultBuilder(),
196
+ ): ISummarizeResults {
197
+ this.summarizeCore(summarizeProps, options, resultsBuilder, cancellationToken).catch(
198
+ (error) => {
199
+ const message = "UnexpectedSummarizeError";
200
+ this.logger.sendErrorEvent({ eventName: message, ...summarizeProps }, error);
201
+ resultsBuilder.fail(message, error);
202
+ },
203
+ );
204
+
205
+ return resultsBuilder.build();
206
+ }
207
+
208
+ private async summarizeCore(
209
+ summarizeProps: ISummarizeTelemetryProperties,
210
+ options: ISummarizeOptions,
211
+ resultsBuilder: SummarizeResultBuilder,
212
+ cancellationToken: ISummaryCancellationToken,
213
+ ): Promise<void> {
214
+ const { refreshLatestAck, fullTree } = options;
215
+ const logger = ChildLogger.create(this.logger, undefined, { all: summarizeProps });
216
+
217
+ // Note: timeSinceLastAttempt and timeSinceLastSummary for the
218
+ // first summary are basically the time since the summarizer was loaded.
219
+ const timeSinceLastAttempt = Date.now() - this.heuristicData.lastAttempt.summaryTime;
220
+ const timeSinceLastSummary =
221
+ Date.now() - this.heuristicData.lastSuccessfulSummary.summaryTime;
222
+ let summarizeTelemetryProps: SummaryGeneratorTelemetry = {
223
+ fullTree,
224
+ timeSinceLastAttempt,
225
+ timeSinceLastSummary,
226
+ };
227
+
228
+ const summarizeEvent = PerformanceEvent.start(
229
+ logger,
230
+ {
231
+ eventName: "Summarize",
232
+ refreshLatestAck,
233
+ ...summarizeTelemetryProps,
234
+ },
235
+ { start: true, end: true, cancel: "generic" },
236
+ );
237
+
238
+ // Helper functions to report failures and return.
239
+ const getFailMessage = (errorCode: keyof typeof summarizeErrors) =>
240
+ `${errorCode}: ${summarizeErrors[errorCode]}`;
241
+ const fail = (
242
+ errorCode: keyof typeof summarizeErrors,
243
+ error?: any,
244
+ properties?: SummaryGeneratorTelemetry,
245
+ nackSummaryResult?: INackSummaryResult,
246
+ ) => {
247
+ this.raiseSummarizingError(summarizeErrors[errorCode]);
248
+ // UploadSummary may fail with 429 and retryAfter - respect that
249
+ // Summary Nack also can have retryAfter, it's parsed below and comes as a property.
250
+ const retryAfterSeconds = getRetryDelaySecondsFromError(error);
251
+
252
+ // Report any failure as an error unless it was due to cancellation (like "disconnected" error)
253
+ // If failure happened on upload, we may not yet realized that socket disconnected, so check
254
+ // offlineError too.
255
+ const category =
256
+ cancellationToken.cancelled || error?.errorType === DriverErrorType.offlineError
257
+ ? "generic"
258
+ : "error";
259
+
260
+ const message = getFailMessage(errorCode);
261
+ summarizeEvent.cancel(
262
+ {
263
+ ...properties,
264
+ reason: errorCode,
265
+ category,
266
+ retryAfterSeconds,
267
+ },
268
+ error ?? message,
269
+ ); // disconnect & summaryAckTimeout do not have proper error.
270
+ resultsBuilder.fail(message, error, nackSummaryResult, retryAfterSeconds);
271
+ };
272
+
273
+ // Wait to generate and send summary
274
+ this.summarizeTimer.start();
275
+
276
+ // Use record type to prevent unexpected value types
277
+ let summaryData: SubmitSummaryResult | undefined;
278
+ try {
279
+ summaryData = await this.submitSummaryCallback({
280
+ fullTree,
281
+ refreshLatestAck,
282
+ summaryLogger: logger,
283
+ cancellationToken,
284
+ });
285
+
286
+ // Cumulatively add telemetry properties based on how far generateSummary went.
287
+ const referenceSequenceNumber = summaryData.referenceSequenceNumber;
288
+ const opsSinceLastSummary =
289
+ referenceSequenceNumber -
290
+ this.heuristicData.lastSuccessfulSummary.refSequenceNumber;
291
+ summarizeTelemetryProps = {
292
+ ...summarizeTelemetryProps,
293
+ referenceSequenceNumber,
294
+ minimumSequenceNumber: summaryData.minimumSequenceNumber,
295
+ opsSinceLastAttempt:
296
+ referenceSequenceNumber - this.heuristicData.lastAttempt.refSequenceNumber,
297
+ opsSinceLastSummary,
298
+ };
299
+ summarizeTelemetryProps = this.addSummaryDataToTelemetryProps(
300
+ summaryData,
301
+ summarizeTelemetryProps,
302
+ );
303
+
304
+ if (summaryData.stage !== "submit") {
305
+ return fail("submitSummaryFailure", summaryData.error, summarizeTelemetryProps);
306
+ }
307
+
308
+ /**
309
+ * With incremental summaries, if the full tree was not summarized, only data stores that changed should
310
+ * be summarized. A data store is considered changed if either or both of the following is true:
311
+ * - It has received an op.
312
+ * - Its reference state changed, i.e., it went from referenced to unreferenced or vice-versa.
313
+ *
314
+ * In the extreme case, every op can be for a different data store and each op can result in the reference
315
+ * state change of multiple data stores. So, the total number of data stores that are summarized should not
316
+ * exceed the number of ops since last summary + number of data store whose reference state changed.
317
+ */
318
+ if (!fullTree && !summaryData.forcedFullTree) {
319
+ const { summarizedDataStoreCount, gcStateUpdatedDataStoreCount = 0 } =
320
+ summaryData.summaryStats;
321
+ if (summarizedDataStoreCount > gcStateUpdatedDataStoreCount + opsSinceLastSummary) {
322
+ logger.sendErrorEvent({
323
+ eventName: "IncrementalSummaryViolation",
324
+ summarizedDataStoreCount,
325
+ gcStateUpdatedDataStoreCount,
326
+ opsSinceLastSummary,
327
+ });
328
+ }
329
+ }
330
+
331
+ // Log event here on summary success only, as Summarize_cancel duplicates failure logging.
332
+ summarizeEvent.reportEvent("generate", { ...summarizeTelemetryProps });
333
+ resultsBuilder.summarySubmitted.resolve({ success: true, data: summaryData });
334
+ } catch (error) {
335
+ return fail("submitSummaryFailure", error);
336
+ } finally {
337
+ this.heuristicData.recordAttempt(summaryData?.referenceSequenceNumber);
338
+ this.summarizeTimer.clear();
339
+ }
340
+
341
+ try {
342
+ const pendingTimeoutP = this.pendingAckTimer.start();
343
+ const summary = this.summaryWatcher.watchSummary(summaryData.clientSequenceNumber);
344
+
345
+ // Wait for broadcast
346
+ const waitBroadcastResult = await raceTimer(
347
+ summary.waitBroadcast(),
348
+ pendingTimeoutP,
349
+ cancellationToken,
350
+ );
351
+ if (waitBroadcastResult.result === "cancelled") {
352
+ return fail("disconnect");
353
+ }
354
+ if (waitBroadcastResult.result !== "done") {
355
+ return fail("summaryOpWaitTimeout");
356
+ }
357
+ const summarizeOp = waitBroadcastResult.value;
358
+
359
+ const broadcastDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;
360
+ resultsBuilder.summaryOpBroadcasted.resolve({
361
+ success: true,
362
+ data: { summarizeOp, broadcastDuration },
363
+ });
364
+
365
+ this.heuristicData.lastAttempt.summarySequenceNumber = summarizeOp.sequenceNumber;
366
+ logger.sendTelemetryEvent({
367
+ eventName: "Summarize_Op",
368
+ duration: broadcastDuration,
369
+ referenceSequenceNumber: summarizeOp.referenceSequenceNumber,
370
+ summarySequenceNumber: summarizeOp.sequenceNumber,
371
+ handle: summarizeOp.contents.handle,
372
+ });
373
+
374
+ // Wait for ack/nack
375
+ const waitAckNackResult = await raceTimer(
376
+ summary.waitAckNack(),
377
+ pendingTimeoutP,
378
+ cancellationToken,
379
+ );
380
+ if (waitAckNackResult.result === "cancelled") {
381
+ return fail("disconnect");
382
+ }
383
+ if (waitAckNackResult.result !== "done") {
384
+ return fail("summaryAckWaitTimeout");
385
+ }
386
+ const ackNackOp = waitAckNackResult.value;
387
+ this.pendingAckTimer.clear();
388
+
389
+ // Update for success/failure
390
+ const ackNackDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;
391
+
392
+ // adding new properties
393
+ summarizeTelemetryProps = {
394
+ ackWaitDuration: ackNackDuration,
395
+ ackNackSequenceNumber: ackNackOp.sequenceNumber,
396
+ summarySequenceNumber: ackNackOp.contents.summaryProposal.summarySequenceNumber,
397
+ ...summarizeTelemetryProps,
398
+ };
399
+ if (ackNackOp.type === MessageType.SummaryAck) {
400
+ this.heuristicData.markLastAttemptAsSuccessful();
401
+ this.successfulSummaryCallback();
402
+ summarizeEvent.end({
403
+ ...summarizeTelemetryProps,
404
+ handle: ackNackOp.contents.handle,
405
+ });
406
+ resultsBuilder.receivedSummaryAckOrNack.resolve({
407
+ success: true,
408
+ data: {
409
+ summaryAckOp: ackNackOp,
410
+ ackNackDuration,
411
+ },
412
+ });
413
+ } else {
414
+ // Check for retryDelay in summaryNack response.
415
+ assert(ackNackOp.type === MessageType.SummaryNack, 0x274 /* "type check" */);
416
+ const summaryNack = ackNackOp.contents;
417
+ const errorMessage = summaryNack?.message;
418
+ const retryAfterSeconds = summaryNack?.retryAfter;
419
+
420
+ // pre-0.58 error message prefix: summaryNack
421
+ const error = new LoggingError(`Received summaryNack`, {
422
+ retryAfterSeconds,
423
+ errorMessage,
424
+ });
425
+
426
+ assert(
427
+ getRetryDelaySecondsFromError(error) === retryAfterSeconds,
428
+ 0x25f /* "retryAfterSeconds" */,
429
+ );
430
+ // This will only set resultsBuilder.receivedSummaryAckOrNack, as other promises are already set.
431
+ return fail(
432
+ "summaryNack",
433
+ error,
434
+ { ...summarizeTelemetryProps, nackRetryAfter: retryAfterSeconds },
435
+ { summaryNackOp: ackNackOp, ackNackDuration },
436
+ );
437
+ }
438
+ } finally {
439
+ this.pendingAckTimer.clear();
440
+ }
441
+ }
442
+
443
+ private addSummaryDataToTelemetryProps(
444
+ summaryData: SubmitSummaryResult,
445
+ initialProps: SummaryGeneratorTelemetry,
446
+ ): SummaryGeneratorTelemetry {
447
+ switch (summaryData.stage) {
448
+ case "base":
449
+ return initialProps;
450
+
451
+ case "generate":
452
+ return {
453
+ ...initialProps,
454
+ ...summaryData.summaryStats,
455
+ generateDuration: summaryData.generateDuration,
456
+ };
457
+
458
+ case "upload":
459
+ return {
460
+ ...initialProps,
461
+ ...summaryData.summaryStats,
462
+ generateDuration: summaryData.generateDuration,
463
+ handle: summaryData.handle,
464
+ uploadDuration: summaryData.uploadDuration,
465
+ };
466
+
467
+ case "submit":
468
+ return {
469
+ ...initialProps,
470
+ ...summaryData.summaryStats,
471
+ generateDuration: summaryData.generateDuration,
472
+ handle: summaryData.handle,
473
+ uploadDuration: summaryData.uploadDuration,
474
+ clientSequenceNumber: summaryData.clientSequenceNumber,
475
+ hasMissingOpData: this.heuristicData.hasMissingOpData,
476
+ opsSizesSinceLastSummary: this.heuristicData.totalOpsSize,
477
+ nonRuntimeOpsSinceLastSummary: this.heuristicData.numNonRuntimeOps,
478
+ };
479
+
480
+ default:
481
+ assert(true, 0x397 /* Unexpected summary stage */);
482
+ }
483
+
484
+ return initialProps;
485
+ }
486
+
487
+ private summarizeTimerHandler(time: number, count: number) {
488
+ this.logger.sendPerformanceEvent({
489
+ eventName: "SummarizeTimeout",
490
+ timeoutTime: time,
491
+ timeoutCount: count,
492
+ });
493
+ if (count < maxSummarizeTimeoutCount) {
494
+ // Double and start a new timer
495
+ const nextTime = time * 2;
496
+ this.summarizeTimer.start(nextTime, () =>
497
+ this.summarizeTimerHandler(nextTime, count + 1),
498
+ );
499
+ }
500
+ }
501
+
502
+ public dispose() {
503
+ this.summarizeTimer.clear();
504
+ }
505
+ }