@fluidframework/container-runtime 2.0.0-internal.5.2.0 → 2.0.0-internal.5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/blobManager.d.ts +5 -2
  3. package/dist/blobManager.d.ts.map +1 -1
  4. package/dist/blobManager.js +51 -22
  5. package/dist/blobManager.js.map +1 -1
  6. package/dist/connectionTelemetry.d.ts.map +1 -1
  7. package/dist/connectionTelemetry.js +8 -1
  8. package/dist/connectionTelemetry.js.map +1 -1
  9. package/dist/containerRuntime.d.ts +4 -15
  10. package/dist/containerRuntime.d.ts.map +1 -1
  11. package/dist/containerRuntime.js +12 -7
  12. package/dist/containerRuntime.js.map +1 -1
  13. package/dist/dataStoreContext.d.ts.map +1 -1
  14. package/dist/dataStoreContext.js +4 -3
  15. package/dist/dataStoreContext.js.map +1 -1
  16. package/dist/dataStoreContexts.d.ts.map +1 -1
  17. package/dist/dataStoreContexts.js +2 -1
  18. package/dist/dataStoreContexts.js.map +1 -1
  19. package/dist/dataStores.d.ts +1 -2
  20. package/dist/dataStores.d.ts.map +1 -1
  21. package/dist/dataStores.js +2 -1
  22. package/dist/dataStores.js.map +1 -1
  23. package/dist/gc/garbageCollection.d.ts.map +1 -1
  24. package/dist/gc/garbageCollection.js +4 -3
  25. package/dist/gc/garbageCollection.js.map +1 -1
  26. package/dist/gc/gcTelemetry.d.ts +1 -1
  27. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  28. package/dist/gc/gcTelemetry.js.map +1 -1
  29. package/dist/id-compressor/uuidUtilities.d.ts +0 -2
  30. package/dist/id-compressor/uuidUtilities.d.ts.map +1 -1
  31. package/dist/id-compressor/uuidUtilities.js +1 -3
  32. package/dist/id-compressor/uuidUtilities.js.map +1 -1
  33. package/dist/metadata.d.ts +18 -0
  34. package/dist/metadata.d.ts.map +1 -0
  35. package/dist/metadata.js +7 -0
  36. package/dist/metadata.js.map +1 -0
  37. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  38. package/dist/opLifecycle/opDecompressor.js +14 -8
  39. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  40. package/dist/opLifecycle/opGroupingManager.d.ts +1 -1
  41. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  42. package/dist/opLifecycle/opGroupingManager.js +2 -6
  43. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  44. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  45. package/dist/opLifecycle/opSplitter.js +2 -0
  46. package/dist/opLifecycle/opSplitter.js.map +1 -1
  47. package/dist/opLifecycle/outbox.d.ts +5 -1
  48. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  49. package/dist/opLifecycle/outbox.js +45 -27
  50. package/dist/opLifecycle/outbox.js.map +1 -1
  51. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  52. package/dist/opLifecycle/remoteMessageProcessor.js +3 -1
  53. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  54. package/dist/packageVersion.d.ts +1 -1
  55. package/dist/packageVersion.js +1 -1
  56. package/dist/packageVersion.js.map +1 -1
  57. package/dist/pendingStateManager.d.ts +1 -1
  58. package/dist/pendingStateManager.d.ts.map +1 -1
  59. package/dist/pendingStateManager.js +13 -5
  60. package/dist/pendingStateManager.js.map +1 -1
  61. package/dist/scheduleManager.d.ts.map +1 -1
  62. package/dist/scheduleManager.js +8 -2
  63. package/dist/scheduleManager.js.map +1 -1
  64. package/dist/summary/summarizerNode/summarizerNode.d.ts +1 -1
  65. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  66. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  67. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  68. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +3 -2
  69. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  70. package/dist/summary/summarizerTypes.d.ts +2 -1
  71. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  72. package/dist/summary/summarizerTypes.js.map +1 -1
  73. package/dist/summary/summaryCollection.d.ts.map +1 -1
  74. package/dist/summary/summaryCollection.js +4 -0
  75. package/dist/summary/summaryCollection.js.map +1 -1
  76. package/dist/summary/summaryGenerator.d.ts +1 -1
  77. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  78. package/dist/summary/summaryGenerator.js.map +1 -1
  79. package/lib/blobManager.d.ts +5 -2
  80. package/lib/blobManager.d.ts.map +1 -1
  81. package/lib/blobManager.js +51 -22
  82. package/lib/blobManager.js.map +1 -1
  83. package/lib/connectionTelemetry.d.ts.map +1 -1
  84. package/lib/connectionTelemetry.js +8 -1
  85. package/lib/connectionTelemetry.js.map +1 -1
  86. package/lib/containerRuntime.d.ts +4 -15
  87. package/lib/containerRuntime.d.ts.map +1 -1
  88. package/lib/containerRuntime.js +12 -7
  89. package/lib/containerRuntime.js.map +1 -1
  90. package/lib/dataStoreContext.d.ts.map +1 -1
  91. package/lib/dataStoreContext.js +4 -3
  92. package/lib/dataStoreContext.js.map +1 -1
  93. package/lib/dataStoreContexts.d.ts.map +1 -1
  94. package/lib/dataStoreContexts.js +2 -1
  95. package/lib/dataStoreContexts.js.map +1 -1
  96. package/lib/dataStores.d.ts +1 -2
  97. package/lib/dataStores.d.ts.map +1 -1
  98. package/lib/dataStores.js +2 -1
  99. package/lib/dataStores.js.map +1 -1
  100. package/lib/gc/garbageCollection.d.ts.map +1 -1
  101. package/lib/gc/garbageCollection.js +2 -1
  102. package/lib/gc/garbageCollection.js.map +1 -1
  103. package/lib/gc/gcTelemetry.d.ts +1 -1
  104. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  105. package/lib/gc/gcTelemetry.js.map +1 -1
  106. package/lib/id-compressor/uuidUtilities.d.ts +0 -2
  107. package/lib/id-compressor/uuidUtilities.d.ts.map +1 -1
  108. package/lib/id-compressor/uuidUtilities.js +1 -3
  109. package/lib/id-compressor/uuidUtilities.js.map +1 -1
  110. package/lib/metadata.d.ts +18 -0
  111. package/lib/metadata.d.ts.map +1 -0
  112. package/lib/metadata.js +6 -0
  113. package/lib/metadata.js.map +1 -0
  114. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  115. package/lib/opLifecycle/opDecompressor.js +14 -8
  116. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  117. package/lib/opLifecycle/opGroupingManager.d.ts +1 -1
  118. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  119. package/lib/opLifecycle/opGroupingManager.js +2 -6
  120. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  121. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  122. package/lib/opLifecycle/opSplitter.js +2 -0
  123. package/lib/opLifecycle/opSplitter.js.map +1 -1
  124. package/lib/opLifecycle/outbox.d.ts +5 -1
  125. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  126. package/lib/opLifecycle/outbox.js +45 -27
  127. package/lib/opLifecycle/outbox.js.map +1 -1
  128. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  129. package/lib/opLifecycle/remoteMessageProcessor.js +3 -1
  130. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  131. package/lib/packageVersion.d.ts +1 -1
  132. package/lib/packageVersion.js +1 -1
  133. package/lib/packageVersion.js.map +1 -1
  134. package/lib/pendingStateManager.d.ts +1 -1
  135. package/lib/pendingStateManager.d.ts.map +1 -1
  136. package/lib/pendingStateManager.js +13 -5
  137. package/lib/pendingStateManager.js.map +1 -1
  138. package/lib/scheduleManager.d.ts.map +1 -1
  139. package/lib/scheduleManager.js +8 -2
  140. package/lib/scheduleManager.js.map +1 -1
  141. package/lib/summary/summarizerNode/summarizerNode.d.ts +1 -1
  142. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  143. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  144. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  145. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +2 -1
  146. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  147. package/lib/summary/summarizerTypes.d.ts +2 -1
  148. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  149. package/lib/summary/summarizerTypes.js.map +1 -1
  150. package/lib/summary/summaryCollection.d.ts.map +1 -1
  151. package/lib/summary/summaryCollection.js +4 -0
  152. package/lib/summary/summaryCollection.js.map +1 -1
  153. package/lib/summary/summaryGenerator.d.ts +1 -1
  154. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  155. package/lib/summary/summaryGenerator.js.map +1 -1
  156. package/package.json +19 -18
  157. package/src/blobManager.ts +68 -27
  158. package/src/connectionTelemetry.ts +10 -1
  159. package/src/containerRuntime.ts +14 -25
  160. package/src/dataStoreContext.ts +5 -4
  161. package/src/dataStoreContexts.ts +2 -1
  162. package/src/dataStores.ts +8 -3
  163. package/src/gc/garbageCollection.ts +2 -1
  164. package/src/gc/gcTelemetry.ts +1 -1
  165. package/src/id-compressor/uuidUtilities.ts +1 -4
  166. package/src/metadata.ts +19 -0
  167. package/src/opLifecycle/README.md +20 -0
  168. package/src/opLifecycle/opDecompressor.ts +41 -13
  169. package/src/opLifecycle/opGroupingManager.ts +14 -7
  170. package/src/opLifecycle/opSplitter.ts +3 -1
  171. package/src/opLifecycle/outbox.ts +61 -38
  172. package/src/opLifecycle/remoteMessageProcessor.ts +5 -1
  173. package/src/packageVersion.ts +1 -1
  174. package/src/pendingStateManager.ts +20 -9
  175. package/src/scheduleManager.ts +15 -6
  176. package/src/summary/summarizerNode/summarizerNode.ts +1 -1
  177. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +2 -1
  178. package/src/summary/summarizerTypes.ts +2 -1
  179. package/src/summary/summaryCollection.ts +6 -2
  180. package/src/summary/summaryGenerator.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"scheduleManager.js","sourceRoot":"","sources":["../src/scheduleManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAAuB,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EACN,mBAAmB,EACnB,mBAAmB,EACnB,gCAAgC,GAChC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQ9C;;;;;;;;GAQG;AACH,MAAM,OAAO,eAAe;IAK3B,YACkB,YAAwE,EACxE,OAAqB,EAC7B,WAAqC,EAC7B,MAA2B;QAH3B,iBAAY,GAAZ,YAAY,CAA4D;QACxE,YAAO,GAAP,OAAO,CAAc;QAC7B,gBAAW,GAAX,WAAW,CAA0B;QAC7B,WAAM,GAAN,MAAM,CAAqB;QANrC,aAAQ,GAAG,KAAK,CAAC;QAQxB,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CACvC,IAAI,CAAC,YAAY,EACjB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CACjD,CAAC;QACF,KAAK,IAAI,mBAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAEM,kBAAkB,CAAC,OAAkC;;QAC3D,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,CAAC,QAAQ,EAAE;YAC5C,MAAM,CACL,IAAI,CAAC,aAAa,KAAK,SAAS,EAChC,KAAK,CAAC,mFAAmF,CACzF,CAAC;YAEF,uEAAuE;YACvE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACzC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAExC,MAAM,KAAK,GAAG,MAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAoC,0CAAE,KAAK,CAAC;YACpE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;SAC1D;IACF,CAAC;IAEM,iBAAiB,CAAC,KAAsB,EAAE,OAAkC;;QAClF,uFAAuF;QACvF,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAE9E,IAAI,KAAK,EAAE;YACV,sFAAsF;YACtF,2FAA2F;YAC3F,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtC,OAAO;SACP;QAED,MAAM,KAAK,GAAG,MAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAoC,0CAAE,KAAK,CAAC;QACpE,sFAAsF;QACtF,wDAAwD;QACxD,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK,EAAE;YACxD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtC,OAAO;SACP;IACF,CAAC;CACD;AAED;;;GAGG;AACH,MAAM,mBAAmB;IAOxB,YACkB,YAAwE,EACxE,WAAqC,EACrC,MAA2B;QAF3B,iBAAY,GAAZ,YAAY,CAA4D;QACxE,gBAAW,GAAX,WAAW,CAA0B;QACrC,WAAM,GAAN,MAAM,CAAqB;QAPrC,gBAAW,GAAG,KAAK,CAAC;QACpB,eAAU,GAAG,CAAC,CAAC;QACf,eAAU,GAAG,CAAC,CAAC;QAOtB,oEAAoE;QACpE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,QAA4B,EAAE,EAAE;YACpE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC1B,OAAO;aACP;YAED,6EAA6E;YAC7E,MAAM,oBAAoB,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAmC,CAAC;YAC7E,IAAI,CAAC,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,KAAK,CAAA,EAAE;gBACjC,OAAO;aACP;YAED,gEAAgE;YAChE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC1B,OAAO,oBAAoB,CAAC,KAAK,CAAC;gBAClC,OAAO;aACP;YAED,wFAAwF;YACxF,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAClD,WAAW,CAAC,QAAQ,mCAAQ,WAAW,CAAC,QAAQ,KAAE,KAAK,EAAE,KAAK,GAAE,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,6CAA6C;QAC7C,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,OAAkC,EAAE,EAAE;YAC3E,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,6CAA6C;QAC7C,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAEvD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvD,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE;YACjC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SAC3B;QAED,qFAAqF;QACrF,qFAAqF;QACrF,sCAAsC;QACtC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED;;;OAGG;IACI,iBAAiB,CAAC,OAAkC;;QAC1D,MAAM,CACL,CAAC,IAAI,CAAC,WAAW,EACjB,KAAK,CAAC,kEAAkE,CACxE,CAAC;QAEF,qDAAqD;QACrD,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YAC3C,MAAM,CACL,IAAI,CAAC,mBAAmB,KAAK,SAAS,EACtC,KAAK,CAAC,0DAA0D,CAChE,CAAC;YACF,OAAO;SACP;QAED,eAAe;QACf,wGAAwG;QACxG,sEAAsE;QACtE,6EAA6E;QAC7E,yDAAyD;QAEzD,8CAA8C;QAC9C,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS,EAAE;YAC3C,IAAI,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,mBAAmB,EAAE;gBACvD,MAAM,mBAAmB,CAAC,MAAM;gBAC/B,sBAAsB;gBACtB,kBAAkB,EAClB,iBAAiB,EACjB,OAAO,EACP;oBACC,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,WAAW,EAAE,OAAO,OAAO,CAAC,QAAQ;oBACpC,KAAK,EAAE,MAAA,OAAO,CAAC,QAAQ,0CAAE,KAAK;oBAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,WAAW,EAAE,IAAI,CAAC,mBAAmB;iBACrC,CACD,CAAC;aACF;YAED,yGAAyG;YACzG,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,KAAK,IAAI,CAAC,mBAAmB,EAAE;gBAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;aAClB;SACD;IACF,CAAC;IAEO,UAAU;QACjB,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC1E,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,mEAAmE;QACnE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACnC,CAAC;IAEO,WAAW,CAAC,UAAkB,EAAE,eAA0C;QACjF,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpF,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,CAAC,EAAE;YACjC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;gBAC9B,SAAS,EAAE,YAAY;gBACvB,cAAc,EAAE,QAAQ;gBACxB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,CAAC;gBACjC,WAAW,EAAE,QAAQ,GAAG,eAAe,CAAC,qBAAqB;gBAC7D,QAAQ;gBACR,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;aAC7B,CAAC,CAAC;SACH;QAED,qCAAqC;QACrC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACtB,OAAO;SACP;QAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAEzB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAAkC;QACtD,MAAM,CACL,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EACtC,KAAK,CAAC,gEAAgE,CACtE,CAAC;QAEF,MAAM,CACL,CAAC,IAAI,CAAC,oBAAoB,KAAK,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,SAAS,CAAC,EACtF,KAAK,CAAC,8BAA8B,CACpC,CAAC;QAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAmC,CAAC;QAC7D,sGAAsG;QACtG,oCAAoC;QACpC,MAAM,aAAa,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,CAAC;QAEtC,kEAAkE;QAClE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE;YAC/B,qEAAqE;YACrE,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS,EAAE;gBAC5C,MAAM,mBAAmB,CAAC,MAAM,CAC/B,mDAAmD,EAAE,iCAAiC;gBACtF,cAAc,EACd,OAAO,EACP;oBACC,cAAc,EAAE,UAAU;oBAC1B,aAAa,EAAE,IAAI,CAAC,oBAAoB;oBACxC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;oBAC7C,UAAU,EAAE,IAAI,CAAC,oBAAoB,KAAK,IAAI,CAAC,WAAW,EAAE;oBAC5D,WAAW,EAAE,OAAO,CAAC,IAAI;iBACzB,CACD,CAAC;aACF;YAED,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACzE,MAAM,CACL,CAAC,IAAI,CAAC,WAAW,EACjB,KAAK,CAAC,iEAAiE,CACvE,CAAC;YACF,OAAO;SACP;QAED,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE;YAC3E,MAAM,CACL,CAAC,IAAI,CAAC,WAAW,EACjB,KAAK,CAAC,iEAAiE,CACvE,CAAC;YACF,OAAO;SACP;QAED,2FAA2F;QAE3F,+GAA+G;QAC/G,oHAAoH;QACpH,IACC,IAAI,CAAC,oBAAoB,KAAK,SAAS;YACvC,IAAI,CAAC,oBAAoB,KAAK,OAAO,CAAC,QAAQ,EAC7C;YACD,MAAM,IAAI,mBAAmB,CAAC,mBAAmB,kBAChD,cAAc,EAAE,UAAU,EAC1B,aAAa,EAAE,IAAI,CAAC,oBAAoB,EACxC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAC7C,UAAU,EAAE,IAAI,CAAC,oBAAoB,KAAK,IAAI,CAAC,WAAW,EAAE,EAC5D,YAAY,EAAE,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,WAAW,EAAE,IAClD,gCAAgC,CAAC,OAAO,CAAC,EAC3C,CAAC;SACH;QAED,eAAe;QACf,wGAAwG;QACxG,wFAAwF;QACxF,+FAA+F;QAC/F,qEAAqE;QAErE,IAAI,aAAa,EAAE;YAClB,MAAM,CACL,IAAI,CAAC,oBAAoB,KAAK,SAAS,EACvC,KAAK,CAAC,mCAAmC,CACzC,CAAC;YACF,MAAM,CACL,CAAC,IAAI,CAAC,WAAW,EACjB,KAAK,CAAC,iEAAiE,CACvE,CAAC;YACF,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;YAClD,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;YAC7C,qBAAqB;YACrB,mDAAmD;YACnD,+FAA+F;YAC/F,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;aAClB;SACD;aAAM,IAAI,aAAa,KAAK,KAAK,EAAE;YACnC,MAAM,CACL,IAAI,CAAC,mBAAmB,KAAK,SAAS,EACtC,KAAK,CAAC,0CAA0C,CAChD,CAAC;YACF,wCAAwC;YACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;YACrC,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;SACtC;aAAM;YACN,4CAA4C;YAC5C,MAAM,CAAC,IAAI,CAAC,oBAAoB,KAAK,SAAS,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;SAC3E;IACF,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { EventEmitter } from \"events\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions\";\nimport { IDocumentMessage, ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLoggerExt, ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { assert, performance } from \"@fluidframework/common-utils\";\nimport { isRuntimeMessage } from \"@fluidframework/driver-utils\";\nimport {\n\tDataCorruptionError,\n\tDataProcessingError,\n\textractSafePropertiesFromMessage,\n} from \"@fluidframework/container-utils\";\nimport { DeltaScheduler } from \"./deltaScheduler\";\nimport { pkgVersion } from \"./packageVersion\";\n\ntype IRuntimeMessageMetadata =\n\t| undefined\n\t| {\n\t\t\tbatch?: boolean;\n\t };\n\n/**\n * This class has the following responsibilities:\n *\n * 1. It tracks batches as we process ops and raises \"batchBegin\" and \"batchEnd\" events.\n * As part of it, it validates batch correctness (i.e. no system ops in the middle of batch)\n *\n * 2. It creates instance of ScheduleManagerCore that ensures we never start processing ops from batch\n * unless all ops of the batch are in.\n */\nexport class ScheduleManager {\n\tprivate readonly deltaScheduler: DeltaScheduler;\n\tprivate batchClientId: string | undefined;\n\tprivate hitError = false;\n\n\tconstructor(\n\t\tprivate readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly emitter: EventEmitter,\n\t\treadonly getClientId: () => string | undefined,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\tthis.deltaScheduler = new DeltaScheduler(\n\t\t\tthis.deltaManager,\n\t\t\tChildLogger.create(this.logger, \"DeltaScheduler\"),\n\t\t);\n\t\tvoid new ScheduleManagerCore(deltaManager, getClientId, logger);\n\t}\n\n\tpublic beforeOpProcessing(message: ISequencedDocumentMessage) {\n\t\tif (this.batchClientId !== message.clientId) {\n\t\t\tassert(\n\t\t\t\tthis.batchClientId === undefined,\n\t\t\t\t0x2a2 /* \"Batch is interrupted by other client op. Should be caught by trackPending()\" */,\n\t\t\t);\n\n\t\t\t// This could be the beginning of a new batch or an individual message.\n\t\t\tthis.emitter.emit(\"batchBegin\", message);\n\t\t\tthis.deltaScheduler.batchBegin(message);\n\n\t\t\tconst batch = (message?.metadata as IRuntimeMessageMetadata)?.batch;\n\t\t\tthis.batchClientId = batch ? message.clientId : undefined;\n\t\t}\n\t}\n\n\tpublic afterOpProcessing(error: any | undefined, message: ISequencedDocumentMessage) {\n\t\t// If this is no longer true, we need to revisit what we do where we set this.hitError.\n\t\tassert(!this.hitError, 0x2a3 /* \"container should be closed on any error\" */);\n\n\t\tif (error) {\n\t\t\t// We assume here that loader will close container and stop processing all future ops.\n\t\t\t// This is implicit dependency. If this flow changes, this code might no longer be correct.\n\t\t\tthis.hitError = true;\n\t\t\tthis.batchClientId = undefined;\n\t\t\tthis.emitter.emit(\"batchEnd\", error, message);\n\t\t\tthis.deltaScheduler.batchEnd(message);\n\t\t\treturn;\n\t\t}\n\n\t\tconst batch = (message?.metadata as IRuntimeMessageMetadata)?.batch;\n\t\t// If no batchClientId has been set then we're in an individual batch. Else, if we get\n\t\t// batch end metadata, this is end of the current batch.\n\t\tif (this.batchClientId === undefined || batch === false) {\n\t\t\tthis.batchClientId = undefined;\n\t\t\tthis.emitter.emit(\"batchEnd\", undefined, message);\n\t\t\tthis.deltaScheduler.batchEnd(message);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/**\n * This class controls pausing and resuming of inbound queue to ensure that we never\n * start processing ops in a batch IF we do not have all ops in the batch.\n */\nclass ScheduleManagerCore {\n\tprivate pauseSequenceNumber: number | undefined;\n\tprivate currentBatchClientId: string | undefined;\n\tprivate localPaused = false;\n\tprivate timePaused = 0;\n\tprivate batchCount = 0;\n\n\tconstructor(\n\t\tprivate readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly getClientId: () => string | undefined,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\t// Listen for delta manager sends and add batch metadata to messages\n\t\tthis.deltaManager.on(\"prepareSend\", (messages: IDocumentMessage[]) => {\n\t\t\tif (messages.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// First message will have the batch flag set to true if doing a batched send\n\t\t\tconst firstMessageMetadata = messages[0].metadata as IRuntimeMessageMetadata;\n\t\t\tif (!firstMessageMetadata?.batch) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the batch contains only a single op, clear the batch flag.\n\t\t\tif (messages.length === 1) {\n\t\t\t\tdelete firstMessageMetadata.batch;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the batch flag to false on the last message to indicate the end of the send batch\n\t\t\tconst lastMessage = messages[messages.length - 1];\n\t\t\tlastMessage.metadata = { ...lastMessage.metadata, batch: false };\n\t\t});\n\n\t\t// Listen for updates and peek at the inbound\n\t\tthis.deltaManager.inbound.on(\"push\", (message: ISequencedDocumentMessage) => {\n\t\t\tthis.trackPending(message);\n\t\t});\n\n\t\t// Start with baseline - empty inbound queue.\n\t\tassert(!this.localPaused, 0x293 /* \"initial state\" */);\n\n\t\tconst allPending = this.deltaManager.inbound.toArray();\n\t\tfor (const pending of allPending) {\n\t\t\tthis.trackPending(pending);\n\t\t}\n\n\t\t// We are intentionally directly listening to the \"op\" to inspect system ops as well.\n\t\t// If we do not observe system ops, we are likely to hit 0x296 assert when system ops\n\t\t// precedes start of incomplete batch.\n\t\tthis.deltaManager.on(\"op\", (message) => this.afterOpProcessing(message));\n\t}\n\n\t/**\n\t * The only public function in this class - called when we processed an op,\n\t * to make decision if op processing should be paused or not after that.\n\t */\n\tpublic afterOpProcessing(message: ISequencedDocumentMessage) {\n\t\tassert(\n\t\t\t!this.localPaused,\n\t\t\t0x294 /* \"can't have op processing paused if we are processing an op\" */,\n\t\t);\n\n\t\t// If the inbound queue is ever empty, nothing to do!\n\t\tif (this.deltaManager.inbound.length === 0) {\n\t\t\tassert(\n\t\t\t\tthis.pauseSequenceNumber === undefined,\n\t\t\t\t0x295 /* \"there should be no pending batch if we have no ops\" */,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// The queue is\n\t\t// 1. paused only when the next message to be processed is the beginning of a batch. Done in two places:\n\t\t// - here (processing ops until reaching start of incomplete batch)\n\t\t// - in trackPending(), when queue was empty and start of batch showed up.\n\t\t// 2. resumed when batch end comes in (in trackPending())\n\n\t\t// do we have incomplete batch to worry about?\n\t\tif (this.pauseSequenceNumber !== undefined) {\n\t\t\tif (message.sequenceNumber >= this.pauseSequenceNumber) {\n\t\t\t\tthrow DataProcessingError.create(\n\t\t\t\t\t// Former assert 0x296\n\t\t\t\t\t\"Incomplete batch\",\n\t\t\t\t\t\"ScheduleManager\",\n\t\t\t\t\tmessage,\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: message.type,\n\t\t\t\t\t\tcontentType: typeof message.contents,\n\t\t\t\t\t\tbatch: message.metadata?.batch,\n\t\t\t\t\t\tcompression: message.compression,\n\t\t\t\t\t\tpauseSeqNum: this.pauseSequenceNumber,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// If the next op is the start of incomplete batch, then we can't process it until it's fully in - pause!\n\t\t\tif (message.sequenceNumber + 1 === this.pauseSequenceNumber) {\n\t\t\t\tthis.pauseQueue();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate pauseQueue() {\n\t\tassert(!this.localPaused, 0x297 /* \"always called from resumed state\" */);\n\t\tthis.localPaused = true;\n\t\tthis.timePaused = performance.now();\n\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\tthis.deltaManager.inbound.pause();\n\t}\n\n\tprivate resumeQueue(startBatch: number, messageEndBatch: ISequencedDocumentMessage) {\n\t\tconst endBatch = messageEndBatch.sequenceNumber;\n\t\tconst duration = this.localPaused ? performance.now() - this.timePaused : undefined;\n\n\t\tthis.batchCount++;\n\t\tif (this.batchCount % 1000 === 1) {\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"BatchStats\",\n\t\t\t\tsequenceNumber: endBatch,\n\t\t\t\tlength: endBatch - startBatch + 1,\n\t\t\t\tmsnDistance: endBatch - messageEndBatch.minimumSequenceNumber,\n\t\t\t\tduration,\n\t\t\t\tbatchCount: this.batchCount,\n\t\t\t\tinterrupted: this.localPaused,\n\t\t\t});\n\t\t}\n\n\t\t// Return early if no change in value\n\t\tif (!this.localPaused) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.localPaused = false;\n\n\t\tthis.deltaManager.inbound.resume();\n\t}\n\n\t/**\n\t * Called for each incoming op (i.e. inbound \"push\" notification)\n\t */\n\tprivate trackPending(message: ISequencedDocumentMessage) {\n\t\tassert(\n\t\t\tthis.deltaManager.inbound.length !== 0,\n\t\t\t0x298 /* \"we have something in the queue that generates this event\" */,\n\t\t);\n\n\t\tassert(\n\t\t\t(this.currentBatchClientId === undefined) === (this.pauseSequenceNumber === undefined),\n\t\t\t0x299 /* \"non-synchronized state\" */,\n\t\t);\n\n\t\tconst metadata = message.metadata as IRuntimeMessageMetadata;\n\t\t// batchMetadata will be true for the message that starts a batch, false for the one that ends it, and\n\t\t// undefined for all other messages.\n\t\tconst batchMetadata = metadata?.batch;\n\n\t\t// Protocol messages are never part of a runtime batch of messages\n\t\tif (!isRuntimeMessage(message)) {\n\t\t\t// Protocol messages should never show up in the middle of the batch!\n\t\t\tif (this.currentBatchClientId !== undefined) {\n\t\t\t\tthrow DataProcessingError.create(\n\t\t\t\t\t\"Received a system message during batch processing\", // Formerly known as assert 0x29a\n\t\t\t\t\t\"trackPending\",\n\t\t\t\t\tmessage,\n\t\t\t\t\t{\n\t\t\t\t\t\truntimeVersion: pkgVersion,\n\t\t\t\t\t\tbatchClientId: this.currentBatchClientId,\n\t\t\t\t\t\tpauseSequenceNumber: this.pauseSequenceNumber,\n\t\t\t\t\t\tlocalBatch: this.currentBatchClientId === this.getClientId(),\n\t\t\t\t\t\tmessageType: message.type,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tassert(batchMetadata === undefined, 0x29b /* \"system op in a batch?\" */);\n\t\t\tassert(\n\t\t\t\t!this.localPaused,\n\t\t\t\t0x29c /* \"we should be processing ops when there is no active batch\" */,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.currentBatchClientId === undefined && batchMetadata === undefined) {\n\t\t\tassert(\n\t\t\t\t!this.localPaused,\n\t\t\t\t0x29d /* \"we should be processing ops when there is no active batch\" */,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// If we got here, the message is part of a batch. Either starting, in progress, or ending.\n\n\t\t// If this is not the start of the batch, error out if the message was sent by a client other than the one that\n\t\t// started the current batch (it should not be possible for ops from other clients to get interleaved with a batch).\n\t\tif (\n\t\t\tthis.currentBatchClientId !== undefined &&\n\t\t\tthis.currentBatchClientId !== message.clientId\n\t\t) {\n\t\t\tthrow new DataCorruptionError(\"OpBatchIncomplete\", {\n\t\t\t\truntimeVersion: pkgVersion,\n\t\t\t\tbatchClientId: this.currentBatchClientId,\n\t\t\t\tpauseSequenceNumber: this.pauseSequenceNumber,\n\t\t\t\tlocalBatch: this.currentBatchClientId === this.getClientId(),\n\t\t\t\tlocalMessage: message.clientId === this.getClientId(),\n\t\t\t\t...extractSafePropertiesFromMessage(message),\n\t\t\t});\n\t\t}\n\n\t\t// The queue is\n\t\t// 1. paused only when the next message to be processed is the beginning of a batch. Done in two places:\n\t\t// - in afterOpProcessing() - processing ops until reaching start of incomplete batch\n\t\t// - here, when queue was empty and start of batch showed up (batchMetadata === true below).\n\t\t// 2. resumed when batch end comes in (batchMetadata === false below)\n\n\t\tif (batchMetadata) {\n\t\t\tassert(\n\t\t\t\tthis.currentBatchClientId === undefined,\n\t\t\t\t0x29e /* \"there can't be active batch\" */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!this.localPaused,\n\t\t\t\t0x29f /* \"we should be processing ops when there is no active batch\" */,\n\t\t\t);\n\t\t\tthis.pauseSequenceNumber = message.sequenceNumber;\n\t\t\tthis.currentBatchClientId = message.clientId;\n\t\t\t// Start of the batch\n\t\t\t// Only pause processing if queue has no other ops!\n\t\t\t// If there are any other ops in the queue, processing will be stopped when they are processed!\n\t\t\tif (this.deltaManager.inbound.length === 1) {\n\t\t\t\tthis.pauseQueue();\n\t\t\t}\n\t\t} else if (batchMetadata === false) {\n\t\t\tassert(\n\t\t\t\tthis.pauseSequenceNumber !== undefined,\n\t\t\t\t0x2a0 /* \"batch presence was validated above\" */,\n\t\t\t);\n\t\t\t// Batch is complete, we can process it!\n\t\t\tthis.resumeQueue(this.pauseSequenceNumber, message);\n\t\t\tthis.pauseSequenceNumber = undefined;\n\t\t\tthis.currentBatchClientId = undefined;\n\t\t} else {\n\t\t\t// Continuation of current batch. Do nothing\n\t\t\tassert(this.currentBatchClientId !== undefined, 0x2a1 /* \"logic error\" */);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"scheduleManager.js","sourceRoot":"","sources":["../src/scheduleManager.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 */\nimport { EventEmitter } from \"events\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions\";\nimport { IDocumentMessage, ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLoggerExt, ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { assert, performance } from \"@fluidframework/common-utils\";\nimport { isRuntimeMessage } from \"@fluidframework/driver-utils\";\nimport {\n\tDataCorruptionError,\n\tDataProcessingError,\n\textractSafePropertiesFromMessage,\n} from \"@fluidframework/container-utils\";\nimport { DeltaScheduler } from \"./deltaScheduler\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { IBatchMetadata } from \"./metadata\";\n\ntype IRuntimeMessageMetadata =\n\t| undefined\n\t| {\n\t\t\tbatch?: boolean;\n\t };\n\n/**\n * This class has the following responsibilities:\n *\n * 1. It tracks batches as we process ops and raises \"batchBegin\" and \"batchEnd\" events.\n * As part of it, it validates batch correctness (i.e. no system ops in the middle of batch)\n *\n * 2. It creates instance of ScheduleManagerCore that ensures we never start processing ops from batch\n * unless all ops of the batch are in.\n */\nexport class ScheduleManager {\n\tprivate readonly deltaScheduler: DeltaScheduler;\n\tprivate batchClientId: string | undefined;\n\tprivate hitError = false;\n\n\tconstructor(\n\t\tprivate readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly emitter: EventEmitter,\n\t\treadonly getClientId: () => string | undefined,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\tthis.deltaScheduler = new DeltaScheduler(\n\t\t\tthis.deltaManager,\n\t\t\tChildLogger.create(this.logger, \"DeltaScheduler\"),\n\t\t);\n\t\tvoid new ScheduleManagerCore(deltaManager, getClientId, logger);\n\t}\n\n\tpublic beforeOpProcessing(message: ISequencedDocumentMessage) {\n\t\tif (this.batchClientId !== message.clientId) {\n\t\t\tassert(\n\t\t\t\tthis.batchClientId === undefined,\n\t\t\t\t0x2a2 /* \"Batch is interrupted by other client op. Should be caught by trackPending()\" */,\n\t\t\t);\n\n\t\t\t// This could be the beginning of a new batch or an individual message.\n\t\t\tthis.emitter.emit(\"batchBegin\", message);\n\t\t\tthis.deltaScheduler.batchBegin(message);\n\n\t\t\tconst batch = (message?.metadata as IRuntimeMessageMetadata)?.batch;\n\t\t\t// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n\t\t\tthis.batchClientId = batch ? (message.clientId as string) : undefined;\n\t\t}\n\t}\n\n\tpublic afterOpProcessing(error: any | undefined, message: ISequencedDocumentMessage) {\n\t\t// If this is no longer true, we need to revisit what we do where we set this.hitError.\n\t\tassert(!this.hitError, 0x2a3 /* \"container should be closed on any error\" */);\n\n\t\tif (error) {\n\t\t\t// We assume here that loader will close container and stop processing all future ops.\n\t\t\t// This is implicit dependency. If this flow changes, this code might no longer be correct.\n\t\t\tthis.hitError = true;\n\t\t\tthis.batchClientId = undefined;\n\t\t\tthis.emitter.emit(\"batchEnd\", error, message);\n\t\t\tthis.deltaScheduler.batchEnd(message);\n\t\t\treturn;\n\t\t}\n\n\t\tconst batch = (message?.metadata as IRuntimeMessageMetadata)?.batch;\n\t\t// If no batchClientId has been set then we're in an individual batch. Else, if we get\n\t\t// batch end metadata, this is end of the current batch.\n\t\tif (this.batchClientId === undefined || batch === false) {\n\t\t\tthis.batchClientId = undefined;\n\t\t\tthis.emitter.emit(\"batchEnd\", undefined, message);\n\t\t\tthis.deltaScheduler.batchEnd(message);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/**\n * This class controls pausing and resuming of inbound queue to ensure that we never\n * start processing ops in a batch IF we do not have all ops in the batch.\n */\nclass ScheduleManagerCore {\n\tprivate pauseSequenceNumber: number | undefined;\n\tprivate currentBatchClientId: string | undefined;\n\tprivate localPaused = false;\n\tprivate timePaused = 0;\n\tprivate batchCount = 0;\n\n\tconstructor(\n\t\tprivate readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly getClientId: () => string | undefined,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\t// Listen for delta manager sends and add batch metadata to messages\n\t\tthis.deltaManager.on(\"prepareSend\", (messages: IDocumentMessage[]) => {\n\t\t\tif (messages.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// First message will have the batch flag set to true if doing a batched send\n\t\t\tconst firstMessageMetadata = messages[0].metadata as IRuntimeMessageMetadata;\n\t\t\tif (!firstMessageMetadata?.batch) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the batch contains only a single op, clear the batch flag.\n\t\t\tif (messages.length === 1) {\n\t\t\t\tdelete firstMessageMetadata.batch;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the batch flag to false on the last message to indicate the end of the send batch\n\t\t\tconst lastMessage = messages[messages.length - 1];\n\t\t\t// TODO: It's not clear if this shallow clone is required, as opposed to just setting \"batch\" to false.\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n\t\t\tlastMessage.metadata = { ...(lastMessage.metadata as any), batch: false };\n\t\t});\n\n\t\t// Listen for updates and peek at the inbound\n\t\tthis.deltaManager.inbound.on(\"push\", (message: ISequencedDocumentMessage) => {\n\t\t\tthis.trackPending(message);\n\t\t});\n\n\t\t// Start with baseline - empty inbound queue.\n\t\tassert(!this.localPaused, 0x293 /* \"initial state\" */);\n\n\t\tconst allPending = this.deltaManager.inbound.toArray();\n\t\tfor (const pending of allPending) {\n\t\t\tthis.trackPending(pending);\n\t\t}\n\n\t\t// We are intentionally directly listening to the \"op\" to inspect system ops as well.\n\t\t// If we do not observe system ops, we are likely to hit 0x296 assert when system ops\n\t\t// precedes start of incomplete batch.\n\t\tthis.deltaManager.on(\"op\", (message) => this.afterOpProcessing(message));\n\t}\n\n\t/**\n\t * The only public function in this class - called when we processed an op,\n\t * to make decision if op processing should be paused or not after that.\n\t */\n\tpublic afterOpProcessing(message: ISequencedDocumentMessage) {\n\t\tassert(\n\t\t\t!this.localPaused,\n\t\t\t0x294 /* \"can't have op processing paused if we are processing an op\" */,\n\t\t);\n\n\t\t// If the inbound queue is ever empty, nothing to do!\n\t\tif (this.deltaManager.inbound.length === 0) {\n\t\t\tassert(\n\t\t\t\tthis.pauseSequenceNumber === undefined,\n\t\t\t\t0x295 /* \"there should be no pending batch if we have no ops\" */,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// The queue is\n\t\t// 1. paused only when the next message to be processed is the beginning of a batch. Done in two places:\n\t\t// - here (processing ops until reaching start of incomplete batch)\n\t\t// - in trackPending(), when queue was empty and start of batch showed up.\n\t\t// 2. resumed when batch end comes in (in trackPending())\n\n\t\t// do we have incomplete batch to worry about?\n\t\tif (this.pauseSequenceNumber !== undefined) {\n\t\t\tif (message.sequenceNumber >= this.pauseSequenceNumber) {\n\t\t\t\tthrow DataProcessingError.create(\n\t\t\t\t\t// Former assert 0x296\n\t\t\t\t\t\"Incomplete batch\",\n\t\t\t\t\t\"ScheduleManager\",\n\t\t\t\t\tmessage,\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: message.type,\n\t\t\t\t\t\tcontentType: typeof message.contents,\n\t\t\t\t\t\tbatch: (message.metadata as IBatchMetadata | undefined)?.batch,\n\t\t\t\t\t\tcompression: message.compression,\n\t\t\t\t\t\tpauseSeqNum: this.pauseSequenceNumber,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// If the next op is the start of incomplete batch, then we can't process it until it's fully in - pause!\n\t\t\tif (message.sequenceNumber + 1 === this.pauseSequenceNumber) {\n\t\t\t\tthis.pauseQueue();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate pauseQueue() {\n\t\tassert(!this.localPaused, 0x297 /* \"always called from resumed state\" */);\n\t\tthis.localPaused = true;\n\t\tthis.timePaused = performance.now();\n\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\tthis.deltaManager.inbound.pause();\n\t}\n\n\tprivate resumeQueue(startBatch: number, messageEndBatch: ISequencedDocumentMessage) {\n\t\tconst endBatch = messageEndBatch.sequenceNumber;\n\t\tconst duration = this.localPaused ? performance.now() - this.timePaused : undefined;\n\n\t\tthis.batchCount++;\n\t\tif (this.batchCount % 1000 === 1) {\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"BatchStats\",\n\t\t\t\tsequenceNumber: endBatch,\n\t\t\t\tlength: endBatch - startBatch + 1,\n\t\t\t\tmsnDistance: endBatch - messageEndBatch.minimumSequenceNumber,\n\t\t\t\tduration,\n\t\t\t\tbatchCount: this.batchCount,\n\t\t\t\tinterrupted: this.localPaused,\n\t\t\t});\n\t\t}\n\n\t\t// Return early if no change in value\n\t\tif (!this.localPaused) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.localPaused = false;\n\n\t\tthis.deltaManager.inbound.resume();\n\t}\n\n\t/**\n\t * Called for each incoming op (i.e. inbound \"push\" notification)\n\t */\n\tprivate trackPending(message: ISequencedDocumentMessage) {\n\t\tassert(\n\t\t\tthis.deltaManager.inbound.length !== 0,\n\t\t\t0x298 /* \"we have something in the queue that generates this event\" */,\n\t\t);\n\n\t\tassert(\n\t\t\t(this.currentBatchClientId === undefined) === (this.pauseSequenceNumber === undefined),\n\t\t\t0x299 /* \"non-synchronized state\" */,\n\t\t);\n\n\t\tconst metadata = message.metadata as IRuntimeMessageMetadata;\n\t\t// batchMetadata will be true for the message that starts a batch, false for the one that ends it, and\n\t\t// undefined for all other messages.\n\t\tconst batchMetadata = metadata?.batch;\n\n\t\t// Protocol messages are never part of a runtime batch of messages\n\t\tif (!isRuntimeMessage(message)) {\n\t\t\t// Protocol messages should never show up in the middle of the batch!\n\t\t\tif (this.currentBatchClientId !== undefined) {\n\t\t\t\tthrow DataProcessingError.create(\n\t\t\t\t\t\"Received a system message during batch processing\", // Formerly known as assert 0x29a\n\t\t\t\t\t\"trackPending\",\n\t\t\t\t\tmessage,\n\t\t\t\t\t{\n\t\t\t\t\t\truntimeVersion: pkgVersion,\n\t\t\t\t\t\tbatchClientId:\n\t\t\t\t\t\t\tthis.currentBatchClientId === null ? \"null\" : this.currentBatchClientId,\n\t\t\t\t\t\tpauseSequenceNumber: this.pauseSequenceNumber,\n\t\t\t\t\t\tlocalBatch: this.currentBatchClientId === this.getClientId(),\n\t\t\t\t\t\tmessageType: message.type,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tassert(batchMetadata === undefined, 0x29b /* \"system op in a batch?\" */);\n\t\t\tassert(\n\t\t\t\t!this.localPaused,\n\t\t\t\t0x29c /* \"we should be processing ops when there is no active batch\" */,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.currentBatchClientId === undefined && batchMetadata === undefined) {\n\t\t\tassert(\n\t\t\t\t!this.localPaused,\n\t\t\t\t0x29d /* \"we should be processing ops when there is no active batch\" */,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// If we got here, the message is part of a batch. Either starting, in progress, or ending.\n\n\t\t// If this is not the start of the batch, error out if the message was sent by a client other than the one that\n\t\t// started the current batch (it should not be possible for ops from other clients to get interleaved with a batch).\n\t\tif (\n\t\t\tthis.currentBatchClientId !== undefined &&\n\t\t\tthis.currentBatchClientId !== message.clientId\n\t\t) {\n\t\t\tthrow new DataCorruptionError(\"OpBatchIncomplete\", {\n\t\t\t\truntimeVersion: pkgVersion,\n\t\t\t\tbatchClientId:\n\t\t\t\t\tthis.currentBatchClientId === null ? \"null\" : this.currentBatchClientId,\n\t\t\t\tpauseSequenceNumber: this.pauseSequenceNumber,\n\t\t\t\tlocalBatch: this.currentBatchClientId === this.getClientId(),\n\t\t\t\tlocalMessage: message.clientId === this.getClientId(),\n\t\t\t\t...extractSafePropertiesFromMessage(message),\n\t\t\t});\n\t\t}\n\n\t\t// The queue is\n\t\t// 1. paused only when the next message to be processed is the beginning of a batch. Done in two places:\n\t\t// - in afterOpProcessing() - processing ops until reaching start of incomplete batch\n\t\t// - here, when queue was empty and start of batch showed up (batchMetadata === true below).\n\t\t// 2. resumed when batch end comes in (batchMetadata === false below)\n\n\t\tif (batchMetadata) {\n\t\t\tassert(\n\t\t\t\tthis.currentBatchClientId === undefined,\n\t\t\t\t0x29e /* \"there can't be active batch\" */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!this.localPaused,\n\t\t\t\t0x29f /* \"we should be processing ops when there is no active batch\" */,\n\t\t\t);\n\t\t\tthis.pauseSequenceNumber = message.sequenceNumber;\n\t\t\t// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n\t\t\tthis.currentBatchClientId = message.clientId as string;\n\t\t\t// Start of the batch\n\t\t\t// Only pause processing if queue has no other ops!\n\t\t\t// If there are any other ops in the queue, processing will be stopped when they are processed!\n\t\t\tif (this.deltaManager.inbound.length === 1) {\n\t\t\t\tthis.pauseQueue();\n\t\t\t}\n\t\t} else if (batchMetadata === false) {\n\t\t\tassert(\n\t\t\t\tthis.pauseSequenceNumber !== undefined,\n\t\t\t\t0x2a0 /* \"batch presence was validated above\" */,\n\t\t\t);\n\t\t\t// Batch is complete, we can process it!\n\t\t\tthis.resumeQueue(this.pauseSequenceNumber, message);\n\t\t\tthis.pauseSequenceNumber = undefined;\n\t\t\tthis.currentBatchClientId = undefined;\n\t\t} else {\n\t\t\t// Continuation of current batch. Do nothing\n\t\t\tassert(this.currentBatchClientId !== undefined, 0x2a1 /* \"logic error\" */);\n\t\t}\n\t}\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { ITelemetryErrorEvent } from "@fluidframework/common-definitions";
5
+ import { ITelemetryErrorEvent } from "@fluidframework/core-interfaces";
6
6
  import { ISummarizerNode, ISummarizerNodeConfig, ISummarizeResult, CreateChildSummarizerNodeParam, SummarizeInternalFn, ITelemetryContext } from "@fluidframework/runtime-definitions";
7
7
  import { ISequencedDocumentMessage, ISnapshotTree } from "@fluidframework/protocol-definitions";
8
8
  import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
@@ -1 +1 @@
1
- {"version":3,"file":"summarizerNode.d.ts","sourceRoot":"","sources":["../../../src/summary/summarizerNode/summarizerNode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EACN,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAEhB,8BAA8B,EAE9B,mBAAmB,EACnB,iBAAiB,EAEjB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACN,yBAAyB,EAEzB,aAAa,EAEb,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACN,mBAAmB,EAKnB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAIN,gBAAgB,EAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,2BAA2B,EAG3B,oBAAoB,EACpB,WAAW,EACX,qBAAqB,EACrB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,mBAAoB,SAAQ,eAAe,EAAE,2BAA2B;CAAG;AAE5F;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAe,YAAW,mBAAmB;IAuBxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAEpC,OAAO,CAAC,qBAAqB;IAC7B,8CAA8C;IAC9C,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,SAAS,CAAC,gBAAgB,CAAC;IAC3B,oEAAoE;IACpE,SAAS,CAAC,eAAe,CAAC;IA9B3B;;;OAGG;IACH,IAAW,uBAAuB,WAEjC;IAED,SAAS,CAAC,QAAQ,CAAC,QAAQ,8BAAqC;IAChE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,2BAAkC;IACrE,SAAS,CAAC,0BAA0B,EAAE,MAAM,GAAG,SAAS,CAAC;IACzD,OAAO,CAAC,aAAa,CAAuE;IAC5F,OAAO,CAAC,gBAAgB,CAAS;IAEjC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAE/C;;;OAGG;gBAEF,UAAU,EAAE,mBAAmB,EACd,mBAAmB,EAAE,mBAAmB,EACzD,MAAM,EAAE,qBAAqB,EACrB,qBAAqB,EAAE,MAAM;IACrC,8CAA8C;IACtC,cAAc,CAAC,yBAAa,EACnB,cAAc,CAAC,6BAAiB,EACvC,gBAAgB,CAAC,iCAAqB;IAChD,oEAAoE;IAC1D,eAAe,CAAC,oBAAQ;IAc5B,YAAY,CAAC,uBAAuB,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB;IAkB1E,SAAS,CACrB,QAAQ,EAAE,OAAO,EACjB,UAAU,GAAE,OAAc,EAC1B,gBAAgB,CAAC,EAAE,iBAAiB,GAClC,OAAO,CAAC,gBAAgB,CAAC;IA+D5B;;;;;;OAMG;IACI,eAAe,IAAI,qBAAqB;IAI/C;;;;;;;;OAQG;IACH,SAAS,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,OAAO,GAAG,qBAAqB;IA2BlF,OAAO,CAAC,kBAAkB;IA8B1B;;;;OAIG;IACI,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO;IAShE;;;;;;;OAOG;IACH,SAAS,CAAC,mBAAmB,CAC5B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,mBAAmB,EAAE,OAAO,EAC5B,QAAQ,EAAE,OAAO;IAgEX,YAAY;IAUnB;;;;;;;;;;;;;OAaG;IACU,oBAAoB,CAChC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,aAAa,EAAE,MAAM,EACrB,mBAAmB,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,EACxD,gBAAgB,EAAE,gBAAgB,EAClC,uBAAuB,EAAE,mBAAmB,GAC1C,OAAO,CAAC,oBAAoB,CAAC;IAoGhC;;;;;OAKG;IACH,SAAS,CAAC,+BAA+B,CACxC,cAAc,EAAE,MAAM,EACtB,uBAAuB,EAAE,MAAM,GAC7B,IAAI;cA4BS,gCAAgC,CAC/C,uBAAuB,EAAE,MAAM,EAC/B,YAAY,EAAE,aAAa,EAC3B,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,SAAS,EAAE,WAAW,EACtB,uBAAuB,EAAE,mBAAmB,EAC5C,gBAAgB,EAAE,gBAAgB,GAChC,OAAO,CAAC,IAAI,CAAC;IA8ChB,OAAO,CAAC,wBAAwB;IAQzB,sBAAsB,CAAC,QAAQ,EAAE,aAAa;IAS9C,YAAY,CAAC,EAAE,EAAE,yBAAyB,GAAG,IAAI;IAIjD,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAM/C;;;;OAIG;IACH,SAAS,CAAC,UAAU,IAAI,OAAO;IAI/B,IAAW,aAAa,IAAI,QAAQ,CAAC,WAAW,CAAC,GAAG,SAAS,CAE5D;IAED,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IAEpC,WAAW;IACjB,yBAAyB;IACzB,mBAAmB,EAAE,mBAAmB;IACxC,2CAA2C;IAC3C,EAAE,EAAE,MAAM;IACV;;;;OAIG;IACH,WAAW,EAAE,8BAA8B,EAC3C,MAAM,GAAE,qBAA0B,GAChC,eAAe;IAwBX,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIxD;;;;;OAKG;IACH,SAAS,CAAC,wBAAwB,CACjC,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,8BAA8B,GACzC,mBAAmB;IA2FtB;;;;;;;;OAQG;IACH,SAAS,CAAC,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM;IAoBjE,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW;IAI7D;;OAEG;IACI,mBAAmB,IAAI,OAAO;IAIrC;;OAEG;IACH,SAAS,CAAC,oBAAoB,CAAC,UAAU,EAAE,oBAAoB,GAAG,KAAK;CAYvE;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,WAC5B,mBAAmB,uBACN,mBAAmB,wBAClB,MAAM,2BACH,MAAM,GAAG,SAAS,WACnC,qBAAqB,KAC3B,mBAYD,CAAC"}
1
+ {"version":3,"file":"summarizerNode.d.ts","sourceRoot":"","sources":["../../../src/summary/summarizerNode/summarizerNode.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"summarizerNode.js","sourceRoot":"","sources":["../../../src/summary/summarizerNode/summarizerNode.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 { ITelemetryErrorEvent } from \"@fluidframework/common-definitions\";\nimport {\n\tISummarizerNode,\n\tISummarizerNodeConfig,\n\tISummarizeResult,\n\tISummaryTreeWithStats,\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tSummarizeInternalFn,\n\tITelemetryContext,\n\tIExperimentalIncrementalSummaryContext,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n\tISequencedDocumentMessage,\n\tSummaryType,\n\tISnapshotTree,\n\tSummaryObject,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tITelemetryLoggerExt,\n\tChildLogger,\n\tLoggingError,\n\tPerformanceEvent,\n\tTelemetryDataTag,\n} from \"@fluidframework/telemetry-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/common-utils\";\nimport {\n\tconvertToSummaryTree,\n\tcalculateStats,\n\tmergeStats,\n\tReadAndParseBlob,\n} from \"@fluidframework/runtime-utils\";\nimport {\n\tEscapedPath,\n\tICreateChildDetails,\n\tIFetchSnapshotResult,\n\tIInitialSummary,\n\tISummarizerNodeRootContract,\n\tparseSummaryForSubtrees,\n\tparseSummaryTreeForSubtrees,\n\tRefreshSummaryResult,\n\tSummaryNode,\n\tValidateSummaryResult,\n} from \"./summarizerNodeUtils\";\n\nexport interface IRootSummarizerNode extends ISummarizerNode, ISummarizerNodeRootContract {}\n\n/**\n * Encapsulates the summarizing work and state of an individual tree node in the\n * summary tree. It tracks changes and allows for optimizations when unchanged, or\n * can allow for fallback summaries to be generated when an error is encountered.\n * Usage is for the root node to call startSummary first to begin tracking a WIP\n * (work in progress) summary. Then all nodes will call summarize to summaries their\n * individual parts. Once completed and uploaded to storage, the root node will call\n * completeSummary or clearSummary to clear the WIP summary tracking state if something\n * went wrong. The SummarizerNodes will track all pending summaries that have been\n * recorded by the completeSummary call. When one of them is acked, the root node should\n * call refreshLatestSummary to inform the tree of SummarizerNodes of the new baseline\n * latest successful summary.\n */\nexport class SummarizerNode implements IRootSummarizerNode {\n\t/**\n\t * The reference sequence number of the most recent acked summary.\n\t * Returns 0 if there is not yet an acked summary.\n\t */\n\tpublic get referenceSequenceNumber() {\n\t\treturn this._latestSummary?.referenceSequenceNumber ?? 0;\n\t}\n\n\tprotected readonly children = new Map<string, SummarizerNode>();\n\tprotected readonly pendingSummaries = new Map<string, SummaryNode>();\n\tprotected wipReferenceSequenceNumber: number | undefined;\n\tprivate wipLocalPaths: { localPath: EscapedPath; additionalPath?: EscapedPath } | undefined;\n\tprivate wipSkipRecursion = false;\n\n\tprotected readonly logger: ITelemetryLoggerExt;\n\n\t/**\n\t * Do not call constructor directly.\n\t * Use createRootSummarizerNode to create root node, or createChild to create child nodes.\n\t */\n\tpublic constructor(\n\t\tbaseLogger: ITelemetryLoggerExt,\n\t\tprivate readonly summarizeInternalFn: SummarizeInternalFn,\n\t\tconfig: ISummarizerNodeConfig,\n\t\tprivate _changeSequenceNumber: number,\n\t\t/** Undefined means created without summary */\n\t\tprivate _latestSummary?: SummaryNode,\n\t\tprivate readonly initialSummary?: IInitialSummary,\n\t\tprotected wipSummaryLogger?: ITelemetryLoggerExt,\n\t\t/** A unique id of this node to be logged when sending telemetry. */\n\t\tprotected telemetryNodeId?: string,\n\t) {\n\t\tthis.canReuseHandle = config.canReuseHandle ?? true;\n\t\t// All logs posted by the summarizer node should include the telemetryNodeId.\n\t\tthis.logger = ChildLogger.create(baseLogger, undefined /* namespace */, {\n\t\t\tall: {\n\t\t\t\tid: {\n\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\tvalue: this.telemetryNodeId,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic startSummary(referenceSequenceNumber: number, summaryLogger: ITelemetryLoggerExt) {\n\t\tassert(\n\t\t\tthis.wipSummaryLogger === undefined,\n\t\t\t0x19f /* \"wipSummaryLogger should not be set yet in startSummary\" */,\n\t\t);\n\t\tassert(\n\t\t\tthis.wipReferenceSequenceNumber === undefined,\n\t\t\t0x1a0 /* \"Already tracking a summary\" */,\n\t\t);\n\n\t\tthis.wipSummaryLogger = summaryLogger;\n\n\t\tfor (const child of this.children.values()) {\n\t\t\tchild.startSummary(referenceSequenceNumber, this.wipSummaryLogger);\n\t\t}\n\t\tthis.wipReferenceSequenceNumber = referenceSequenceNumber;\n\t}\n\n\tpublic async summarize(\n\t\tfullTree: boolean,\n\t\ttrackState: boolean = true,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummarizeResult> {\n\t\tassert(\n\t\t\tthis.isSummaryInProgress(),\n\t\t\t0x1a1 /* \"summarize should not be called when not tracking the summary\" */,\n\t\t);\n\t\tassert(\n\t\t\tthis.wipSummaryLogger !== undefined,\n\t\t\t0x1a2 /* \"wipSummaryLogger should have been set in startSummary or ctor\" */,\n\t\t);\n\n\t\t// Try to reuse the tree if unchanged\n\t\tif (this.canReuseHandle && !fullTree && !this.hasChanged()) {\n\t\t\tconst latestSummary = this._latestSummary;\n\t\t\tif (latestSummary !== undefined) {\n\t\t\t\tthis.wipLocalPaths = {\n\t\t\t\t\tlocalPath: latestSummary.localPath,\n\t\t\t\t\tadditionalPath: latestSummary.additionalPath,\n\t\t\t\t};\n\t\t\t\tthis.wipSkipRecursion = true;\n\t\t\t\tconst stats = mergeStats();\n\t\t\t\tstats.handleNodeCount++;\n\t\t\t\treturn {\n\t\t\t\t\tsummary: {\n\t\t\t\t\t\ttype: SummaryType.Handle,\n\t\t\t\t\t\thandle: latestSummary.fullPath.path,\n\t\t\t\t\t\thandleType: SummaryType.Tree,\n\t\t\t\t\t},\n\t\t\t\t\tstats,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// This assert is the same the other 0a1x1 assert `isSummaryInProgress`, the only difference is that typescript\n\t\t// complains if this assert isn't done this way\n\t\tassert(\n\t\t\tthis.wipReferenceSequenceNumber !== undefined,\n\t\t\t0x5df /* Summarize should not be called when not tracking the summary */,\n\t\t);\n\t\tconst incrementalSummaryContext: IExperimentalIncrementalSummaryContext | undefined =\n\t\t\tthis._latestSummary !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tsummarySequenceNumber: this.wipReferenceSequenceNumber,\n\t\t\t\t\t\tlatestSummarySequenceNumber: this._latestSummary.referenceSequenceNumber,\n\t\t\t\t\t\t// TODO: remove summaryPath\n\t\t\t\t\t\tsummaryPath: this._latestSummary.fullPath.path,\n\t\t\t\t }\n\t\t\t\t: undefined;\n\n\t\tconst result = await this.summarizeInternalFn(\n\t\t\tfullTree,\n\t\t\ttrue,\n\t\t\ttelemetryContext,\n\t\t\tincrementalSummaryContext,\n\t\t);\n\t\tthis.wipLocalPaths = { localPath: EscapedPath.create(result.id) };\n\t\tif (result.pathPartsForChildren !== undefined) {\n\t\t\tthis.wipLocalPaths.additionalPath = EscapedPath.createAndConcat(\n\t\t\t\tresult.pathPartsForChildren,\n\t\t\t);\n\t\t}\n\t\treturn { summary: result.summary, stats: result.stats };\n\t}\n\n\t/**\n\t * Validates that the in-progress summary is correct, i.e., summarize should have run for all non-skipped\n\t * nodes. This will only be called for the root summarizer node and is called by it recursively on all child nodes.\n\t *\n\t * @returns ValidateSummaryResult which contains a boolean success indicating whether the validation was successful.\n\t * In case of failure, additional information is returned indicating type of failure and where it was.\n\t */\n\tpublic validateSummary(): ValidateSummaryResult {\n\t\treturn this.validateSummaryCore(false /* parentSkipRecursion */);\n\t}\n\n\t/**\n\t * Validates that the in-progress summary is correct for all nodes, i.e., summarize should have run for all\n\t * non-skipped nodes.\n\t * @param parentSkipRecursion - true if the parent of this node skipped recursing the child nodes when summarizing.\n\t * In that case, the children will not have work-in-progress state.\n\t *\n\t * @returns ValidateSummaryResult which contains a boolean success indicating whether the validation was successful.\n\t * In case of failure, additional information is returned indicating type of failure and where it was.\n\t */\n\tprotected validateSummaryCore(parentSkipRecursion: boolean): ValidateSummaryResult {\n\t\tif (this.wasSummarizeMissed(parentSkipRecursion)) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\treason: \"NodeDidNotSummarize\",\n\t\t\t\tid: {\n\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\tvalue: this.telemetryNodeId,\n\t\t\t\t},\n\t\t\t\t// These errors are usually transient and should go away when summarize is retried.\n\t\t\t\tretryAfterSeconds: 1,\n\t\t\t};\n\t\t}\n\t\tif (parentSkipRecursion) {\n\t\t\treturn { success: true };\n\t\t}\n\n\t\tfor (const child of this.children.values()) {\n\t\t\tconst result = child.validateSummaryCore(this.wipSkipRecursion || parentSkipRecursion);\n\t\t\t// If any child fails, return the failure.\n\t\t\tif (!result.success) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\treturn { success: true };\n\t}\n\n\tprivate wasSummarizeMissed(parentSkipRecursion: boolean): boolean {\n\t\tassert(\n\t\t\tthis.wipSummaryLogger !== undefined,\n\t\t\t0x6fc /* wipSummaryLogger should have been set in startSummary or ctor */,\n\t\t);\n\t\tassert(this.wipReferenceSequenceNumber !== undefined, 0x6fd /* Not tracking a summary */);\n\n\t\t// If the parent node skipped recursion, it did not call summarize on this node. So, summarize was not missed\n\t\t// but was intentionally not called.\n\t\t// Otherwise, summarize should have been called on this node and wipLocalPaths must be set.\n\t\tif (parentSkipRecursion || this.wipLocalPaths !== undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * The absence of wip local path indicates that summarize was not called for this node. Return failure.\n\t\t * This can happen if:\n\t\t * 1. A child node was created after summarize was already called on the parent. For example, a data store\n\t\t * is realized (loaded) after summarize was called on it creating summarizer nodes for its DDSes. In this case,\n\t\t * parentSkipRecursion will be true and the if block above would handle it.\n\t\t * 2. A new node was created but summarize was never called on it. This can mean that the summary that is\n\t\t * generated may not have the data from this node. We should not continue, log and throw an error. This\n\t\t * will help us identify these cases and take appropriate action.\n\t\t *\n\t\t * This happens due to scenarios such as data store created during summarize. Such errors should go away when\n\t\t * summarize is attempted again.\n\t\t */\n\t\treturn true;\n\t}\n\n\t/**\n\t * Called after summary has been uploaded to the server. Add the work-in-progress state to the pending summary\n\t * queue. We track this until we get an ack from the server for this summary.\n\t * @param proposalHandle - The handle of the summary that was uploaded to the server.\n\t */\n\tpublic completeSummary(proposalHandle: string, validate: boolean) {\n\t\tthis.completeSummaryCore(\n\t\t\tproposalHandle,\n\t\t\tundefined /* parentPath */,\n\t\t\tfalse /* parentSkipRecursion */,\n\t\t\tvalidate,\n\t\t);\n\t}\n\n\t/**\n\t * Recursive implementation for completeSummary, with additional internal-only parameters.\n\t * @param proposalHandle - The handle of the summary that was uploaded to the server.\n\t * @param parentPath - The path of the parent node which is used to build the path of this node.\n\t * @param parentSkipRecursion - true if the parent of this node skipped recursing the child nodes when summarizing.\n\t * In that case, the children will not have work-in-progress state.\n\t * @param validate - true to validate that the in-progress summary is correct for all nodes.\n\t */\n\tprotected completeSummaryCore(\n\t\tproposalHandle: string,\n\t\tparentPath: EscapedPath | undefined,\n\t\tparentSkipRecursion: boolean,\n\t\tvalidate: boolean,\n\t) {\n\t\tif (validate && this.wasSummarizeMissed(parentSkipRecursion)) {\n\t\t\tthis.throwUnexpectedError({\n\t\t\t\teventName: \"NodeDidNotSummarize\",\n\t\t\t\tproposalHandle,\n\t\t\t});\n\t\t}\n\n\t\tassert(this.wipReferenceSequenceNumber !== undefined, 0x1a4 /* \"Not tracking a summary\" */);\n\t\tlet localPathsToUse = this.wipLocalPaths;\n\n\t\tif (parentSkipRecursion) {\n\t\t\tconst latestSummary = this._latestSummary;\n\t\t\tif (latestSummary !== undefined) {\n\t\t\t\t// This case the parent node created a failure summary or was reused.\n\t\t\t\t// This node and all children should only try to reference their path\n\t\t\t\t// by its last known good state in the actual summary tree.\n\t\t\t\t// If parent fails or is reused, the child summarize is not called so\n\t\t\t\t// it did not get a chance to change its paths.\n\t\t\t\t// In this case, essentially only propagate the new summary ref seq num.\n\t\t\t\tlocalPathsToUse = {\n\t\t\t\t\tlocalPath: latestSummary.localPath,\n\t\t\t\t\tadditionalPath: latestSummary.additionalPath,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\t// This case the child is added after the latest non-failure summary.\n\t\t\t\t// This node and all children should consider themselves as still not\n\t\t\t\t// having a successful summary yet.\n\t\t\t\t// We cannot \"reuse\" this node if unchanged since that summary, because\n\t\t\t\t// handles will be unable to point to that node. It never made it to the\n\t\t\t\t// tree itself, and only exists as an attach op in the _outstandingOps.\n\t\t\t\tthis.clearSummary();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If localPathsToUse is undefined, it means summarize didn't run for this node and in that case the validate\n\t\t// step should have failed.\n\t\tassert(localPathsToUse !== undefined, 0x6fe /* summarize didn't run for node */);\n\t\tconst summary = new SummaryNode({\n\t\t\t...localPathsToUse,\n\t\t\treferenceSequenceNumber: this.wipReferenceSequenceNumber,\n\t\t\tbasePath: parentPath,\n\t\t});\n\t\tconst fullPathForChildren = summary.fullPathForChildren;\n\t\tfor (const child of this.children.values()) {\n\t\t\tchild.completeSummaryCore(\n\t\t\t\tproposalHandle,\n\t\t\t\tfullPathForChildren,\n\t\t\t\tthis.wipSkipRecursion || parentSkipRecursion,\n\t\t\t\tvalidate,\n\t\t\t);\n\t\t}\n\t\t// Note that this overwrites existing pending summary with\n\t\t// the same proposalHandle. If proposalHandle is something like\n\t\t// a hash or unique identifier, this should be fine. If storage\n\t\t// can return the same proposalHandle for a different summary,\n\t\t// this should still be okay, because we should be proposing the\n\t\t// newer one later which would have to overwrite the previous one.\n\t\tthis.pendingSummaries.set(proposalHandle, summary);\n\t\tthis.clearSummary();\n\t}\n\n\tpublic clearSummary() {\n\t\tthis.wipReferenceSequenceNumber = undefined;\n\t\tthis.wipLocalPaths = undefined;\n\t\tthis.wipSkipRecursion = false;\n\t\tthis.wipSummaryLogger = undefined;\n\t\tfor (const child of this.children.values()) {\n\t\t\tchild.clearSummary();\n\t\t}\n\t}\n\n\t/**\n\t * Refreshes the latest summary tracked by this node. If we have a pending summary for the given proposal handle,\n\t * it becomes the latest summary. If the current summary is already ahead (e.g., loaded from a service summary),\n\t * we skip the update. Otherwise, we fetch the latest snapshot and update latest summary based off of that.\n\t *\n\t * @returns A RefreshSummaryResult type which returns information based on the following three scenarios:\n\t *\n\t * 1. The latest summary was not updated.\n\t *\n\t * 2. The latest summary was updated and the summary corresponding to the params was being tracked.\n\t *\n\t * 3. The latest summary was updated but the summary corresponding to the params was not tracked. In this\n\t * case, the latest summary is updated based on the downloaded snapshot which is also returned.\n\t */\n\tpublic async refreshLatestSummary(\n\t\tproposalHandle: string | undefined,\n\t\tsummaryRefSeq: number,\n\t\tfetchLatestSnapshot: () => Promise<IFetchSnapshotResult>,\n\t\treadAndParseBlob: ReadAndParseBlob,\n\t\tcorrelatedSummaryLogger: ITelemetryLoggerExt,\n\t): Promise<RefreshSummaryResult> {\n\t\tconst eventProps: {\n\t\t\tproposalHandle: string | undefined;\n\t\t\tsummaryRefSeq: number;\n\t\t\treferenceSequenceNumber: number;\n\t\t\tlatestSummaryUpdated?: boolean;\n\t\t\twasSummaryTracked?: boolean;\n\t\t} = {\n\t\t\tproposalHandle,\n\t\t\tsummaryRefSeq,\n\t\t\treferenceSequenceNumber: this.referenceSequenceNumber,\n\t\t};\n\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\tthis.logger,\n\t\t\t{\n\t\t\t\teventName: \"refreshLatestSummary\",\n\t\t\t\t...eventProps,\n\t\t\t},\n\t\t\tasync (event) => {\n\t\t\t\t// Refresh latest summary should not happen while a summary is in progress. If it does, it can result\n\t\t\t\t// in inconsistent state, so, we should not continue;\n\t\t\t\tif (this.isSummaryInProgress()) {\n\t\t\t\t\tthrow new LoggingError(\"UnexpectedRefreshDuringSummarize\", {\n\t\t\t\t\t\tinProgressSummaryRefSeq: this.wipReferenceSequenceNumber,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (proposalHandle !== undefined) {\n\t\t\t\t\tconst maybeSummaryNode = this.pendingSummaries.get(proposalHandle);\n\n\t\t\t\t\tif (maybeSummaryNode !== undefined) {\n\t\t\t\t\t\tthis.refreshLatestSummaryFromPending(\n\t\t\t\t\t\t\tproposalHandle,\n\t\t\t\t\t\t\tmaybeSummaryNode.referenceSequenceNumber,\n\t\t\t\t\t\t);\n\t\t\t\t\t\teventProps.wasSummaryTracked = true;\n\t\t\t\t\t\teventProps.latestSummaryUpdated = true;\n\t\t\t\t\t\tevent.end(eventProps);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tlatestSummaryUpdated: true,\n\t\t\t\t\t\t\twasSummaryTracked: true,\n\t\t\t\t\t\t\tsummaryRefSeq,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tconst props = {\n\t\t\t\t\t\tsummaryRefSeq,\n\t\t\t\t\t\tpendingSize: this.pendingSummaries.size ?? undefined,\n\t\t\t\t\t};\n\t\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\t\teventName: \"PendingSummaryNotFound\",\n\t\t\t\t\t\tproposalHandle,\n\t\t\t\t\t\treferenceSequenceNumber: this.referenceSequenceNumber,\n\t\t\t\t\t\tdetails: JSON.stringify(props),\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// If the summary for which refresh is called is older than the latest tracked summary, ignore it.\n\t\t\t\tif (this.referenceSequenceNumber >= summaryRefSeq) {\n\t\t\t\t\teventProps.latestSummaryUpdated = false;\n\t\t\t\t\tevent.end(eventProps);\n\t\t\t\t\treturn { latestSummaryUpdated: false };\n\t\t\t\t}\n\n\t\t\t\t// Fetch the latest snapshot and refresh state from it. Note that we need to use the reference sequence number\n\t\t\t\t// of the fetched snapshot and not the \"summaryRefSeq\" that was passed in.\n\t\t\t\tconst { snapshotTree, snapshotRefSeq: fetchedSnapshotRefSeq } =\n\t\t\t\t\tawait fetchLatestSnapshot();\n\n\t\t\t\t// Possible re-entrancy. We may have updated latest summary state while fetching the snapshot. If the fetched\n\t\t\t\t// snapshot is older than the latest tracked summary, ignore it.\n\t\t\t\tif (this.referenceSequenceNumber >= fetchedSnapshotRefSeq) {\n\t\t\t\t\teventProps.latestSummaryUpdated = false;\n\t\t\t\t\tevent.end(eventProps);\n\t\t\t\t\treturn { latestSummaryUpdated: false };\n\t\t\t\t}\n\n\t\t\t\tawait this.refreshLatestSummaryFromSnapshot(\n\t\t\t\t\tfetchedSnapshotRefSeq,\n\t\t\t\t\tsnapshotTree,\n\t\t\t\t\tundefined,\n\t\t\t\t\tEscapedPath.create(\"\"),\n\t\t\t\t\tcorrelatedSummaryLogger,\n\t\t\t\t\treadAndParseBlob,\n\t\t\t\t);\n\n\t\t\t\teventProps.latestSummaryUpdated = true;\n\t\t\t\teventProps.wasSummaryTracked = false;\n\t\t\t\teventProps.summaryRefSeq = fetchedSnapshotRefSeq;\n\t\t\t\tevent.end(eventProps);\n\t\t\t\treturn {\n\t\t\t\t\tlatestSummaryUpdated: true,\n\t\t\t\t\twasSummaryTracked: false,\n\t\t\t\t\tsnapshotTree,\n\t\t\t\t\tsummaryRefSeq: fetchedSnapshotRefSeq,\n\t\t\t\t};\n\t\t\t},\n\t\t\t{ start: true, end: true, cancel: \"error\" },\n\t\t);\n\t}\n\t/**\n\t * Called when we get an ack from the server for a summary we've just sent. Updates the reference state of this node\n\t * from the state in the pending summary queue.\n\t * @param proposalHandle - Handle for the current proposal.\n\t * @param referenceSequenceNumber - reference sequence number of sent summary.\n\t */\n\tprotected refreshLatestSummaryFromPending(\n\t\tproposalHandle: string,\n\t\treferenceSequenceNumber: number,\n\t): void {\n\t\tconst summaryNode = this.pendingSummaries.get(proposalHandle);\n\t\tif (summaryNode === undefined) {\n\t\t\t// This should only happen if parent skipped recursion AND no prior summary existed.\n\t\t\tassert(\n\t\t\t\tthis._latestSummary === undefined,\n\t\t\t\t0x1a6 /* \"Not found pending summary, but this node has previously completed a summary\" */,\n\t\t\t);\n\t\t\treturn;\n\t\t} else {\n\t\t\tassert(\n\t\t\t\treferenceSequenceNumber === summaryNode.referenceSequenceNumber,\n\t\t\t\t0x1a7 /* Pending summary reference sequence number should be consistent */,\n\t\t\t);\n\n\t\t\t// Clear earlier pending summaries\n\t\t\tthis.pendingSummaries.delete(proposalHandle);\n\t\t}\n\n\t\tthis.refreshLatestSummaryCore(referenceSequenceNumber);\n\n\t\tthis._latestSummary = summaryNode;\n\t\t// Propagate update to all child nodes\n\t\tfor (const child of this.children.values()) {\n\t\t\tchild.refreshLatestSummaryFromPending(proposalHandle, referenceSequenceNumber);\n\t\t}\n\t}\n\n\tprotected async refreshLatestSummaryFromSnapshot(\n\t\treferenceSequenceNumber: number,\n\t\tsnapshotTree: ISnapshotTree,\n\t\tbasePath: EscapedPath | undefined,\n\t\tlocalPath: EscapedPath,\n\t\tcorrelatedSummaryLogger: ITelemetryLoggerExt,\n\t\treadAndParseBlob: ReadAndParseBlob,\n\t): Promise<void> {\n\t\t// Possible re-entrancy. If we have already seen a summary later than this one, ignore it.\n\t\tif (this.referenceSequenceNumber >= referenceSequenceNumber) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.refreshLatestSummaryCore(referenceSequenceNumber);\n\n\t\tthis._latestSummary = new SummaryNode({\n\t\t\treferenceSequenceNumber,\n\t\t\tbasePath,\n\t\t\tlocalPath,\n\t\t});\n\n\t\tconst pathParts: string[] = [];\n\t\tconst { childrenTree, childrenPathPart } = parseSummaryForSubtrees(snapshotTree);\n\t\tif (childrenPathPart !== undefined) {\n\t\t\tpathParts.push(childrenPathPart);\n\t\t}\n\n\t\tif (pathParts.length > 0) {\n\t\t\tthis._latestSummary.additionalPath = EscapedPath.createAndConcat(pathParts);\n\t\t}\n\n\t\t// Propagate update to all child nodes\n\t\tconst pathForChildren = this._latestSummary.fullPathForChildren;\n\t\tawait Promise.all(\n\t\t\tArray.from(this.children)\n\t\t\t\t.filter(([id]) => {\n\t\t\t\t\t// Assuming subtrees missing from snapshot are newer than the snapshot,\n\t\t\t\t\t// but might be nice to assert this using earliest seq for node.\n\t\t\t\t\treturn childrenTree.trees[id] !== undefined;\n\t\t\t\t})\n\t\t\t\t.map(async ([id, child]) => {\n\t\t\t\t\treturn child.refreshLatestSummaryFromSnapshot(\n\t\t\t\t\t\treferenceSequenceNumber,\n\t\t\t\t\t\tchildrenTree.trees[id],\n\t\t\t\t\t\tpathForChildren,\n\t\t\t\t\t\tEscapedPath.create(id),\n\t\t\t\t\t\tcorrelatedSummaryLogger,\n\t\t\t\t\t\treadAndParseBlob,\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t);\n\t}\n\n\tprivate refreshLatestSummaryCore(referenceSequenceNumber: number): void {\n\t\tfor (const [key, value] of this.pendingSummaries) {\n\t\t\tif (value.referenceSequenceNumber < referenceSequenceNumber) {\n\t\t\t\tthis.pendingSummaries.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic updateBaseSummaryState(snapshot: ISnapshotTree) {\n\t\t// Check base summary to see if it has any additional path parts\n\t\t// separating child SummarizerNodes. Checks for .channels subtrees.\n\t\tconst { childrenPathPart } = parseSummaryForSubtrees(snapshot);\n\t\tif (childrenPathPart !== undefined && this._latestSummary !== undefined) {\n\t\t\tthis._latestSummary.additionalPath = EscapedPath.create(childrenPathPart);\n\t\t}\n\t}\n\n\tpublic recordChange(op: ISequencedDocumentMessage): void {\n\t\tthis.invalidate(op.sequenceNumber);\n\t}\n\n\tpublic invalidate(sequenceNumber: number): void {\n\t\tif (sequenceNumber > this._changeSequenceNumber) {\n\t\t\tthis._changeSequenceNumber = sequenceNumber;\n\t\t}\n\t}\n\n\t/**\n\t * True if a change has been recorded with sequence number exceeding\n\t * the latest successfully acked summary reference sequence number.\n\t * False implies that the previous summary can be reused.\n\t */\n\tprotected hasChanged(): boolean {\n\t\treturn this._changeSequenceNumber > this.referenceSequenceNumber;\n\t}\n\n\tpublic get latestSummary(): Readonly<SummaryNode> | undefined {\n\t\treturn this._latestSummary;\n\t}\n\n\tprotected readonly canReuseHandle: boolean;\n\n\tpublic createChild(\n\t\t/** Summarize function */\n\t\tsummarizeInternalFn: SummarizeInternalFn,\n\t\t/** Initial id or path part of this node */\n\t\tid: string,\n\t\t/**\n\t\t * Information needed to create the node.\n\t\t * If it is from a base summary, it will assert that a summary has been seen.\n\t\t * Attach information if it is created from an attach op.\n\t\t */\n\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t\tconfig: ISummarizerNodeConfig = {},\n\t): ISummarizerNode {\n\t\tassert(!this.children.has(id), 0x1ab /* \"Create SummarizerNode child already exists\" */);\n\n\t\tconst createDetails: ICreateChildDetails = this.getCreateDetailsForChild(id, createParam);\n\t\tconst child = new SummarizerNode(\n\t\t\tthis.logger,\n\t\t\tsummarizeInternalFn,\n\t\t\tconfig,\n\t\t\tcreateDetails.changeSequenceNumber,\n\t\t\tcreateDetails.latestSummary,\n\t\t\tcreateDetails.initialSummary,\n\t\t\tthis.wipSummaryLogger,\n\t\t\tcreateDetails.telemetryNodeId,\n\t\t);\n\n\t\t// There may be additional state that has to be updated in this child. For example, if a summary is being\n\t\t// tracked, the child's summary tracking state needs to be updated too. Same goes for pendingSummaries we might\n\t\t// have outstanding on the parent in case we realize nodes in between Summary Op and Summary Ack.\n\t\tthis.maybeUpdateChildState(child, id);\n\n\t\tthis.children.set(id, child);\n\t\treturn child;\n\t}\n\n\tpublic getChild(id: string): ISummarizerNode | undefined {\n\t\treturn this.children.get(id);\n\t}\n\n\t/**\n\t * Returns the details needed to create a child node.\n\t * @param id - Initial id or path part of the child node.\n\t * @param createParam - Information needed to create the node.\n\t * @returns the details needed to create the child node.\n\t */\n\tprotected getCreateDetailsForChild(\n\t\tid: string,\n\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t): ICreateChildDetails {\n\t\tlet initialSummary: IInitialSummary | undefined;\n\t\tlet latestSummary: SummaryNode | undefined;\n\t\tlet changeSequenceNumber: number;\n\n\t\tconst parentLatestSummary = this._latestSummary;\n\t\tswitch (createParam.type) {\n\t\t\tcase CreateSummarizerNodeSource.FromAttach: {\n\t\t\t\tif (\n\t\t\t\t\tparentLatestSummary !== undefined &&\n\t\t\t\t\tcreateParam.sequenceNumber <= parentLatestSummary.referenceSequenceNumber\n\t\t\t\t) {\n\t\t\t\t\t// Prioritize latest summary if it was after this node was attached.\n\t\t\t\t\tlatestSummary = parentLatestSummary.createForChild(id);\n\t\t\t\t} else {\n\t\t\t\t\tconst summary = convertToSummaryTree(\n\t\t\t\t\t\tcreateParam.snapshot,\n\t\t\t\t\t) as ISummaryTreeWithStats;\n\t\t\t\t\tinitialSummary = {\n\t\t\t\t\t\tsequenceNumber: createParam.sequenceNumber,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tsummary,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tchangeSequenceNumber = createParam.sequenceNumber;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CreateSummarizerNodeSource.FromSummary: {\n\t\t\t\tif (this.initialSummary === undefined) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!!parentLatestSummary,\n\t\t\t\t\t\t0x1ac /* \"Cannot create child from summary if parent does not have latest summary\" */,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// fallthrough to local\n\t\t\t}\n\t\t\tcase CreateSummarizerNodeSource.Local: {\n\t\t\t\tconst parentInitialSummary = this.initialSummary;\n\t\t\t\tif (parentInitialSummary !== undefined) {\n\t\t\t\t\tlet childSummary: SummaryObject | undefined;\n\t\t\t\t\tif (parentInitialSummary.summary !== undefined) {\n\t\t\t\t\t\tconst { childrenTree } = parseSummaryTreeForSubtrees(\n\t\t\t\t\t\t\tparentInitialSummary.summary.summary,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tchildrenTree.type === SummaryType.Tree,\n\t\t\t\t\t\t\t0x1d6 /* \"Parent summary object is not a tree\" */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tchildSummary = childrenTree.tree[id];\n\t\t\t\t\t}\n\t\t\t\t\tif (createParam.type === CreateSummarizerNodeSource.FromSummary) {\n\t\t\t\t\t\t// Locally created would not have differential subtree.\n\t\t\t\t\t\tassert(!!childSummary, 0x1ad /* \"Missing child summary tree\" */);\n\t\t\t\t\t}\n\t\t\t\t\tlet childSummaryWithStats: ISummaryTreeWithStats | undefined;\n\t\t\t\t\tif (childSummary !== undefined) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tchildSummary.type === SummaryType.Tree,\n\t\t\t\t\t\t\t0x1ae /* \"Child summary object is not a tree\" */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tchildSummaryWithStats = {\n\t\t\t\t\t\t\tsummary: childSummary,\n\t\t\t\t\t\t\tstats: calculateStats(childSummary),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tinitialSummary = {\n\t\t\t\t\t\tsequenceNumber: parentInitialSummary.sequenceNumber,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tsummary: childSummaryWithStats,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tlatestSummary = parentLatestSummary?.createForChild(id);\n\t\t\t\tchangeSequenceNumber = parentLatestSummary?.referenceSequenceNumber ?? -1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst type = (createParam as unknown as CreateChildSummarizerNodeParam).type;\n\t\t\t\tunreachableCase(createParam, `Unexpected CreateSummarizerNodeSource: ${type}`);\n\t\t\t}\n\t\t}\n\n\t\tconst childtelemetryNodeId = `${this.telemetryNodeId ?? \"\"}/${id}`;\n\n\t\treturn {\n\t\t\tinitialSummary,\n\t\t\tlatestSummary,\n\t\t\tchangeSequenceNumber,\n\t\t\ttelemetryNodeId: childtelemetryNodeId,\n\t\t};\n\t}\n\n\t/**\n\t * Updates the state of the child if required. For example, if a summary is currently being tracked, the child's\n\t * summary tracking state needs to be updated too.\n\t * Also, in case a child node gets realized in between Summary Op and Summary Ack, let's initialize the child's\n\t * pending summary as well.\n\t * @param child - The child node whose state is to be updated.\n\t * @param id - Initial id or path part of this node\n\t *\n\t */\n\tprotected maybeUpdateChildState(child: SummarizerNode, id: string) {\n\t\t// If a summary is in progress, this child was created after the summary started. So, we need to update the\n\t\t// child's summary state as well.\n\t\tif (this.isSummaryInProgress()) {\n\t\t\tchild.wipReferenceSequenceNumber = this.wipReferenceSequenceNumber;\n\t\t}\n\t\t// In case we have pending summaries on the parent, let's initialize it on the child.\n\t\tif (child._latestSummary !== undefined) {\n\t\t\tfor (const [key, value] of this.pendingSummaries.entries()) {\n\t\t\t\tconst newLatestSummaryNode = new SummaryNode({\n\t\t\t\t\treferenceSequenceNumber: value.referenceSequenceNumber,\n\t\t\t\t\tbasePath: child._latestSummary.basePath,\n\t\t\t\t\tlocalPath: child._latestSummary.localPath,\n\t\t\t\t});\n\n\t\t\t\tchild.addPendingSummary(key, newLatestSummaryNode);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected addPendingSummary(key: string, summary: SummaryNode) {\n\t\tthis.pendingSummaries.set(key, summary);\n\t}\n\n\t/**\n\t * Tells whether summary tracking is in progress. True if \"startSummary\" API is called before summarize.\n\t */\n\tpublic isSummaryInProgress(): boolean {\n\t\treturn this.wipReferenceSequenceNumber !== undefined;\n\t}\n\n\t/**\n\t * Creates and throws an error due to unexpected conditions.\n\t */\n\tprotected throwUnexpectedError(eventProps: ITelemetryErrorEvent): never {\n\t\tconst error = new LoggingError(eventProps.eventName, {\n\t\t\t...eventProps,\n\t\t\treferenceSequenceNumber: this.wipReferenceSequenceNumber,\n\t\t\tid: {\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\tvalue: this.telemetryNodeId,\n\t\t\t},\n\t\t});\n\t\tthis.logger.sendErrorEvent(eventProps, error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Creates a root summarizer node.\n * @param logger - Logger to use within SummarizerNode\n * @param summarizeInternalFn - Function to generate summary\n * @param changeSequenceNumber - Sequence number of latest change to new node/subtree\n * @param referenceSequenceNumber - Reference sequence number of last acked summary,\n * or undefined if not loaded from summary\n * @param config - Configure behavior of summarizer node\n */\nexport const createRootSummarizerNode = (\n\tlogger: ITelemetryLoggerExt,\n\tsummarizeInternalFn: SummarizeInternalFn,\n\tchangeSequenceNumber: number,\n\treferenceSequenceNumber: number | undefined,\n\tconfig: ISummarizerNodeConfig = {},\n): IRootSummarizerNode =>\n\tnew SummarizerNode(\n\t\tlogger,\n\t\tsummarizeInternalFn,\n\t\tconfig,\n\t\tchangeSequenceNumber,\n\t\treferenceSequenceNumber === undefined\n\t\t\t? undefined\n\t\t\t: SummaryNode.createForRoot(referenceSequenceNumber),\n\t\tundefined /* initialSummary */,\n\t\tundefined /* wipSummaryLogger */,\n\t\t\"\" /* telemetryNodeId */,\n\t);\n"]}
1
+ {"version":3,"file":"summarizerNode.js","sourceRoot":"","sources":["../../../src/summary/summarizerNode/summarizerNode.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 { ITelemetryErrorEvent } from \"@fluidframework/core-interfaces\";\nimport {\n\tISummarizerNode,\n\tISummarizerNodeConfig,\n\tISummarizeResult,\n\tISummaryTreeWithStats,\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tSummarizeInternalFn,\n\tITelemetryContext,\n\tIExperimentalIncrementalSummaryContext,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n\tISequencedDocumentMessage,\n\tSummaryType,\n\tISnapshotTree,\n\tSummaryObject,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tITelemetryLoggerExt,\n\tChildLogger,\n\tLoggingError,\n\tPerformanceEvent,\n\tTelemetryDataTag,\n} from \"@fluidframework/telemetry-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/common-utils\";\nimport {\n\tconvertToSummaryTree,\n\tcalculateStats,\n\tmergeStats,\n\tReadAndParseBlob,\n} from \"@fluidframework/runtime-utils\";\nimport {\n\tEscapedPath,\n\tICreateChildDetails,\n\tIFetchSnapshotResult,\n\tIInitialSummary,\n\tISummarizerNodeRootContract,\n\tparseSummaryForSubtrees,\n\tparseSummaryTreeForSubtrees,\n\tRefreshSummaryResult,\n\tSummaryNode,\n\tValidateSummaryResult,\n} from \"./summarizerNodeUtils\";\n\nexport interface IRootSummarizerNode extends ISummarizerNode, ISummarizerNodeRootContract {}\n\n/**\n * Encapsulates the summarizing work and state of an individual tree node in the\n * summary tree. It tracks changes and allows for optimizations when unchanged, or\n * can allow for fallback summaries to be generated when an error is encountered.\n * Usage is for the root node to call startSummary first to begin tracking a WIP\n * (work in progress) summary. Then all nodes will call summarize to summaries their\n * individual parts. Once completed and uploaded to storage, the root node will call\n * completeSummary or clearSummary to clear the WIP summary tracking state if something\n * went wrong. The SummarizerNodes will track all pending summaries that have been\n * recorded by the completeSummary call. When one of them is acked, the root node should\n * call refreshLatestSummary to inform the tree of SummarizerNodes of the new baseline\n * latest successful summary.\n */\nexport class SummarizerNode implements IRootSummarizerNode {\n\t/**\n\t * The reference sequence number of the most recent acked summary.\n\t * Returns 0 if there is not yet an acked summary.\n\t */\n\tpublic get referenceSequenceNumber() {\n\t\treturn this._latestSummary?.referenceSequenceNumber ?? 0;\n\t}\n\n\tprotected readonly children = new Map<string, SummarizerNode>();\n\tprotected readonly pendingSummaries = new Map<string, SummaryNode>();\n\tprotected wipReferenceSequenceNumber: number | undefined;\n\tprivate wipLocalPaths: { localPath: EscapedPath; additionalPath?: EscapedPath } | undefined;\n\tprivate wipSkipRecursion = false;\n\n\tprotected readonly logger: ITelemetryLoggerExt;\n\n\t/**\n\t * Do not call constructor directly.\n\t * Use createRootSummarizerNode to create root node, or createChild to create child nodes.\n\t */\n\tpublic constructor(\n\t\tbaseLogger: ITelemetryLoggerExt,\n\t\tprivate readonly summarizeInternalFn: SummarizeInternalFn,\n\t\tconfig: ISummarizerNodeConfig,\n\t\tprivate _changeSequenceNumber: number,\n\t\t/** Undefined means created without summary */\n\t\tprivate _latestSummary?: SummaryNode,\n\t\tprivate readonly initialSummary?: IInitialSummary,\n\t\tprotected wipSummaryLogger?: ITelemetryLoggerExt,\n\t\t/** A unique id of this node to be logged when sending telemetry. */\n\t\tprotected telemetryNodeId?: string,\n\t) {\n\t\tthis.canReuseHandle = config.canReuseHandle ?? true;\n\t\t// All logs posted by the summarizer node should include the telemetryNodeId.\n\t\tthis.logger = ChildLogger.create(baseLogger, undefined /* namespace */, {\n\t\t\tall: {\n\t\t\t\tid: {\n\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\tvalue: this.telemetryNodeId,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic startSummary(referenceSequenceNumber: number, summaryLogger: ITelemetryLoggerExt) {\n\t\tassert(\n\t\t\tthis.wipSummaryLogger === undefined,\n\t\t\t0x19f /* \"wipSummaryLogger should not be set yet in startSummary\" */,\n\t\t);\n\t\tassert(\n\t\t\tthis.wipReferenceSequenceNumber === undefined,\n\t\t\t0x1a0 /* \"Already tracking a summary\" */,\n\t\t);\n\n\t\tthis.wipSummaryLogger = summaryLogger;\n\n\t\tfor (const child of this.children.values()) {\n\t\t\tchild.startSummary(referenceSequenceNumber, this.wipSummaryLogger);\n\t\t}\n\t\tthis.wipReferenceSequenceNumber = referenceSequenceNumber;\n\t}\n\n\tpublic async summarize(\n\t\tfullTree: boolean,\n\t\ttrackState: boolean = true,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummarizeResult> {\n\t\tassert(\n\t\t\tthis.isSummaryInProgress(),\n\t\t\t0x1a1 /* \"summarize should not be called when not tracking the summary\" */,\n\t\t);\n\t\tassert(\n\t\t\tthis.wipSummaryLogger !== undefined,\n\t\t\t0x1a2 /* \"wipSummaryLogger should have been set in startSummary or ctor\" */,\n\t\t);\n\n\t\t// Try to reuse the tree if unchanged\n\t\tif (this.canReuseHandle && !fullTree && !this.hasChanged()) {\n\t\t\tconst latestSummary = this._latestSummary;\n\t\t\tif (latestSummary !== undefined) {\n\t\t\t\tthis.wipLocalPaths = {\n\t\t\t\t\tlocalPath: latestSummary.localPath,\n\t\t\t\t\tadditionalPath: latestSummary.additionalPath,\n\t\t\t\t};\n\t\t\t\tthis.wipSkipRecursion = true;\n\t\t\t\tconst stats = mergeStats();\n\t\t\t\tstats.handleNodeCount++;\n\t\t\t\treturn {\n\t\t\t\t\tsummary: {\n\t\t\t\t\t\ttype: SummaryType.Handle,\n\t\t\t\t\t\thandle: latestSummary.fullPath.path,\n\t\t\t\t\t\thandleType: SummaryType.Tree,\n\t\t\t\t\t},\n\t\t\t\t\tstats,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// This assert is the same the other 0a1x1 assert `isSummaryInProgress`, the only difference is that typescript\n\t\t// complains if this assert isn't done this way\n\t\tassert(\n\t\t\tthis.wipReferenceSequenceNumber !== undefined,\n\t\t\t0x5df /* Summarize should not be called when not tracking the summary */,\n\t\t);\n\t\tconst incrementalSummaryContext: IExperimentalIncrementalSummaryContext | undefined =\n\t\t\tthis._latestSummary !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tsummarySequenceNumber: this.wipReferenceSequenceNumber,\n\t\t\t\t\t\tlatestSummarySequenceNumber: this._latestSummary.referenceSequenceNumber,\n\t\t\t\t\t\t// TODO: remove summaryPath\n\t\t\t\t\t\tsummaryPath: this._latestSummary.fullPath.path,\n\t\t\t\t }\n\t\t\t\t: undefined;\n\n\t\tconst result = await this.summarizeInternalFn(\n\t\t\tfullTree,\n\t\t\ttrue,\n\t\t\ttelemetryContext,\n\t\t\tincrementalSummaryContext,\n\t\t);\n\t\tthis.wipLocalPaths = { localPath: EscapedPath.create(result.id) };\n\t\tif (result.pathPartsForChildren !== undefined) {\n\t\t\tthis.wipLocalPaths.additionalPath = EscapedPath.createAndConcat(\n\t\t\t\tresult.pathPartsForChildren,\n\t\t\t);\n\t\t}\n\t\treturn { summary: result.summary, stats: result.stats };\n\t}\n\n\t/**\n\t * Validates that the in-progress summary is correct, i.e., summarize should have run for all non-skipped\n\t * nodes. This will only be called for the root summarizer node and is called by it recursively on all child nodes.\n\t *\n\t * @returns ValidateSummaryResult which contains a boolean success indicating whether the validation was successful.\n\t * In case of failure, additional information is returned indicating type of failure and where it was.\n\t */\n\tpublic validateSummary(): ValidateSummaryResult {\n\t\treturn this.validateSummaryCore(false /* parentSkipRecursion */);\n\t}\n\n\t/**\n\t * Validates that the in-progress summary is correct for all nodes, i.e., summarize should have run for all\n\t * non-skipped nodes.\n\t * @param parentSkipRecursion - true if the parent of this node skipped recursing the child nodes when summarizing.\n\t * In that case, the children will not have work-in-progress state.\n\t *\n\t * @returns ValidateSummaryResult which contains a boolean success indicating whether the validation was successful.\n\t * In case of failure, additional information is returned indicating type of failure and where it was.\n\t */\n\tprotected validateSummaryCore(parentSkipRecursion: boolean): ValidateSummaryResult {\n\t\tif (this.wasSummarizeMissed(parentSkipRecursion)) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\treason: \"NodeDidNotSummarize\",\n\t\t\t\tid: {\n\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\tvalue: this.telemetryNodeId,\n\t\t\t\t},\n\t\t\t\t// These errors are usually transient and should go away when summarize is retried.\n\t\t\t\tretryAfterSeconds: 1,\n\t\t\t};\n\t\t}\n\t\tif (parentSkipRecursion) {\n\t\t\treturn { success: true };\n\t\t}\n\n\t\tfor (const child of this.children.values()) {\n\t\t\tconst result = child.validateSummaryCore(this.wipSkipRecursion || parentSkipRecursion);\n\t\t\t// If any child fails, return the failure.\n\t\t\tif (!result.success) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\treturn { success: true };\n\t}\n\n\tprivate wasSummarizeMissed(parentSkipRecursion: boolean): boolean {\n\t\tassert(\n\t\t\tthis.wipSummaryLogger !== undefined,\n\t\t\t0x6fc /* wipSummaryLogger should have been set in startSummary or ctor */,\n\t\t);\n\t\tassert(this.wipReferenceSequenceNumber !== undefined, 0x6fd /* Not tracking a summary */);\n\n\t\t// If the parent node skipped recursion, it did not call summarize on this node. So, summarize was not missed\n\t\t// but was intentionally not called.\n\t\t// Otherwise, summarize should have been called on this node and wipLocalPaths must be set.\n\t\tif (parentSkipRecursion || this.wipLocalPaths !== undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * The absence of wip local path indicates that summarize was not called for this node. Return failure.\n\t\t * This can happen if:\n\t\t * 1. A child node was created after summarize was already called on the parent. For example, a data store\n\t\t * is realized (loaded) after summarize was called on it creating summarizer nodes for its DDSes. In this case,\n\t\t * parentSkipRecursion will be true and the if block above would handle it.\n\t\t * 2. A new node was created but summarize was never called on it. This can mean that the summary that is\n\t\t * generated may not have the data from this node. We should not continue, log and throw an error. This\n\t\t * will help us identify these cases and take appropriate action.\n\t\t *\n\t\t * This happens due to scenarios such as data store created during summarize. Such errors should go away when\n\t\t * summarize is attempted again.\n\t\t */\n\t\treturn true;\n\t}\n\n\t/**\n\t * Called after summary has been uploaded to the server. Add the work-in-progress state to the pending summary\n\t * queue. We track this until we get an ack from the server for this summary.\n\t * @param proposalHandle - The handle of the summary that was uploaded to the server.\n\t */\n\tpublic completeSummary(proposalHandle: string, validate: boolean) {\n\t\tthis.completeSummaryCore(\n\t\t\tproposalHandle,\n\t\t\tundefined /* parentPath */,\n\t\t\tfalse /* parentSkipRecursion */,\n\t\t\tvalidate,\n\t\t);\n\t}\n\n\t/**\n\t * Recursive implementation for completeSummary, with additional internal-only parameters.\n\t * @param proposalHandle - The handle of the summary that was uploaded to the server.\n\t * @param parentPath - The path of the parent node which is used to build the path of this node.\n\t * @param parentSkipRecursion - true if the parent of this node skipped recursing the child nodes when summarizing.\n\t * In that case, the children will not have work-in-progress state.\n\t * @param validate - true to validate that the in-progress summary is correct for all nodes.\n\t */\n\tprotected completeSummaryCore(\n\t\tproposalHandle: string,\n\t\tparentPath: EscapedPath | undefined,\n\t\tparentSkipRecursion: boolean,\n\t\tvalidate: boolean,\n\t) {\n\t\tif (validate && this.wasSummarizeMissed(parentSkipRecursion)) {\n\t\t\tthis.throwUnexpectedError({\n\t\t\t\teventName: \"NodeDidNotSummarize\",\n\t\t\t\tproposalHandle,\n\t\t\t});\n\t\t}\n\n\t\tassert(this.wipReferenceSequenceNumber !== undefined, 0x1a4 /* \"Not tracking a summary\" */);\n\t\tlet localPathsToUse = this.wipLocalPaths;\n\n\t\tif (parentSkipRecursion) {\n\t\t\tconst latestSummary = this._latestSummary;\n\t\t\tif (latestSummary !== undefined) {\n\t\t\t\t// This case the parent node created a failure summary or was reused.\n\t\t\t\t// This node and all children should only try to reference their path\n\t\t\t\t// by its last known good state in the actual summary tree.\n\t\t\t\t// If parent fails or is reused, the child summarize is not called so\n\t\t\t\t// it did not get a chance to change its paths.\n\t\t\t\t// In this case, essentially only propagate the new summary ref seq num.\n\t\t\t\tlocalPathsToUse = {\n\t\t\t\t\tlocalPath: latestSummary.localPath,\n\t\t\t\t\tadditionalPath: latestSummary.additionalPath,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\t// This case the child is added after the latest non-failure summary.\n\t\t\t\t// This node and all children should consider themselves as still not\n\t\t\t\t// having a successful summary yet.\n\t\t\t\t// We cannot \"reuse\" this node if unchanged since that summary, because\n\t\t\t\t// handles will be unable to point to that node. It never made it to the\n\t\t\t\t// tree itself, and only exists as an attach op in the _outstandingOps.\n\t\t\t\tthis.clearSummary();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If localPathsToUse is undefined, it means summarize didn't run for this node and in that case the validate\n\t\t// step should have failed.\n\t\tassert(localPathsToUse !== undefined, 0x6fe /* summarize didn't run for node */);\n\t\tconst summary = new SummaryNode({\n\t\t\t...localPathsToUse,\n\t\t\treferenceSequenceNumber: this.wipReferenceSequenceNumber,\n\t\t\tbasePath: parentPath,\n\t\t});\n\t\tconst fullPathForChildren = summary.fullPathForChildren;\n\t\tfor (const child of this.children.values()) {\n\t\t\tchild.completeSummaryCore(\n\t\t\t\tproposalHandle,\n\t\t\t\tfullPathForChildren,\n\t\t\t\tthis.wipSkipRecursion || parentSkipRecursion,\n\t\t\t\tvalidate,\n\t\t\t);\n\t\t}\n\t\t// Note that this overwrites existing pending summary with\n\t\t// the same proposalHandle. If proposalHandle is something like\n\t\t// a hash or unique identifier, this should be fine. If storage\n\t\t// can return the same proposalHandle for a different summary,\n\t\t// this should still be okay, because we should be proposing the\n\t\t// newer one later which would have to overwrite the previous one.\n\t\tthis.pendingSummaries.set(proposalHandle, summary);\n\t\tthis.clearSummary();\n\t}\n\n\tpublic clearSummary() {\n\t\tthis.wipReferenceSequenceNumber = undefined;\n\t\tthis.wipLocalPaths = undefined;\n\t\tthis.wipSkipRecursion = false;\n\t\tthis.wipSummaryLogger = undefined;\n\t\tfor (const child of this.children.values()) {\n\t\t\tchild.clearSummary();\n\t\t}\n\t}\n\n\t/**\n\t * Refreshes the latest summary tracked by this node. If we have a pending summary for the given proposal handle,\n\t * it becomes the latest summary. If the current summary is already ahead (e.g., loaded from a service summary),\n\t * we skip the update. Otherwise, we fetch the latest snapshot and update latest summary based off of that.\n\t *\n\t * @returns A RefreshSummaryResult type which returns information based on the following three scenarios:\n\t *\n\t * 1. The latest summary was not updated.\n\t *\n\t * 2. The latest summary was updated and the summary corresponding to the params was being tracked.\n\t *\n\t * 3. The latest summary was updated but the summary corresponding to the params was not tracked. In this\n\t * case, the latest summary is updated based on the downloaded snapshot which is also returned.\n\t */\n\tpublic async refreshLatestSummary(\n\t\tproposalHandle: string | undefined,\n\t\tsummaryRefSeq: number,\n\t\tfetchLatestSnapshot: () => Promise<IFetchSnapshotResult>,\n\t\treadAndParseBlob: ReadAndParseBlob,\n\t\tcorrelatedSummaryLogger: ITelemetryLoggerExt,\n\t): Promise<RefreshSummaryResult> {\n\t\tconst eventProps: {\n\t\t\tproposalHandle: string | undefined;\n\t\t\tsummaryRefSeq: number;\n\t\t\treferenceSequenceNumber: number;\n\t\t\tlatestSummaryUpdated?: boolean;\n\t\t\twasSummaryTracked?: boolean;\n\t\t} = {\n\t\t\tproposalHandle,\n\t\t\tsummaryRefSeq,\n\t\t\treferenceSequenceNumber: this.referenceSequenceNumber,\n\t\t};\n\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\tthis.logger,\n\t\t\t{\n\t\t\t\teventName: \"refreshLatestSummary\",\n\t\t\t\t...eventProps,\n\t\t\t},\n\t\t\tasync (event) => {\n\t\t\t\t// Refresh latest summary should not happen while a summary is in progress. If it does, it can result\n\t\t\t\t// in inconsistent state, so, we should not continue;\n\t\t\t\tif (this.isSummaryInProgress()) {\n\t\t\t\t\tthrow new LoggingError(\"UnexpectedRefreshDuringSummarize\", {\n\t\t\t\t\t\tinProgressSummaryRefSeq: this.wipReferenceSequenceNumber,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (proposalHandle !== undefined) {\n\t\t\t\t\tconst maybeSummaryNode = this.pendingSummaries.get(proposalHandle);\n\n\t\t\t\t\tif (maybeSummaryNode !== undefined) {\n\t\t\t\t\t\tthis.refreshLatestSummaryFromPending(\n\t\t\t\t\t\t\tproposalHandle,\n\t\t\t\t\t\t\tmaybeSummaryNode.referenceSequenceNumber,\n\t\t\t\t\t\t);\n\t\t\t\t\t\teventProps.wasSummaryTracked = true;\n\t\t\t\t\t\teventProps.latestSummaryUpdated = true;\n\t\t\t\t\t\tevent.end(eventProps);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tlatestSummaryUpdated: true,\n\t\t\t\t\t\t\twasSummaryTracked: true,\n\t\t\t\t\t\t\tsummaryRefSeq,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tconst props = {\n\t\t\t\t\t\tsummaryRefSeq,\n\t\t\t\t\t\tpendingSize: this.pendingSummaries.size ?? undefined,\n\t\t\t\t\t};\n\t\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\t\teventName: \"PendingSummaryNotFound\",\n\t\t\t\t\t\tproposalHandle,\n\t\t\t\t\t\treferenceSequenceNumber: this.referenceSequenceNumber,\n\t\t\t\t\t\tdetails: JSON.stringify(props),\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// If the summary for which refresh is called is older than the latest tracked summary, ignore it.\n\t\t\t\tif (this.referenceSequenceNumber >= summaryRefSeq) {\n\t\t\t\t\teventProps.latestSummaryUpdated = false;\n\t\t\t\t\tevent.end(eventProps);\n\t\t\t\t\treturn { latestSummaryUpdated: false };\n\t\t\t\t}\n\n\t\t\t\t// Fetch the latest snapshot and refresh state from it. Note that we need to use the reference sequence number\n\t\t\t\t// of the fetched snapshot and not the \"summaryRefSeq\" that was passed in.\n\t\t\t\tconst { snapshotTree, snapshotRefSeq: fetchedSnapshotRefSeq } =\n\t\t\t\t\tawait fetchLatestSnapshot();\n\n\t\t\t\t// Possible re-entrancy. We may have updated latest summary state while fetching the snapshot. If the fetched\n\t\t\t\t// snapshot is older than the latest tracked summary, ignore it.\n\t\t\t\tif (this.referenceSequenceNumber >= fetchedSnapshotRefSeq) {\n\t\t\t\t\teventProps.latestSummaryUpdated = false;\n\t\t\t\t\tevent.end(eventProps);\n\t\t\t\t\treturn { latestSummaryUpdated: false };\n\t\t\t\t}\n\n\t\t\t\tawait this.refreshLatestSummaryFromSnapshot(\n\t\t\t\t\tfetchedSnapshotRefSeq,\n\t\t\t\t\tsnapshotTree,\n\t\t\t\t\tundefined,\n\t\t\t\t\tEscapedPath.create(\"\"),\n\t\t\t\t\tcorrelatedSummaryLogger,\n\t\t\t\t\treadAndParseBlob,\n\t\t\t\t);\n\n\t\t\t\teventProps.latestSummaryUpdated = true;\n\t\t\t\teventProps.wasSummaryTracked = false;\n\t\t\t\teventProps.summaryRefSeq = fetchedSnapshotRefSeq;\n\t\t\t\tevent.end(eventProps);\n\t\t\t\treturn {\n\t\t\t\t\tlatestSummaryUpdated: true,\n\t\t\t\t\twasSummaryTracked: false,\n\t\t\t\t\tsnapshotTree,\n\t\t\t\t\tsummaryRefSeq: fetchedSnapshotRefSeq,\n\t\t\t\t};\n\t\t\t},\n\t\t\t{ start: true, end: true, cancel: \"error\" },\n\t\t);\n\t}\n\t/**\n\t * Called when we get an ack from the server for a summary we've just sent. Updates the reference state of this node\n\t * from the state in the pending summary queue.\n\t * @param proposalHandle - Handle for the current proposal.\n\t * @param referenceSequenceNumber - reference sequence number of sent summary.\n\t */\n\tprotected refreshLatestSummaryFromPending(\n\t\tproposalHandle: string,\n\t\treferenceSequenceNumber: number,\n\t): void {\n\t\tconst summaryNode = this.pendingSummaries.get(proposalHandle);\n\t\tif (summaryNode === undefined) {\n\t\t\t// This should only happen if parent skipped recursion AND no prior summary existed.\n\t\t\tassert(\n\t\t\t\tthis._latestSummary === undefined,\n\t\t\t\t0x1a6 /* \"Not found pending summary, but this node has previously completed a summary\" */,\n\t\t\t);\n\t\t\treturn;\n\t\t} else {\n\t\t\tassert(\n\t\t\t\treferenceSequenceNumber === summaryNode.referenceSequenceNumber,\n\t\t\t\t0x1a7 /* Pending summary reference sequence number should be consistent */,\n\t\t\t);\n\n\t\t\t// Clear earlier pending summaries\n\t\t\tthis.pendingSummaries.delete(proposalHandle);\n\t\t}\n\n\t\tthis.refreshLatestSummaryCore(referenceSequenceNumber);\n\n\t\tthis._latestSummary = summaryNode;\n\t\t// Propagate update to all child nodes\n\t\tfor (const child of this.children.values()) {\n\t\t\tchild.refreshLatestSummaryFromPending(proposalHandle, referenceSequenceNumber);\n\t\t}\n\t}\n\n\tprotected async refreshLatestSummaryFromSnapshot(\n\t\treferenceSequenceNumber: number,\n\t\tsnapshotTree: ISnapshotTree,\n\t\tbasePath: EscapedPath | undefined,\n\t\tlocalPath: EscapedPath,\n\t\tcorrelatedSummaryLogger: ITelemetryLoggerExt,\n\t\treadAndParseBlob: ReadAndParseBlob,\n\t): Promise<void> {\n\t\t// Possible re-entrancy. If we have already seen a summary later than this one, ignore it.\n\t\tif (this.referenceSequenceNumber >= referenceSequenceNumber) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.refreshLatestSummaryCore(referenceSequenceNumber);\n\n\t\tthis._latestSummary = new SummaryNode({\n\t\t\treferenceSequenceNumber,\n\t\t\tbasePath,\n\t\t\tlocalPath,\n\t\t});\n\n\t\tconst pathParts: string[] = [];\n\t\tconst { childrenTree, childrenPathPart } = parseSummaryForSubtrees(snapshotTree);\n\t\tif (childrenPathPart !== undefined) {\n\t\t\tpathParts.push(childrenPathPart);\n\t\t}\n\n\t\tif (pathParts.length > 0) {\n\t\t\tthis._latestSummary.additionalPath = EscapedPath.createAndConcat(pathParts);\n\t\t}\n\n\t\t// Propagate update to all child nodes\n\t\tconst pathForChildren = this._latestSummary.fullPathForChildren;\n\t\tawait Promise.all(\n\t\t\tArray.from(this.children)\n\t\t\t\t.filter(([id]) => {\n\t\t\t\t\t// Assuming subtrees missing from snapshot are newer than the snapshot,\n\t\t\t\t\t// but might be nice to assert this using earliest seq for node.\n\t\t\t\t\treturn childrenTree.trees[id] !== undefined;\n\t\t\t\t})\n\t\t\t\t.map(async ([id, child]) => {\n\t\t\t\t\treturn child.refreshLatestSummaryFromSnapshot(\n\t\t\t\t\t\treferenceSequenceNumber,\n\t\t\t\t\t\tchildrenTree.trees[id],\n\t\t\t\t\t\tpathForChildren,\n\t\t\t\t\t\tEscapedPath.create(id),\n\t\t\t\t\t\tcorrelatedSummaryLogger,\n\t\t\t\t\t\treadAndParseBlob,\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t);\n\t}\n\n\tprivate refreshLatestSummaryCore(referenceSequenceNumber: number): void {\n\t\tfor (const [key, value] of this.pendingSummaries) {\n\t\t\tif (value.referenceSequenceNumber < referenceSequenceNumber) {\n\t\t\t\tthis.pendingSummaries.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic updateBaseSummaryState(snapshot: ISnapshotTree) {\n\t\t// Check base summary to see if it has any additional path parts\n\t\t// separating child SummarizerNodes. Checks for .channels subtrees.\n\t\tconst { childrenPathPart } = parseSummaryForSubtrees(snapshot);\n\t\tif (childrenPathPart !== undefined && this._latestSummary !== undefined) {\n\t\t\tthis._latestSummary.additionalPath = EscapedPath.create(childrenPathPart);\n\t\t}\n\t}\n\n\tpublic recordChange(op: ISequencedDocumentMessage): void {\n\t\tthis.invalidate(op.sequenceNumber);\n\t}\n\n\tpublic invalidate(sequenceNumber: number): void {\n\t\tif (sequenceNumber > this._changeSequenceNumber) {\n\t\t\tthis._changeSequenceNumber = sequenceNumber;\n\t\t}\n\t}\n\n\t/**\n\t * True if a change has been recorded with sequence number exceeding\n\t * the latest successfully acked summary reference sequence number.\n\t * False implies that the previous summary can be reused.\n\t */\n\tprotected hasChanged(): boolean {\n\t\treturn this._changeSequenceNumber > this.referenceSequenceNumber;\n\t}\n\n\tpublic get latestSummary(): Readonly<SummaryNode> | undefined {\n\t\treturn this._latestSummary;\n\t}\n\n\tprotected readonly canReuseHandle: boolean;\n\n\tpublic createChild(\n\t\t/** Summarize function */\n\t\tsummarizeInternalFn: SummarizeInternalFn,\n\t\t/** Initial id or path part of this node */\n\t\tid: string,\n\t\t/**\n\t\t * Information needed to create the node.\n\t\t * If it is from a base summary, it will assert that a summary has been seen.\n\t\t * Attach information if it is created from an attach op.\n\t\t */\n\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t\tconfig: ISummarizerNodeConfig = {},\n\t): ISummarizerNode {\n\t\tassert(!this.children.has(id), 0x1ab /* \"Create SummarizerNode child already exists\" */);\n\n\t\tconst createDetails: ICreateChildDetails = this.getCreateDetailsForChild(id, createParam);\n\t\tconst child = new SummarizerNode(\n\t\t\tthis.logger,\n\t\t\tsummarizeInternalFn,\n\t\t\tconfig,\n\t\t\tcreateDetails.changeSequenceNumber,\n\t\t\tcreateDetails.latestSummary,\n\t\t\tcreateDetails.initialSummary,\n\t\t\tthis.wipSummaryLogger,\n\t\t\tcreateDetails.telemetryNodeId,\n\t\t);\n\n\t\t// There may be additional state that has to be updated in this child. For example, if a summary is being\n\t\t// tracked, the child's summary tracking state needs to be updated too. Same goes for pendingSummaries we might\n\t\t// have outstanding on the parent in case we realize nodes in between Summary Op and Summary Ack.\n\t\tthis.maybeUpdateChildState(child, id);\n\n\t\tthis.children.set(id, child);\n\t\treturn child;\n\t}\n\n\tpublic getChild(id: string): ISummarizerNode | undefined {\n\t\treturn this.children.get(id);\n\t}\n\n\t/**\n\t * Returns the details needed to create a child node.\n\t * @param id - Initial id or path part of the child node.\n\t * @param createParam - Information needed to create the node.\n\t * @returns the details needed to create the child node.\n\t */\n\tprotected getCreateDetailsForChild(\n\t\tid: string,\n\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t): ICreateChildDetails {\n\t\tlet initialSummary: IInitialSummary | undefined;\n\t\tlet latestSummary: SummaryNode | undefined;\n\t\tlet changeSequenceNumber: number;\n\n\t\tconst parentLatestSummary = this._latestSummary;\n\t\tswitch (createParam.type) {\n\t\t\tcase CreateSummarizerNodeSource.FromAttach: {\n\t\t\t\tif (\n\t\t\t\t\tparentLatestSummary !== undefined &&\n\t\t\t\t\tcreateParam.sequenceNumber <= parentLatestSummary.referenceSequenceNumber\n\t\t\t\t) {\n\t\t\t\t\t// Prioritize latest summary if it was after this node was attached.\n\t\t\t\t\tlatestSummary = parentLatestSummary.createForChild(id);\n\t\t\t\t} else {\n\t\t\t\t\tconst summary = convertToSummaryTree(\n\t\t\t\t\t\tcreateParam.snapshot,\n\t\t\t\t\t) as ISummaryTreeWithStats;\n\t\t\t\t\tinitialSummary = {\n\t\t\t\t\t\tsequenceNumber: createParam.sequenceNumber,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tsummary,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tchangeSequenceNumber = createParam.sequenceNumber;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CreateSummarizerNodeSource.FromSummary: {\n\t\t\t\tif (this.initialSummary === undefined) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!!parentLatestSummary,\n\t\t\t\t\t\t0x1ac /* \"Cannot create child from summary if parent does not have latest summary\" */,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// fallthrough to local\n\t\t\t}\n\t\t\tcase CreateSummarizerNodeSource.Local: {\n\t\t\t\tconst parentInitialSummary = this.initialSummary;\n\t\t\t\tif (parentInitialSummary !== undefined) {\n\t\t\t\t\tlet childSummary: SummaryObject | undefined;\n\t\t\t\t\tif (parentInitialSummary.summary !== undefined) {\n\t\t\t\t\t\tconst { childrenTree } = parseSummaryTreeForSubtrees(\n\t\t\t\t\t\t\tparentInitialSummary.summary.summary,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tchildrenTree.type === SummaryType.Tree,\n\t\t\t\t\t\t\t0x1d6 /* \"Parent summary object is not a tree\" */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tchildSummary = childrenTree.tree[id];\n\t\t\t\t\t}\n\t\t\t\t\tif (createParam.type === CreateSummarizerNodeSource.FromSummary) {\n\t\t\t\t\t\t// Locally created would not have differential subtree.\n\t\t\t\t\t\tassert(!!childSummary, 0x1ad /* \"Missing child summary tree\" */);\n\t\t\t\t\t}\n\t\t\t\t\tlet childSummaryWithStats: ISummaryTreeWithStats | undefined;\n\t\t\t\t\tif (childSummary !== undefined) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tchildSummary.type === SummaryType.Tree,\n\t\t\t\t\t\t\t0x1ae /* \"Child summary object is not a tree\" */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tchildSummaryWithStats = {\n\t\t\t\t\t\t\tsummary: childSummary,\n\t\t\t\t\t\t\tstats: calculateStats(childSummary),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tinitialSummary = {\n\t\t\t\t\t\tsequenceNumber: parentInitialSummary.sequenceNumber,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tsummary: childSummaryWithStats,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tlatestSummary = parentLatestSummary?.createForChild(id);\n\t\t\t\tchangeSequenceNumber = parentLatestSummary?.referenceSequenceNumber ?? -1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst type = (createParam as unknown as CreateChildSummarizerNodeParam).type;\n\t\t\t\tunreachableCase(createParam, `Unexpected CreateSummarizerNodeSource: ${type}`);\n\t\t\t}\n\t\t}\n\n\t\tconst childtelemetryNodeId = `${this.telemetryNodeId ?? \"\"}/${id}`;\n\n\t\treturn {\n\t\t\tinitialSummary,\n\t\t\tlatestSummary,\n\t\t\tchangeSequenceNumber,\n\t\t\ttelemetryNodeId: childtelemetryNodeId,\n\t\t};\n\t}\n\n\t/**\n\t * Updates the state of the child if required. For example, if a summary is currently being tracked, the child's\n\t * summary tracking state needs to be updated too.\n\t * Also, in case a child node gets realized in between Summary Op and Summary Ack, let's initialize the child's\n\t * pending summary as well.\n\t * @param child - The child node whose state is to be updated.\n\t * @param id - Initial id or path part of this node\n\t *\n\t */\n\tprotected maybeUpdateChildState(child: SummarizerNode, id: string) {\n\t\t// If a summary is in progress, this child was created after the summary started. So, we need to update the\n\t\t// child's summary state as well.\n\t\tif (this.isSummaryInProgress()) {\n\t\t\tchild.wipReferenceSequenceNumber = this.wipReferenceSequenceNumber;\n\t\t}\n\t\t// In case we have pending summaries on the parent, let's initialize it on the child.\n\t\tif (child._latestSummary !== undefined) {\n\t\t\tfor (const [key, value] of this.pendingSummaries.entries()) {\n\t\t\t\tconst newLatestSummaryNode = new SummaryNode({\n\t\t\t\t\treferenceSequenceNumber: value.referenceSequenceNumber,\n\t\t\t\t\tbasePath: child._latestSummary.basePath,\n\t\t\t\t\tlocalPath: child._latestSummary.localPath,\n\t\t\t\t});\n\n\t\t\t\tchild.addPendingSummary(key, newLatestSummaryNode);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected addPendingSummary(key: string, summary: SummaryNode) {\n\t\tthis.pendingSummaries.set(key, summary);\n\t}\n\n\t/**\n\t * Tells whether summary tracking is in progress. True if \"startSummary\" API is called before summarize.\n\t */\n\tpublic isSummaryInProgress(): boolean {\n\t\treturn this.wipReferenceSequenceNumber !== undefined;\n\t}\n\n\t/**\n\t * Creates and throws an error due to unexpected conditions.\n\t */\n\tprotected throwUnexpectedError(eventProps: ITelemetryErrorEvent): never {\n\t\tconst error = new LoggingError(eventProps.eventName, {\n\t\t\t...eventProps,\n\t\t\treferenceSequenceNumber: this.wipReferenceSequenceNumber,\n\t\t\tid: {\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\tvalue: this.telemetryNodeId,\n\t\t\t},\n\t\t});\n\t\tthis.logger.sendErrorEvent(eventProps, error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Creates a root summarizer node.\n * @param logger - Logger to use within SummarizerNode\n * @param summarizeInternalFn - Function to generate summary\n * @param changeSequenceNumber - Sequence number of latest change to new node/subtree\n * @param referenceSequenceNumber - Reference sequence number of last acked summary,\n * or undefined if not loaded from summary\n * @param config - Configure behavior of summarizer node\n */\nexport const createRootSummarizerNode = (\n\tlogger: ITelemetryLoggerExt,\n\tsummarizeInternalFn: SummarizeInternalFn,\n\tchangeSequenceNumber: number,\n\treferenceSequenceNumber: number | undefined,\n\tconfig: ISummarizerNodeConfig = {},\n): IRootSummarizerNode =>\n\tnew SummarizerNode(\n\t\tlogger,\n\t\tsummarizeInternalFn,\n\t\tconfig,\n\t\tchangeSequenceNumber,\n\t\treferenceSequenceNumber === undefined\n\t\t\t? undefined\n\t\t\t: SummaryNode.createForRoot(referenceSequenceNumber),\n\t\tundefined /* initialSummary */,\n\t\tundefined /* wipSummaryLogger */,\n\t\t\"\" /* telemetryNodeId */,\n\t);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"summarizerNodeWithGc.d.ts","sourceRoot":"","sources":["../../../src/summary/summarizerNode/summarizerNodeWithGc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"summarizerNodeWithGc.d.ts","sourceRoot":"","sources":["../../../src/summary/summarizerNode/summarizerNodeWithGc.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { LoggingError, TelemetryDataTag, } from "@fluidframework/telemetry-utils";
6
- import { assert, LazyPromise } from "@fluidframework/common-utils";
6
+ import { assert } from "@fluidframework/common-utils";
7
+ import { LazyPromise } from "@fluidframework/core-utils";
7
8
  import { gcTreeKey, } from "@fluidframework/runtime-definitions";
8
9
  import { unpackChildNodesUsedRoutes } from "@fluidframework/runtime-utils";
9
10
  import { cloneGCData, getGCDataFromSnapshot, runGarbageCollection, unpackChildNodesGCDetails, } from "../../gc";