@fluidframework/container-runtime 2.0.0-dev.5.2.0.169897 → 2.0.0-dev.6.4.0.191258

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 (561) hide show
  1. package/CHANGELOG.md +147 -0
  2. package/README.md +4 -3
  3. package/dist/batchTracker.d.ts +3 -2
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +6 -5
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +15 -18
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +212 -171
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/connectionTelemetry.d.ts.map +1 -1
  12. package/dist/connectionTelemetry.js +33 -17
  13. package/dist/connectionTelemetry.js.map +1 -1
  14. package/dist/containerRuntime.d.ts +172 -35
  15. package/dist/containerRuntime.d.ts.map +1 -1
  16. package/dist/containerRuntime.js +722 -425
  17. package/dist/containerRuntime.js.map +1 -1
  18. package/dist/dataStore.d.ts.map +1 -1
  19. package/dist/dataStore.js +15 -7
  20. package/dist/dataStore.js.map +1 -1
  21. package/dist/dataStoreContext.d.ts +4 -4
  22. package/dist/dataStoreContext.d.ts.map +1 -1
  23. package/dist/dataStoreContext.js +87 -90
  24. package/dist/dataStoreContext.js.map +1 -1
  25. package/dist/dataStoreContexts.d.ts +1 -1
  26. package/dist/dataStoreContexts.d.ts.map +1 -1
  27. package/dist/dataStoreContexts.js +10 -10
  28. package/dist/dataStoreContexts.js.map +1 -1
  29. package/dist/dataStoreRegistry.js +2 -2
  30. package/dist/dataStoreRegistry.js.map +1 -1
  31. package/dist/dataStores.d.ts +23 -7
  32. package/dist/dataStores.d.ts.map +1 -1
  33. package/dist/dataStores.js +125 -82
  34. package/dist/dataStores.js.map +1 -1
  35. package/dist/deltaManagerProxyBase.d.ts +35 -0
  36. package/dist/deltaManagerProxyBase.d.ts.map +1 -0
  37. package/dist/deltaManagerProxyBase.js +77 -0
  38. package/dist/deltaManagerProxyBase.js.map +1 -0
  39. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  40. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  41. package/dist/deltaManagerSummarizerProxy.js +4 -2
  42. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  43. package/dist/deltaScheduler.d.ts.map +1 -1
  44. package/dist/deltaScheduler.js +10 -10
  45. package/dist/deltaScheduler.js.map +1 -1
  46. package/dist/error.d.ts +14 -0
  47. package/dist/error.d.ts.map +1 -0
  48. package/dist/error.js +21 -0
  49. package/dist/error.js.map +1 -0
  50. package/dist/gc/garbageCollection.d.ts +10 -9
  51. package/dist/gc/garbageCollection.d.ts.map +1 -1
  52. package/dist/gc/garbageCollection.js +65 -56
  53. package/dist/gc/garbageCollection.js.map +1 -1
  54. package/dist/gc/gcConfigs.d.ts.map +1 -1
  55. package/dist/gc/gcConfigs.js +18 -14
  56. package/dist/gc/gcConfigs.js.map +1 -1
  57. package/dist/gc/gcDefinitions.d.ts +17 -5
  58. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  59. package/dist/gc/gcDefinitions.js +14 -15
  60. package/dist/gc/gcDefinitions.js.map +1 -1
  61. package/dist/gc/gcHelpers.d.ts +0 -8
  62. package/dist/gc/gcHelpers.d.ts.map +1 -1
  63. package/dist/gc/gcHelpers.js +11 -24
  64. package/dist/gc/gcHelpers.js.map +1 -1
  65. package/dist/gc/gcSummaryStateTracker.d.ts +4 -7
  66. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  67. package/dist/gc/gcSummaryStateTracker.js +19 -58
  68. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  69. package/dist/gc/gcTelemetry.d.ts +1 -1
  70. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  71. package/dist/gc/gcTelemetry.js +45 -35
  72. package/dist/gc/gcTelemetry.js.map +1 -1
  73. package/dist/gc/gcUnreferencedStateTracker.js +4 -4
  74. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  75. package/dist/gc/index.d.ts +2 -2
  76. package/dist/gc/index.d.ts.map +1 -1
  77. package/dist/gc/index.js +3 -5
  78. package/dist/gc/index.js.map +1 -1
  79. package/dist/id-compressor/appendOnlySortedMap.d.ts +8 -30
  80. package/dist/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
  81. package/dist/id-compressor/appendOnlySortedMap.js +26 -68
  82. package/dist/id-compressor/appendOnlySortedMap.js.map +1 -1
  83. package/dist/id-compressor/finalSpace.d.ts +29 -0
  84. package/dist/id-compressor/finalSpace.d.ts.map +1 -0
  85. package/dist/id-compressor/finalSpace.js +62 -0
  86. package/dist/id-compressor/finalSpace.js.map +1 -0
  87. package/dist/id-compressor/idCompressor.d.ts +25 -250
  88. package/dist/id-compressor/idCompressor.d.ts.map +1 -1
  89. package/dist/id-compressor/idCompressor.js +390 -1153
  90. package/dist/id-compressor/idCompressor.js.map +1 -1
  91. package/dist/id-compressor/identifiers.d.ts +32 -0
  92. package/dist/id-compressor/identifiers.d.ts.map +1 -0
  93. package/dist/id-compressor/identifiers.js +15 -0
  94. package/dist/id-compressor/identifiers.js.map +1 -0
  95. package/dist/id-compressor/index.d.ts +5 -6
  96. package/dist/id-compressor/index.d.ts.map +1 -1
  97. package/dist/id-compressor/index.js +20 -26
  98. package/dist/id-compressor/index.js.map +1 -1
  99. package/dist/id-compressor/persistanceUtilities.d.ts +22 -0
  100. package/dist/id-compressor/persistanceUtilities.d.ts.map +1 -0
  101. package/dist/id-compressor/persistanceUtilities.js +43 -0
  102. package/dist/id-compressor/persistanceUtilities.js.map +1 -0
  103. package/dist/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
  104. package/dist/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
  105. package/dist/id-compressor/sessionSpaceNormalizer.js +80 -0
  106. package/dist/id-compressor/sessionSpaceNormalizer.js.map +1 -0
  107. package/dist/id-compressor/sessions.d.ts +115 -0
  108. package/dist/id-compressor/sessions.d.ts.map +1 -0
  109. package/dist/id-compressor/sessions.js +305 -0
  110. package/dist/id-compressor/sessions.js.map +1 -0
  111. package/dist/id-compressor/utilities.d.ts +49 -0
  112. package/dist/id-compressor/utilities.d.ts.map +1 -0
  113. package/dist/id-compressor/utilities.js +166 -0
  114. package/dist/id-compressor/utilities.js.map +1 -0
  115. package/dist/index.d.ts +3 -3
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +6 -4
  118. package/dist/index.js.map +1 -1
  119. package/dist/metadata.d.ts +18 -0
  120. package/dist/metadata.d.ts.map +1 -0
  121. package/dist/metadata.js +7 -0
  122. package/dist/metadata.js.map +1 -0
  123. package/dist/opLifecycle/batchManager.d.ts +2 -1
  124. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  125. package/dist/opLifecycle/batchManager.js +15 -7
  126. package/dist/opLifecycle/batchManager.js.map +1 -1
  127. package/dist/opLifecycle/definitions.d.ts +11 -0
  128. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  129. package/dist/opLifecycle/definitions.js.map +1 -1
  130. package/dist/opLifecycle/index.d.ts +1 -1
  131. package/dist/opLifecycle/index.d.ts.map +1 -1
  132. package/dist/opLifecycle/index.js +2 -1
  133. package/dist/opLifecycle/index.js.map +1 -1
  134. package/dist/opLifecycle/opCompressor.d.ts +2 -2
  135. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  136. package/dist/opLifecycle/opCompressor.js +12 -7
  137. package/dist/opLifecycle/opCompressor.js.map +1 -1
  138. package/dist/opLifecycle/opDecompressor.d.ts +2 -2
  139. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  140. package/dist/opLifecycle/opDecompressor.js +30 -21
  141. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  142. package/dist/opLifecycle/opGroupingManager.d.ts +1 -1
  143. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  144. package/dist/opLifecycle/opGroupingManager.js +19 -13
  145. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  146. package/dist/opLifecycle/opSplitter.d.ts +2 -2
  147. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  148. package/dist/opLifecycle/opSplitter.js +24 -19
  149. package/dist/opLifecycle/opSplitter.js.map +1 -1
  150. package/dist/opLifecycle/outbox.d.ts +39 -6
  151. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  152. package/dist/opLifecycle/outbox.js +138 -61
  153. package/dist/opLifecycle/outbox.js.map +1 -1
  154. package/dist/opLifecycle/remoteMessageProcessor.d.ts +6 -1
  155. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  156. package/dist/opLifecycle/remoteMessageProcessor.js +22 -8
  157. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  158. package/dist/opProperties.js +1 -2
  159. package/dist/opProperties.js.map +1 -1
  160. package/dist/packageVersion.d.ts +1 -1
  161. package/dist/packageVersion.js +1 -1
  162. package/dist/packageVersion.js.map +1 -1
  163. package/dist/pendingStateManager.d.ts +25 -10
  164. package/dist/pendingStateManager.d.ts.map +1 -1
  165. package/dist/pendingStateManager.js +101 -64
  166. package/dist/pendingStateManager.js.map +1 -1
  167. package/dist/scheduleManager.d.ts.map +1 -1
  168. package/dist/scheduleManager.js +43 -33
  169. package/dist/scheduleManager.js.map +1 -1
  170. package/dist/summary/index.d.ts +4 -4
  171. package/dist/summary/index.d.ts.map +1 -1
  172. package/dist/summary/index.js +3 -1
  173. package/dist/summary/index.js.map +1 -1
  174. package/dist/summary/orderedClientElection.d.ts +3 -3
  175. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  176. package/dist/summary/orderedClientElection.js +26 -27
  177. package/dist/summary/orderedClientElection.js.map +1 -1
  178. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  179. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  180. package/dist/summary/runningSummarizer.d.ts +31 -10
  181. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  182. package/dist/summary/runningSummarizer.js +271 -139
  183. package/dist/summary/runningSummarizer.js.map +1 -1
  184. package/dist/summary/summarizer.d.ts +8 -7
  185. package/dist/summary/summarizer.d.ts.map +1 -1
  186. package/dist/summary/summarizer.js +79 -78
  187. package/dist/summary/summarizer.js.map +1 -1
  188. package/dist/summary/summarizerClientElection.d.ts +2 -2
  189. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  190. package/dist/summary/summarizerClientElection.js +7 -11
  191. package/dist/summary/summarizerClientElection.js.map +1 -1
  192. package/dist/summary/summarizerHeuristics.js +10 -14
  193. package/dist/summary/summarizerHeuristics.js.map +1 -1
  194. package/dist/summary/summarizerNode/index.d.ts +1 -1
  195. package/dist/summary/summarizerNode/index.d.ts.map +1 -1
  196. package/dist/summary/summarizerNode/index.js.map +1 -1
  197. package/dist/summary/summarizerNode/summarizerNode.d.ts +40 -23
  198. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  199. package/dist/summary/summarizerNode/summarizerNode.js +144 -149
  200. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  201. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +25 -29
  202. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  203. package/dist/summary/summarizerNode/summarizerNodeUtils.js +2 -4
  204. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  205. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +21 -16
  206. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  207. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +74 -123
  208. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  209. package/dist/summary/summarizerTypes.d.ts +44 -24
  210. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  211. package/dist/summary/summarizerTypes.js.map +1 -1
  212. package/dist/summary/summaryCollection.d.ts +2 -2
  213. package/dist/summary/summaryCollection.d.ts.map +1 -1
  214. package/dist/summary/summaryCollection.js +16 -13
  215. package/dist/summary/summaryCollection.js.map +1 -1
  216. package/dist/summary/summaryFormat.d.ts +4 -0
  217. package/dist/summary/summaryFormat.d.ts.map +1 -1
  218. package/dist/summary/summaryFormat.js +8 -5
  219. package/dist/summary/summaryFormat.js.map +1 -1
  220. package/dist/summary/summaryGenerator.d.ts +21 -6
  221. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  222. package/dist/summary/summaryGenerator.js +117 -54
  223. package/dist/summary/summaryGenerator.js.map +1 -1
  224. package/dist/summary/summaryManager.d.ts +8 -7
  225. package/dist/summary/summaryManager.d.ts.map +1 -1
  226. package/dist/summary/summaryManager.js +38 -28
  227. package/dist/summary/summaryManager.js.map +1 -1
  228. package/lib/batchTracker.d.ts +3 -2
  229. package/lib/batchTracker.d.ts.map +1 -1
  230. package/lib/batchTracker.js +5 -4
  231. package/lib/batchTracker.js.map +1 -1
  232. package/lib/blobManager.d.ts +15 -18
  233. package/lib/blobManager.d.ts.map +1 -1
  234. package/lib/blobManager.js +187 -146
  235. package/lib/blobManager.js.map +1 -1
  236. package/lib/connectionTelemetry.d.ts.map +1 -1
  237. package/lib/connectionTelemetry.js +23 -7
  238. package/lib/connectionTelemetry.js.map +1 -1
  239. package/lib/containerRuntime.d.ts +172 -35
  240. package/lib/containerRuntime.d.ts.map +1 -1
  241. package/lib/containerRuntime.js +678 -380
  242. package/lib/containerRuntime.js.map +1 -1
  243. package/lib/dataStore.d.ts.map +1 -1
  244. package/lib/dataStore.js +13 -5
  245. package/lib/dataStore.js.map +1 -1
  246. package/lib/dataStoreContext.d.ts +4 -4
  247. package/lib/dataStoreContext.d.ts.map +1 -1
  248. package/lib/dataStoreContext.js +49 -52
  249. package/lib/dataStoreContext.js.map +1 -1
  250. package/lib/dataStoreContexts.d.ts +1 -1
  251. package/lib/dataStoreContexts.d.ts.map +1 -1
  252. package/lib/dataStoreContexts.js +3 -3
  253. package/lib/dataStoreContexts.js.map +1 -1
  254. package/lib/dataStoreRegistry.js +1 -1
  255. package/lib/dataStoreRegistry.js.map +1 -1
  256. package/lib/dataStores.d.ts +23 -7
  257. package/lib/dataStores.d.ts.map +1 -1
  258. package/lib/dataStores.js +107 -64
  259. package/lib/dataStores.js.map +1 -1
  260. package/lib/deltaManagerProxyBase.d.ts +35 -0
  261. package/lib/deltaManagerProxyBase.d.ts.map +1 -0
  262. package/lib/deltaManagerProxyBase.js +73 -0
  263. package/lib/deltaManagerProxyBase.js.map +1 -0
  264. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  265. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  266. package/lib/deltaManagerSummarizerProxy.js +3 -1
  267. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  268. package/lib/deltaScheduler.d.ts.map +1 -1
  269. package/lib/deltaScheduler.js +7 -7
  270. package/lib/deltaScheduler.js.map +1 -1
  271. package/lib/error.d.ts +14 -0
  272. package/lib/error.d.ts.map +1 -0
  273. package/lib/error.js +17 -0
  274. package/lib/error.js.map +1 -0
  275. package/lib/gc/garbageCollection.d.ts +10 -9
  276. package/lib/gc/garbageCollection.d.ts.map +1 -1
  277. package/lib/gc/garbageCollection.js +61 -52
  278. package/lib/gc/garbageCollection.js.map +1 -1
  279. package/lib/gc/gcConfigs.d.ts.map +1 -1
  280. package/lib/gc/gcConfigs.js +16 -12
  281. package/lib/gc/gcConfigs.js.map +1 -1
  282. package/lib/gc/gcDefinitions.d.ts +17 -5
  283. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  284. package/lib/gc/gcDefinitions.js +13 -14
  285. package/lib/gc/gcDefinitions.js.map +1 -1
  286. package/lib/gc/gcHelpers.d.ts +0 -8
  287. package/lib/gc/gcHelpers.d.ts.map +1 -1
  288. package/lib/gc/gcHelpers.js +5 -17
  289. package/lib/gc/gcHelpers.js.map +1 -1
  290. package/lib/gc/gcSummaryStateTracker.d.ts +4 -7
  291. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  292. package/lib/gc/gcSummaryStateTracker.js +20 -59
  293. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  294. package/lib/gc/gcTelemetry.d.ts +1 -1
  295. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  296. package/lib/gc/gcTelemetry.js +46 -36
  297. package/lib/gc/gcTelemetry.js.map +1 -1
  298. package/lib/gc/gcUnreferencedStateTracker.js +1 -1
  299. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  300. package/lib/gc/index.d.ts +2 -2
  301. package/lib/gc/index.d.ts.map +1 -1
  302. package/lib/gc/index.js +2 -2
  303. package/lib/gc/index.js.map +1 -1
  304. package/lib/id-compressor/appendOnlySortedMap.d.ts +8 -30
  305. package/lib/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
  306. package/lib/id-compressor/appendOnlySortedMap.js +25 -66
  307. package/lib/id-compressor/appendOnlySortedMap.js.map +1 -1
  308. package/lib/id-compressor/finalSpace.d.ts +29 -0
  309. package/lib/id-compressor/finalSpace.d.ts.map +1 -0
  310. package/lib/id-compressor/finalSpace.js +58 -0
  311. package/lib/id-compressor/finalSpace.js.map +1 -0
  312. package/lib/id-compressor/idCompressor.d.ts +25 -250
  313. package/lib/id-compressor/idCompressor.d.ts.map +1 -1
  314. package/lib/id-compressor/idCompressor.js +385 -1142
  315. package/lib/id-compressor/idCompressor.js.map +1 -1
  316. package/lib/id-compressor/identifiers.d.ts +32 -0
  317. package/lib/id-compressor/identifiers.d.ts.map +1 -0
  318. package/lib/id-compressor/identifiers.js +11 -0
  319. package/lib/id-compressor/identifiers.js.map +1 -0
  320. package/lib/id-compressor/index.d.ts +5 -6
  321. package/lib/id-compressor/index.d.ts.map +1 -1
  322. package/lib/id-compressor/index.js +5 -6
  323. package/lib/id-compressor/index.js.map +1 -1
  324. package/lib/id-compressor/persistanceUtilities.d.ts +22 -0
  325. package/lib/id-compressor/persistanceUtilities.d.ts.map +1 -0
  326. package/lib/id-compressor/persistanceUtilities.js +34 -0
  327. package/lib/id-compressor/persistanceUtilities.js.map +1 -0
  328. package/lib/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
  329. package/lib/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
  330. package/lib/id-compressor/sessionSpaceNormalizer.js +76 -0
  331. package/lib/id-compressor/sessionSpaceNormalizer.js.map +1 -0
  332. package/lib/id-compressor/sessions.d.ts +115 -0
  333. package/lib/id-compressor/sessions.d.ts.map +1 -0
  334. package/lib/id-compressor/sessions.js +290 -0
  335. package/lib/id-compressor/sessions.js.map +1 -0
  336. package/lib/id-compressor/utilities.d.ts +49 -0
  337. package/lib/id-compressor/utilities.d.ts.map +1 -0
  338. package/lib/id-compressor/utilities.js +148 -0
  339. package/lib/id-compressor/utilities.js.map +1 -0
  340. package/lib/index.d.ts +3 -3
  341. package/lib/index.d.ts.map +1 -1
  342. package/lib/index.js +2 -2
  343. package/lib/index.js.map +1 -1
  344. package/lib/metadata.d.ts +18 -0
  345. package/lib/metadata.d.ts.map +1 -0
  346. package/lib/metadata.js +6 -0
  347. package/lib/metadata.js.map +1 -0
  348. package/lib/opLifecycle/batchManager.d.ts +2 -1
  349. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  350. package/lib/opLifecycle/batchManager.js +15 -7
  351. package/lib/opLifecycle/batchManager.js.map +1 -1
  352. package/lib/opLifecycle/definitions.d.ts +11 -0
  353. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  354. package/lib/opLifecycle/definitions.js.map +1 -1
  355. package/lib/opLifecycle/index.d.ts +1 -1
  356. package/lib/opLifecycle/index.d.ts.map +1 -1
  357. package/lib/opLifecycle/index.js +1 -1
  358. package/lib/opLifecycle/index.js.map +1 -1
  359. package/lib/opLifecycle/opCompressor.d.ts +2 -2
  360. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  361. package/lib/opLifecycle/opCompressor.js +10 -5
  362. package/lib/opLifecycle/opCompressor.js.map +1 -1
  363. package/lib/opLifecycle/opDecompressor.d.ts +2 -2
  364. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  365. package/lib/opLifecycle/opDecompressor.js +22 -13
  366. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  367. package/lib/opLifecycle/opGroupingManager.d.ts +1 -1
  368. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  369. package/lib/opLifecycle/opGroupingManager.js +17 -11
  370. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  371. package/lib/opLifecycle/opSplitter.d.ts +2 -2
  372. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  373. package/lib/opLifecycle/opSplitter.js +15 -10
  374. package/lib/opLifecycle/opSplitter.js.map +1 -1
  375. package/lib/opLifecycle/outbox.d.ts +39 -6
  376. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  377. package/lib/opLifecycle/outbox.js +132 -56
  378. package/lib/opLifecycle/outbox.js.map +1 -1
  379. package/lib/opLifecycle/remoteMessageProcessor.d.ts +6 -1
  380. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  381. package/lib/opLifecycle/remoteMessageProcessor.js +23 -9
  382. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  383. package/lib/opProperties.js +1 -2
  384. package/lib/opProperties.js.map +1 -1
  385. package/lib/packageVersion.d.ts +1 -1
  386. package/lib/packageVersion.js +1 -1
  387. package/lib/packageVersion.js.map +1 -1
  388. package/lib/pendingStateManager.d.ts +25 -10
  389. package/lib/pendingStateManager.d.ts.map +1 -1
  390. package/lib/pendingStateManager.js +90 -53
  391. package/lib/pendingStateManager.js.map +1 -1
  392. package/lib/scheduleManager.d.ts.map +1 -1
  393. package/lib/scheduleManager.js +25 -15
  394. package/lib/scheduleManager.js.map +1 -1
  395. package/lib/summary/index.d.ts +4 -4
  396. package/lib/summary/index.d.ts.map +1 -1
  397. package/lib/summary/index.js +2 -2
  398. package/lib/summary/index.js.map +1 -1
  399. package/lib/summary/orderedClientElection.d.ts +3 -3
  400. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  401. package/lib/summary/orderedClientElection.js +21 -22
  402. package/lib/summary/orderedClientElection.js.map +1 -1
  403. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  404. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  405. package/lib/summary/runningSummarizer.d.ts +31 -10
  406. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  407. package/lib/summary/runningSummarizer.js +265 -133
  408. package/lib/summary/runningSummarizer.js.map +1 -1
  409. package/lib/summary/summarizer.d.ts +8 -7
  410. package/lib/summary/summarizer.d.ts.map +1 -1
  411. package/lib/summary/summarizer.js +75 -74
  412. package/lib/summary/summarizer.js.map +1 -1
  413. package/lib/summary/summarizerClientElection.d.ts +2 -2
  414. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  415. package/lib/summary/summarizerClientElection.js +6 -10
  416. package/lib/summary/summarizerClientElection.js.map +1 -1
  417. package/lib/summary/summarizerHeuristics.js +9 -13
  418. package/lib/summary/summarizerHeuristics.js.map +1 -1
  419. package/lib/summary/summarizerNode/index.d.ts +1 -1
  420. package/lib/summary/summarizerNode/index.d.ts.map +1 -1
  421. package/lib/summary/summarizerNode/index.js.map +1 -1
  422. package/lib/summary/summarizerNode/summarizerNode.d.ts +40 -23
  423. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  424. package/lib/summary/summarizerNode/summarizerNode.js +132 -137
  425. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  426. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +25 -29
  427. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  428. package/lib/summary/summarizerNode/summarizerNodeUtils.js +2 -4
  429. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  430. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +21 -16
  431. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  432. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +70 -119
  433. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  434. package/lib/summary/summarizerTypes.d.ts +44 -24
  435. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  436. package/lib/summary/summarizerTypes.js.map +1 -1
  437. package/lib/summary/summaryCollection.d.ts +2 -2
  438. package/lib/summary/summaryCollection.d.ts.map +1 -1
  439. package/lib/summary/summaryCollection.js +9 -6
  440. package/lib/summary/summaryCollection.js.map +1 -1
  441. package/lib/summary/summaryFormat.d.ts +4 -0
  442. package/lib/summary/summaryFormat.d.ts.map +1 -1
  443. package/lib/summary/summaryFormat.js +7 -4
  444. package/lib/summary/summaryFormat.js.map +1 -1
  445. package/lib/summary/summaryGenerator.d.ts +21 -6
  446. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  447. package/lib/summary/summaryGenerator.js +109 -47
  448. package/lib/summary/summaryGenerator.js.map +1 -1
  449. package/lib/summary/summaryManager.d.ts +8 -7
  450. package/lib/summary/summaryManager.d.ts.map +1 -1
  451. package/lib/summary/summaryManager.js +35 -25
  452. package/lib/summary/summaryManager.js.map +1 -1
  453. package/package.json +30 -32
  454. package/src/batchTracker.ts +7 -5
  455. package/src/blobManager.ts +235 -172
  456. package/src/connectionTelemetry.ts +19 -5
  457. package/src/containerRuntime.ts +853 -431
  458. package/src/dataStore.ts +12 -4
  459. package/src/dataStoreContext.ts +49 -46
  460. package/src/dataStoreContexts.ts +4 -4
  461. package/src/dataStoreRegistry.ts +1 -1
  462. package/src/dataStores.ts +119 -80
  463. package/src/deltaManagerProxyBase.ts +111 -0
  464. package/src/deltaManagerSummarizerProxy.ts +4 -1
  465. package/src/deltaScheduler.ts +7 -11
  466. package/src/error.ts +18 -0
  467. package/src/gc/garbageCollection.md +53 -5
  468. package/src/gc/garbageCollection.ts +58 -51
  469. package/src/gc/gcConfigs.ts +4 -2
  470. package/src/gc/gcDefinitions.ts +17 -21
  471. package/src/gc/gcEarlyAdoption.md +145 -0
  472. package/src/gc/gcHelpers.ts +1 -12
  473. package/src/gc/gcSummaryStateTracker.ts +19 -65
  474. package/src/gc/gcTelemetry.ts +15 -13
  475. package/src/gc/gcUnreferencedStateTracker.ts +1 -1
  476. package/src/gc/index.ts +2 -4
  477. package/src/id-compressor/appendOnlySortedMap.ts +26 -87
  478. package/src/id-compressor/finalSpace.ts +67 -0
  479. package/src/id-compressor/idCompressor.ts +458 -1682
  480. package/src/id-compressor/identifiers.ts +42 -0
  481. package/src/id-compressor/index.ts +11 -20
  482. package/src/id-compressor/persistanceUtilities.ts +58 -0
  483. package/src/id-compressor/sessionSpaceNormalizer.ts +83 -0
  484. package/src/id-compressor/sessions.ts +405 -0
  485. package/src/id-compressor/utilities.ts +187 -0
  486. package/src/index.ts +9 -2
  487. package/src/metadata.ts +19 -0
  488. package/src/opLifecycle/README.md +20 -0
  489. package/src/opLifecycle/batchManager.ts +9 -1
  490. package/src/opLifecycle/definitions.ts +11 -0
  491. package/src/opLifecycle/index.ts +1 -1
  492. package/src/opLifecycle/opCompressor.ts +6 -5
  493. package/src/opLifecycle/opDecompressor.ts +47 -17
  494. package/src/opLifecycle/opGroupingManager.ts +18 -8
  495. package/src/opLifecycle/opSplitter.ts +10 -7
  496. package/src/opLifecycle/outbox.ts +177 -72
  497. package/src/opLifecycle/remoteMessageProcessor.ts +32 -9
  498. package/src/packageVersion.ts +1 -1
  499. package/src/pendingStateManager.ts +123 -78
  500. package/src/scheduleManager.ts +22 -11
  501. package/src/summary/index.ts +7 -4
  502. package/src/summary/orderedClientElection.ts +10 -6
  503. package/src/summary/runWhileConnectedCoordinator.ts +1 -1
  504. package/src/summary/runningSummarizer.ts +291 -163
  505. package/src/summary/summarizer.ts +27 -16
  506. package/src/summary/summarizerClientElection.ts +2 -2
  507. package/src/summary/summarizerHeuristics.ts +1 -1
  508. package/src/summary/summarizerNode/index.ts +2 -2
  509. package/src/summary/summarizerNode/summarizerNode.ts +142 -184
  510. package/src/summary/summarizerNode/summarizerNodeUtils.ts +27 -35
  511. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +72 -148
  512. package/src/summary/summarizerTypes.ts +49 -24
  513. package/src/summary/summaryCollection.ts +9 -4
  514. package/src/summary/summaryFormat.ts +9 -2
  515. package/src/summary/summaryGenerator.ts +72 -49
  516. package/src/summary/summaryManager.ts +44 -16
  517. package/dist/id-compressor/idRange.d.ts +0 -11
  518. package/dist/id-compressor/idRange.d.ts.map +0 -1
  519. package/dist/id-compressor/idRange.js +0 -29
  520. package/dist/id-compressor/idRange.js.map +0 -1
  521. package/dist/id-compressor/numericUuid.d.ts +0 -59
  522. package/dist/id-compressor/numericUuid.d.ts.map +0 -1
  523. package/dist/id-compressor/numericUuid.js +0 -325
  524. package/dist/id-compressor/numericUuid.js.map +0 -1
  525. package/dist/id-compressor/sessionIdNormalizer.d.ts +0 -138
  526. package/dist/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
  527. package/dist/id-compressor/sessionIdNormalizer.js +0 -488
  528. package/dist/id-compressor/sessionIdNormalizer.js.map +0 -1
  529. package/dist/id-compressor/utils.d.ts +0 -57
  530. package/dist/id-compressor/utils.d.ts.map +0 -1
  531. package/dist/id-compressor/utils.js +0 -90
  532. package/dist/id-compressor/utils.js.map +0 -1
  533. package/dist/id-compressor/uuidUtilities.d.ts +0 -30
  534. package/dist/id-compressor/uuidUtilities.d.ts.map +0 -1
  535. package/dist/id-compressor/uuidUtilities.js +0 -106
  536. package/dist/id-compressor/uuidUtilities.js.map +0 -1
  537. package/lib/id-compressor/idRange.d.ts +0 -11
  538. package/lib/id-compressor/idRange.d.ts.map +0 -1
  539. package/lib/id-compressor/idRange.js +0 -25
  540. package/lib/id-compressor/idRange.js.map +0 -1
  541. package/lib/id-compressor/numericUuid.d.ts +0 -59
  542. package/lib/id-compressor/numericUuid.d.ts.map +0 -1
  543. package/lib/id-compressor/numericUuid.js +0 -315
  544. package/lib/id-compressor/numericUuid.js.map +0 -1
  545. package/lib/id-compressor/sessionIdNormalizer.d.ts +0 -138
  546. package/lib/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
  547. package/lib/id-compressor/sessionIdNormalizer.js +0 -484
  548. package/lib/id-compressor/sessionIdNormalizer.js.map +0 -1
  549. package/lib/id-compressor/utils.d.ts +0 -57
  550. package/lib/id-compressor/utils.d.ts.map +0 -1
  551. package/lib/id-compressor/utils.js +0 -79
  552. package/lib/id-compressor/utils.js.map +0 -1
  553. package/lib/id-compressor/uuidUtilities.d.ts +0 -30
  554. package/lib/id-compressor/uuidUtilities.d.ts.map +0 -1
  555. package/lib/id-compressor/uuidUtilities.js +0 -98
  556. package/lib/id-compressor/uuidUtilities.js.map +0 -1
  557. package/src/id-compressor/idRange.ts +0 -35
  558. package/src/id-compressor/numericUuid.ts +0 -383
  559. package/src/id-compressor/sessionIdNormalizer.ts +0 -609
  560. package/src/id-compressor/utils.ts +0 -114
  561. package/src/id-compressor/uuidUtilities.ts +0 -123
