@fluidframework/container-runtime 2.0.0-dev-rc.1.0.0.225277 → 2.0.0-dev-rc.1.0.0.232845

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +0 -6
  3. package/api-report/container-runtime.api.md +14 -3
  4. package/dist/{batchTracker.cjs → batchTracker.js} +1 -1
  5. package/dist/batchTracker.js.map +1 -0
  6. package/dist/blobManager.d.ts.map +1 -1
  7. package/dist/{blobManager.cjs → blobManager.js} +9 -3
  8. package/dist/blobManager.js.map +1 -0
  9. package/dist/{connectionTelemetry.cjs → connectionTelemetry.js} +1 -1
  10. package/dist/connectionTelemetry.js.map +1 -0
  11. package/dist/container-runtime-alpha.d.ts +13 -3
  12. package/dist/container-runtime-beta.d.ts +7 -0
  13. package/dist/container-runtime-public.d.ts +7 -0
  14. package/dist/container-runtime-untrimmed.d.ts +30 -3
  15. package/dist/{containerHandleContext.cjs → containerHandleContext.js} +1 -1
  16. package/dist/containerHandleContext.js.map +1 -0
  17. package/dist/containerRuntime.d.ts +5 -2
  18. package/dist/containerRuntime.d.ts.map +1 -1
  19. package/dist/{containerRuntime.cjs → containerRuntime.js} +78 -85
  20. package/dist/containerRuntime.js.map +1 -0
  21. package/dist/{dataStore.cjs → dataStore.js} +1 -1
  22. package/dist/dataStore.js.map +1 -0
  23. package/dist/dataStoreContext.d.ts +7 -1
  24. package/dist/dataStoreContext.d.ts.map +1 -1
  25. package/dist/{dataStoreContext.cjs → dataStoreContext.js} +13 -7
  26. package/dist/dataStoreContext.js.map +1 -0
  27. package/dist/{dataStoreContexts.cjs → dataStoreContexts.js} +1 -1
  28. package/dist/dataStoreContexts.js.map +1 -0
  29. package/dist/{dataStoreRegistry.cjs → dataStoreRegistry.js} +1 -1
  30. package/dist/dataStoreRegistry.js.map +1 -0
  31. package/dist/dataStores.d.ts +9 -3
  32. package/dist/dataStores.d.ts.map +1 -1
  33. package/dist/{dataStores.cjs → dataStores.js} +62 -16
  34. package/dist/dataStores.js.map +1 -0
  35. package/dist/{deltaManagerProxyBase.cjs → deltaManagerProxyBase.js} +1 -1
  36. package/dist/deltaManagerProxyBase.js.map +1 -0
  37. package/dist/{deltaManagerSummarizerProxy.cjs → deltaManagerSummarizerProxy.js} +3 -3
  38. package/dist/deltaManagerSummarizerProxy.js.map +1 -0
  39. package/dist/{deltaScheduler.cjs → deltaScheduler.js} +1 -1
  40. package/dist/deltaScheduler.js.map +1 -0
  41. package/dist/{error.cjs → error.js} +1 -1
  42. package/dist/error.js.map +1 -0
  43. package/dist/gc/garbageCollection.d.ts +17 -1
  44. package/dist/gc/garbageCollection.d.ts.map +1 -1
  45. package/dist/gc/{garbageCollection.cjs → garbageCollection.js} +111 -42
  46. package/dist/gc/garbageCollection.js.map +1 -0
  47. package/dist/gc/{gcConfigs.cjs → gcConfigs.js} +3 -3
  48. package/dist/gc/gcConfigs.js.map +1 -0
  49. package/dist/gc/gcDefinitions.d.ts +20 -2
  50. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  51. package/dist/gc/{gcDefinitions.cjs → gcDefinitions.js} +8 -2
  52. package/dist/gc/gcDefinitions.js.map +1 -0
  53. package/dist/gc/{gcHelpers.cjs → gcHelpers.js} +1 -1
  54. package/dist/gc/gcHelpers.js.map +1 -0
  55. package/dist/gc/{gcReferenceGraphAlgorithm.cjs → gcReferenceGraphAlgorithm.js} +1 -1
  56. package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -0
  57. package/dist/gc/{gcSummaryDefinitions.cjs → gcSummaryDefinitions.js} +1 -1
  58. package/dist/gc/gcSummaryDefinitions.js.map +1 -0
  59. package/dist/gc/{gcSummaryStateTracker.cjs → gcSummaryStateTracker.js} +2 -2
  60. package/dist/gc/gcSummaryStateTracker.js.map +1 -0
  61. package/dist/gc/gcTelemetry.d.ts +1 -0
  62. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  63. package/dist/gc/{gcTelemetry.cjs → gcTelemetry.js} +2 -4
  64. package/dist/gc/gcTelemetry.js.map +1 -0
  65. package/dist/gc/gcUnreferencedStateTracker.d.ts +5 -0
  66. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  67. package/dist/gc/{gcUnreferencedStateTracker.cjs → gcUnreferencedStateTracker.js} +14 -3
  68. package/dist/gc/{gcUnreferencedStateTracker.cjs.map → gcUnreferencedStateTracker.js.map} +1 -1
  69. package/dist/gc/index.d.ts +1 -1
  70. package/dist/gc/index.d.ts.map +1 -1
  71. package/dist/gc/{index.cjs → index.js} +11 -9
  72. package/dist/gc/index.js.map +1 -0
  73. package/dist/index.d.ts +2 -1
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/{index.cjs → index.js} +10 -8
  76. package/dist/index.js.map +1 -0
  77. package/dist/messageTypes.d.ts +1 -1
  78. package/dist/{messageTypes.cjs → messageTypes.js} +1 -1
  79. package/dist/messageTypes.js.map +1 -0
  80. package/dist/{metadata.cjs → metadata.js} +1 -1
  81. package/dist/metadata.js.map +1 -0
  82. package/dist/opLifecycle/{batchManager.cjs → batchManager.js} +1 -1
  83. package/dist/opLifecycle/batchManager.js.map +1 -0
  84. package/dist/opLifecycle/{definitions.cjs → definitions.js} +1 -1
  85. package/dist/opLifecycle/definitions.js.map +1 -0
  86. package/dist/opLifecycle/{index.cjs → index.js} +8 -8
  87. package/dist/opLifecycle/index.js.map +1 -0
  88. package/dist/opLifecycle/{opCompressor.cjs → opCompressor.js} +3 -3
  89. package/dist/opLifecycle/opCompressor.js.map +1 -0
  90. package/dist/opLifecycle/{opDecompressor.cjs → opDecompressor.js} +2 -2
  91. package/dist/opLifecycle/opDecompressor.js.map +1 -0
  92. package/dist/opLifecycle/{opGroupingManager.cjs → opGroupingManager.js} +1 -1
  93. package/dist/opLifecycle/opGroupingManager.js.map +1 -0
  94. package/dist/opLifecycle/{opSplitter.cjs → opSplitter.js} +3 -3
  95. package/dist/opLifecycle/opSplitter.js.map +1 -0
  96. package/dist/opLifecycle/{outbox.cjs → outbox.js} +2 -2
  97. package/dist/opLifecycle/outbox.js.map +1 -0
  98. package/dist/opLifecycle/{remoteMessageProcessor.cjs → remoteMessageProcessor.js} +2 -2
  99. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -0
  100. package/dist/{opProperties.cjs → opProperties.js} +1 -1
  101. package/dist/opProperties.js.map +1 -0
  102. package/dist/packageVersion.d.ts +1 -1
  103. package/dist/{packageVersion.cjs → packageVersion.js} +2 -2
  104. package/dist/packageVersion.js.map +1 -0
  105. package/dist/{pendingStateManager.cjs → pendingStateManager.js} +2 -2
  106. package/dist/pendingStateManager.js.map +1 -0
  107. package/dist/{scheduleManager.cjs → scheduleManager.js} +3 -3
  108. package/dist/scheduleManager.js.map +1 -0
  109. package/dist/{storageServiceWithAttachBlobs.cjs → storageServiceWithAttachBlobs.js} +1 -1
  110. package/dist/storageServiceWithAttachBlobs.js.map +1 -0
  111. package/dist/summary/{index.cjs → index.js} +12 -12
  112. package/dist/summary/index.js.map +1 -0
  113. package/dist/summary/{orderedClientElection.cjs → orderedClientElection.js} +2 -2
  114. package/dist/summary/orderedClientElection.js.map +1 -0
  115. package/dist/summary/{runWhileConnectedCoordinator.cjs → runWhileConnectedCoordinator.js} +1 -1
  116. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
  117. package/dist/summary/runningSummarizer.d.ts +11 -6
  118. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  119. package/dist/summary/{runningSummarizer.cjs → runningSummarizer.js} +140 -93
  120. package/dist/summary/runningSummarizer.js.map +1 -0
  121. package/dist/summary/{summarizer.cjs → summarizer.js} +4 -4
  122. package/dist/summary/summarizer.js.map +1 -0
  123. package/dist/summary/{summarizerClientElection.cjs → summarizerClientElection.js} +1 -1
  124. package/dist/summary/summarizerClientElection.js.map +1 -0
  125. package/dist/summary/{summarizerHeuristics.cjs → summarizerHeuristics.js} +1 -1
  126. package/dist/summary/summarizerHeuristics.js.map +1 -0
  127. package/dist/summary/summarizerNode/{index.cjs → index.js} +3 -3
  128. package/dist/summary/summarizerNode/index.js.map +1 -0
  129. package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -3
  130. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  131. package/dist/summary/summarizerNode/{summarizerNode.cjs → summarizerNode.js} +8 -50
  132. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -0
  133. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -18
  134. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  135. package/dist/summary/summarizerNode/{summarizerNodeUtils.cjs → summarizerNodeUtils.js} +2 -22
  136. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
  137. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +3 -3
  138. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  139. package/dist/summary/summarizerNode/{summarizerNodeWithGc.cjs → summarizerNodeWithGc.js} +9 -9
  140. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
  141. package/dist/summary/summarizerTypes.d.ts +3 -1
  142. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  143. package/dist/summary/{summarizerTypes.cjs → summarizerTypes.js} +1 -1
  144. package/dist/summary/summarizerTypes.js.map +1 -0
  145. package/dist/summary/{summaryCollection.cjs → summaryCollection.js} +1 -1
  146. package/dist/summary/summaryCollection.js.map +1 -0
  147. package/dist/summary/{summaryFormat.cjs → summaryFormat.js} +1 -1
  148. package/dist/summary/summaryFormat.js.map +1 -0
  149. package/dist/summary/{summaryGenerator.cjs → summaryGenerator.js} +1 -1
  150. package/dist/summary/summaryGenerator.js.map +1 -0
  151. package/dist/summary/{summaryManager.cjs → summaryManager.js} +2 -2
  152. package/dist/summary/summaryManager.js.map +1 -0
  153. package/dist/{throttler.cjs → throttler.js} +1 -1
  154. package/dist/throttler.js.map +1 -0
  155. package/dist/tsdoc-metadata.json +1 -1
  156. package/lib/blobManager.d.mts.map +1 -1
  157. package/lib/blobManager.mjs +7 -1
  158. package/lib/blobManager.mjs.map +1 -1
  159. package/lib/container-runtime-alpha.d.mts +13 -3
  160. package/lib/container-runtime-beta.d.mts +7 -0
  161. package/lib/container-runtime-public.d.mts +7 -0
  162. package/lib/container-runtime-untrimmed.d.mts +30 -3
  163. package/lib/containerRuntime.d.mts +5 -2
  164. package/lib/containerRuntime.d.mts.map +1 -1
  165. package/lib/containerRuntime.mjs +62 -69
  166. package/lib/containerRuntime.mjs.map +1 -1
  167. package/lib/dataStoreContext.d.mts +7 -1
  168. package/lib/dataStoreContext.d.mts.map +1 -1
  169. package/lib/dataStoreContext.mjs +11 -5
  170. package/lib/dataStoreContext.mjs.map +1 -1
  171. package/lib/dataStores.d.mts +9 -3
  172. package/lib/dataStores.d.mts.map +1 -1
  173. package/lib/dataStores.mjs +54 -9
  174. package/lib/dataStores.mjs.map +1 -1
  175. package/lib/gc/garbageCollection.d.mts +17 -1
  176. package/lib/gc/garbageCollection.d.mts.map +1 -1
  177. package/lib/gc/garbageCollection.mjs +103 -34
  178. package/lib/gc/garbageCollection.mjs.map +1 -1
  179. package/lib/gc/gcDefinitions.d.mts +20 -2
  180. package/lib/gc/gcDefinitions.d.mts.map +1 -1
  181. package/lib/gc/gcDefinitions.mjs +6 -0
  182. package/lib/gc/gcDefinitions.mjs.map +1 -1
  183. package/lib/gc/gcTelemetry.d.mts +1 -0
  184. package/lib/gc/gcTelemetry.d.mts.map +1 -1
  185. package/lib/gc/gcTelemetry.mjs +0 -2
  186. package/lib/gc/gcTelemetry.mjs.map +1 -1
  187. package/lib/gc/gcUnreferencedStateTracker.d.mts +5 -0
  188. package/lib/gc/gcUnreferencedStateTracker.d.mts.map +1 -1
  189. package/lib/gc/gcUnreferencedStateTracker.mjs +10 -0
  190. package/lib/gc/gcUnreferencedStateTracker.mjs.map +1 -1
  191. package/lib/gc/index.d.mts +1 -1
  192. package/lib/gc/index.d.mts.map +1 -1
  193. package/lib/gc/index.mjs +1 -1
  194. package/lib/gc/index.mjs.map +1 -1
  195. package/lib/index.d.mts +2 -1
  196. package/lib/index.d.mts.map +1 -1
  197. package/lib/index.mjs +1 -0
  198. package/lib/index.mjs.map +1 -1
  199. package/lib/messageTypes.d.mts +1 -1
  200. package/lib/messageTypes.mjs.map +1 -1
  201. package/lib/packageVersion.d.mts +1 -1
  202. package/lib/packageVersion.mjs +1 -1
  203. package/lib/packageVersion.mjs.map +1 -1
  204. package/lib/summary/runningSummarizer.d.mts +11 -6
  205. package/lib/summary/runningSummarizer.d.mts.map +1 -1
  206. package/lib/summary/runningSummarizer.mjs +136 -89
  207. package/lib/summary/runningSummarizer.mjs.map +1 -1
  208. package/lib/summary/summarizerNode/summarizerNode.d.mts +2 -3
  209. package/lib/summary/summarizerNode/summarizerNode.d.mts.map +1 -1
  210. package/lib/summary/summarizerNode/summarizerNode.mjs +8 -50
  211. package/lib/summary/summarizerNode/summarizerNode.mjs.map +1 -1
  212. package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts +1 -18
  213. package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts.map +1 -1
  214. package/lib/summary/summarizerNode/summarizerNodeUtils.mjs +0 -19
  215. package/lib/summary/summarizerNode/summarizerNodeUtils.mjs.map +1 -1
  216. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts +3 -3
  217. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts.map +1 -1
  218. package/lib/summary/summarizerNode/summarizerNodeWithGc.mjs +5 -5
  219. package/lib/summary/summarizerNode/summarizerNodeWithGc.mjs.map +1 -1
  220. package/lib/summary/summarizerTypes.d.mts +3 -1
  221. package/lib/summary/summarizerTypes.d.mts.map +1 -1
  222. package/lib/summary/summarizerTypes.mjs.map +1 -1
  223. package/package.json +48 -38
  224. package/src/blobManager.ts +7 -1
  225. package/src/containerRuntime.ts +103 -85
  226. package/src/dataStoreContext.ts +15 -6
  227. package/src/dataStores.ts +64 -6
  228. package/src/gc/garbageCollection.ts +118 -32
  229. package/src/gc/gcDefinitions.ts +21 -3
  230. package/src/gc/gcTelemetry.ts +1 -2
  231. package/src/gc/gcUnreferencedStateTracker.ts +11 -0
  232. package/src/gc/index.ts +3 -0
  233. package/src/index.ts +2 -0
  234. package/src/messageTypes.ts +1 -1
  235. package/src/packageVersion.ts +1 -1
  236. package/src/summary/runningSummarizer.ts +174 -113
  237. package/src/summary/summarizerNode/summarizerNode.ts +4 -64
  238. package/src/summary/summarizerNode/summarizerNodeUtils.ts +2 -33
  239. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +0 -6
  240. package/src/summary/summarizerTypes.ts +3 -1
  241. package/dist/batchTracker.cjs.map +0 -1
  242. package/dist/blobManager.cjs.map +0 -1
  243. package/dist/connectionTelemetry.cjs.map +0 -1
  244. package/dist/containerHandleContext.cjs.map +0 -1
  245. package/dist/containerRuntime.cjs.map +0 -1
  246. package/dist/dataStore.cjs.map +0 -1
  247. package/dist/dataStoreContext.cjs.map +0 -1
  248. package/dist/dataStoreContexts.cjs.map +0 -1
  249. package/dist/dataStoreRegistry.cjs.map +0 -1
  250. package/dist/dataStores.cjs.map +0 -1
  251. package/dist/deltaManagerProxyBase.cjs.map +0 -1
  252. package/dist/deltaManagerSummarizerProxy.cjs.map +0 -1
  253. package/dist/deltaScheduler.cjs.map +0 -1
  254. package/dist/error.cjs.map +0 -1
  255. package/dist/gc/garbageCollection.cjs.map +0 -1
  256. package/dist/gc/gcConfigs.cjs.map +0 -1
  257. package/dist/gc/gcDefinitions.cjs.map +0 -1
  258. package/dist/gc/gcHelpers.cjs.map +0 -1
  259. package/dist/gc/gcReferenceGraphAlgorithm.cjs.map +0 -1
  260. package/dist/gc/gcSummaryDefinitions.cjs.map +0 -1
  261. package/dist/gc/gcSummaryStateTracker.cjs.map +0 -1
  262. package/dist/gc/gcTelemetry.cjs.map +0 -1
  263. package/dist/gc/index.cjs.map +0 -1
  264. package/dist/index.cjs.map +0 -1
  265. package/dist/messageTypes.cjs.map +0 -1
  266. package/dist/metadata.cjs.map +0 -1
  267. package/dist/opLifecycle/batchManager.cjs.map +0 -1
  268. package/dist/opLifecycle/definitions.cjs.map +0 -1
  269. package/dist/opLifecycle/index.cjs.map +0 -1
  270. package/dist/opLifecycle/opCompressor.cjs.map +0 -1
  271. package/dist/opLifecycle/opDecompressor.cjs.map +0 -1
  272. package/dist/opLifecycle/opGroupingManager.cjs.map +0 -1
  273. package/dist/opLifecycle/opSplitter.cjs.map +0 -1
  274. package/dist/opLifecycle/outbox.cjs.map +0 -1
  275. package/dist/opLifecycle/remoteMessageProcessor.cjs.map +0 -1
  276. package/dist/opProperties.cjs.map +0 -1
  277. package/dist/packageVersion.cjs.map +0 -1
  278. package/dist/pendingStateManager.cjs.map +0 -1
  279. package/dist/scheduleManager.cjs.map +0 -1
  280. package/dist/storageServiceWithAttachBlobs.cjs.map +0 -1
  281. package/dist/summary/index.cjs.map +0 -1
  282. package/dist/summary/orderedClientElection.cjs.map +0 -1
  283. package/dist/summary/runWhileConnectedCoordinator.cjs.map +0 -1
  284. package/dist/summary/runningSummarizer.cjs.map +0 -1
  285. package/dist/summary/summarizer.cjs.map +0 -1
  286. package/dist/summary/summarizerClientElection.cjs.map +0 -1
  287. package/dist/summary/summarizerHeuristics.cjs.map +0 -1
  288. package/dist/summary/summarizerNode/index.cjs.map +0 -1
  289. package/dist/summary/summarizerNode/summarizerNode.cjs.map +0 -1
  290. package/dist/summary/summarizerNode/summarizerNodeUtils.cjs.map +0 -1
  291. package/dist/summary/summarizerNode/summarizerNodeWithGc.cjs.map +0 -1
  292. package/dist/summary/summarizerTypes.cjs.map +0 -1
  293. package/dist/summary/summaryCollection.cjs.map +0 -1
  294. package/dist/summary/summaryFormat.cjs.map +0 -1
  295. package/dist/summary/summaryGenerator.cjs.map +0 -1
  296. package/dist/summary/summaryManager.cjs.map +0 -1
  297. package/dist/throttler.cjs.map +0 -1
  298. package/tsc-multi.test.json +0 -4
  299. /package/{.eslintrc.js → .eslintrc.cjs} +0 -0