@@ -1 +1 @@
1
- {"version":3,"file":"summaryCollection.js","sourceRoot":"","sources":["../../src/summary/summaryCollection.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 { IDisposable, IEvent } from \"@fluidframework/common-definitions\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils\";\nimport { Deferred, assert, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions\";\nimport {\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tISummaryAck,\n\tISummaryContent,\n\tISummaryNack,\n\tMessageType,\n} from \"@fluidframework/protocol-definitions\";\n\n/**\n * Interface for summary op messages with typed contents.\n */\nexport interface ISummaryOpMessage extends ISequencedDocumentMessage {\n\ttype: MessageType.Summarize;\n\tcontents: ISummaryContent;\n}\n\n/**\n * Interface for summary ack messages with typed contents.\n */\nexport interface ISummaryAckMessage extends ISequencedDocumentMessage {\n\ttype: MessageType.SummaryAck;\n\tcontents: ISummaryAck;\n}\n\n/**\n * Interface for summary nack messages with typed contents.\n */\nexport interface ISummaryNackMessage extends ISequencedDocumentMessage {\n\ttype: MessageType.SummaryNack;\n\tcontents: ISummaryNack;\n}\n\n/**\n * A single summary which can be tracked as it goes through its life cycle.\n * The life cycle is: Local to Broadcast to Acked/Nacked.\n */\nexport interface ISummary {\n\treadonly clientId: string;\n\treadonly clientSequenceNumber: number;\n\twaitBroadcast(): Promise<ISummaryOpMessage>;\n\twaitAckNack(): Promise<ISummaryAckMessage | ISummaryNackMessage>;\n}\n\n/**\n * A single summary which has already been acked by the server.\n */\nexport interface IAckedSummary {\n\treadonly summaryOp: ISummaryOpMessage;\n\treadonly summaryAck: ISummaryAckMessage;\n}\n\nenum SummaryState {\n\tLocal = 0,\n\tBroadcast = 1,\n\tAcked = 2,\n\tNacked = -1,\n}\n\nclass Summary implements ISummary {\n\tpublic static createLocal(clientId: string, clientSequenceNumber: number) {\n\t\treturn new Summary(clientId, clientSequenceNumber);\n\t}\n\tpublic static createFromOp(op: ISummaryOpMessage) {\n\t\tconst summary = new Summary(op.clientId, op.clientSequenceNumber);\n\t\tsummary.broadcast(op);\n\t\treturn summary;\n\t}\n\n\tprivate state = SummaryState.Local;\n\n\tprivate _summaryOp?: ISummaryOpMessage;\n\tprivate _summaryAckNack?: ISummaryAckMessage | ISummaryNackMessage;\n\n\tprivate readonly defSummaryOp = new Deferred<void>();\n\tprivate readonly defSummaryAck = new Deferred<void>();\n\n\tpublic get summaryOp() {\n\t\treturn this._summaryOp;\n\t}\n\tpublic get summaryAckNack() {\n\t\treturn this._summaryAckNack;\n\t}\n\n\tprivate constructor(\n\t\tpublic readonly clientId: string,\n\t\tpublic readonly clientSequenceNumber: number,\n\t) {}\n\n\tpublic hasBeenAcked(): this is IAckedSummary {\n\t\treturn this.state === SummaryState.Acked;\n\t}\n\n\tpublic broadcast(op: ISummaryOpMessage) {\n\t\tassert(\n\t\t\tthis.state === SummaryState.Local,\n\t\t\t0x175 /* \"Can only broadcast if summarizer starts in local state\" */,\n\t\t);\n\t\tthis._summaryOp = op;\n\t\tthis.defSummaryOp.resolve();\n\t\tthis.state = SummaryState.Broadcast;\n\t\treturn true;\n\t}\n\n\tpublic ackNack(op: ISummaryAckMessage | ISummaryNackMessage) {\n\t\tassert(\n\t\t\tthis.state === SummaryState.Broadcast,\n\t\t\t0x176 /* \"Can only ack/nack if summarizer is in broadcasting state\" */,\n\t\t);\n\t\tthis._summaryAckNack = op;\n\t\tthis.defSummaryAck.resolve();\n\t\tthis.state = op.type === MessageType.SummaryAck ? SummaryState.Acked : SummaryState.Nacked;\n\t\treturn true;\n\t}\n\n\tpublic async waitBroadcast(): Promise<ISummaryOpMessage> {\n\t\tawait this.defSummaryOp.promise;\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\treturn this._summaryOp!;\n\t}\n\n\tpublic async waitAckNack(): Promise<ISummaryAckMessage | ISummaryNackMessage> {\n\t\tawait this.defSummaryAck.promise;\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\treturn this._summaryAckNack!;\n\t}\n}\n\n/**\n * Watches summaries created by a specific client.\n */\nexport interface IClientSummaryWatcher extends IDisposable {\n\twatchSummary(clientSequenceNumber: number): ISummary;\n\twaitFlushed(): Promise<IAckedSummary | undefined>;\n}\n\n/**\n * This class watches summaries created by a specific client.\n * It should be created and managed from a SummaryCollection.\n */\nclass ClientSummaryWatcher implements IClientSummaryWatcher {\n\t// key: clientSeqNum\n\tprivate readonly localSummaries = new Map<number, Summary>();\n\tprivate _disposed = false;\n\n\tpublic get disposed() {\n\t\treturn this._disposed;\n\t}\n\n\tpublic constructor(\n\t\tpublic readonly clientId: string,\n\t\tprivate readonly summaryCollection: SummaryCollection,\n\t) {}\n\n\t/**\n\t * Watches for a specific sent summary op.\n\t * @param clientSequenceNumber - client sequence number of sent summary op\n\t */\n\tpublic watchSummary(clientSequenceNumber: number): ISummary {\n\t\tlet summary = this.localSummaries.get(clientSequenceNumber);\n\t\tif (!summary) {\n\t\t\tsummary = Summary.createLocal(this.clientId, clientSequenceNumber);\n\t\t\tthis.localSummaries.set(summary.clientSequenceNumber, summary);\n\t\t}\n\t\treturn summary;\n\t}\n\n\t/**\n\t * Waits until all of the pending summaries in the underlying SummaryCollection\n\t * are acked/nacked.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/promise-function-async\n\tpublic waitFlushed() {\n\t\treturn this.summaryCollection.waitFlushed();\n\t}\n\n\t/**\n\t * Gets a watched summary or returns undefined if not watched.\n\t * @param clientSequenceNumber - client sequence number of sent summary op\n\t */\n\tpublic tryGetSummary(clientSequenceNumber: number) {\n\t\treturn this.localSummaries.get(clientSequenceNumber);\n\t}\n\n\t/**\n\t * Starts watching a summary made by this client.\n\t * @param summary - summary to start watching\n\t */\n\tpublic setSummary(summary: Summary) {\n\t\tthis.localSummaries.set(summary.clientSequenceNumber, summary);\n\t}\n\n\tpublic dispose() {\n\t\tthis.summaryCollection.removeWatcher(this.clientId);\n\t\tthis._disposed = true;\n\t}\n}\n\nexport type OpActionEventName =\n\t| MessageType.Summarize\n\t| MessageType.SummaryAck\n\t| MessageType.SummaryNack\n\t| \"default\";\nexport type OpActionEventListener = (op: ISequencedDocumentMessage) => void;\nexport interface ISummaryCollectionOpEvents extends IEvent {\n\t(event: OpActionEventName, listener: OpActionEventListener);\n}\n\n/**\n * Data structure that looks at the op stream to track summaries as they\n * are broadcast, acked and nacked.\n * It provides functionality for watching specific summaries.\n */\nexport class SummaryCollection extends TypedEventEmitter<ISummaryCollectionOpEvents> {\n\t// key: clientId\n\tprivate readonly summaryWatchers = new Map<string, ClientSummaryWatcher>();\n\t// key: summarySeqNum\n\tprivate readonly pendingSummaries = new Map<number, Summary>();\n\tprivate refreshWaitNextAck = new Deferred<void>();\n\n\tprivate lastSummaryTimestamp: number | undefined;\n\tprivate maxAckWaitTime: number | undefined;\n\tprivate pendingAckTimerTimeoutCallback: (() => void) | undefined;\n\tprivate lastAck: IAckedSummary | undefined;\n\n\tpublic get latestAck(): IAckedSummary | undefined {\n\t\treturn this.lastAck;\n\t}\n\n\tpublic emit(event: OpActionEventName, ...args: Parameters<OpActionEventListener>): boolean {\n\t\treturn super.emit(event, ...args);\n\t}\n\n\tpublic get opsSinceLastAck() {\n\t\treturn (\n\t\t\tthis.deltaManager.lastSequenceNumber -\n\t\t\t(this.lastAck?.summaryAck.sequenceNumber ?? this.deltaManager.initialSequenceNumber)\n\t\t);\n\t}\n\n\tpublic addOpListener(listener: () => void) {\n\t\tthis.deltaManager.on(\"op\", listener);\n\t}\n\n\tpublic removeOpListener(listener: () => void) {\n\t\tthis.deltaManager.off(\"op\", listener);\n\t}\n\n\tpublic constructor(\n\t\tprivate readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\tsuper();\n\t\tthis.deltaManager.on(\"op\", (op) => this.handleOp(op));\n\t}\n\n\t/**\n\t * Creates and returns a summary watcher for a specific client.\n\t * This will allow for local sent summaries to be better tracked.\n\t * @param clientId - client id for watcher\n\t */\n\tpublic createWatcher(clientId: string): IClientSummaryWatcher {\n\t\tconst watcher = new ClientSummaryWatcher(clientId, this);\n\t\tthis.summaryWatchers.set(clientId, watcher);\n\t\treturn watcher;\n\t}\n\n\tpublic removeWatcher(clientId: string) {\n\t\tthis.summaryWatchers.delete(clientId);\n\t}\n\n\tpublic setPendingAckTimerTimeoutCallback(maxAckWaitTime: number, timeoutCallback: () => void) {\n\t\tthis.maxAckWaitTime = maxAckWaitTime;\n\t\tthis.pendingAckTimerTimeoutCallback = timeoutCallback;\n\t}\n\n\tpublic unsetPendingAckTimerTimeoutCallback() {\n\t\tthis.maxAckWaitTime = undefined;\n\t\tthis.pendingAckTimerTimeoutCallback = undefined;\n\t}\n\n\t/**\n\t * Returns a promise that resolves once all pending summary ops\n\t * have been acked or nacked.\n\t */\n\tpublic async waitFlushed(): Promise<IAckedSummary | undefined> {\n\t\twhile (this.pendingSummaries.size > 0) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/promise-function-async\n\t\t\tconst promises = Array.from(this.pendingSummaries, ([, summary]) =>\n\t\t\t\tsummary.waitAckNack(),\n\t\t\t);\n\t\t\tawait Promise.all(promises);\n\t\t}\n\t\treturn this.lastAck;\n\t}\n\n\t/**\n\t * Returns a promise that resolves once a summary is acked that has a reference\n\t * sequence number greater than or equal to the passed in sequence number.\n\t * @param referenceSequenceNumber - reference sequence number to wait for\n\t * @returns The latest acked summary\n\t */\n\tpublic async waitSummaryAck(referenceSequenceNumber: number): Promise<IAckedSummary> {\n\t\twhile (\n\t\t\t!this.lastAck ||\n\t\t\tthis.lastAck.summaryOp.referenceSequenceNumber < referenceSequenceNumber\n\t\t) {\n\t\t\tawait this.refreshWaitNextAck.promise;\n\t\t}\n\t\treturn this.lastAck;\n\t}\n\n\tprivate parseContent(op: ISequencedDocumentMessage) {\n\t\t// back-compat: ADO #1385: Make this unconditional in the future,\n\t\t// when Container.processRemoteMessage stops parsing contents. That said, we should move to\n\t\t// listen for \"op\" events from ContainerRuntime, and parsing may not be required at all if\n\t\t// ContainerRuntime.process() would parse it for all types of ops.\n\t\t// Can make either of those changes only when LTS moves to a version that has no content\n\t\t// parsing in loader layer!\n\t\tif (typeof op.contents === \"string\") {\n\t\t\top.contents = JSON.parse(op.contents);\n\t\t}\n\t}\n\n\t/**\n\t * Handler for ops; only handles ops relating to summaries.\n\t * @param op - op message to handle\n\t */\n\tprivate handleOp(opArg: ISequencedDocumentMessage) {\n\t\tconst op = { ...opArg };\n\n\t\tswitch (op.type) {\n\t\t\tcase MessageType.Summarize:\n\t\t\t\tthis.parseContent(op);\n\t\t\t\treturn this.handleSummaryOp(op as ISummaryOpMessage);\n\t\t\tcase MessageType.SummaryAck:\n\t\t\tcase MessageType.SummaryNack:\n\t\t\t\t// Old files (prior to PR #10077) may not contain this info\n\t\t\t\t// back-compat: ADO #1385: remove cast when ISequencedDocumentMessage changes are propagated\n\t\t\t\tif ((op as any).data !== undefined) {\n\t\t\t\t\top.contents = JSON.parse((op as any).data);\n\t\t\t\t} else {\n\t\t\t\t\tthis.parseContent(op);\n\t\t\t\t}\n\t\t\t\treturn op.type === MessageType.SummaryAck\n\t\t\t\t\t? this.handleSummaryAck(op as ISummaryAckMessage)\n\t\t\t\t\t: this.handleSummaryNack(op as ISummaryNackMessage);\n\t\t\tdefault: {\n\t\t\t\t// If the difference between timestamp of current op and last summary op is greater than\n\t\t\t\t// the maxAckWaitTime, then we need to inform summarizer to not wait and summarize\n\t\t\t\t// immediately as we have already waited for maxAckWaitTime.\n\t\t\t\tconst lastOpTimestamp = op.timestamp;\n\t\t\t\tif (\n\t\t\t\t\tthis.lastSummaryTimestamp !== undefined &&\n\t\t\t\t\tthis.maxAckWaitTime !== undefined &&\n\t\t\t\t\tlastOpTimestamp - this.lastSummaryTimestamp >= this.maxAckWaitTime\n\t\t\t\t) {\n\t\t\t\t\tthis.pendingAckTimerTimeoutCallback?.();\n\t\t\t\t}\n\t\t\t\tthis.emit(\"default\", op);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleSummaryOp(op: ISummaryOpMessage) {\n\t\tlet summary: Summary | undefined;\n\n\t\t// Check if summary already being watched, broadcast if so\n\t\tconst watcher = this.summaryWatchers.get(op.clientId);\n\t\tif (watcher) {\n\t\t\tsummary = watcher.tryGetSummary(op.clientSequenceNumber);\n\t\t\tif (summary) {\n\t\t\t\tsummary.broadcast(op);\n\t\t\t}\n\t\t}\n\n\t\t// If not watched, create from op\n\t\tif (!summary) {\n\t\t\tsummary = Summary.createFromOp(op);\n\t\t\tif (watcher) {\n\t\t\t\twatcher.setSummary(summary);\n\t\t\t}\n\t\t}\n\t\tthis.pendingSummaries.set(op.sequenceNumber, summary);\n\t\tthis.lastSummaryTimestamp = op.timestamp;\n\t\tthis.emit(MessageType.Summarize, op);\n\t}\n\n\tprivate handleSummaryAck(op: ISummaryAckMessage) {\n\t\tconst seq = op.contents.summaryProposal.summarySequenceNumber;\n\t\tconst summary = this.pendingSummaries.get(seq);\n\t\tif (!summary || summary.summaryOp === undefined) {\n\t\t\t// Summary ack without an op should be rare. We could fetch the\n\t\t\t// reference sequence number from the snapshot, but instead we\n\t\t\t// will not emit this ack. It should be the case that the summary\n\t\t\t// op that this ack is for is earlier than this file was loaded\n\t\t\t// from. i.e. initialSequenceNumber > summarySequenceNumber.\n\t\t\t// We really don't care about it for now, since it is older than\n\t\t\t// the one we loaded from.\n\t\t\tif (seq > this.deltaManager.initialSequenceNumber) {\n\t\t\t\t// Potential causes for it to be later than our initialSequenceNumber\n\t\t\t\t// are that the summaryOp was nacked then acked, double-acked, or\n\t\t\t\t// the summarySequenceNumber is incorrect.\n\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\teventName: \"SummaryAckWithoutOp\",\n\t\t\t\t\tsequenceNumber: op.sequenceNumber, // summary ack seq #\n\t\t\t\t\tsummarySequenceNumber: seq, // missing summary seq #\n\t\t\t\t\tinitialSequenceNumber: this.deltaManager.initialSequenceNumber,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tsummary.ackNack(op);\n\t\tthis.pendingSummaries.delete(seq);\n\n\t\t// Track latest ack\n\t\tif (\n\t\t\t!this.lastAck ||\n\t\t\tseq > this.lastAck.summaryAck.contents.summaryProposal.summarySequenceNumber\n\t\t) {\n\t\t\tthis.lastAck = {\n\t\t\t\tsummaryOp: summary.summaryOp,\n\t\t\t\tsummaryAck: op,\n\t\t\t};\n\t\t\tthis.refreshWaitNextAck.resolve();\n\t\t\tthis.refreshWaitNextAck = new Deferred<void>();\n\t\t\tthis.emit(MessageType.SummaryAck, op);\n\t\t}\n\t}\n\n\tprivate handleSummaryNack(op: ISummaryNackMessage) {\n\t\tconst seq = op.contents.summaryProposal.summarySequenceNumber;\n\t\tconst summary = this.pendingSummaries.get(seq);\n\t\tif (summary) {\n\t\t\tsummary.ackNack(op);\n\t\t\tthis.pendingSummaries.delete(seq);\n\t\t\tthis.emit(MessageType.SummaryNack, op);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"summaryCollection.js","sourceRoot":"","sources":["../../src/summary/summaryCollection.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 { IDisposable, IEvent } from \"@fluidframework/core-interfaces\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils\";\nimport { Deferred, assert } from \"@fluidframework/core-utils\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions\";\nimport {\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tISummaryAck,\n\tISummaryContent,\n\tISummaryNack,\n\tMessageType,\n} from \"@fluidframework/protocol-definitions\";\n\n/**\n * Interface for summary op messages with typed contents.\n */\nexport interface ISummaryOpMessage extends ISequencedDocumentMessage {\n\ttype: MessageType.Summarize;\n\tcontents: ISummaryContent;\n}\n\n/**\n * Interface for summary ack messages with typed contents.\n */\nexport interface ISummaryAckMessage extends ISequencedDocumentMessage {\n\ttype: MessageType.SummaryAck;\n\tcontents: ISummaryAck;\n}\n\n/**\n * Interface for summary nack messages with typed contents.\n */\nexport interface ISummaryNackMessage extends ISequencedDocumentMessage {\n\ttype: MessageType.SummaryNack;\n\tcontents: ISummaryNack;\n}\n\n/**\n * A single summary which can be tracked as it goes through its life cycle.\n * The life cycle is: Local to Broadcast to Acked/Nacked.\n */\nexport interface ISummary {\n\treadonly clientId: string;\n\treadonly clientSequenceNumber: number;\n\twaitBroadcast(): Promise<ISummaryOpMessage>;\n\twaitAckNack(): Promise<ISummaryAckMessage | ISummaryNackMessage>;\n}\n\n/**\n * A single summary which has already been acked by the server.\n */\nexport interface IAckedSummary {\n\treadonly summaryOp: ISummaryOpMessage;\n\treadonly summaryAck: ISummaryAckMessage;\n}\n\nenum SummaryState {\n\tLocal = 0,\n\tBroadcast = 1,\n\tAcked = 2,\n\tNacked = -1,\n}\n\nclass Summary implements ISummary {\n\tpublic static createLocal(clientId: string, clientSequenceNumber: number) {\n\t\treturn new Summary(clientId, clientSequenceNumber);\n\t}\n\tpublic static createFromOp(op: ISummaryOpMessage) {\n\t\t// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)\n\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n\t\tconst summary = new Summary(op.clientId as string, op.clientSequenceNumber);\n\t\tsummary.broadcast(op);\n\t\treturn summary;\n\t}\n\n\tprivate state = SummaryState.Local;\n\n\tprivate _summaryOp?: ISummaryOpMessage;\n\tprivate _summaryAckNack?: ISummaryAckMessage | ISummaryNackMessage;\n\n\tprivate readonly defSummaryOp = new Deferred<void>();\n\tprivate readonly defSummaryAck = new Deferred<void>();\n\n\tpublic get summaryOp() {\n\t\treturn this._summaryOp;\n\t}\n\tpublic get summaryAckNack() {\n\t\treturn this._summaryAckNack;\n\t}\n\n\tprivate constructor(\n\t\tpublic readonly clientId: string,\n\t\tpublic readonly clientSequenceNumber: number,\n\t) {}\n\n\tpublic hasBeenAcked(): this is IAckedSummary {\n\t\treturn this.state === SummaryState.Acked;\n\t}\n\n\tpublic broadcast(op: ISummaryOpMessage) {\n\t\tassert(\n\t\t\tthis.state === SummaryState.Local,\n\t\t\t0x175 /* \"Can only broadcast if summarizer starts in local state\" */,\n\t\t);\n\t\tthis._summaryOp = op;\n\t\tthis.defSummaryOp.resolve();\n\t\tthis.state = SummaryState.Broadcast;\n\t\treturn true;\n\t}\n\n\tpublic ackNack(op: ISummaryAckMessage | ISummaryNackMessage) {\n\t\tassert(\n\t\t\tthis.state === SummaryState.Broadcast,\n\t\t\t0x176 /* \"Can only ack/nack if summarizer is in broadcasting state\" */,\n\t\t);\n\t\tthis._summaryAckNack = op;\n\t\tthis.defSummaryAck.resolve();\n\t\tthis.state = op.type === MessageType.SummaryAck ? SummaryState.Acked : SummaryState.Nacked;\n\t\treturn true;\n\t}\n\n\tpublic async waitBroadcast(): Promise<ISummaryOpMessage> {\n\t\tawait this.defSummaryOp.promise;\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\treturn this._summaryOp!;\n\t}\n\n\tpublic async waitAckNack(): Promise<ISummaryAckMessage | ISummaryNackMessage> {\n\t\tawait this.defSummaryAck.promise;\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\treturn this._summaryAckNack!;\n\t}\n}\n\n/**\n * Watches summaries created by a specific client.\n */\nexport interface IClientSummaryWatcher extends IDisposable {\n\twatchSummary(clientSequenceNumber: number): ISummary;\n\twaitFlushed(): Promise<IAckedSummary | undefined>;\n}\n\n/**\n * This class watches summaries created by a specific client.\n * It should be created and managed from a SummaryCollection.\n */\nclass ClientSummaryWatcher implements IClientSummaryWatcher {\n\t// key: clientSeqNum\n\tprivate readonly localSummaries = new Map<number, Summary>();\n\tprivate _disposed = false;\n\n\tpublic get disposed() {\n\t\treturn this._disposed;\n\t}\n\n\tpublic constructor(\n\t\tpublic readonly clientId: string,\n\t\tprivate readonly summaryCollection: SummaryCollection,\n\t) {}\n\n\t/**\n\t * Watches for a specific sent summary op.\n\t * @param clientSequenceNumber - client sequence number of sent summary op\n\t */\n\tpublic watchSummary(clientSequenceNumber: number): ISummary {\n\t\tlet summary = this.localSummaries.get(clientSequenceNumber);\n\t\tif (!summary) {\n\t\t\tsummary = Summary.createLocal(this.clientId, clientSequenceNumber);\n\t\t\tthis.localSummaries.set(summary.clientSequenceNumber, summary);\n\t\t}\n\t\treturn summary;\n\t}\n\n\t/**\n\t * Waits until all of the pending summaries in the underlying SummaryCollection\n\t * are acked/nacked.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/promise-function-async\n\tpublic waitFlushed() {\n\t\treturn this.summaryCollection.waitFlushed();\n\t}\n\n\t/**\n\t * Gets a watched summary or returns undefined if not watched.\n\t * @param clientSequenceNumber - client sequence number of sent summary op\n\t */\n\tpublic tryGetSummary(clientSequenceNumber: number) {\n\t\treturn this.localSummaries.get(clientSequenceNumber);\n\t}\n\n\t/**\n\t * Starts watching a summary made by this client.\n\t * @param summary - summary to start watching\n\t */\n\tpublic setSummary(summary: Summary) {\n\t\tthis.localSummaries.set(summary.clientSequenceNumber, summary);\n\t}\n\n\tpublic dispose() {\n\t\tthis.summaryCollection.removeWatcher(this.clientId);\n\t\tthis._disposed = true;\n\t}\n}\n\nexport type OpActionEventName =\n\t| MessageType.Summarize\n\t| MessageType.SummaryAck\n\t| MessageType.SummaryNack\n\t| \"default\";\nexport type OpActionEventListener = (op: ISequencedDocumentMessage) => void;\nexport interface ISummaryCollectionOpEvents extends IEvent {\n\t(event: OpActionEventName, listener: OpActionEventListener);\n}\n\n/**\n * Data structure that looks at the op stream to track summaries as they\n * are broadcast, acked and nacked.\n * It provides functionality for watching specific summaries.\n */\nexport class SummaryCollection extends TypedEventEmitter<ISummaryCollectionOpEvents> {\n\t// key: clientId\n\tprivate readonly summaryWatchers = new Map<string, ClientSummaryWatcher>();\n\t// key: summarySeqNum\n\tprivate readonly pendingSummaries = new Map<number, Summary>();\n\tprivate refreshWaitNextAck = new Deferred<void>();\n\n\tprivate lastSummaryTimestamp: number | undefined;\n\tprivate maxAckWaitTime: number | undefined;\n\tprivate pendingAckTimerTimeoutCallback: (() => void) | undefined;\n\tprivate lastAck: IAckedSummary | undefined;\n\n\tpublic get latestAck(): IAckedSummary | undefined {\n\t\treturn this.lastAck;\n\t}\n\n\tpublic emit(event: OpActionEventName, ...args: Parameters<OpActionEventListener>): boolean {\n\t\treturn super.emit(event, ...args);\n\t}\n\n\tpublic get opsSinceLastAck() {\n\t\treturn (\n\t\t\tthis.deltaManager.lastSequenceNumber -\n\t\t\t(this.lastAck?.summaryAck.sequenceNumber ?? this.deltaManager.initialSequenceNumber)\n\t\t);\n\t}\n\n\tpublic addOpListener(listener: () => void) {\n\t\tthis.deltaManager.on(\"op\", listener);\n\t}\n\n\tpublic removeOpListener(listener: () => void) {\n\t\tthis.deltaManager.off(\"op\", listener);\n\t}\n\n\tpublic constructor(\n\t\tprivate readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\tsuper();\n\t\tthis.deltaManager.on(\"op\", (op) => this.handleOp(op));\n\t}\n\n\t/**\n\t * Creates and returns a summary watcher for a specific client.\n\t * This will allow for local sent summaries to be better tracked.\n\t * @param clientId - client id for watcher\n\t */\n\tpublic createWatcher(clientId: string): IClientSummaryWatcher {\n\t\tconst watcher = new ClientSummaryWatcher(clientId, this);\n\t\tthis.summaryWatchers.set(clientId, watcher);\n\t\treturn watcher;\n\t}\n\n\tpublic removeWatcher(clientId: string) {\n\t\tthis.summaryWatchers.delete(clientId);\n\t}\n\n\tpublic setPendingAckTimerTimeoutCallback(maxAckWaitTime: number, timeoutCallback: () => void) {\n\t\tthis.maxAckWaitTime = maxAckWaitTime;\n\t\tthis.pendingAckTimerTimeoutCallback = timeoutCallback;\n\t}\n\n\tpublic unsetPendingAckTimerTimeoutCallback() {\n\t\tthis.maxAckWaitTime = undefined;\n\t\tthis.pendingAckTimerTimeoutCallback = undefined;\n\t}\n\n\t/**\n\t * Returns a promise that resolves once all pending summary ops\n\t * have been acked or nacked.\n\t */\n\tpublic async waitFlushed(): Promise<IAckedSummary | undefined> {\n\t\twhile (this.pendingSummaries.size > 0) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/promise-function-async\n\t\t\tconst promises = Array.from(this.pendingSummaries, ([, summary]) =>\n\t\t\t\tsummary.waitAckNack(),\n\t\t\t);\n\t\t\tawait Promise.all(promises);\n\t\t}\n\t\treturn this.lastAck;\n\t}\n\n\t/**\n\t * Returns a promise that resolves once a summary is acked that has a reference\n\t * sequence number greater than or equal to the passed in sequence number.\n\t * @param referenceSequenceNumber - reference sequence number to wait for\n\t * @returns The latest acked summary\n\t */\n\tpublic async waitSummaryAck(referenceSequenceNumber: number): Promise<IAckedSummary> {\n\t\twhile (\n\t\t\t!this.lastAck ||\n\t\t\tthis.lastAck.summaryOp.referenceSequenceNumber < referenceSequenceNumber\n\t\t) {\n\t\t\tawait this.refreshWaitNextAck.promise;\n\t\t}\n\t\treturn this.lastAck;\n\t}\n\n\tprivate parseContent(op: ISequencedDocumentMessage) {\n\t\t// back-compat: ADO #1385: Make this unconditional in the future,\n\t\t// when Container.processRemoteMessage stops parsing contents. That said, we should move to\n\t\t// listen for \"op\" events from ContainerRuntime, and parsing may not be required at all if\n\t\t// ContainerRuntime.process() would parse it for all types of ops.\n\t\t// Can make either of those changes only when LTS moves to a version that has no content\n\t\t// parsing in loader layer!\n\t\tif (typeof op.contents === \"string\") {\n\t\t\top.contents = JSON.parse(op.contents);\n\t\t}\n\t}\n\n\t/**\n\t * Handler for ops; only handles ops relating to summaries.\n\t * @param op - op message to handle\n\t */\n\tprivate handleOp(opArg: ISequencedDocumentMessage) {\n\t\tconst op = { ...opArg };\n\n\t\tswitch (op.type) {\n\t\t\tcase MessageType.Summarize:\n\t\t\t\tthis.parseContent(op);\n\t\t\t\treturn this.handleSummaryOp(op as ISummaryOpMessage);\n\t\t\tcase MessageType.SummaryAck:\n\t\t\tcase MessageType.SummaryNack:\n\t\t\t\t// Old files (prior to PR #10077) may not contain this info\n\t\t\t\t// back-compat: ADO #1385: remove cast when ISequencedDocumentMessage changes are propagated\n\t\t\t\tif ((op as any).data !== undefined) {\n\t\t\t\t\top.contents = JSON.parse((op as any).data);\n\t\t\t\t} else {\n\t\t\t\t\tthis.parseContent(op);\n\t\t\t\t}\n\t\t\t\treturn op.type === MessageType.SummaryAck\n\t\t\t\t\t? this.handleSummaryAck(op as ISummaryAckMessage)\n\t\t\t\t\t: this.handleSummaryNack(op as ISummaryNackMessage);\n\t\t\tdefault: {\n\t\t\t\t// If the difference between timestamp of current op and last summary op is greater than\n\t\t\t\t// the maxAckWaitTime, then we need to inform summarizer to not wait and summarize\n\t\t\t\t// immediately as we have already waited for maxAckWaitTime.\n\t\t\t\tconst lastOpTimestamp = op.timestamp;\n\t\t\t\tif (\n\t\t\t\t\tthis.lastSummaryTimestamp !== undefined &&\n\t\t\t\t\tthis.maxAckWaitTime !== undefined &&\n\t\t\t\t\tlastOpTimestamp - this.lastSummaryTimestamp >= this.maxAckWaitTime\n\t\t\t\t) {\n\t\t\t\t\tthis.pendingAckTimerTimeoutCallback?.();\n\t\t\t\t}\n\t\t\t\tthis.emit(\"default\", op);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleSummaryOp(op: ISummaryOpMessage) {\n\t\tlet summary: Summary | undefined;\n\n\t\t// Check if summary already being watched, broadcast if so\n\t\t// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)\n\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n\t\tconst watcher = this.summaryWatchers.get(op.clientId as string);\n\t\tif (watcher) {\n\t\t\tsummary = watcher.tryGetSummary(op.clientSequenceNumber);\n\t\t\tif (summary) {\n\t\t\t\tsummary.broadcast(op);\n\t\t\t}\n\t\t}\n\n\t\t// If not watched, create from op\n\t\tif (!summary) {\n\t\t\tsummary = Summary.createFromOp(op);\n\t\t\tif (watcher) {\n\t\t\t\twatcher.setSummary(summary);\n\t\t\t}\n\t\t}\n\t\tthis.pendingSummaries.set(op.sequenceNumber, summary);\n\t\tthis.lastSummaryTimestamp = op.timestamp;\n\t\tthis.emit(MessageType.Summarize, op);\n\t}\n\n\tprivate handleSummaryAck(op: ISummaryAckMessage) {\n\t\tconst seq = op.contents.summaryProposal.summarySequenceNumber;\n\t\tconst summary = this.pendingSummaries.get(seq);\n\t\tif (!summary || summary.summaryOp === undefined) {\n\t\t\t// Summary ack without an op should be rare. We could fetch the\n\t\t\t// reference sequence number from the snapshot, but instead we\n\t\t\t// will not emit this ack. It should be the case that the summary\n\t\t\t// op that this ack is for is earlier than this file was loaded\n\t\t\t// from. i.e. initialSequenceNumber > summarySequenceNumber.\n\t\t\t// We really don't care about it for now, since it is older than\n\t\t\t// the one we loaded from.\n\t\t\tif (seq > this.deltaManager.initialSequenceNumber) {\n\t\t\t\t// Potential causes for it to be later than our initialSequenceNumber\n\t\t\t\t// are that the summaryOp was nacked then acked, double-acked, or\n\t\t\t\t// the summarySequenceNumber is incorrect.\n\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\teventName: \"SummaryAckWithoutOp\",\n\t\t\t\t\tsequenceNumber: op.sequenceNumber, // summary ack seq #\n\t\t\t\t\tsummarySequenceNumber: seq, // missing summary seq #\n\t\t\t\t\tinitialSequenceNumber: this.deltaManager.initialSequenceNumber,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tsummary.ackNack(op);\n\t\tthis.pendingSummaries.delete(seq);\n\n\t\t// Track latest ack\n\t\tif (\n\t\t\t!this.lastAck ||\n\t\t\tseq > this.lastAck.summaryAck.contents.summaryProposal.summarySequenceNumber\n\t\t) {\n\t\t\tthis.lastAck = {\n\t\t\t\tsummaryOp: summary.summaryOp,\n\t\t\t\tsummaryAck: op,\n\t\t\t};\n\t\t\tthis.refreshWaitNextAck.resolve();\n\t\t\tthis.refreshWaitNextAck = new Deferred<void>();\n\t\t\tthis.emit(MessageType.SummaryAck, op);\n\t\t}\n\t}\n\n\tprivate handleSummaryNack(op: ISummaryNackMessage) {\n\t\tconst seq = op.contents.summaryProposal.summarySequenceNumber;\n\t\tconst summary = this.pendingSummaries.get(seq);\n\t\tif (summary) {\n\t\t\tsummary.ackNack(op);\n\t\t\tthis.pendingSummaries.delete(seq);\n\t\t\tthis.emit(MessageType.SummaryNack, op);\n\t\t}\n\t}\n}\n"]}
@@ -76,6 +76,7 @@ export declare const chunksBlobName = ".chunks";
76
76
  export declare const electedSummarizerBlobName = ".electedSummarizer";
77
77
  export declare const blobsTreeName = ".blobs";
78
78
  export declare const idCompressorBlobName = ".idCompressor";
79
+ export declare const blobHeadersBlobName = ".metadata.blobHeaders";
79
80
  export declare function rootHasIsolatedChannels(metadata?: IContainerRuntimeMetadata): boolean;
80
81
  export declare const protocolTreeName = ".protocol";
81
82
  /**
@@ -92,7 +93,9 @@ export declare const dataStoreAttributesBlobName = ".component";
92
93
  * @param summarizeResult - Summary tree and stats to modify
93
94
  *
94
95
  * @example
96
+ *
95
97
  * Converts from:
98
+ *
96
99
  * ```typescript
97
100
  * {
98
101
  * type: SummaryType.Tree,
@@ -113,6 +116,7 @@ export declare const dataStoreAttributesBlobName = ".component";
113
116
  * },
114
117
  * }
115
118
  * ```
119
+ *
116
120
  * And adds +1 to treeNodeCount in stats.
117
121
  */
118
122
  export declare function wrapSummaryInChannelsTree(summarizeResult: ISummaryTreeWithStats): void;
@@ -1 +1 @@
1
- {"version":3,"file":"summaryFormat.d.ts","sourceRoot":"","sources":["../../src/summary/summaryFormat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"summaryFormat.d.ts","sourceRoot":"","sources":["../../src/summary/summaryFormat.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,8 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { assert } from "@fluidframework/common-utils";
6
- import { readAndParse } from "@fluidframework/driver-utils";
5
+ import { assert } from "@fluidframework/core-utils";
6
+ import { readAndParse, blobHeadersBlobName as blobNameForBlobHeaders, } from "@fluidframework/driver-utils";
7
7
  import { SummaryType, } from "@fluidframework/protocol-definitions";
8
8
  import { channelsTreeName, gcTreeKey, } from "@fluidframework/runtime-definitions";
9
9
  export function getAttributesFormatVersion(attributes) {
@@ -46,7 +46,6 @@ export const extractSummaryMetadataMessage = (message) => message === undefined
46
46
  type: message.type,
47
47
  };
48
48
  export function getMetadataFormatVersion(metadata) {
49
- var _a;
50
49
  /**
51
50
  * Version 2+: Introduces runtime sequence number for data verification.
52
51
  *
@@ -57,7 +56,7 @@ export function getMetadataFormatVersion(metadata) {
57
56
  * Version 0: metadata blob missing; format version is missing from summary.
58
57
  * This indicates it is an older version.
59
58
  */
60
- return (_a = metadata === null || metadata === void 0 ? void 0 : metadata.summaryFormatVersion) !== null && _a !== void 0 ? _a : 0;
59
+ return metadata?.summaryFormatVersion ?? 0;
61
60
  }
62
61
  export const aliasBlobName = ".aliases";
63
62
  export const metadataBlobName = ".metadata";
@@ -65,6 +64,7 @@ export const chunksBlobName = ".chunks";
65
64
  export const electedSummarizerBlobName = ".electedSummarizer";
66
65
  export const blobsTreeName = ".blobs";
67
66
  export const idCompressorBlobName = ".idCompressor";
67
+ export const blobHeadersBlobName = blobNameForBlobHeaders;
68
68
  export function rootHasIsolatedChannels(metadata) {
69
69
  return !!metadata && !metadata.disableIsolatedChannels;
70
70
  }
@@ -90,7 +90,9 @@ export const dataStoreAttributesBlobName = ".component";
90
90
  * @param summarizeResult - Summary tree and stats to modify
91
91
  *
92
92
  * @example
93
+ *
93
94
  * Converts from:
95
+ *
94
96
  * ```typescript
95
97
  * {
96
98
  * type: SummaryType.Tree,
@@ -111,6 +113,7 @@ export const dataStoreAttributesBlobName = ".component";
111
113
  * },
112
114
  * }
113
115
  * ```
116
+ *
114
117
  * And adds +1 to treeNodeCount in stats.
115
118
  */
116
119
  export function wrapSummaryInChannelsTree(summarizeResult) {
@@ -1 +1 @@
1
- {"version":3,"file":"summaryFormat.js","sourceRoot":"","sources":["../../src/summary/summaryFormat.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { readAndParse } from \"@fluidframework/driver-utils\";\nimport {\n\tISequencedDocumentMessage,\n\tISnapshotTree,\n\tSummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tchannelsTreeName,\n\tgcTreeKey,\n\tISummaryTreeWithStats,\n} from \"@fluidframework/runtime-definitions\";\nimport { IGCMetadata } from \"../gc\";\n\ntype OmitAttributesVersions<T> = Omit<T, \"snapshotFormatVersion\" | \"summaryFormatVersion\">;\ninterface IFluidDataStoreAttributes0 {\n\treadonly snapshotFormatVersion?: undefined;\n\treadonly summaryFormatVersion?: undefined;\n\tpkg: string;\n\t/**\n\t * This tells whether a data store is root. Root data stores are never collected.\n\t * Non-root data stores may be collected if they are not used. If this is not present, default it to\n\t * true. This will ensure that older data stores are incorrectly collected.\n\t */\n\treadonly isRootDataStore?: boolean;\n}\ninterface IFluidDataStoreAttributes1 extends OmitAttributesVersions<IFluidDataStoreAttributes0> {\n\treadonly snapshotFormatVersion: \"0.1\";\n\treadonly summaryFormatVersion?: undefined;\n}\ninterface IFluidDataStoreAttributes2 extends OmitAttributesVersions<IFluidDataStoreAttributes1> {\n\t/** Switch from snapshotFormatVersion to summaryFormatVersion */\n\treadonly snapshotFormatVersion?: undefined;\n\treadonly summaryFormatVersion: 2;\n\t/**\n\t * True if channels are not isolated in .channels subtrees, otherwise isolated.\n\t * This is required in both datastore attributes as well as the root container,\n\t * because reused summary handles may cause different format versions in each\n\t * datastore subtree within the summary.\n\t */\n\treadonly disableIsolatedChannels?: true;\n}\n/**\n * Added IFluidDataStoreAttributes similar to IChannelAttributes which will tell the attributes of a\n * store like the package, snapshotFormatVersion to take different decisions based on a particular\n * snapshotFormatVersion.\n */\nexport type ReadFluidDataStoreAttributes =\n\t| IFluidDataStoreAttributes0\n\t| IFluidDataStoreAttributes1\n\t| IFluidDataStoreAttributes2;\nexport type WriteFluidDataStoreAttributes = IFluidDataStoreAttributes1 | IFluidDataStoreAttributes2;\n\nexport function getAttributesFormatVersion(attributes: ReadFluidDataStoreAttributes): number {\n\tif (attributes.summaryFormatVersion) {\n\t\t/**\n\t\t * Version 2+: Introduces .channels trees for isolation of\n\t\t * channel trees from data store objects.\n\t\t */\n\t\treturn attributes.summaryFormatVersion;\n\t} else if (attributes.snapshotFormatVersion === \"0.1\") {\n\t\t/**\n\t\t * Version 1: from this version the pkg within the data store\n\t\t * attributes blob is a JSON array rather than a string.\n\t\t */\n\t\treturn 1;\n\t}\n\t/**\n\t * Version 0: format version is missing from summary.\n\t * This indicates it is an older version.\n\t */\n\treturn 0;\n}\n\nexport function hasIsolatedChannels(attributes: ReadFluidDataStoreAttributes): boolean {\n\treturn !!attributes.summaryFormatVersion && !attributes.disableIsolatedChannels;\n}\nexport interface IContainerRuntimeMetadata extends ICreateContainerMetadata, IGCMetadata {\n\treadonly summaryFormatVersion: 1;\n\t/** The last message processed at the time of summary. Only primitive property types are added to the summary. */\n\treadonly message: ISummaryMetadataMessage | undefined;\n\t/** True if channels are not isolated in .channels subtrees, otherwise isolated. */\n\treadonly disableIsolatedChannels?: true;\n\t/** The summary number for a container's summary. Incremented on summaries throughout its lifetime. */\n\treadonly summaryNumber?: number;\n\t/** GUID to identify a document in telemetry */\n\treadonly telemetryDocumentId?: string;\n\t/** True if the runtime IdCompressor is enabled */\n\treadonly idCompressorEnabled?: boolean;\n}\n\nexport interface ICreateContainerMetadata {\n\t/** Runtime version of the container when it was first created */\n\tcreateContainerRuntimeVersion?: string;\n\t/** Timestamp of the container when it was first created */\n\tcreateContainerTimestamp?: number;\n}\n\n/** The properties of an ISequencedDocumentMessage to be stored in the metadata blob in summary. */\nexport type ISummaryMetadataMessage = Pick<\n\tISequencedDocumentMessage,\n\t| \"clientId\"\n\t| \"clientSequenceNumber\"\n\t| \"minimumSequenceNumber\"\n\t| \"referenceSequenceNumber\"\n\t| \"sequenceNumber\"\n\t| \"timestamp\"\n\t| \"type\"\n>;\n\n/**\n * Extracts the properties from an ISequencedDocumentMessage as defined by ISummaryMetadataMessage. This message is\n * added to the metadata blob in summary.\n */\nexport const extractSummaryMetadataMessage = (\n\tmessage?: ISequencedDocumentMessage,\n): ISummaryMetadataMessage | undefined =>\n\tmessage === undefined\n\t\t? undefined\n\t\t: {\n\t\t\t\tclientId: message.clientId,\n\t\t\t\tclientSequenceNumber: message.clientSequenceNumber,\n\t\t\t\tminimumSequenceNumber: message.minimumSequenceNumber,\n\t\t\t\treferenceSequenceNumber: message.referenceSequenceNumber,\n\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t\ttimestamp: message.timestamp,\n\t\t\t\ttype: message.type,\n\t\t };\n\nexport function getMetadataFormatVersion(metadata?: IContainerRuntimeMetadata): number {\n\t/**\n\t * Version 2+: Introduces runtime sequence number for data verification.\n\t *\n\t * Version 1+: Introduces .metadata blob and .channels trees for isolation of\n\t * data store trees from container-level objects.\n\t * Also introduces enableGC option stored in the summary.\n\t *\n\t * Version 0: metadata blob missing; format version is missing from summary.\n\t * This indicates it is an older version.\n\t */\n\treturn metadata?.summaryFormatVersion ?? 0;\n}\n\nexport const aliasBlobName = \".aliases\";\nexport const metadataBlobName = \".metadata\";\nexport const chunksBlobName = \".chunks\";\nexport const electedSummarizerBlobName = \".electedSummarizer\";\nexport const blobsTreeName = \".blobs\";\nexport const idCompressorBlobName = \".idCompressor\";\n\nexport function rootHasIsolatedChannels(metadata?: IContainerRuntimeMetadata): boolean {\n\treturn !!metadata && !metadata.disableIsolatedChannels;\n}\n\nexport const protocolTreeName = \".protocol\";\n\n/**\n * List of tree IDs at the container level which are reserved.\n * This is for older versions of summaries that do not yet have an\n * isolated data stores namespace. Without the namespace, this must\n * be used to prevent name collisions with data store IDs.\n */\nexport const nonDataStorePaths = [\n\tprotocolTreeName,\n\t\".logTail\",\n\t\".serviceProtocol\",\n\tblobsTreeName,\n\tgcTreeKey,\n\tidCompressorBlobName,\n];\n\nexport const dataStoreAttributesBlobName = \".component\";\n\n/**\n * Modifies summary tree and stats to put tree under .channels tree.\n *\n * @param summarizeResult - Summary tree and stats to modify\n *\n * @example\n * Converts from:\n * ```typescript\n * {\n * type: SummaryType.Tree,\n * tree: { a: {...}, b: {...}, c: {...} },\n * }\n * ```\n *\n * to:\n *\n * ```typescript\n * {\n * type: SummaryType.Tree,\n * tree: {\n * \".channels\": {\n * type: SummaryType.Tree,\n * tree: { a: {...}, b: {...}, c: {...} }\n * },\n * },\n * }\n * ```\n * And adds +1 to treeNodeCount in stats.\n */\nexport function wrapSummaryInChannelsTree(summarizeResult: ISummaryTreeWithStats): void {\n\tsummarizeResult.summary = {\n\t\ttype: SummaryType.Tree,\n\t\ttree: { [channelsTreeName]: summarizeResult.summary },\n\t};\n\tsummarizeResult.stats.treeNodeCount++;\n}\n\nexport async function getFluidDataStoreAttributes(\n\tstorage: IDocumentStorageService,\n\tsnapshot: ISnapshotTree,\n): Promise<ReadFluidDataStoreAttributes> {\n\tconst attributes = await readAndParse<ReadFluidDataStoreAttributes>(\n\t\tstorage,\n\t\tsnapshot.blobs[dataStoreAttributesBlobName],\n\t);\n\t// Use the snapshotFormatVersion to determine how the pkg is encoded in the snapshot.\n\t// For snapshotFormatVersion = \"0.1\" (1) or above, pkg is jsonified, otherwise it is just a string.\n\t// However the feature of loading a detached container from snapshot, is added when the\n\t// snapshotFormatVersion is at least \"0.1\" (1), so we don't expect it to be anything else.\n\tconst formatVersion = getAttributesFormatVersion(attributes);\n\tassert(formatVersion > 0, 0x1d5 /* Invalid snapshot format version */);\n\treturn attributes;\n}\n"]}
1
+ {"version":3,"file":"summaryFormat.js","sourceRoot":"","sources":["../../src/summary/summaryFormat.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport {\n\treadAndParse,\n\tblobHeadersBlobName as blobNameForBlobHeaders,\n} from \"@fluidframework/driver-utils\";\nimport {\n\tISequencedDocumentMessage,\n\tISnapshotTree,\n\tSummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tchannelsTreeName,\n\tgcTreeKey,\n\tISummaryTreeWithStats,\n} from \"@fluidframework/runtime-definitions\";\nimport { IGCMetadata } from \"../gc\";\n\ntype OmitAttributesVersions<T> = Omit<T, \"snapshotFormatVersion\" | \"summaryFormatVersion\">;\ninterface IFluidDataStoreAttributes0 {\n\treadonly snapshotFormatVersion?: undefined;\n\treadonly summaryFormatVersion?: undefined;\n\tpkg: string;\n\t/**\n\t * This tells whether a data store is root. Root data stores are never collected.\n\t * Non-root data stores may be collected if they are not used. If this is not present, default it to\n\t * true. This will ensure that older data stores are incorrectly collected.\n\t */\n\treadonly isRootDataStore?: boolean;\n}\ninterface IFluidDataStoreAttributes1 extends OmitAttributesVersions<IFluidDataStoreAttributes0> {\n\treadonly snapshotFormatVersion: \"0.1\";\n\treadonly summaryFormatVersion?: undefined;\n}\ninterface IFluidDataStoreAttributes2 extends OmitAttributesVersions<IFluidDataStoreAttributes1> {\n\t/** Switch from snapshotFormatVersion to summaryFormatVersion */\n\treadonly snapshotFormatVersion?: undefined;\n\treadonly summaryFormatVersion: 2;\n\t/**\n\t * True if channels are not isolated in .channels subtrees, otherwise isolated.\n\t * This is required in both datastore attributes as well as the root container,\n\t * because reused summary handles may cause different format versions in each\n\t * datastore subtree within the summary.\n\t */\n\treadonly disableIsolatedChannels?: true;\n}\n/**\n * Added IFluidDataStoreAttributes similar to IChannelAttributes which will tell the attributes of a\n * store like the package, snapshotFormatVersion to take different decisions based on a particular\n * snapshotFormatVersion.\n */\nexport type ReadFluidDataStoreAttributes =\n\t| IFluidDataStoreAttributes0\n\t| IFluidDataStoreAttributes1\n\t| IFluidDataStoreAttributes2;\nexport type WriteFluidDataStoreAttributes = IFluidDataStoreAttributes1 | IFluidDataStoreAttributes2;\n\nexport function getAttributesFormatVersion(attributes: ReadFluidDataStoreAttributes): number {\n\tif (attributes.summaryFormatVersion) {\n\t\t/**\n\t\t * Version 2+: Introduces .channels trees for isolation of\n\t\t * channel trees from data store objects.\n\t\t */\n\t\treturn attributes.summaryFormatVersion;\n\t} else if (attributes.snapshotFormatVersion === \"0.1\") {\n\t\t/**\n\t\t * Version 1: from this version the pkg within the data store\n\t\t * attributes blob is a JSON array rather than a string.\n\t\t */\n\t\treturn 1;\n\t}\n\t/**\n\t * Version 0: format version is missing from summary.\n\t * This indicates it is an older version.\n\t */\n\treturn 0;\n}\n\nexport function hasIsolatedChannels(attributes: ReadFluidDataStoreAttributes): boolean {\n\treturn !!attributes.summaryFormatVersion && !attributes.disableIsolatedChannels;\n}\nexport interface IContainerRuntimeMetadata extends ICreateContainerMetadata, IGCMetadata {\n\treadonly summaryFormatVersion: 1;\n\t/** The last message processed at the time of summary. Only primitive property types are added to the summary. */\n\treadonly message: ISummaryMetadataMessage | undefined;\n\t/** True if channels are not isolated in .channels subtrees, otherwise isolated. */\n\treadonly disableIsolatedChannels?: true;\n\t/** The summary number for a container's summary. Incremented on summaries throughout its lifetime. */\n\treadonly summaryNumber?: number;\n\t/** GUID to identify a document in telemetry */\n\treadonly telemetryDocumentId?: string;\n\t/** True if the runtime IdCompressor is enabled */\n\treadonly idCompressorEnabled?: boolean;\n}\n\nexport interface ICreateContainerMetadata {\n\t/** Runtime version of the container when it was first created */\n\tcreateContainerRuntimeVersion?: string;\n\t/** Timestamp of the container when it was first created */\n\tcreateContainerTimestamp?: number;\n}\n\n/** The properties of an ISequencedDocumentMessage to be stored in the metadata blob in summary. */\nexport type ISummaryMetadataMessage = Pick<\n\tISequencedDocumentMessage,\n\t| \"clientId\"\n\t| \"clientSequenceNumber\"\n\t| \"minimumSequenceNumber\"\n\t| \"referenceSequenceNumber\"\n\t| \"sequenceNumber\"\n\t| \"timestamp\"\n\t| \"type\"\n>;\n\n/**\n * Extracts the properties from an ISequencedDocumentMessage as defined by ISummaryMetadataMessage. This message is\n * added to the metadata blob in summary.\n */\nexport const extractSummaryMetadataMessage = (\n\tmessage?: ISequencedDocumentMessage,\n): ISummaryMetadataMessage | undefined =>\n\tmessage === undefined\n\t\t? undefined\n\t\t: {\n\t\t\t\tclientId: message.clientId,\n\t\t\t\tclientSequenceNumber: message.clientSequenceNumber,\n\t\t\t\tminimumSequenceNumber: message.minimumSequenceNumber,\n\t\t\t\treferenceSequenceNumber: message.referenceSequenceNumber,\n\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t\ttimestamp: message.timestamp,\n\t\t\t\ttype: message.type,\n\t\t };\n\nexport function getMetadataFormatVersion(metadata?: IContainerRuntimeMetadata): number {\n\t/**\n\t * Version 2+: Introduces runtime sequence number for data verification.\n\t *\n\t * Version 1+: Introduces .metadata blob and .channels trees for isolation of\n\t * data store trees from container-level objects.\n\t * Also introduces enableGC option stored in the summary.\n\t *\n\t * Version 0: metadata blob missing; format version is missing from summary.\n\t * This indicates it is an older version.\n\t */\n\treturn metadata?.summaryFormatVersion ?? 0;\n}\n\nexport const aliasBlobName = \".aliases\";\nexport const metadataBlobName = \".metadata\";\nexport const chunksBlobName = \".chunks\";\nexport const electedSummarizerBlobName = \".electedSummarizer\";\nexport const blobsTreeName = \".blobs\";\nexport const idCompressorBlobName = \".idCompressor\";\nexport const blobHeadersBlobName = blobNameForBlobHeaders;\n\nexport function rootHasIsolatedChannels(metadata?: IContainerRuntimeMetadata): boolean {\n\treturn !!metadata && !metadata.disableIsolatedChannels;\n}\n\nexport const protocolTreeName = \".protocol\";\n\n/**\n * List of tree IDs at the container level which are reserved.\n * This is for older versions of summaries that do not yet have an\n * isolated data stores namespace. Without the namespace, this must\n * be used to prevent name collisions with data store IDs.\n */\nexport const nonDataStorePaths = [\n\tprotocolTreeName,\n\t\".logTail\",\n\t\".serviceProtocol\",\n\tblobsTreeName,\n\tgcTreeKey,\n\tidCompressorBlobName,\n];\n\nexport const dataStoreAttributesBlobName = \".component\";\n\n/**\n * Modifies summary tree and stats to put tree under .channels tree.\n *\n * @param summarizeResult - Summary tree and stats to modify\n *\n * @example\n *\n * Converts from:\n *\n * ```typescript\n * {\n * type: SummaryType.Tree,\n * tree: { a: {...}, b: {...}, c: {...} },\n * }\n * ```\n *\n * to:\n *\n * ```typescript\n * {\n * type: SummaryType.Tree,\n * tree: {\n * \".channels\": {\n * type: SummaryType.Tree,\n * tree: { a: {...}, b: {...}, c: {...} }\n * },\n * },\n * }\n * ```\n *\n * And adds +1 to treeNodeCount in stats.\n */\nexport function wrapSummaryInChannelsTree(summarizeResult: ISummaryTreeWithStats): void {\n\tsummarizeResult.summary = {\n\t\ttype: SummaryType.Tree,\n\t\ttree: { [channelsTreeName]: summarizeResult.summary },\n\t};\n\tsummarizeResult.stats.treeNodeCount++;\n}\n\nexport async function getFluidDataStoreAttributes(\n\tstorage: IDocumentStorageService,\n\tsnapshot: ISnapshotTree,\n): Promise<ReadFluidDataStoreAttributes> {\n\tconst attributes = await readAndParse<ReadFluidDataStoreAttributes>(\n\t\tstorage,\n\t\tsnapshot.blobs[dataStoreAttributesBlobName],\n\t);\n\t// Use the snapshotFormatVersion to determine how the pkg is encoded in the snapshot.\n\t// For snapshotFormatVersion = \"0.1\" (1) or above, pkg is jsonified, otherwise it is just a string.\n\t// However the feature of loading a detached container from snapshot, is added when the\n\t// snapshotFormatVersion is at least \"0.1\" (1), so we don't expect it to be anything else.\n\tconst formatVersion = getAttributesFormatVersion(attributes);\n\tassert(formatVersion > 0, 0x1d5 /* Invalid snapshot format version */);\n\treturn attributes;\n}\n"]}
@@ -2,9 +2,10 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
6
- import { Deferred, IPromiseTimer, IPromiseTimerResult } from "@fluidframework/common-utils";
7
- import { IAckSummaryResult, INackSummaryResult, ISummarizeOptions, IBroadcastSummaryResult, ISummarizeResults, ISummarizeHeuristicData, ISubmitSummaryOptions, SubmitSummaryResult, SummarizeResultPart, ISummaryCancellationToken, ISummarizeTelemetryProperties } from "./summarizerTypes";
5
+ import { ITelemetryLoggerExt, LoggingError } from "@fluidframework/telemetry-utils";
6
+ import { ITelemetryProperties } from "@fluidframework/core-interfaces";
7
+ import { Deferred, IPromiseTimer, IPromiseTimerResult } from "@fluidframework/core-utils";
8
+ import { IAckSummaryResult, INackSummaryResult, IBroadcastSummaryResult, ISummarizeResults, ISummarizeHeuristicData, ISubmitSummaryOptions, SubmitSummaryResult, SummarizeResultPart, ISummaryCancellationToken, SubmitSummaryFailureData } from "./summarizerTypes";
8
9
  import { IClientSummaryWatcher } from "./summaryCollection";
9
10
  export declare type raceTimerResult<T> = {
10
11
  result: "done";
@@ -77,12 +78,26 @@ declare const summarizeErrors: {
77
78
  };
78
79
  export declare const getFailMessage: (errorCode: keyof typeof summarizeErrors) => string;
79
80
  export declare class SummarizeResultBuilder {
80
- readonly summarySubmitted: Deferred<SummarizeResultPart<SubmitSummaryResult, undefined>>;
81
+ readonly summarySubmitted: Deferred<SummarizeResultPart<SubmitSummaryResult, SubmitSummaryFailureData>>;
81
82
  readonly summaryOpBroadcasted: Deferred<SummarizeResultPart<IBroadcastSummaryResult, undefined>>;
82
83
  readonly receivedSummaryAckOrNack: Deferred<SummarizeResultPart<IAckSummaryResult, INackSummaryResult>>;
83
- fail(message: string, error: any, nackSummaryResult?: INackSummaryResult, retryAfterSeconds?: number): void;
84
+ /**
85
+ * Fails one or more of the three results as per the passed params.
86
+ * If submit fails, all three results fail.
87
+ * If op broadcast fails, only op broadcast result and ack nack result fails.
88
+ * If ack nack fails, only ack nack result fails.
89
+ */
90
+ fail(message: string, error: any, submitFailureResult?: SubmitSummaryFailureData, nackSummaryResult?: INackSummaryResult): void;
84
91
  build(): ISummarizeResults;
85
92
  }
93
+ /**
94
+ * Errors type for errors hit during summary that may be retriable.
95
+ */
96
+ export declare class RetriableSummaryError extends LoggingError {
97
+ readonly retryAfterSeconds?: number | undefined;
98
+ readonly canRetry: boolean;
99
+ constructor(message: string, retryAfterSeconds?: number | undefined, props?: ITelemetryProperties);
100
+ }
86
101
  /**
87
102
  * This class generates and tracks a summary attempt.
88
103
  */
@@ -102,7 +117,7 @@ export declare class SummaryGenerator {
102
117
  * @param options - refreshLatestAck to fetch summary ack info from server,
103
118
  * fullTree to generate tree without any summary handles even if unchanged
104
119
  */
105
- summarize(summarizeProps: ISummarizeTelemetryProperties, options: ISummarizeOptions, cancellationToken: ISummaryCancellationToken, resultsBuilder?: SummarizeResultBuilder): ISummarizeResults;
120
+ summarize(summaryOptions: ISubmitSummaryOptions, resultsBuilder?: SummarizeResultBuilder): ISummarizeResults;
106
121
  private summarizeCore;
107
122
  private addSummaryDataToTelemetryProps;
108
123
  private summarizeTimerHandler;
@@ -1 +1 @@
1
- {"version":3,"file":"summaryGenerator.d.ts","sourceRoot":"","sources":["../../src/summary/summaryGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,mBAAmB,EAInB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEN,QAAQ,EACR,aAAa,EACb,mBAAmB,EAEnB,MAAM,8BAA8B,CAAC;AAItC,OAAO,EACN,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,6BAA6B,EAE7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,oBAAY,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,uEAAuE;AACvE,wBAAsB,SAAS,CAAC,CAAC,EAChC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,EACnC,iBAAiB,CAAC,EAAE,yBAAyB,GAC3C,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAW7B;AAMD,oBAAY,eAAe;AAC1B;;;;;GAKG;AACD,MAAM;AACR;;;;GAIG;GACD,SAAS;AACX;;;;;;GAMG;GACD,QAAQ;AACV;;;;;;GAMG;GACD,aAAa;AACf,yDAAyD;GACvD,YAAY,MAAM,EAAE;AACtB,uDAAuD;GACrD,WAAW,MAAM,EAAE,CAAC;AAEvB,QAAA,MAAM,eAAe;IACpB;;;;OAIG;;IAEH;;;OAGG;;IAEH;;;;OAIG;;IAEH;;;OAGG;;;CAIM,CAAC;AAGX,eAAO,MAAM,cAAc,cAAe,MAAM,sBAAsB,WACxB,CAAC;AAE/C,qBAAa,sBAAsB;IAClC,SAAgB,gBAAgB,gEAA4D;IAC5F,SAAgB,oBAAoB,oEAEhC;IACJ,SAAgB,wBAAwB,uEAEpC;IAEG,IAAI,CACV,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,GAAG,EACV,iBAAiB,CAAC,EAAE,kBAAkB,EACtC,iBAAiB,CAAC,EAAE,MAAM;IAkBpB,KAAK,IAAI,iBAAiB;CAOjC;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAG3B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAGtC,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IATxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;gBAErB,eAAe,EAAE,aAAa,EAC9B,aAAa,EAAE,uBAAuB,EACtC,qBAAqB,EAAE,CACvC,OAAO,EAAE,qBAAqB,KAC1B,OAAO,CAAC,mBAAmB,CAAC,EAChB,yBAAyB,EAAE,MAAM,IAAI,EACrC,cAAc,EAAE,IAAI,CAAC,qBAAqB,EAAE,cAAc,CAAC,EAC3D,MAAM,EAAE,mBAAmB;IAO7C;;;;;;OAMG;IACI,SAAS,CACf,cAAc,EAAE,6BAA6B,EAC7C,OAAO,EAAE,iBAAiB,EAC1B,iBAAiB,EAAE,yBAAyB,EAC5C,cAAc,yBAA+B,GAC3C,iBAAiB;YAYN,aAAa;IA8O3B,OAAO,CAAC,8BAA8B;IA6CtC,OAAO,CAAC,qBAAqB;IAetB,OAAO;CAGd"}
1
+ {"version":3,"file":"summaryGenerator.d.ts","sourceRoot":"","sources":["../../src/summary/summaryGenerator.ts"],"names":[],"mappings":"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"}
@@ -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 { PerformanceEvent, LoggingError, ChildLogger, } from "@fluidframework/telemetry-utils";
6
- import { assert, Deferred, Timer, } from "@fluidframework/common-utils";
5
+ import { PerformanceEvent, LoggingError, } from "@fluidframework/telemetry-utils";
6
+ import { assert, Deferred, Timer, } from "@fluidframework/core-utils";
7
7
  import { MessageType } from "@fluidframework/protocol-definitions";
8
8
  import { getRetryDelaySecondsFromError } from "@fluidframework/driver-utils";
9
- import { DriverErrorType } from "@fluidframework/driver-definitions";
9
+ import { DriverErrorTypes } from "@fluidframework/driver-definitions";
10
10
  /** Helper function to wait for a promise or PromiseTimer to elapse. */
11
11
  export async function raceTimer(promise, timer, cancellationToken) {
12
12
  const promises = [
@@ -54,18 +54,25 @@ export class SummarizeResultBuilder {
54
54
  this.summaryOpBroadcasted = new Deferred();
55
55
  this.receivedSummaryAckOrNack = new Deferred();
56
56
  }
57
- fail(message, error, nackSummaryResult, retryAfterSeconds) {
57
+ /**
58
+ * Fails one or more of the three results as per the passed params.
59
+ * If submit fails, all three results fail.
60
+ * If op broadcast fails, only op broadcast result and ack nack result fails.
61
+ * If ack nack fails, only ack nack result fails.
62
+ */
63
+ fail(message, error, submitFailureResult, nackSummaryResult) {
58
64
  assert(!this.receivedSummaryAckOrNack.isCompleted, 0x25e /* "no reason to call fail if all promises have been completed" */);
59
65
  const result = {
60
66
  success: false,
61
67
  message,
62
68
  data: undefined,
63
69
  error,
64
- retryAfterSeconds,
65
70
  };
66
- this.summarySubmitted.resolve(result);
71
+ // Note that if any of these are already resolved, it will be a no-op. For example, if ack nack failed but
72
+ // submit summary and op broadcast has already been resolved as passed, only ack nack result will get modified.
73
+ this.summarySubmitted.resolve({ ...result, data: submitFailureResult });
67
74
  this.summaryOpBroadcasted.resolve(result);
68
- this.receivedSummaryAckOrNack.resolve(Object.assign(Object.assign({}, result), { data: nackSummaryResult }));
75
+ this.receivedSummaryAckOrNack.resolve({ ...result, data: nackSummaryResult });
69
76
  }
70
77
  build() {
71
78
  return {
@@ -75,6 +82,16 @@ export class SummarizeResultBuilder {
75
82
  };
76
83
  }
77
84
  }
85
+ /**
86
+ * Errors type for errors hit during summary that may be retriable.
87
+ */
88
+ export class RetriableSummaryError extends LoggingError {
89
+ constructor(message, retryAfterSeconds, props) {
90
+ super(message, props);
91
+ this.retryAfterSeconds = retryAfterSeconds;
92
+ this.canRetry = this.retryAfterSeconds !== undefined;
93
+ }
94
+ }
78
95
  /**
79
96
  * This class generates and tracks a summary attempt.
80
97
  */
@@ -95,63 +112,76 @@ export class SummaryGenerator {
95
112
  * @param options - refreshLatestAck to fetch summary ack info from server,
96
113
  * fullTree to generate tree without any summary handles even if unchanged
97
114
  */
98
- summarize(summarizeProps, options, cancellationToken, resultsBuilder = new SummarizeResultBuilder()) {
99
- this.summarizeCore(summarizeProps, options, resultsBuilder, cancellationToken).catch((error) => {
115
+ summarize(summaryOptions, resultsBuilder = new SummarizeResultBuilder()) {
116
+ this.summarizeCore(summaryOptions, resultsBuilder).catch((error) => {
100
117
  const message = "UnexpectedSummarizeError";
101
- this.logger.sendErrorEvent(Object.assign({ eventName: message }, summarizeProps), error);
118
+ summaryOptions.summaryLogger.sendErrorEvent({ eventName: message }, error);
102
119
  resultsBuilder.fail(message, error);
103
120
  });
104
121
  return resultsBuilder.build();
105
122
  }
106
- async summarizeCore(summarizeProps, options, resultsBuilder, cancellationToken) {
107
- const { refreshLatestAck, fullTree } = options;
108
- const logger = ChildLogger.create(this.logger, undefined, { all: summarizeProps });
123
+ async summarizeCore(submitSummaryOptions, resultsBuilder) {
124
+ const { summaryLogger, cancellationToken, ...summarizeOptions } = submitSummaryOptions;
109
125
  // Note: timeSinceLastAttempt and timeSinceLastSummary for the
110
126
  // first summary are basically the time since the summarizer was loaded.
111
127
  const timeSinceLastAttempt = Date.now() - this.heuristicData.lastAttempt.summaryTime;
112
128
  const timeSinceLastSummary = Date.now() - this.heuristicData.lastSuccessfulSummary.summaryTime;
113
129
  let summarizeTelemetryProps = {
114
- fullTree,
130
+ ...summarizeOptions,
131
+ fullTree: summarizeOptions.fullTree ?? false,
115
132
  timeSinceLastAttempt,
116
133
  timeSinceLastSummary,
117
134
  };
118
- const summarizeEvent = PerformanceEvent.start(logger, Object.assign({ eventName: "Summarize", refreshLatestAck }, summarizeTelemetryProps), { start: true, end: true, cancel: "generic" });
119
- const fail = (errorCode, error, properties, nackSummaryResult) => {
120
- // UploadSummary may fail with 429 and retryAfter - respect that
121
- // Summary Nack also can have retryAfter, it's parsed below and comes as a property.
122
- const retryAfterSeconds = getRetryDelaySecondsFromError(error);
135
+ const summarizeEvent = PerformanceEvent.start(summaryLogger, {
136
+ eventName: "Summarize",
137
+ ...summarizeTelemetryProps,
138
+ }, { start: true, end: true, cancel: "generic" });
139
+ let summaryData;
140
+ /**
141
+ * Summarization can fail during submit, during op broadcast or during nack.
142
+ * For submit failures, submitFailureResult should be provided. For nack failures, nackSummaryResult should
143
+ * be provided. For op broadcast failures, only errors / properties should be provided.
144
+ */
145
+ const fail = (errorCode, error, properties, submitFailureResult, nackSummaryResult) => {
123
146
  // Report any failure as an error unless it was due to cancellation (like "disconnected" error)
124
147
  // If failure happened on upload, we may not yet realized that socket disconnected, so check
125
148
  // offlineError too.
126
- const category = cancellationToken.cancelled || (error === null || error === void 0 ? void 0 : error.errorType) === DriverErrorType.offlineError
149
+ const category = cancellationToken.cancelled || error?.errorType === DriverErrorTypes.offlineError
127
150
  ? "generic"
128
151
  : "error";
129
152
  const reason = getFailMessage(errorCode);
130
- summarizeEvent.cancel(Object.assign(Object.assign({}, properties), { reason,
153
+ summarizeEvent.cancel({
154
+ ...properties,
155
+ reason,
131
156
  category,
132
- retryAfterSeconds }), error !== null && error !== void 0 ? error : reason); // disconnect & summaryAckTimeout do not have proper error.
133
- resultsBuilder.fail(reason, error, nackSummaryResult, retryAfterSeconds);
157
+ retryAfterSeconds: submitFailureResult?.retryAfterSeconds ??
158
+ nackSummaryResult?.retryAfterSeconds,
159
+ }, error ?? reason); // disconnect & summaryAckTimeout do not have proper error.
160
+ resultsBuilder.fail(reason, error, submitFailureResult, nackSummaryResult);
134
161
  };
135
162
  // Wait to generate and send summary
136
163
  this.summarizeTimer.start();
137
- // Use record type to prevent unexpected value types
138
- let summaryData;
139
164
  try {
140
165
  // Need to save refSeqNum before we record new attempt (happens as part of submitSummaryCallback)
141
166
  const lastAttemptRefSeqNum = this.heuristicData.lastAttempt.refSequenceNumber;
142
- summaryData = await this.submitSummaryCallback({
143
- fullTree,
144
- refreshLatestAck,
145
- summaryLogger: logger,
146
- cancellationToken,
147
- });
167
+ summaryData = await this.submitSummaryCallback(submitSummaryOptions);
148
168
  // Cumulatively add telemetry properties based on how far generateSummary went.
149
169
  const referenceSequenceNumber = summaryData.referenceSequenceNumber;
150
- summarizeTelemetryProps = Object.assign(Object.assign({}, summarizeTelemetryProps), { referenceSequenceNumber, minimumSequenceNumber: summaryData.minimumSequenceNumber, opsSinceLastAttempt: referenceSequenceNumber - lastAttemptRefSeqNum, opsSinceLastSummary: referenceSequenceNumber -
151
- this.heuristicData.lastSuccessfulSummary.refSequenceNumber, stage: summaryData.stage });
170
+ summarizeTelemetryProps = {
171
+ ...summarizeTelemetryProps,
172
+ referenceSequenceNumber,
173
+ minimumSequenceNumber: summaryData.minimumSequenceNumber,
174
+ opsSinceLastAttempt: referenceSequenceNumber - lastAttemptRefSeqNum,
175
+ opsSinceLastSummary: referenceSequenceNumber -
176
+ this.heuristicData.lastSuccessfulSummary.refSequenceNumber,
177
+ stage: summaryData.stage,
178
+ };
152
179
  summarizeTelemetryProps = this.addSummaryDataToTelemetryProps(summaryData, summarizeTelemetryProps);
153
180
  if (summaryData.stage !== "submit") {
154
- return fail("submitSummaryFailure", summaryData.error, summarizeTelemetryProps);
181
+ return fail("submitSummaryFailure", summaryData.error, summarizeTelemetryProps, {
182
+ stage: summaryData.stage,
183
+ retryAfterSeconds: getRetryDelaySecondsFromError(summaryData.error),
184
+ });
155
185
  }
156
186
  /**
157
187
  * With incremental summaries, if the full tree was not summarized, only data stores that changed should
@@ -163,11 +193,11 @@ export class SummaryGenerator {
163
193
  * state change of multiple data stores. So, the total number of data stores that are summarized should not
164
194
  * exceed the number of ops since last summary + number of data store whose reference state changed.
165
195
  */
166
- if (!fullTree && !summaryData.forcedFullTree) {
196
+ if (!submitSummaryOptions.fullTree && !summaryData.forcedFullTree) {
167
197
  const { summarizedDataStoreCount, gcStateUpdatedDataStoreCount = 0 } = summaryData.summaryStats;
168
198
  if (summarizedDataStoreCount >
169
199
  gcStateUpdatedDataStoreCount + this.heuristicData.opsSinceLastSummary) {
170
- logger.sendErrorEvent({
200
+ summaryLogger.sendErrorEvent({
171
201
  eventName: "IncrementalSummaryViolation",
172
202
  summarizedDataStoreCount,
173
203
  gcStateUpdatedDataStoreCount,
@@ -176,11 +206,14 @@ export class SummaryGenerator {
176
206
  }
177
207
  }
178
208
  // Log event here on summary success only, as Summarize_cancel duplicates failure logging.
179
- summarizeEvent.reportEvent("generate", Object.assign({}, summarizeTelemetryProps));
209
+ summarizeEvent.reportEvent("generate", { ...summarizeTelemetryProps });
180
210
  resultsBuilder.summarySubmitted.resolve({ success: true, data: summaryData });
181
211
  }
182
212
  catch (error) {
183
- return fail("submitSummaryFailure", error);
213
+ return fail("submitSummaryFailure", error, undefined /* properties */, {
214
+ stage: "unknown",
215
+ retryAfterSeconds: getRetryDelaySecondsFromError(error),
216
+ });
184
217
  }
185
218
  finally {
186
219
  if (summaryData === undefined) {
@@ -206,7 +239,7 @@ export class SummaryGenerator {
206
239
  data: { summarizeOp, broadcastDuration },
207
240
  });
208
241
  this.heuristicData.lastAttempt.summarySequenceNumber = summarizeOp.sequenceNumber;
209
- logger.sendTelemetryEvent({
242
+ summaryLogger.sendTelemetryEvent({
210
243
  eventName: "Summarize_Op",
211
244
  duration: broadcastDuration,
212
245
  referenceSequenceNumber: summarizeOp.referenceSequenceNumber,
@@ -226,11 +259,19 @@ export class SummaryGenerator {
226
259
  // Update for success/failure
227
260
  const ackNackDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;
228
261
  // adding new properties
229
- summarizeTelemetryProps = Object.assign({ ackWaitDuration: ackNackDuration, ackNackSequenceNumber: ackNackOp.sequenceNumber, summarySequenceNumber: ackNackOp.contents.summaryProposal.summarySequenceNumber }, summarizeTelemetryProps);
262
+ summarizeTelemetryProps = {
263
+ ackWaitDuration: ackNackDuration,
264
+ ackNackSequenceNumber: ackNackOp.sequenceNumber,
265
+ summarySequenceNumber: ackNackOp.contents.summaryProposal.summarySequenceNumber,
266
+ ...summarizeTelemetryProps,
267
+ };
230
268
  if (ackNackOp.type === MessageType.SummaryAck) {
231
269
  this.heuristicData.markLastAttemptAsSuccessful();
232
270
  this.successfulSummaryCallback();
233
- summarizeEvent.end(Object.assign(Object.assign({}, summarizeTelemetryProps), { handle: ackNackOp.contents.handle }));
271
+ summarizeEvent.end({
272
+ ...summarizeTelemetryProps,
273
+ handle: ackNackOp.contents.handle,
274
+ });
234
275
  resultsBuilder.receivedSummaryAckOrNack.resolve({
235
276
  success: true,
236
277
  data: {
@@ -243,8 +284,8 @@ export class SummaryGenerator {
243
284
  // Check for retryDelay in summaryNack response.
244
285
  assert(ackNackOp.type === MessageType.SummaryNack, 0x274 /* "type check" */);
245
286
  const summaryNack = ackNackOp.contents;
246
- const errorMessage = summaryNack === null || summaryNack === void 0 ? void 0 : summaryNack.message;
247
- const retryAfterSeconds = summaryNack === null || summaryNack === void 0 ? void 0 : summaryNack.retryAfter;
287
+ const errorMessage = summaryNack?.message;
288
+ const retryAfterSeconds = summaryNack?.retryAfter;
248
289
  // pre-0.58 error message prefix: summaryNack
249
290
  const error = new LoggingError(`Received summaryNack`, {
250
291
  retryAfterSeconds,
@@ -252,7 +293,7 @@ export class SummaryGenerator {
252
293
  });
253
294
  assert(getRetryDelaySecondsFromError(error) === retryAfterSeconds, 0x25f /* "retryAfterSeconds" */);
254
295
  // This will only set resultsBuilder.receivedSummaryAckOrNack, as other promises are already set.
255
- return fail("summaryNack", error, Object.assign(Object.assign({}, summarizeTelemetryProps), { nackRetryAfter: retryAfterSeconds }), { summaryNackOp: ackNackOp, ackNackDuration });
296
+ return fail("summaryNack", error, { ...summarizeTelemetryProps, nackRetryAfter: retryAfterSeconds }, undefined /* submitFailureResult */, { summaryNackOp: ackNackOp, ackNackDuration, retryAfterSeconds });
256
297
  }
257
298
  }
258
299
  finally {
@@ -264,11 +305,32 @@ export class SummaryGenerator {
264
305
  case "base":
265
306
  return initialProps;
266
307
  case "generate":
267
- return Object.assign(Object.assign(Object.assign({}, initialProps), summaryData.summaryStats), { generateDuration: summaryData.generateDuration });
308
+ return {
309
+ ...initialProps,
310
+ ...summaryData.summaryStats,
311
+ generateDuration: summaryData.generateDuration,
312
+ };
268
313
  case "upload":
269
- return Object.assign(Object.assign(Object.assign({}, initialProps), summaryData.summaryStats), { generateDuration: summaryData.generateDuration, handle: summaryData.handle, uploadDuration: summaryData.uploadDuration });
314
+ return {
315
+ ...initialProps,
316
+ ...summaryData.summaryStats,
317
+ generateDuration: summaryData.generateDuration,
318
+ handle: summaryData.handle,
319
+ uploadDuration: summaryData.uploadDuration,
320
+ };
270
321
  case "submit":
271
- return Object.assign(Object.assign(Object.assign({}, initialProps), summaryData.summaryStats), { generateDuration: summaryData.generateDuration, handle: summaryData.handle, uploadDuration: summaryData.uploadDuration, clientSequenceNumber: summaryData.clientSequenceNumber, hasMissingOpData: this.heuristicData.hasMissingOpData, opsSizesSinceLastSummary: this.heuristicData.totalOpsSize, nonRuntimeOpsSinceLastSummary: this.heuristicData.numNonRuntimeOps, runtimeOpsSinceLastSummary: this.heuristicData.numRuntimeOps });
322
+ return {
323
+ ...initialProps,
324
+ ...summaryData.summaryStats,
325
+ generateDuration: summaryData.generateDuration,
326
+ handle: summaryData.handle,
327
+ uploadDuration: summaryData.uploadDuration,
328
+ clientSequenceNumber: summaryData.clientSequenceNumber,
329
+ hasMissingOpData: this.heuristicData.hasMissingOpData,
330
+ opsSizesSinceLastSummary: this.heuristicData.totalOpsSize,
331
+ nonRuntimeOpsSinceLastSummary: this.heuristicData.numNonRuntimeOps,
332
+ runtimeOpsSinceLastSummary: this.heuristicData.numRuntimeOps,
333
+ };
272
334
  default:
273
335
  assert(true, 0x397 /* Unexpected summary stage */);
274
336
  }