@@ -80,7 +80,7 @@ export type ContainerRuntimeAliasMessage = TypedContainerRuntimeMessage<Containe
80
80
  export type ContainerRuntimeIdAllocationMessage = TypedContainerRuntimeMessage<ContainerMessageType.IdAllocation, IdCreationRange>;
81
81
  export type ContainerRuntimeGCMessage = TypedContainerRuntimeMessage<ContainerMessageType.GC, GarbageCollectionMessage>;
82
82
  /**
83
- * Represents an unrecognized {@link TypedContainerRuntimeMessage}, e.g. a message from a future version of the container runtime.
83
+ * Represents an unrecognized TypedContainerRuntimeMessage, e.g. a message from a future version of the container runtime.
84
84
  * @internal
85
85
  */
86
86
  export interface UnknownContainerRuntimeMessage extends Partial<RecentlyAddedContainerRuntimeMessageDetails> {
@@ -1 +1 @@
1
- {"version":3,"file":"messageTypes.mjs","sourceRoot":"","sources":["../src/messageTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH;;GAEG;AACH,MAAM,CAAN,IAAY,oBA+BX;AA/BD,WAAY,oBAAoB;IAC/B,iCAAiC;IACjC,sDAA8B,CAAA;IAE9B,sBAAsB;IACtB,yCAAiB,CAAA;IAEjB,qBAAqB;IACrB,+CAAuB,CAAA;IAEvB,yFAAyF;IACzF,iDAAyB,CAAA;IAEzB,oDAAoD;IACpD,yCAAiB,CAAA;IAEjB,sCAAsC;IACtC,uCAAe,CAAA;IAEf;;;;OAIG;IACH,qDAA6B,CAAA;IAE7B;;;OAGG;IACH,iCAAS,CAAA;AACV,CAAC,EA/BW,oBAAoB,KAApB,oBAAoB,QA+B/B","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIEnvelope,\n\tInboundAttachMessage,\n\tIAttachMessage,\n} from \"@fluidframework/runtime-definitions\";\nimport type { IdCreationRange } from \"@fluidframework/id-compressor\";\nimport { IDataStoreAliasMessage } from \"./dataStore\";\nimport { GarbageCollectionMessage } from \"./gc\";\nimport { IChunkedOp } from \"./opLifecycle\";\n\n/**\n * @alpha\n */\nexport enum ContainerMessageType {\n\t// An op to be delivered to store\n\tFluidDataStoreOp = \"component\",\n\n\t// Creates a new store\n\tAttach = \"attach\",\n\n\t// Chunked operation.\n\tChunkedOp = \"chunkedOp\",\n\n\t// Signifies that a blob has been attached and should not be garbage collected by storage\n\tBlobAttach = \"blobAttach\",\n\n\t// Ties our new clientId to our old one on reconnect\n\tRejoin = \"rejoin\",\n\n\t// Sets the alias of a root data store\n\tAlias = \"alias\",\n\n\t/**\n\t * An op containing an IdRange of Ids allocated using the runtime's IdCompressor since\n\t * the last allocation op was sent.\n\t * See the [IdCompressor README](./id-compressor/README.md) for more details.\n\t */\n\tIdAllocation = \"idAllocation\",\n\n\t/**\n\t * Garbage collection specific op. This is sent by the summarizer client when GC runs. It's used to synchronize GC\n\t * state across all clients.\n\t */\n\tGC = \"GC\",\n}\n\n/**\n * How should an older client handle an unrecognized remote op type?\n *\n * @internal\n */\nexport type CompatModeBehavior =\n\t/** Ignore the op. It won't be persisted if this client summarizes */\n\t| \"Ignore\"\n\t/** Fail processing immediately. (The container will close) */\n\t| \"FailToProcess\";\n\n/**\n * All the info an older client would need to know how to handle an unrecognized remote op type\n *\n * @internal\n */\nexport interface IContainerRuntimeMessageCompatDetails {\n\t/** How should an older client handle an unrecognized remote op type? */\n\tbehavior: CompatModeBehavior;\n}\n\n/**\n * The unpacked runtime message / details to be handled or dispatched by the ContainerRuntime.\n * Message type are differentiated via a `type` string and contain different contents depending on their type.\n *\n * IMPORTANT: when creating one to be serialized, set the properties in the order they appear here.\n * This way stringified values can be compared.\n */\ninterface TypedContainerRuntimeMessage<TType extends ContainerMessageType, TContents>\n\textends Partial<RecentlyAddedContainerRuntimeMessageDetails> {\n\t/** Type of the op, within the ContainerRuntime's domain */\n\ttype: TType;\n\t/** Domain-specific contents, interpreted according to the type */\n\tcontents: TContents;\n}\n\n/**\n * Additional details expected for any recently added message.\n * @internal\n */\nexport interface RecentlyAddedContainerRuntimeMessageDetails {\n\t/** Info describing how to handle this op in case the type is unrecognized (default: fail to process) */\n\tcompatDetails: IContainerRuntimeMessageCompatDetails;\n}\n\nexport type ContainerRuntimeDataStoreOpMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.FluidDataStoreOp,\n\tIEnvelope\n>;\nexport type InboundContainerRuntimeAttachMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.Attach,\n\tInboundAttachMessage\n>;\nexport type OutboundContainerRuntimeAttachMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.Attach,\n\tIAttachMessage\n>;\nexport type ContainerRuntimeChunkedOpMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.ChunkedOp,\n\tIChunkedOp\n>;\nexport type ContainerRuntimeBlobAttachMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.BlobAttach,\n\tundefined\n>;\nexport type ContainerRuntimeRejoinMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.Rejoin,\n\tundefined\n>;\nexport type ContainerRuntimeAliasMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.Alias,\n\tIDataStoreAliasMessage\n>;\nexport type ContainerRuntimeIdAllocationMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.IdAllocation,\n\tIdCreationRange\n>;\nexport type ContainerRuntimeGCMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.GC,\n\tGarbageCollectionMessage\n>;\n\n/**\n * Represents an unrecognized {@link TypedContainerRuntimeMessage}, e.g. a message from a future version of the container runtime.\n * @internal\n */\nexport interface UnknownContainerRuntimeMessage\n\textends Partial<RecentlyAddedContainerRuntimeMessageDetails> {\n\t/** Invalid type of the op, within the ContainerRuntime's domain. This value should never exist at runtime.\n\t * This is useful for type narrowing but should never be used as an actual message type at runtime.\n\t * Actual value will not be \"__unknown...\", but the type `Exclude<string, ContainerMessageType>` is not supported.\n\t */\n\ttype: \"__unknown_container_message_type__never_use_as_value__\";\n\n\t/** Domain-specific contents, but not decipherable by an unknown op. */\n\tcontents: unknown;\n}\n\n/**\n * A {@link TypedContainerRuntimeMessage} that is received from the server and will be processed by the container runtime.\n */\nexport type InboundContainerRuntimeMessage =\n\t| ContainerRuntimeDataStoreOpMessage\n\t| InboundContainerRuntimeAttachMessage\n\t| ContainerRuntimeChunkedOpMessage\n\t| ContainerRuntimeBlobAttachMessage\n\t| ContainerRuntimeRejoinMessage\n\t| ContainerRuntimeAliasMessage\n\t| ContainerRuntimeIdAllocationMessage\n\t| ContainerRuntimeGCMessage\n\t// Inbound messages may include unknown types from other clients, so we include that as a special case here\n\t| UnknownContainerRuntimeMessage;\n\n/** A {@link TypedContainerRuntimeMessage} that has been generated by the container runtime but is not yet being sent to the server. */\nexport type LocalContainerRuntimeMessage =\n\t| ContainerRuntimeDataStoreOpMessage\n\t| OutboundContainerRuntimeAttachMessage\n\t| ContainerRuntimeChunkedOpMessage\n\t| ContainerRuntimeBlobAttachMessage\n\t| ContainerRuntimeRejoinMessage\n\t| ContainerRuntimeAliasMessage\n\t| ContainerRuntimeIdAllocationMessage\n\t| ContainerRuntimeGCMessage\n\t// In rare cases (e.g. related to stashed ops) we could have a local message of an unknown type\n\t| UnknownContainerRuntimeMessage;\n\n/** A {@link TypedContainerRuntimeMessage} that is being sent to the server from the container runtime. */\nexport type OutboundContainerRuntimeMessage =\n\t| ContainerRuntimeDataStoreOpMessage\n\t| OutboundContainerRuntimeAttachMessage\n\t| ContainerRuntimeChunkedOpMessage\n\t| ContainerRuntimeBlobAttachMessage\n\t| ContainerRuntimeRejoinMessage\n\t| ContainerRuntimeAliasMessage\n\t| ContainerRuntimeIdAllocationMessage\n\t| ContainerRuntimeGCMessage;\n\n/**\n * An unpacked ISequencedDocumentMessage with the inner TypedContainerRuntimeMessage type/contents/etc\n * promoted up to the outer object\n */\nexport type InboundSequencedContainerRuntimeMessage = Omit<\n\tISequencedDocumentMessage,\n\t\"type\" | \"contents\"\n> &\n\tInboundContainerRuntimeMessage;\n\n/** Essentially ISequencedDocumentMessage except that `type` is not `string` to enable narrowing\n * as `Exclude<string, InboundContainerRuntimeMessage['type']>` is not supported.\n * There should never be a runtime value of \"__not_a_...\".\n * Currently additionally replaces `contents` type until protocol-definitions update is taken with `unknown` instead of `any`.\n */\ntype InboundSequencedNonContainerRuntimeMessage = Omit<\n\tISequencedDocumentMessage,\n\t\"type\" | \"contents\"\n> & { type: \"__not_a_container_runtime_message_type__\"; contents: unknown };\n\nexport type InboundSequencedContainerRuntimeMessageOrSystemMessage =\n\t| InboundSequencedContainerRuntimeMessage\n\t| InboundSequencedNonContainerRuntimeMessage;\n\n/** A [loose] InboundSequencedContainerRuntimeMessage that is recent and may contain compat details.\n * It exists solely to to provide access to those details.\n */\nexport type InboundSequencedRecentlyAddedContainerRuntimeMessage = ISequencedDocumentMessage &\n\tPartial<RecentlyAddedContainerRuntimeMessageDetails>;\n\n/**\n * The unpacked runtime message / details to be handled or dispatched by the ContainerRuntime\n *\n * IMPORTANT: when creating one to be serialized, set the properties in the order they appear here.\n * This way stringified values can be compared.\n *\n * @deprecated this is an internal type which should not be used outside of the package.\n * Internally, it is superseded by `TypedContainerRuntimeMessage`.\n *\n * @internal\n */\nexport interface ContainerRuntimeMessage {\n\t/** Type of the op, within the ContainerRuntime's domain */\n\ttype: ContainerMessageType;\n\t/** Domain-specific contents, interpreted according to the type */\n\tcontents: any;\n\t/** Info describing how to handle this op in case the type is unrecognized (default: fail to process) */\n\tcompatDetails?: IContainerRuntimeMessageCompatDetails;\n}\n"]}
1
+ {"version":3,"file":"messageTypes.mjs","sourceRoot":"","sources":["../src/messageTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH;;GAEG;AACH,MAAM,CAAN,IAAY,oBA+BX;AA/BD,WAAY,oBAAoB;IAC/B,iCAAiC;IACjC,sDAA8B,CAAA;IAE9B,sBAAsB;IACtB,yCAAiB,CAAA;IAEjB,qBAAqB;IACrB,+CAAuB,CAAA;IAEvB,yFAAyF;IACzF,iDAAyB,CAAA;IAEzB,oDAAoD;IACpD,yCAAiB,CAAA;IAEjB,sCAAsC;IACtC,uCAAe,CAAA;IAEf;;;;OAIG;IACH,qDAA6B,CAAA;IAE7B;;;OAGG;IACH,iCAAS,CAAA;AACV,CAAC,EA/BW,oBAAoB,KAApB,oBAAoB,QA+B/B","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIEnvelope,\n\tInboundAttachMessage,\n\tIAttachMessage,\n} from \"@fluidframework/runtime-definitions\";\nimport type { IdCreationRange } from \"@fluidframework/id-compressor\";\nimport { IDataStoreAliasMessage } from \"./dataStore\";\nimport { GarbageCollectionMessage } from \"./gc\";\nimport { IChunkedOp } from \"./opLifecycle\";\n\n/**\n * @alpha\n */\nexport enum ContainerMessageType {\n\t// An op to be delivered to store\n\tFluidDataStoreOp = \"component\",\n\n\t// Creates a new store\n\tAttach = \"attach\",\n\n\t// Chunked operation.\n\tChunkedOp = \"chunkedOp\",\n\n\t// Signifies that a blob has been attached and should not be garbage collected by storage\n\tBlobAttach = \"blobAttach\",\n\n\t// Ties our new clientId to our old one on reconnect\n\tRejoin = \"rejoin\",\n\n\t// Sets the alias of a root data store\n\tAlias = \"alias\",\n\n\t/**\n\t * An op containing an IdRange of Ids allocated using the runtime's IdCompressor since\n\t * the last allocation op was sent.\n\t * See the [IdCompressor README](./id-compressor/README.md) for more details.\n\t */\n\tIdAllocation = \"idAllocation\",\n\n\t/**\n\t * Garbage collection specific op. This is sent by the summarizer client when GC runs. It's used to synchronize GC\n\t * state across all clients.\n\t */\n\tGC = \"GC\",\n}\n\n/**\n * How should an older client handle an unrecognized remote op type?\n *\n * @internal\n */\nexport type CompatModeBehavior =\n\t/** Ignore the op. It won't be persisted if this client summarizes */\n\t| \"Ignore\"\n\t/** Fail processing immediately. (The container will close) */\n\t| \"FailToProcess\";\n\n/**\n * All the info an older client would need to know how to handle an unrecognized remote op type\n *\n * @internal\n */\nexport interface IContainerRuntimeMessageCompatDetails {\n\t/** How should an older client handle an unrecognized remote op type? */\n\tbehavior: CompatModeBehavior;\n}\n\n/**\n * The unpacked runtime message / details to be handled or dispatched by the ContainerRuntime.\n * Message type are differentiated via a `type` string and contain different contents depending on their type.\n *\n * IMPORTANT: when creating one to be serialized, set the properties in the order they appear here.\n * This way stringified values can be compared.\n */\ninterface TypedContainerRuntimeMessage<TType extends ContainerMessageType, TContents>\n\textends Partial<RecentlyAddedContainerRuntimeMessageDetails> {\n\t/** Type of the op, within the ContainerRuntime's domain */\n\ttype: TType;\n\t/** Domain-specific contents, interpreted according to the type */\n\tcontents: TContents;\n}\n\n/**\n * Additional details expected for any recently added message.\n * @internal\n */\nexport interface RecentlyAddedContainerRuntimeMessageDetails {\n\t/** Info describing how to handle this op in case the type is unrecognized (default: fail to process) */\n\tcompatDetails: IContainerRuntimeMessageCompatDetails;\n}\n\nexport type ContainerRuntimeDataStoreOpMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.FluidDataStoreOp,\n\tIEnvelope\n>;\nexport type InboundContainerRuntimeAttachMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.Attach,\n\tInboundAttachMessage\n>;\nexport type OutboundContainerRuntimeAttachMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.Attach,\n\tIAttachMessage\n>;\nexport type ContainerRuntimeChunkedOpMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.ChunkedOp,\n\tIChunkedOp\n>;\nexport type ContainerRuntimeBlobAttachMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.BlobAttach,\n\tundefined\n>;\nexport type ContainerRuntimeRejoinMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.Rejoin,\n\tundefined\n>;\nexport type ContainerRuntimeAliasMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.Alias,\n\tIDataStoreAliasMessage\n>;\nexport type ContainerRuntimeIdAllocationMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.IdAllocation,\n\tIdCreationRange\n>;\nexport type ContainerRuntimeGCMessage = TypedContainerRuntimeMessage<\n\tContainerMessageType.GC,\n\tGarbageCollectionMessage\n>;\n\n/**\n * Represents an unrecognized TypedContainerRuntimeMessage, e.g. a message from a future version of the container runtime.\n * @internal\n */\nexport interface UnknownContainerRuntimeMessage\n\textends Partial<RecentlyAddedContainerRuntimeMessageDetails> {\n\t/** Invalid type of the op, within the ContainerRuntime's domain. This value should never exist at runtime.\n\t * This is useful for type narrowing but should never be used as an actual message type at runtime.\n\t * Actual value will not be \"__unknown...\", but the type `Exclude<string, ContainerMessageType>` is not supported.\n\t */\n\ttype: \"__unknown_container_message_type__never_use_as_value__\";\n\n\t/** Domain-specific contents, but not decipherable by an unknown op. */\n\tcontents: unknown;\n}\n\n/**\n * A {@link TypedContainerRuntimeMessage} that is received from the server and will be processed by the container runtime.\n */\nexport type InboundContainerRuntimeMessage =\n\t| ContainerRuntimeDataStoreOpMessage\n\t| InboundContainerRuntimeAttachMessage\n\t| ContainerRuntimeChunkedOpMessage\n\t| ContainerRuntimeBlobAttachMessage\n\t| ContainerRuntimeRejoinMessage\n\t| ContainerRuntimeAliasMessage\n\t| ContainerRuntimeIdAllocationMessage\n\t| ContainerRuntimeGCMessage\n\t// Inbound messages may include unknown types from other clients, so we include that as a special case here\n\t| UnknownContainerRuntimeMessage;\n\n/** A {@link TypedContainerRuntimeMessage} that has been generated by the container runtime but is not yet being sent to the server. */\nexport type LocalContainerRuntimeMessage =\n\t| ContainerRuntimeDataStoreOpMessage\n\t| OutboundContainerRuntimeAttachMessage\n\t| ContainerRuntimeChunkedOpMessage\n\t| ContainerRuntimeBlobAttachMessage\n\t| ContainerRuntimeRejoinMessage\n\t| ContainerRuntimeAliasMessage\n\t| ContainerRuntimeIdAllocationMessage\n\t| ContainerRuntimeGCMessage\n\t// In rare cases (e.g. related to stashed ops) we could have a local message of an unknown type\n\t| UnknownContainerRuntimeMessage;\n\n/** A {@link TypedContainerRuntimeMessage} that is being sent to the server from the container runtime. */\nexport type OutboundContainerRuntimeMessage =\n\t| ContainerRuntimeDataStoreOpMessage\n\t| OutboundContainerRuntimeAttachMessage\n\t| ContainerRuntimeChunkedOpMessage\n\t| ContainerRuntimeBlobAttachMessage\n\t| ContainerRuntimeRejoinMessage\n\t| ContainerRuntimeAliasMessage\n\t| ContainerRuntimeIdAllocationMessage\n\t| ContainerRuntimeGCMessage;\n\n/**\n * An unpacked ISequencedDocumentMessage with the inner TypedContainerRuntimeMessage type/contents/etc\n * promoted up to the outer object\n */\nexport type InboundSequencedContainerRuntimeMessage = Omit<\n\tISequencedDocumentMessage,\n\t\"type\" | \"contents\"\n> &\n\tInboundContainerRuntimeMessage;\n\n/** Essentially ISequencedDocumentMessage except that `type` is not `string` to enable narrowing\n * as `Exclude<string, InboundContainerRuntimeMessage['type']>` is not supported.\n * There should never be a runtime value of \"__not_a_...\".\n * Currently additionally replaces `contents` type until protocol-definitions update is taken with `unknown` instead of `any`.\n */\ntype InboundSequencedNonContainerRuntimeMessage = Omit<\n\tISequencedDocumentMessage,\n\t\"type\" | \"contents\"\n> & { type: \"__not_a_container_runtime_message_type__\"; contents: unknown };\n\nexport type InboundSequencedContainerRuntimeMessageOrSystemMessage =\n\t| InboundSequencedContainerRuntimeMessage\n\t| InboundSequencedNonContainerRuntimeMessage;\n\n/** A [loose] InboundSequencedContainerRuntimeMessage that is recent and may contain compat details.\n * It exists solely to to provide access to those details.\n */\nexport type InboundSequencedRecentlyAddedContainerRuntimeMessage = ISequencedDocumentMessage &\n\tPartial<RecentlyAddedContainerRuntimeMessageDetails>;\n\n/**\n * The unpacked runtime message / details to be handled or dispatched by the ContainerRuntime\n *\n * IMPORTANT: when creating one to be serialized, set the properties in the order they appear here.\n * This way stringified values can be compared.\n *\n * @deprecated this is an internal type which should not be used outside of the package.\n * Internally, it is superseded by `TypedContainerRuntimeMessage`.\n *\n * @internal\n */\nexport interface ContainerRuntimeMessage {\n\t/** Type of the op, within the ContainerRuntime's domain */\n\ttype: ContainerMessageType;\n\t/** Domain-specific contents, interpreted according to the type */\n\tcontents: any;\n\t/** Info describing how to handle this op in case the type is unrecognized (default: fail to process) */\n\tcompatDetails?: IContainerRuntimeMessageCompatDetails;\n}\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/container-runtime";
8
- export declare const pkgVersion = "2.0.0-dev-rc.1.0.0.225277";
8
+ export declare const pkgVersion = "2.0.0-dev-rc.1.0.0.232845";
9
9
  //# sourceMappingURL=packageVersion.d.mts.map
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export const pkgName = "@fluidframework/container-runtime";
8
- export const pkgVersion = "2.0.0-dev-rc.1.0.0.225277";
8
+ export const pkgVersion = "2.0.0-dev-rc.1.0.0.232845";
9
9
  //# sourceMappingURL=packageVersion.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.mjs","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,mCAAmC,CAAC;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-runtime\";\nexport const pkgVersion = \"2.0.0-dev-rc.1.0.0.225277\";\n"]}
1
+ {"version":3,"file":"packageVersion.mjs","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,mCAAmC,CAAC;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-runtime\";\nexport const pkgVersion = \"2.0.0-dev-rc.1.0.0.232845\";\n"]}
@@ -56,12 +56,12 @@ export declare class RunningSummarizer extends TypedEventEmitter<ISummarizerEven
56
56
  private constructor();
57
57
  private handleSummaryAck;
58
58
  /**
59
- * Responsible for receiving and processing all the summaryAcks.
60
- * In case there was a summary ack processed by the running summarizer before processIncomingSummaryAcks is called,
61
- * it will wait for the summary ack that is newer than the one indicated by the lastAckRefSeq.
62
- * @param lastAckRefSeq - Identifies the minimum reference sequence number the summarizer needs to wait for.
63
- * In case of a negative number, the summarizer will wait for ANY summary ack that is greater than the deltaManager's initial sequence number,
64
- * and, in case of a positive one, it will wait for a summary ack that is greater than this current reference sequence number.
59
+ * Responsible for receiving and processing all the summary acks.
60
+ * It starts processing ACKs after the one for the summary this client loaded from (initialSequenceNumber). Any
61
+ * ACK before that is not interesting as it will simply be ignored.
62
+ *
63
+ * @param referenceSequenceNumber - The referenceSequenceNumber of the summary from which to start processing
64
+ * acks.
65
65
  */
66
66
  private processIncomingSummaryAcks;
67
67
  dispose(): void;
@@ -118,6 +118,11 @@ export declare class RunningSummarizer extends TypedEventEmitter<ISummarizerEven
118
118
  * For example, summarization may be retried for failures with "retryAfterSeconds" param.
119
119
  */
120
120
  private trySummarizeWithRetries;
121
+ /**
122
+ * Attempts to generate a summary on demand with retries in case of failures. The retry logic is the same
123
+ * as heuristics based summaries.
124
+ */
125
+ private summarizeOnDemandWithRetries;
121
126
  /** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */
122
127
  summarizeOnDemand(options: IOnDemandSummarizeOptions, resultsBuilder?: SummarizeResultBuilder): ISummarizeResults;
123
128
  /** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */
@@ -1 +1 @@
1
- {"version":3,"file":"runningSummarizer.d.mts","sourceRoot":"","sources":["../../src/summary/runningSummarizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runningSummarizer.d.mts","sourceRoot":"","sources":["../../src/summary/runningSummarizer.ts"],"names":[],"mappings":"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"}
@@ -31,13 +31,22 @@ export const defaultMaxAttemptsForSubmitFailures = 5;
31
31
  export class RunningSummarizer extends TypedEventEmitter {
32
32
  static async start(logger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
33
33
  const summarizer = new RunningSummarizer(logger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime);
34
- // Before doing any heuristics or proceeding with its refreshing, if there is a summary ack received while
35
- // this summarizer catches up, let's refresh state before proceeding with the summarization.
36
- const lastAckRefSeq = await summarizer.handleSummaryAck();
34
+ // If there have been any acks newer that the one this client loaded from until now, process them before
35
+ // starting the running summarizer which will trigger summary heuristics.
36
+ // This is done primarily to handle scenarios where the summarizer loads from a cached snapshot and there
37
+ // is newer one available. The ack for the newer summary is processed before summarizing because otherwise
38
+ // that summary would fail as it has an older parent.
39
+ let nextReferenceSequenceNumber = runtime.deltaManager.initialSequenceNumber + 1;
40
+ const latestAck = summaryCollection.latestAck;
41
+ if (latestAck !== undefined &&
42
+ latestAck.summaryOp.referenceSequenceNumber >= nextReferenceSequenceNumber) {
43
+ await summarizer.handleSummaryAck(latestAck);
44
+ nextReferenceSequenceNumber = latestAck.summaryOp.referenceSequenceNumber + 1;
45
+ }
37
46
  await summarizer.waitStart();
38
- // Handle summary acks asynchronously
47
+ // Process summary acks asynchronously
39
48
  // Note: no exceptions are thrown from processIncomingSummaryAcks handler as it handles all exceptions
40
- summarizer.processIncomingSummaryAcks(lastAckRefSeq).catch((error) => {
49
+ summarizer.processIncomingSummaryAcks(nextReferenceSequenceNumber).catch((error) => {
41
50
  createChildLogger({ logger }).sendErrorEvent({ eventName: "HandleSummaryAckFatalError" }, error);
42
51
  });
43
52
  // Update heuristic counts
@@ -154,78 +163,63 @@ export class RunningSummarizer extends TypedEventEmitter {
154
163
  ? overrideMaxAttempts
155
164
  : defaultMaxAttemptsForSubmitFailures;
156
165
  }
157
- async handleSummaryAck() {
158
- const lastAck = this.summaryCollection.latestAck;
159
- let refSequenceNumber = -1;
160
- // In case we haven't received the lastestAck yet, just return.
161
- if (lastAck !== undefined) {
162
- refSequenceNumber = lastAck.summaryOp.referenceSequenceNumber;
163
- const summaryLogger = this.tryGetCorrelatedLogger(refSequenceNumber) ?? this.mc.logger;
164
- const summaryOpHandle = lastAck.summaryOp.contents.handle;
165
- const summaryAckHandle = lastAck.summaryAck.contents.handle;
166
- while (this.summarizingLock !== undefined) {
167
- summaryLogger.sendTelemetryEvent({
168
- eventName: "RefreshAttemptWithSummarizerRunning",
169
- referenceSequenceNumber: refSequenceNumber,
170
- proposalHandle: summaryOpHandle,
171
- ackHandle: summaryAckHandle,
172
- });
173
- await this.summarizingLock;
174
- }
175
- // Make sure we block any summarizer from being executed/enqueued while
176
- // executing the refreshLatestSummaryAck.
177
- // https://dev.azure.com/fluidframework/internal/_workitems/edit/779
178
- await this.lockedSummaryAction(() => { }, async () => this.refreshLatestSummaryAckCallback({
166
+ async handleSummaryAck(ack) {
167
+ const refSequenceNumber = ack.summaryOp.referenceSequenceNumber;
168
+ const summaryLogger = this.tryGetCorrelatedLogger(refSequenceNumber) ?? this.mc.logger;
169
+ const summaryOpHandle = ack.summaryOp.contents.handle;
170
+ const summaryAckHandle = ack.summaryAck.contents.handle;
171
+ while (this.summarizingLock !== undefined) {
172
+ summaryLogger.sendTelemetryEvent({
173
+ eventName: "RefreshAttemptWithSummarizerRunning",
174
+ referenceSequenceNumber: refSequenceNumber,
179
175
  proposalHandle: summaryOpHandle,
180
176
  ackHandle: summaryAckHandle,
181
- summaryRefSeq: refSequenceNumber,
182
- summaryLogger,
183
- }).catch(async (error) => {
184
- // If the error is 404, so maybe the fetched version no longer exists on server. We just
185
- // ignore this error in that case, as that means we will have another summaryAck for the
186
- // latest version with which we will refresh the state. However in case of single commit
187
- // summary, we might me missing a summary ack, so in that case we are still fine as the
188
- // code in `submitSummary` function in container runtime, will refresh the latest state
189
- // by calling `prefetchLatestSummaryThenClose`. We will load the next summarizer from the
190
- // updated state and be fine.
191
- const isIgnoredError = isFluidError(error) &&
192
- error.errorType === DriverErrorTypes.fileNotFoundOrAccessDeniedError;
193
- summaryLogger.sendTelemetryEvent({
194
- eventName: isIgnoredError
195
- ? "HandleSummaryAckErrorIgnored"
196
- : "HandleLastSummaryAckError",
197
- referenceSequenceNumber: refSequenceNumber,
198
- proposalHandle: summaryOpHandle,
199
- ackHandle: summaryAckHandle,
200
- }, error);
201
- }), () => { });
202
- refSequenceNumber++;
177
+ });
178
+ await this.summarizingLock;
203
179
  }
204
- return refSequenceNumber;
180
+ // Make sure we block any summarizer from being executed/enqueued while
181
+ // executing the refreshLatestSummaryAck.
182
+ // https://dev.azure.com/fluidframework/internal/_workitems/edit/779
183
+ await this.lockedSummaryAction(() => { }, async () => this.refreshLatestSummaryAckCallback({
184
+ proposalHandle: summaryOpHandle,
185
+ ackHandle: summaryAckHandle,
186
+ summaryRefSeq: refSequenceNumber,
187
+ summaryLogger,
188
+ }).catch(async (error) => {
189
+ // If the error is 404, so maybe the fetched version no longer exists on server. We just
190
+ // ignore this error in that case, as that means we will have another summaryAck for the
191
+ // latest version with which we will refresh the state. However in case of single commit
192
+ // summary, we might me missing a summary ack, so in that case we are still fine as the
193
+ // code in `submitSummary` function in container runtime, will refresh the latest state
194
+ // by calling `prefetchLatestSummaryThenClose`. We will load the next summarizer from the
195
+ // updated state and be fine.
196
+ const isIgnoredError = isFluidError(error) &&
197
+ error.errorType === DriverErrorTypes.fileNotFoundOrAccessDeniedError;
198
+ summaryLogger.sendTelemetryEvent({
199
+ eventName: isIgnoredError
200
+ ? "HandleSummaryAckErrorIgnored"
201
+ : "HandleLastSummaryAckError",
202
+ referenceSequenceNumber: refSequenceNumber,
203
+ proposalHandle: summaryOpHandle,
204
+ ackHandle: summaryAckHandle,
205
+ }, error);
206
+ }), () => { });
205
207
  }
206
208
  /**
207
- * Responsible for receiving and processing all the summaryAcks.
208
- * In case there was a summary ack processed by the running summarizer before processIncomingSummaryAcks is called,
209
- * it will wait for the summary ack that is newer than the one indicated by the lastAckRefSeq.
210
- * @param lastAckRefSeq - Identifies the minimum reference sequence number the summarizer needs to wait for.
211
- * In case of a negative number, the summarizer will wait for ANY summary ack that is greater than the deltaManager's initial sequence number,
212
- * and, in case of a positive one, it will wait for a summary ack that is greater than this current reference sequence number.
209
+ * Responsible for receiving and processing all the summary acks.
210
+ * It starts processing ACKs after the one for the summary this client loaded from (initialSequenceNumber). Any
211
+ * ACK before that is not interesting as it will simply be ignored.
212
+ *
213
+ * @param referenceSequenceNumber - The referenceSequenceNumber of the summary from which to start processing
214
+ * acks.
213
215
  */
214
- async processIncomingSummaryAcks(lastAckRefSeq) {
215
- let refSequenceNumber = lastAckRefSeq > 0 ? lastAckRefSeq : this.runtime.deltaManager.initialSequenceNumber;
216
+ async processIncomingSummaryAcks(referenceSequenceNumber) {
217
+ // Start waiting for acks that are for summaries newer that the one this client loaded from.
218
+ let nextReferenceSequenceNumber = referenceSequenceNumber;
216
219
  while (!this.disposed) {
217
- const summaryLogger = this.tryGetCorrelatedLogger(refSequenceNumber) ?? this.mc.logger;
218
- // Initialize ack with undefined if exception happens inside of waitSummaryAck on second iteration,
219
- // we record undefined, not previous handles.
220
- await this.summaryCollection.waitSummaryAck(refSequenceNumber);
221
- summaryLogger.sendTelemetryEvent({
222
- eventName: "processIncomingSummaryAcks",
223
- referenceSequenceNumber: refSequenceNumber,
224
- lastAckRefSeq,
225
- });
226
- refSequenceNumber = await this.handleSummaryAck();
227
- // A valid Summary Ack must have been processed.
228
- assert(refSequenceNumber >= 0, 0x58f /* Invalid ref sequence number */);
220
+ const ackedSummary = await this.summaryCollection.waitSummaryAck(nextReferenceSequenceNumber);
221
+ await this.handleSummaryAck(ackedSummary);
222
+ nextReferenceSequenceNumber = ackedSummary.summaryOp.referenceSequenceNumber + 1;
229
223
  }
230
224
  }
231
225
  dispose() {
@@ -382,7 +376,14 @@ export class RunningSummarizer extends TypedEventEmitter {
382
376
  };
383
377
  const summarizeResult = this.generator.summarize(summaryOptions, resultsBuilder);
384
378
  // ensure we wait till the end of the process
385
- return summarizeResult.receivedSummaryAckOrNack;
379
+ const result = await summarizeResult.receivedSummaryAckOrNack;
380
+ if (!result.success) {
381
+ this.mc.logger.sendErrorEvent({
382
+ eventName: "SummarizeFailed",
383
+ maxAttempts: 1,
384
+ summaryAttempts: 1,
385
+ }, result.error);
386
+ }
386
387
  }, () => {
387
388
  this.afterSummaryAction();
388
389
  }).catch((error) => {
@@ -425,6 +426,7 @@ export class RunningSummarizer extends TypedEventEmitter {
425
426
  let summaryAttempts = 0;
426
427
  let summaryAttemptsPerPhase = 0;
427
428
  let summaryAttemptPhase = 0;
429
+ let error;
428
430
  while (summaryAttemptPhase < attemptOptions.length) {
429
431
  if (this.cancellationToken.cancelled) {
430
432
  return;
@@ -458,6 +460,7 @@ export class RunningSummarizer extends TypedEventEmitter {
458
460
  if (ackNackResult.success) {
459
461
  return;
460
462
  }
463
+ error = ackNackResult.error;
461
464
  // Check for retryDelay that can come from summaryNack, upload summary or submit summary flows.
462
465
  // Retry the same step only once per retryAfter response.
463
466
  const submitResult = await resultSummarize.summarySubmitted;
@@ -478,6 +481,11 @@ export class RunningSummarizer extends TypedEventEmitter {
478
481
  await delay(delaySeconds * 1000);
479
482
  }
480
483
  }
484
+ this.mc.logger.sendErrorEvent({
485
+ eventName: "SummarizeFailed",
486
+ maxAttempts: attemptOptions.length,
487
+ summaryAttempts: summaryAttemptPhase,
488
+ }, error);
481
489
  this.stopSummarizerCallback("failToSummarize");
482
490
  }
483
491
  /**
@@ -522,19 +530,22 @@ export class RunningSummarizer extends TypedEventEmitter {
522
530
  let currentAttempt = 0;
523
531
  let retryAfterSeconds;
524
532
  let done = false;
525
- let result = "success";
533
+ let status = "success";
534
+ let results;
535
+ let error;
526
536
  do {
527
537
  currentAttempt++;
528
538
  if (this.cancellationToken.cancelled) {
529
- result = "canceled";
539
+ status = "canceled";
530
540
  done = true;
531
541
  break;
532
542
  }
533
- const { summarizeProps, summarizeResult } = attemptSummarize(currentAttempt, false /* finalAttempt */);
543
+ const attemptResult = attemptSummarize(currentAttempt, false /* finalAttempt */);
544
+ results = attemptResult.summarizeResult;
534
545
  // Ack / nack is the final step, so if it succeeds we're done.
535
- const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
546
+ const ackNackResult = await results.receivedSummaryAckOrNack;
536
547
  if (ackNackResult.success) {
537
- result = "success";
548
+ status = "success";
538
549
  done = true;
539
550
  break;
540
551
  }
@@ -542,7 +553,7 @@ export class RunningSummarizer extends TypedEventEmitter {
542
553
  // If submit summary failed, use the params from "summarySubmitted" result. Else, use the params
543
554
  // from "receivedSummaryAckOrNack" result.
544
555
  // Note: Check "summarySubmitted" result first because if it fails, ack nack would fail as well.
545
- const submitSummaryResult = await summarizeResult.summarySubmitted;
556
+ const submitSummaryResult = await results.summarySubmitted;
546
557
  if (!submitSummaryResult.success) {
547
558
  maxAttempts = this.maxAttemptsForSubmitFailures;
548
559
  retryAfterSeconds = submitSummaryResult.data?.retryAfterSeconds;
@@ -552,12 +563,13 @@ export class RunningSummarizer extends TypedEventEmitter {
552
563
  retryAfterSeconds = ackNackResult.data?.retryAfterSeconds;
553
564
  }
554
565
  // Emit "summarize" event for this failed attempt.
555
- result = "failure";
566
+ status = "failure";
567
+ error = ackNackResult.error;
556
568
  const eventProps = {
557
- result,
569
+ result: status,
558
570
  currentAttempt,
559
571
  maxAttempts,
560
- error: ackNackResult.error,
572
+ error,
561
573
  };
562
574
  this.emit("summarize", eventProps);
563
575
  // If the failure doesn't have "retryAfterSeconds" or the max number of attempts have been done, we're done.
@@ -573,15 +585,15 @@ export class RunningSummarizer extends TypedEventEmitter {
573
585
  summaryNackDelay: ackNackResult.data?.retryAfterSeconds !== undefined,
574
586
  stage: submitSummaryResult.data?.stage,
575
587
  dynamicRetries: true,
576
- ...summarizeProps,
588
+ ...attemptResult.summarizeProps,
577
589
  });
578
590
  await delay(retryAfterSeconds * 1000);
579
591
  }
580
592
  } while (!done);
581
593
  // If summarize attempt did not fail, emit "summarize" event and return. A failed attempt may be retried below.
582
- if (result !== "failure") {
583
- this.emit("summarize", { result, currentAttempt, maxAttempts });
584
- return;
594
+ if (status !== "failure") {
595
+ this.emit("summarize", { result: status, currentAttempt, maxAttempts });
596
+ return results;
585
597
  }
586
598
  // If summarization wasn't successful above and the failure contains "retryAfterSeconds", perform one last
587
599
  // attempt. This gives a chance to the runtime to perform additional steps in the last attempt.
@@ -589,19 +601,47 @@ export class RunningSummarizer extends TypedEventEmitter {
589
601
  const { summarizeResult } = attemptSummarize(++currentAttempt, true /* finalAttempt */);
590
602
  // Ack / nack is the final step, so if it succeeds we're done.
591
603
  const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
592
- result = ackNackResult.success ? "success" : "failure";
604
+ status = ackNackResult.success ? "success" : "failure";
605
+ if (!ackNackResult.success) {
606
+ error = ackNackResult.error;
607
+ }
593
608
  const eventProps = {
594
- result,
609
+ result: status,
595
610
  currentAttempt,
596
611
  maxAttempts,
597
612
  error: ackNackResult.success ? undefined : ackNackResult.error,
598
613
  };
599
614
  this.emit("summarize", eventProps);
615
+ results = summarizeResult;
600
616
  }
601
617
  // If summarization is still unsuccessful, stop the summarizer.
602
- if (result === "failure") {
618
+ if (status === "failure") {
619
+ this.mc.logger.sendErrorEvent({
620
+ eventName: "SummarizeFailed",
621
+ maxAttempts,
622
+ summaryAttempts: currentAttempt,
623
+ }, error);
603
624
  this.stopSummarizerCallback("failToSummarize");
604
625
  }
626
+ return results;
627
+ }
628
+ /**
629
+ * Attempts to generate a summary on demand with retries in case of failures. The retry logic is the same
630
+ * as heuristics based summaries.
631
+ */
632
+ async summarizeOnDemandWithRetries(reason, resultsBuilder) {
633
+ const results = await this.trySummarizeWithRetries(reason);
634
+ if (results === undefined) {
635
+ resultsBuilder.fail("Summarization was canceled", undefined);
636
+ return resultsBuilder.build();
637
+ }
638
+ const submitResult = await results.summarySubmitted;
639
+ const summaryOpBroadcastedResult = await results.summaryOpBroadcasted;
640
+ const ackNackResult = await results.receivedSummaryAckOrNack;
641
+ resultsBuilder.summarySubmitted.resolve(submitResult);
642
+ resultsBuilder.summaryOpBroadcasted.resolve(summaryOpBroadcastedResult);
643
+ resultsBuilder.receivedSummaryAckOrNack.resolve(ackNackResult);
644
+ return resultsBuilder.build();
605
645
  }
606
646
  /** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */
607
647
  summarizeOnDemand(options, resultsBuilder = new SummarizeResultBuilder()) {
@@ -616,8 +656,15 @@ export class RunningSummarizer extends TypedEventEmitter {
616
656
  throw new UsageError("Attempted to run an already-running summarizer on demand");
617
657
  }
618
658
  const { reason, ...summarizeOptions } = options;
619
- const result = this.trySummarizeOnce({ summarizeReason: `onDemand/${reason}` }, summarizeOptions, resultsBuilder);
620
- return result;
659
+ if (options.retryOnFailure === true) {
660
+ this.summarizeOnDemandWithRetries(`onDemand;${reason}`, resultsBuilder).catch((error) => {
661
+ resultsBuilder.fail("summarize failed", error);
662
+ });
663
+ }
664
+ else {
665
+ this.trySummarizeOnce({ summarizeReason: `onDemand/${reason}` }, summarizeOptions, resultsBuilder);
666
+ }
667
+ return resultsBuilder.build();
621
668
  }
622
669
  /** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */
623
670
  enqueueSummarize(options) {