@fluidframework/container-runtime 2.0.0-rc.2.0.1 → 2.0.0-rc.3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/api-report/container-runtime.api.md +471 -52
  3. package/dist/batchTracker.d.ts +1 -1
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +4 -4
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +33 -30
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +82 -107
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/channelCollection.d.ts +27 -22
  12. package/dist/channelCollection.d.ts.map +1 -1
  13. package/dist/channelCollection.js +189 -165
  14. package/dist/channelCollection.js.map +1 -1
  15. package/dist/connectionTelemetry.d.ts +3 -3
  16. package/dist/connectionTelemetry.d.ts.map +1 -1
  17. package/dist/connectionTelemetry.js +17 -17
  18. package/dist/connectionTelemetry.js.map +1 -1
  19. package/dist/containerHandleContext.d.ts.map +1 -1
  20. package/dist/containerHandleContext.js +2 -2
  21. package/dist/containerHandleContext.js.map +1 -1
  22. package/dist/containerRuntime.d.ts +42 -39
  23. package/dist/containerRuntime.d.ts.map +1 -1
  24. package/dist/containerRuntime.js +425 -292
  25. package/dist/containerRuntime.js.map +1 -1
  26. package/dist/dataStore.d.ts +1 -1
  27. package/dist/dataStore.d.ts.map +1 -1
  28. package/dist/dataStore.js +8 -8
  29. package/dist/dataStore.js.map +1 -1
  30. package/dist/dataStoreContext.d.ts +58 -19
  31. package/dist/dataStoreContext.d.ts.map +1 -1
  32. package/dist/dataStoreContext.js +171 -114
  33. package/dist/dataStoreContext.js.map +1 -1
  34. package/dist/dataStoreContexts.d.ts +1 -0
  35. package/dist/dataStoreContexts.d.ts.map +1 -1
  36. package/dist/dataStoreContexts.js +12 -11
  37. package/dist/dataStoreContexts.js.map +1 -1
  38. package/dist/dataStoreRegistry.d.ts +5 -1
  39. package/dist/dataStoreRegistry.d.ts.map +1 -1
  40. package/dist/dataStoreRegistry.js +4 -4
  41. package/dist/dataStoreRegistry.js.map +1 -1
  42. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  43. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  44. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  45. package/dist/deltaScheduler.d.ts +1 -1
  46. package/dist/deltaScheduler.d.ts.map +1 -1
  47. package/dist/deltaScheduler.js +6 -6
  48. package/dist/deltaScheduler.js.map +1 -1
  49. package/dist/error.d.ts +1 -1
  50. package/dist/error.d.ts.map +1 -1
  51. package/dist/error.js +4 -4
  52. package/dist/error.js.map +1 -1
  53. package/dist/gc/garbageCollection.d.ts +3 -2
  54. package/dist/gc/garbageCollection.d.ts.map +1 -1
  55. package/dist/gc/garbageCollection.js +23 -23
  56. package/dist/gc/garbageCollection.js.map +1 -1
  57. package/dist/gc/gcConfigs.d.ts +2 -2
  58. package/dist/gc/gcConfigs.d.ts.map +1 -1
  59. package/dist/gc/gcConfigs.js +4 -5
  60. package/dist/gc/gcConfigs.js.map +1 -1
  61. package/dist/gc/gcDefinitions.d.ts +4 -5
  62. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  63. package/dist/gc/gcDefinitions.js.map +1 -1
  64. package/dist/gc/gcHelpers.d.ts +5 -1
  65. package/dist/gc/gcHelpers.d.ts.map +1 -1
  66. package/dist/gc/gcHelpers.js +21 -12
  67. package/dist/gc/gcHelpers.js.map +1 -1
  68. package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
  69. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  70. package/dist/gc/gcSummaryStateTracker.js +11 -11
  71. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  72. package/dist/gc/gcTelemetry.d.ts +2 -1
  73. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  74. package/dist/gc/gcTelemetry.js +11 -9
  75. package/dist/gc/gcTelemetry.js.map +1 -1
  76. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  77. package/dist/gc/gcUnreferencedStateTracker.js +6 -6
  78. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  79. package/dist/gc/index.d.ts +1 -1
  80. package/dist/gc/index.d.ts.map +1 -1
  81. package/dist/gc/index.js +2 -1
  82. package/dist/gc/index.js.map +1 -1
  83. package/dist/index.d.ts +5 -2
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +12 -2
  86. package/dist/index.js.map +1 -1
  87. package/dist/legacy.d.ts +91 -0
  88. package/dist/messageTypes.d.ts +11 -5
  89. package/dist/messageTypes.d.ts.map +1 -1
  90. package/dist/messageTypes.js +4 -0
  91. package/dist/messageTypes.js.map +1 -1
  92. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  93. package/dist/opLifecycle/batchManager.js.map +1 -1
  94. package/dist/opLifecycle/definitions.d.ts +2 -20
  95. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  96. package/dist/opLifecycle/definitions.js.map +1 -1
  97. package/dist/opLifecycle/index.d.ts +3 -3
  98. package/dist/opLifecycle/index.d.ts.map +1 -1
  99. package/dist/opLifecycle/index.js +3 -1
  100. package/dist/opLifecycle/index.js.map +1 -1
  101. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  102. package/dist/opLifecycle/opCompressor.js +5 -6
  103. package/dist/opLifecycle/opCompressor.js.map +1 -1
  104. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  105. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  106. package/dist/opLifecycle/opDecompressor.js +62 -63
  107. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  108. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  109. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  110. package/dist/opLifecycle/opGroupingManager.js +14 -16
  111. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  112. package/dist/opLifecycle/opSplitter.d.ts +12 -4
  113. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  114. package/dist/opLifecycle/opSplitter.js +63 -53
  115. package/dist/opLifecycle/opSplitter.js.map +1 -1
  116. package/dist/opLifecycle/outbox.d.ts +2 -1
  117. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  118. package/dist/opLifecycle/outbox.js +30 -29
  119. package/dist/opLifecycle/outbox.js.map +1 -1
  120. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  121. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  122. package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
  123. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  124. package/dist/packageVersion.d.ts +1 -1
  125. package/dist/packageVersion.js +1 -1
  126. package/dist/packageVersion.js.map +1 -1
  127. package/dist/pendingStateManager.d.ts +1 -1
  128. package/dist/pendingStateManager.d.ts.map +1 -1
  129. package/dist/pendingStateManager.js +18 -18
  130. package/dist/pendingStateManager.js.map +1 -1
  131. package/dist/public.d.ts +12 -0
  132. package/dist/scheduleManager.d.ts +1 -1
  133. package/dist/scheduleManager.d.ts.map +1 -1
  134. package/dist/scheduleManager.js +28 -24
  135. package/dist/scheduleManager.js.map +1 -1
  136. package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
  137. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
  138. package/dist/storageServiceWithAttachBlobs.js +2 -2
  139. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  140. package/dist/summary/documentSchema.d.ts +209 -0
  141. package/dist/summary/documentSchema.d.ts.map +1 -0
  142. package/dist/summary/documentSchema.js +390 -0
  143. package/dist/summary/documentSchema.js.map +1 -0
  144. package/dist/summary/index.d.ts +2 -1
  145. package/dist/summary/index.d.ts.map +1 -1
  146. package/dist/summary/index.js +4 -1
  147. package/dist/summary/index.js.map +1 -1
  148. package/dist/summary/orderedClientElection.d.ts +2 -2
  149. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  150. package/dist/summary/orderedClientElection.js +12 -7
  151. package/dist/summary/orderedClientElection.js.map +1 -1
  152. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
  153. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  154. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  155. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  156. package/dist/summary/runningSummarizer.d.ts +3 -3
  157. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  158. package/dist/summary/runningSummarizer.js +16 -16
  159. package/dist/summary/runningSummarizer.js.map +1 -1
  160. package/dist/summary/summarizer.d.ts +3 -2
  161. package/dist/summary/summarizer.d.ts.map +1 -1
  162. package/dist/summary/summarizer.js +13 -13
  163. package/dist/summary/summarizer.js.map +1 -1
  164. package/dist/summary/summarizerClientElection.d.ts +2 -2
  165. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  166. package/dist/summary/summarizerClientElection.js.map +1 -1
  167. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  168. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  169. package/dist/summary/summarizerHeuristics.js +2 -2
  170. package/dist/summary/summarizerHeuristics.js.map +1 -1
  171. package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
  172. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  173. package/dist/summary/summarizerNode/summarizerNode.js +28 -28
  174. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  175. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  176. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  177. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  178. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  179. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  180. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  181. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
  182. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  183. package/dist/summary/summarizerTypes.d.ts +5 -3
  184. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  185. package/dist/summary/summarizerTypes.js.map +1 -1
  186. package/dist/summary/summaryCollection.d.ts +2 -2
  187. package/dist/summary/summaryCollection.d.ts.map +1 -1
  188. package/dist/summary/summaryCollection.js +7 -7
  189. package/dist/summary/summaryCollection.js.map +1 -1
  190. package/dist/summary/summaryFormat.d.ts +6 -17
  191. package/dist/summary/summaryFormat.d.ts.map +1 -1
  192. package/dist/summary/summaryFormat.js +8 -8
  193. package/dist/summary/summaryFormat.js.map +1 -1
  194. package/dist/summary/summaryGenerator.d.ts +4 -3
  195. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  196. package/dist/summary/summaryGenerator.js +17 -17
  197. package/dist/summary/summaryGenerator.js.map +1 -1
  198. package/dist/summary/summaryManager.d.ts +1 -1
  199. package/dist/summary/summaryManager.d.ts.map +1 -1
  200. package/dist/summary/summaryManager.js +15 -14
  201. package/dist/summary/summaryManager.js.map +1 -1
  202. package/internal.d.ts +11 -0
  203. package/legacy.d.ts +11 -0
  204. package/lib/batchTracker.d.ts +1 -1
  205. package/lib/batchTracker.d.ts.map +1 -1
  206. package/lib/batchTracker.js +2 -2
  207. package/lib/batchTracker.js.map +1 -1
  208. package/lib/blobManager.d.ts +33 -30
  209. package/lib/blobManager.d.ts.map +1 -1
  210. package/lib/blobManager.js +48 -73
  211. package/lib/blobManager.js.map +1 -1
  212. package/lib/channelCollection.d.ts +27 -22
  213. package/lib/channelCollection.d.ts.map +1 -1
  214. package/lib/channelCollection.js +132 -108
  215. package/lib/channelCollection.js.map +1 -1
  216. package/lib/connectionTelemetry.d.ts +3 -3
  217. package/lib/connectionTelemetry.d.ts.map +1 -1
  218. package/lib/connectionTelemetry.js +3 -3
  219. package/lib/connectionTelemetry.js.map +1 -1
  220. package/lib/containerHandleContext.d.ts.map +1 -1
  221. package/lib/containerHandleContext.js +1 -1
  222. package/lib/containerHandleContext.js.map +1 -1
  223. package/lib/containerRuntime.d.ts +42 -39
  224. package/lib/containerRuntime.d.ts.map +1 -1
  225. package/lib/containerRuntime.js +276 -141
  226. package/lib/containerRuntime.js.map +1 -1
  227. package/lib/dataStore.d.ts +1 -1
  228. package/lib/dataStore.d.ts.map +1 -1
  229. package/lib/dataStore.js +3 -3
  230. package/lib/dataStore.js.map +1 -1
  231. package/lib/dataStoreContext.d.ts +58 -19
  232. package/lib/dataStoreContext.d.ts.map +1 -1
  233. package/lib/dataStoreContext.js +110 -53
  234. package/lib/dataStoreContext.js.map +1 -1
  235. package/lib/dataStoreContexts.d.ts +1 -0
  236. package/lib/dataStoreContexts.d.ts.map +1 -1
  237. package/lib/dataStoreContexts.js +3 -2
  238. package/lib/dataStoreContexts.js.map +1 -1
  239. package/lib/dataStoreRegistry.d.ts +5 -1
  240. package/lib/dataStoreRegistry.d.ts.map +1 -1
  241. package/lib/dataStoreRegistry.js +1 -1
  242. package/lib/dataStoreRegistry.js.map +1 -1
  243. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  244. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  245. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  246. package/lib/deltaScheduler.d.ts +1 -1
  247. package/lib/deltaScheduler.d.ts.map +1 -1
  248. package/lib/deltaScheduler.js +1 -1
  249. package/lib/deltaScheduler.js.map +1 -1
  250. package/lib/error.d.ts +1 -1
  251. package/lib/error.d.ts.map +1 -1
  252. package/lib/error.js +2 -2
  253. package/lib/error.js.map +1 -1
  254. package/lib/gc/garbageCollection.d.ts +3 -2
  255. package/lib/gc/garbageCollection.d.ts.map +1 -1
  256. package/lib/gc/garbageCollection.js +8 -8
  257. package/lib/gc/garbageCollection.js.map +1 -1
  258. package/lib/gc/gcConfigs.d.ts +2 -2
  259. package/lib/gc/gcConfigs.d.ts.map +1 -1
  260. package/lib/gc/gcConfigs.js +4 -5
  261. package/lib/gc/gcConfigs.js.map +1 -1
  262. package/lib/gc/gcDefinitions.d.ts +4 -5
  263. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  264. package/lib/gc/gcDefinitions.js.map +1 -1
  265. package/lib/gc/gcHelpers.d.ts +5 -1
  266. package/lib/gc/gcHelpers.d.ts.map +1 -1
  267. package/lib/gc/gcHelpers.js +10 -2
  268. package/lib/gc/gcHelpers.js.map +1 -1
  269. package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
  270. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  271. package/lib/gc/gcSummaryStateTracker.js +2 -2
  272. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  273. package/lib/gc/gcTelemetry.d.ts +2 -1
  274. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  275. package/lib/gc/gcTelemetry.js +4 -2
  276. package/lib/gc/gcTelemetry.js.map +1 -1
  277. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  278. package/lib/gc/gcUnreferencedStateTracker.js +2 -2
  279. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  280. package/lib/gc/index.d.ts +1 -1
  281. package/lib/gc/index.d.ts.map +1 -1
  282. package/lib/gc/index.js +1 -1
  283. package/lib/gc/index.js.map +1 -1
  284. package/lib/index.d.ts +5 -2
  285. package/lib/index.d.ts.map +1 -1
  286. package/lib/index.js +5 -2
  287. package/lib/index.js.map +1 -1
  288. package/lib/legacy.d.ts +91 -0
  289. package/lib/messageTypes.d.ts +11 -5
  290. package/lib/messageTypes.d.ts.map +1 -1
  291. package/lib/messageTypes.js +4 -0
  292. package/lib/messageTypes.js.map +1 -1
  293. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  294. package/lib/opLifecycle/batchManager.js.map +1 -1
  295. package/lib/opLifecycle/definitions.d.ts +2 -20
  296. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  297. package/lib/opLifecycle/definitions.js.map +1 -1
  298. package/lib/opLifecycle/index.d.ts +3 -3
  299. package/lib/opLifecycle/index.d.ts.map +1 -1
  300. package/lib/opLifecycle/index.js +2 -2
  301. package/lib/opLifecycle/index.js.map +1 -1
  302. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  303. package/lib/opLifecycle/opCompressor.js +2 -3
  304. package/lib/opLifecycle/opCompressor.js.map +1 -1
  305. package/lib/opLifecycle/opDecompressor.d.ts +15 -4
  306. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  307. package/lib/opLifecycle/opDecompressor.js +61 -62
  308. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  309. package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
  310. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  311. package/lib/opLifecycle/opGroupingManager.js +9 -12
  312. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  313. package/lib/opLifecycle/opSplitter.d.ts +12 -4
  314. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  315. package/lib/opLifecycle/opSplitter.js +47 -38
  316. package/lib/opLifecycle/opSplitter.js.map +1 -1
  317. package/lib/opLifecycle/outbox.d.ts +2 -1
  318. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  319. package/lib/opLifecycle/outbox.js +19 -18
  320. package/lib/opLifecycle/outbox.js.map +1 -1
  321. package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  322. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  323. package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
  324. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  325. package/lib/packageVersion.d.ts +1 -1
  326. package/lib/packageVersion.js +1 -1
  327. package/lib/packageVersion.js.map +1 -1
  328. package/lib/pendingStateManager.d.ts +1 -1
  329. package/lib/pendingStateManager.d.ts.map +1 -1
  330. package/lib/pendingStateManager.js +2 -2
  331. package/lib/pendingStateManager.js.map +1 -1
  332. package/lib/public.d.ts +12 -0
  333. package/lib/scheduleManager.d.ts +1 -1
  334. package/lib/scheduleManager.d.ts.map +1 -1
  335. package/lib/scheduleManager.js +7 -3
  336. package/lib/scheduleManager.js.map +1 -1
  337. package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
  338. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
  339. package/lib/storageServiceWithAttachBlobs.js +1 -1
  340. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  341. package/lib/summary/documentSchema.d.ts +209 -0
  342. package/lib/summary/documentSchema.d.ts.map +1 -0
  343. package/lib/summary/documentSchema.js +386 -0
  344. package/lib/summary/documentSchema.js.map +1 -0
  345. package/lib/summary/index.d.ts +2 -1
  346. package/lib/summary/index.d.ts.map +1 -1
  347. package/lib/summary/index.js +1 -0
  348. package/lib/summary/index.js.map +1 -1
  349. package/lib/summary/orderedClientElection.d.ts +2 -2
  350. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  351. package/lib/summary/orderedClientElection.js +7 -2
  352. package/lib/summary/orderedClientElection.js.map +1 -1
  353. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  354. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  355. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  356. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  357. package/lib/summary/runningSummarizer.d.ts +3 -3
  358. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  359. package/lib/summary/runningSummarizer.js +3 -3
  360. package/lib/summary/runningSummarizer.js.map +1 -1
  361. package/lib/summary/summarizer.d.ts +3 -2
  362. package/lib/summary/summarizer.d.ts.map +1 -1
  363. package/lib/summary/summarizer.js +3 -3
  364. package/lib/summary/summarizer.js.map +1 -1
  365. package/lib/summary/summarizerClientElection.d.ts +2 -2
  366. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  367. package/lib/summary/summarizerClientElection.js.map +1 -1
  368. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  369. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  370. package/lib/summary/summarizerHeuristics.js +1 -1
  371. package/lib/summary/summarizerHeuristics.js.map +1 -1
  372. package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
  373. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  374. package/lib/summary/summarizerNode/summarizerNode.js +5 -5
  375. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  376. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  377. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  378. package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
  379. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  380. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  381. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  382. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  383. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  384. package/lib/summary/summarizerTypes.d.ts +5 -3
  385. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  386. package/lib/summary/summarizerTypes.js.map +1 -1
  387. package/lib/summary/summaryCollection.d.ts +2 -2
  388. package/lib/summary/summaryCollection.d.ts.map +1 -1
  389. package/lib/summary/summaryCollection.js +1 -1
  390. package/lib/summary/summaryCollection.js.map +1 -1
  391. package/lib/summary/summaryFormat.d.ts +6 -17
  392. package/lib/summary/summaryFormat.d.ts.map +1 -1
  393. package/lib/summary/summaryFormat.js +3 -3
  394. package/lib/summary/summaryFormat.js.map +1 -1
  395. package/lib/summary/summaryGenerator.d.ts +4 -3
  396. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  397. package/lib/summary/summaryGenerator.js +4 -4
  398. package/lib/summary/summaryGenerator.js.map +1 -1
  399. package/lib/summary/summaryManager.d.ts +1 -1
  400. package/lib/summary/summaryManager.d.ts.map +1 -1
  401. package/lib/summary/summaryManager.js +9 -8
  402. package/lib/summary/summaryManager.js.map +1 -1
  403. package/package.json +57 -65
  404. package/src/batchTracker.ts +4 -3
  405. package/src/blobManager.ts +100 -77
  406. package/src/channelCollection.ts +223 -167
  407. package/src/connectionTelemetry.ts +12 -12
  408. package/src/containerHandleContext.ts +3 -2
  409. package/src/containerRuntime.ts +481 -277
  410. package/src/dataStore.ts +9 -4
  411. package/src/dataStoreContext.ts +201 -97
  412. package/src/dataStoreContexts.ts +5 -2
  413. package/src/dataStoreRegistry.ts +3 -2
  414. package/src/deltaManagerSummarizerProxy.ts +1 -1
  415. package/src/deltaScheduler.ts +2 -1
  416. package/src/error.ts +2 -2
  417. package/src/gc/garbageCollection.ts +21 -20
  418. package/src/gc/gcConfigs.ts +15 -18
  419. package/src/gc/gcDefinitions.ts +6 -8
  420. package/src/gc/gcHelpers.ts +22 -5
  421. package/src/gc/gcSummaryStateTracker.ts +7 -5
  422. package/src/gc/gcTelemetry.ts +13 -7
  423. package/src/gc/gcUnreferencedStateTracker.ts +3 -2
  424. package/src/gc/index.ts +1 -0
  425. package/src/index.ts +22 -1
  426. package/src/messageTypes.ts +20 -6
  427. package/src/opLifecycle/README.md +89 -0
  428. package/src/opLifecycle/batchManager.ts +1 -0
  429. package/src/opLifecycle/definitions.ts +3 -21
  430. package/src/opLifecycle/index.ts +3 -9
  431. package/src/opLifecycle/opCompressor.ts +6 -5
  432. package/src/opLifecycle/opDecompressor.ts +90 -100
  433. package/src/opLifecycle/opGroupingManager.ts +12 -14
  434. package/src/opLifecycle/opSplitter.ts +76 -48
  435. package/src/opLifecycle/outbox.ts +30 -38
  436. package/src/opLifecycle/remoteMessageProcessor.ts +43 -55
  437. package/src/packageVersion.ts +1 -1
  438. package/src/pendingStateManager.ts +6 -6
  439. package/src/scheduleManager.ts +10 -8
  440. package/src/storageServiceWithAttachBlobs.ts +2 -2
  441. package/src/summary/documentSchema.ts +631 -0
  442. package/src/summary/index.ts +10 -1
  443. package/src/summary/orderedClientElection.ts +7 -7
  444. package/src/summary/runWhileConnectedCoordinator.ts +3 -2
  445. package/src/summary/runningSummarizer.ts +22 -20
  446. package/src/summary/summarizer.ts +17 -15
  447. package/src/summary/summarizerClientElection.ts +3 -2
  448. package/src/summary/summarizerHeuristics.ts +4 -2
  449. package/src/summary/summarizerNode/summarizerNode.ts +20 -18
  450. package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
  451. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
  452. package/src/summary/summarizerTypes.ts +7 -3
  453. package/src/summary/summaryCollection.ts +3 -3
  454. package/src/summary/summaryFormat.ts +14 -26
  455. package/src/summary/summaryGenerator.ts +12 -15
  456. package/src/summary/summaryManager.ts +16 -13
  457. package/api-extractor-cjs.json +0 -8
  458. package/dist/container-runtime-alpha.d.ts +0 -1753
  459. package/dist/container-runtime-beta.d.ts +0 -268
  460. package/dist/container-runtime-public.d.ts +0 -268
  461. package/dist/container-runtime-untrimmed.d.ts +0 -1893
  462. package/lib/container-runtime-alpha.d.ts +0 -1753
  463. package/lib/container-runtime-beta.d.ts +0 -268
  464. package/lib/container-runtime-public.d.ts +0 -268
  465. package/lib/container-runtime-untrimmed.d.ts +0 -1893
  466. package/lib/test/batchTracker.spec.js +0 -88
  467. package/lib/test/batchTracker.spec.js.map +0 -1
  468. package/lib/test/blobManager.spec.js +0 -835
  469. package/lib/test/blobManager.spec.js.map +0 -1
  470. package/lib/test/channelCollection.spec.js +0 -141
  471. package/lib/test/channelCollection.spec.js.map +0 -1
  472. package/lib/test/containerRuntime.spec.js +0 -1748
  473. package/lib/test/containerRuntime.spec.js.map +0 -1
  474. package/lib/test/dataStoreContext.spec.js +0 -801
  475. package/lib/test/dataStoreContext.spec.js.map +0 -1
  476. package/lib/test/dataStoreCreation.spec.js +0 -312
  477. package/lib/test/dataStoreCreation.spec.js.map +0 -1
  478. package/lib/test/dataStoreRegistry.spec.js +0 -26
  479. package/lib/test/dataStoreRegistry.spec.js.map +0 -1
  480. package/lib/test/fuzz/fuzzUtils.js +0 -66
  481. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  482. package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
  483. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
  484. package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
  485. package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
  486. package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
  487. package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
  488. package/lib/test/gc/garbageCollection.spec.js +0 -1465
  489. package/lib/test/gc/garbageCollection.spec.js.map +0 -1
  490. package/lib/test/gc/gcConfigs.spec.js +0 -690
  491. package/lib/test/gc/gcConfigs.spec.js.map +0 -1
  492. package/lib/test/gc/gcHelpers.spec.js +0 -110
  493. package/lib/test/gc/gcHelpers.spec.js.map +0 -1
  494. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
  495. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
  496. package/lib/test/gc/gcStats.spec.js +0 -391
  497. package/lib/test/gc/gcStats.spec.js.map +0 -1
  498. package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
  499. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
  500. package/lib/test/gc/gcTelemetry.spec.js +0 -530
  501. package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
  502. package/lib/test/gc/gcUnitTestHelpers.js +0 -29
  503. package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
  504. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
  505. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
  506. package/lib/test/getPendingBlobs.spec.js +0 -193
  507. package/lib/test/getPendingBlobs.spec.js.map +0 -1
  508. package/lib/test/hardwareStats.spec.js +0 -93
  509. package/lib/test/hardwareStats.spec.js.map +0 -1
  510. package/lib/test/index.js +0 -6
  511. package/lib/test/index.js.map +0 -1
  512. package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
  513. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
  514. package/lib/test/opLifecycle/batchManager.spec.js +0 -189
  515. package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
  516. package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
  517. package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
  518. package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
  519. package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
  520. package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
  521. package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
  522. package/lib/test/opLifecycle/outbox.spec.js +0 -675
  523. package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
  524. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
  525. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
  526. package/lib/test/pendingStateManager.spec.js +0 -329
  527. package/lib/test/pendingStateManager.spec.js.map +0 -1
  528. package/lib/test/scheduleManager.spec.js +0 -270
  529. package/lib/test/scheduleManager.spec.js.map +0 -1
  530. package/lib/test/summarizerNode.spec.js +0 -326
  531. package/lib/test/summarizerNode.spec.js.map +0 -1
  532. package/lib/test/summarizerNodeWithGc.spec.js +0 -318
  533. package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
  534. package/lib/test/summary/orderedClientElection.spec.js +0 -535
  535. package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
  536. package/lib/test/summary/runningSummarizer.spec.js +0 -1349
  537. package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
  538. package/lib/test/summary/summarizer.spec.js +0 -29
  539. package/lib/test/summary/summarizer.spec.js.map +0 -1
  540. package/lib/test/summary/summarizerClientElection.spec.js +0 -436
  541. package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
  542. package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
  543. package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
  544. package/lib/test/summary/summaryCollection.spec.js +0 -200
  545. package/lib/test/summary/summaryCollection.spec.js.map +0 -1
  546. package/lib/test/summary/summaryManager.spec.js +0 -430
  547. package/lib/test/summary/summaryManager.spec.js.map +0 -1
  548. package/lib/test/summary/testQuorumClients.js +0 -34
  549. package/lib/test/summary/testQuorumClients.js.map +0 -1
  550. package/lib/test/throttler.spec.js +0 -175
  551. package/lib/test/throttler.spec.js.map +0 -1
  552. package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
  553. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
  554. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"containerRuntime.spec.js","sourceRoot":"","sources":["../../src/test/containerRuntime.spec.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 { strict as assert } from \"assert\";\nimport { createSandbox, SinonFakeTimers, useFakeTimers } from \"sinon\";\nimport {\n\tAttachState,\n\tContainerErrorTypes,\n\tIContainerContext,\n\tICriticalContainerError,\n} from \"@fluidframework/container-definitions\";\nimport {\n\tISequencedDocumentMessage,\n\tISummaryTree,\n\tMessageType,\n\ttype ISnapshotTree,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tFluidDataStoreRegistryEntry,\n\tFlushMode,\n\tFlushModeExperimental,\n\tIFluidDataStoreContext,\n\tIFluidDataStoreFactory,\n\tIFluidDataStoreRegistry,\n\tISummaryTreeWithStats,\n\tNamedFluidDataStoreRegistryEntries,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n\tcreateChildLogger,\n\tIFluidErrorBase,\n\tisFluidError,\n\tisILoggingError,\n\tmixinMonitoringContext,\n\tMockLogger,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n\tMockDeltaManager,\n\tMockFluidDataStoreRuntime,\n\tMockQuorumClients,\n\tvalidateAssertionError,\n} from \"@fluidframework/test-runtime-utils\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport {\n\tIErrorBase,\n\tIResponse,\n\tFluidObject,\n\tConfigTypes,\n\tIConfigProviderBase,\n} from \"@fluidframework/core-interfaces\";\nimport {\n\tIDocumentStorageService,\n\tISnapshot,\n\tISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport { stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { ChannelCollection } from \"../channelCollection.js\";\nimport {\n\tCompressionAlgorithms,\n\tContainerRuntime,\n\tIContainerRuntimeOptions,\n\tIPendingRuntimeState,\n\tdefaultPendingOpsWaitTimeoutMs,\n} from \"../containerRuntime.js\";\nimport {\n\tContainerMessageType,\n\ttype RecentlyAddedContainerRuntimeMessageDetails,\n\ttype OutboundContainerRuntimeMessage,\n\ttype UnknownContainerRuntimeMessage,\n} from \"../messageTypes.js\";\nimport {\n\tIPendingLocalState,\n\tIPendingMessage,\n\tPendingStateManager,\n} from \"../pendingStateManager.js\";\nimport { ISummaryCancellationToken, neverCancelledSummaryToken } from \"../summary/index.js\";\n\nfunction submitDataStoreOp(\n\truntime: Pick<ContainerRuntime, \"submitMessage\">,\n\tid: string,\n\tcontents: any,\n\tlocalOpMetadata?: unknown,\n) {\n\truntime.submitMessage(\n\t\tContainerMessageType.FluidDataStoreOp,\n\t\t{\n\t\t\taddress: id,\n\t\t\tcontents,\n\t\t},\n\t\tlocalOpMetadata,\n\t);\n}\n\ndescribe(\"Runtime\", () => {\n\tconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\t\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n\t});\n\n\tlet submittedOps: any[] = [];\n\tlet opFakeSequenceNumber = 1;\n\tlet clock: SinonFakeTimers;\n\n\tbefore(() => {\n\t\tclock = useFakeTimers();\n\t});\n\n\tbeforeEach(() => {\n\t\tsubmittedOps = [];\n\t\topFakeSequenceNumber = 1;\n\t});\n\n\tafterEach(() => {\n\t\tclock.reset();\n\t});\n\n\tafter(() => {\n\t\tclock.restore();\n\t});\n\n\tconst getMockContext = (\n\t\tsettings: Record<string, ConfigTypes> = {},\n\t\tlogger = new MockLogger(),\n\t): Partial<IContainerContext> => {\n\t\tconst mockClientId = \"mockClientId\";\n\n\t\t// Mock the storage layer so \"submitSummary\" works.\n\t\tconst mockStorage: Partial<IDocumentStorageService> = {\n\t\t\tuploadSummaryWithContext: async (summary: ISummaryTree, context: ISummaryContext) => {\n\t\t\t\treturn \"fakeHandle\";\n\t\t\t},\n\t\t};\n\t\tconst mockContext = {\n\t\t\tattachState: AttachState.Attached,\n\t\t\tdeltaManager: new MockDeltaManager(),\n\t\t\tquorum: new MockQuorumClients(),\n\t\t\ttaggedLogger: mixinMonitoringContext(logger, configProvider(settings)).logger,\n\t\t\tclientDetails: { capabilities: { interactive: true } },\n\t\t\tcloseFn: (_error?: ICriticalContainerError): void => {},\n\t\t\tupdateDirtyContainerState: (_dirty: boolean) => {},\n\t\t\tgetLoadedFromVersion: () => undefined,\n\t\t\tsubmitFn: (_type: MessageType, contents: any, _batch: boolean, appData?: any) => {\n\t\t\t\tsubmittedOps.push(contents);\n\t\t\t\treturn opFakeSequenceNumber++;\n\t\t\t},\n\t\t\tclientId: mockClientId,\n\t\t\tconnected: true,\n\t\t\tstorage: mockStorage as IDocumentStorageService,\n\t\t};\n\n\t\t// Update the delta manager's last message which is used for validation during summarization.\n\t\tmockContext.deltaManager.lastMessage = {\n\t\t\tclientId: mockClientId,\n\t\t\ttype: MessageType.Operation,\n\t\t\tsequenceNumber: 0,\n\t\t\ttimestamp: Date.now(),\n\t\t\tminimumSequenceNumber: 0,\n\t\t\treferenceSequenceNumber: 0,\n\t\t\tclientSequenceNumber: 0,\n\t\t\tcontents: undefined,\n\t\t};\n\t\treturn mockContext;\n\t};\n\n\tconst mockProvideEntryPoint = async () => ({\n\t\tmyProp: \"myValue\",\n\t});\n\n\tdescribe(\"Container Runtime\", () => {\n\t\tdescribe(\"IdCompressor\", () => {\n\t\t\tit(\"finalizes idRange on attach\", async () => {\n\t\t\t\tconst logger = new MockLogger();\n\t\t\t\tconst containerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext({}, logger) as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\t\t\tenableRuntimeIdCompressor: \"on\",\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\n\t\t\t\tlogger.clear();\n\n\t\t\t\tconst compressor = containerRuntime.idCompressor;\n\t\t\t\tassert(compressor !== undefined);\n\t\t\t\tcompressor.generateCompressedId();\n\t\t\t\tcontainerRuntime.createSummary();\n\n\t\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\t\tassert.equal(\n\t\t\t\t\trange.ids,\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"All Ids should have been finalized after calling createSummary()\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"flushMode setting\", () => {\n\t\t\tit(\"Default flush mode\", async () => {\n\t\t\t\tconst containerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext() as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\truntimeOptions: {},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\n\t\t\t\tassert.strictEqual(containerRuntime.flushMode, FlushMode.TurnBased);\n\t\t\t});\n\n\t\t\tit(\"Override default flush mode using options\", async () => {\n\t\t\t\tconst containerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext() as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushMode.Immediate,\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\n\t\t\t\tassert.strictEqual(containerRuntime.flushMode, FlushMode.Immediate);\n\t\t\t});\n\n\t\t\tit(\"Replaying ops should resend in correct order\", async () => {\n\t\t\t\tconst containerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext() as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t(containerRuntime as any).channelCollection = {\n\t\t\t\t\tsetConnectionState: (_connected: boolean, _clientId?: string) => {},\n\t\t\t\t\t// Pass data store op right back to ContainerRuntime\n\t\t\t\t\treSubmit: (type: string, envelope: any, localOpMetadata: unknown) => {\n\t\t\t\t\t\tsubmitDataStoreOp(\n\t\t\t\t\t\t\tcontainerRuntime,\n\t\t\t\t\t\t\tenvelope.address,\n\t\t\t\t\t\t\tenvelope.contents,\n\t\t\t\t\t\t\tlocalOpMetadata,\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t} as ChannelCollection;\n\n\t\t\t\tcontainerRuntime.setConnectionState(false);\n\n\t\t\t\tsubmitDataStoreOp(containerRuntime, \"1\", \"test\");\n\t\t\t\t(containerRuntime as any).flush();\n\n\t\t\t\tsubmitDataStoreOp(containerRuntime, \"2\", \"test\");\n\t\t\t\tcontainerRuntime.setConnectionState(true);\n\t\t\t\t(containerRuntime as any).flush();\n\n\t\t\t\tassert.strictEqual(submittedOps.length, 2);\n\t\t\t\tassert.strictEqual(submittedOps[0].contents.address, \"1\");\n\t\t\t\tassert.strictEqual(submittedOps[1].contents.address, \"2\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"orderSequentially\", () =>\n\t\t\t[\n\t\t\t\tFlushMode.TurnBased,\n\t\t\t\tFlushMode.Immediate,\n\t\t\t\tFlushModeExperimental.Async as unknown as FlushMode,\n\t\t\t].forEach((flushMode: FlushMode) => {\n\t\t\t\tdescribe(`orderSequentially with flush mode: ${\n\t\t\t\t\tFlushMode[flushMode] ?? FlushModeExperimental[flushMode]\n\t\t\t\t}`, () => {\n\t\t\t\t\tlet containerRuntime: ContainerRuntime;\n\t\t\t\t\tlet mockContext: Partial<IContainerContext>;\n\t\t\t\t\tconst submittedOpsMetadata: any[] = [];\n\t\t\t\t\tconst containerErrors: ICriticalContainerError[] = [];\n\t\t\t\t\tconst getMockContextForOrderSequentially = (): Partial<IContainerContext> => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tattachState: AttachState.Attached,\n\t\t\t\t\t\t\tdeltaManager: new MockDeltaManager(),\n\t\t\t\t\t\t\tquorum: new MockQuorumClients(),\n\t\t\t\t\t\t\ttaggedLogger: new MockLogger(),\n\t\t\t\t\t\t\tsupportedFeatures: new Map([[\"referenceSequenceNumbers\", true]]),\n\t\t\t\t\t\t\tclientDetails: { capabilities: { interactive: true } },\n\t\t\t\t\t\t\tcloseFn: (error?: ICriticalContainerError): void => {\n\t\t\t\t\t\t\t\tif (error !== undefined) {\n\t\t\t\t\t\t\t\t\tcontainerErrors.push(error);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tupdateDirtyContainerState: (_dirty: boolean) => {},\n\t\t\t\t\t\t\tsubmitFn: (\n\t\t\t\t\t\t\t\t_type: MessageType,\n\t\t\t\t\t\t\t\tcontents: any,\n\t\t\t\t\t\t\t\t_batch: boolean,\n\t\t\t\t\t\t\t\tappData?: any,\n\t\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\t\tif (contents.type === \"groupedBatch\") {\n\t\t\t\t\t\t\t\t\tfor (const subMessage of contents.contents) {\n\t\t\t\t\t\t\t\t\t\tsubmittedOpsMetadata.push(subMessage.metadata);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tsubmittedOpsMetadata.push(appData);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn opFakeSequenceNumber++;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tconnected: true,\n\t\t\t\t\t\t\tclientId: \"fakeClientId\",\n\t\t\t\t\t\t\tgetLoadedFromVersion: () => undefined,\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\n\t\t\t\t\tconst getFirstContainerError = (): ICriticalContainerError => {\n\t\t\t\t\t\tassert.ok(containerErrors.length > 0, \"Container should have errors\");\n\t\t\t\t\t\treturn containerErrors[0];\n\t\t\t\t\t};\n\n\t\t\t\t\tconst expectedOrderSequentiallyErrorMessage =\n\t\t\t\t\t\t\"orderSequentially callback exception\";\n\n\t\t\t\t\tbeforeEach(async () => {\n\t\t\t\t\t\tmockContext = getMockContextForOrderSequentially();\n\t\t\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\t\t\tcontext: mockContext as IContainerContext,\n\t\t\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\t\t\texisting: false,\n\t\t\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\t\t\tsummaryOptions: {\n\t\t\t\t\t\t\t\t\tsummaryConfigOverrides: {\n\t\t\t\t\t\t\t\t\t\tstate: \"disabled\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tflushMode,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontainerErrors.length = 0;\n\t\t\t\t\t\tsubmittedOpsMetadata.length = 0;\n\t\t\t\t\t});\n\n\t\t\t\t\tit(\"Can't call flush() inside orderSequentially's callback\", () => {\n\t\t\t\t\t\tassert.throws(() =>\n\t\t\t\t\t\t\tcontainerRuntime.orderSequentially(() => {\n\t\t\t\t\t\t\t\t(containerRuntime as any).flush();\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst error = getFirstContainerError();\n\t\t\t\t\t\tassert(isFluidError(error));\n\t\t\t\t\t\tassert.strictEqual(error.errorType, ContainerErrorTypes.genericError);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\t`${expectedOrderSequentiallyErrorMessage}: 0x24c`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\terror.getTelemetryProperties().orderSequentiallyCalls,\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tit(\"Can't call flush() inside orderSequentially's callback when nested\", () => {\n\t\t\t\t\t\tassert.throws(() =>\n\t\t\t\t\t\t\tcontainerRuntime.orderSequentially(() =>\n\t\t\t\t\t\t\t\tcontainerRuntime.orderSequentially(() => {\n\t\t\t\t\t\t\t\t\t(containerRuntime as any).flush();\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst error = getFirstContainerError();\n\t\t\t\t\t\tassert(isFluidError(error));\n\t\t\t\t\t\tassert.strictEqual(error.errorType, ContainerErrorTypes.genericError);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\t`${expectedOrderSequentiallyErrorMessage}: 0x24c`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\terror.getTelemetryProperties().orderSequentiallyCalls,\n\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tit(\"Can't call flush() inside orderSequentially's callback when nested ignoring exceptions\", () => {\n\t\t\t\t\t\tcontainerRuntime.orderSequentially(() => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tcontainerRuntime.orderSequentially(() => {\n\t\t\t\t\t\t\t\t\t(containerRuntime as any).flush();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst error = getFirstContainerError();\n\t\t\t\t\t\tassert(isFluidError(error));\n\t\t\t\t\t\tassert.strictEqual(error.errorType, ContainerErrorTypes.genericError);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\t`${expectedOrderSequentiallyErrorMessage}: 0x24c`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\terror.getTelemetryProperties().orderSequentiallyCalls,\n\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tit(\"Errors propagate to the container\", () => {\n\t\t\t\t\t\tassert.throws(() =>\n\t\t\t\t\t\t\tcontainerRuntime.orderSequentially(() => {\n\t\t\t\t\t\t\t\tthrow new Error(\"Any\");\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst error = getFirstContainerError();\n\t\t\t\t\t\tassert(isFluidError(error));\n\t\t\t\t\t\tassert.strictEqual(error.errorType, ContainerErrorTypes.genericError);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\t`${expectedOrderSequentiallyErrorMessage}: Any`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\terror.getTelemetryProperties().orderSequentiallyCalls,\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tit(\"Errors propagate to the container when nested\", () => {\n\t\t\t\t\t\tassert.throws(() =>\n\t\t\t\t\t\t\tcontainerRuntime.orderSequentially(() =>\n\t\t\t\t\t\t\t\tcontainerRuntime.orderSequentially(() => {\n\t\t\t\t\t\t\t\t\tthrow new Error(\"Any\");\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst error = getFirstContainerError();\n\t\t\t\t\t\tassert(isFluidError(error));\n\t\t\t\t\t\tassert.strictEqual(error.errorType, ContainerErrorTypes.genericError);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\t`${expectedOrderSequentiallyErrorMessage}: Any`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\terror.getTelemetryProperties().orderSequentiallyCalls,\n\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tit(\"Batching property set properly\", () => {\n\t\t\t\t\t\tcontainerRuntime.orderSequentially(() => {\n\t\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"1\", \"test\");\n\t\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"2\", \"test\");\n\t\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"3\", \"test\");\n\t\t\t\t\t\t});\n\t\t\t\t\t\t(containerRuntime as any).flush();\n\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\tsubmittedOpsMetadata.length,\n\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\"3 messages should be sent\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\tsubmittedOpsMetadata[0].batch,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\"first message should be the batch start\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\tsubmittedOpsMetadata[1],\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\"second message should not hold batch info\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\tsubmittedOpsMetadata[2].batch,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\"third message should be the batch end\",\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tit(\"Resubmitting batch preserves original batches\", async () => {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\t\t(containerRuntime as any).channelCollection = {\n\t\t\t\t\t\t\tsetConnectionState: (_connected: boolean, _clientId?: string) => {},\n\t\t\t\t\t\t\t// Pass data store op right back to ContainerRuntime\n\t\t\t\t\t\t\treSubmit: (type: string, envelope: any, localOpMetadata: unknown) => {\n\t\t\t\t\t\t\t\tsubmitDataStoreOp(\n\t\t\t\t\t\t\t\t\tcontainerRuntime,\n\t\t\t\t\t\t\t\t\tenvelope.address,\n\t\t\t\t\t\t\t\t\tenvelope.contents,\n\t\t\t\t\t\t\t\t\tlocalOpMetadata,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as ChannelCollection;\n\n\t\t\t\t\t\tcontainerRuntime.setConnectionState(false);\n\n\t\t\t\t\t\tcontainerRuntime.orderSequentially(() => {\n\t\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"1\", \"test\");\n\t\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"2\", \"test\");\n\t\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"3\", \"test\");\n\t\t\t\t\t\t});\n\t\t\t\t\t\t(containerRuntime as any).flush();\n\n\t\t\t\t\t\tcontainerRuntime.orderSequentially(() => {\n\t\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"4\", \"test\");\n\t\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"5\", \"test\");\n\t\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"6\", \"test\");\n\t\t\t\t\t\t});\n\t\t\t\t\t\t(containerRuntime as any).flush();\n\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\tsubmittedOpsMetadata.length,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\"no messages should be sent\",\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tcontainerRuntime.setConnectionState(true);\n\n\t\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t\tsubmittedOpsMetadata.length,\n\t\t\t\t\t\t\t6,\n\t\t\t\t\t\t\t\"6 messages should be sent\",\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst expectedBatchMetadata = [\n\t\t\t\t\t\t\t{ batch: true },\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t{ batch: false },\n\t\t\t\t\t\t\t{ batch: true },\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t{ batch: false },\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\t\tsubmittedOpsMetadata,\n\t\t\t\t\t\t\texpectedBatchMetadata,\n\t\t\t\t\t\t\t\"batch metadata does not match\",\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}));\n\n\t\tdescribe(\"Op reentry enforcement\", () => {\n\t\t\tlet containerRuntime: ContainerRuntime;\n\n\t\t\tit(\"By default, don't enforce the op reentry check\", async () => {\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext() as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t\texisting: false,\n\t\t\t\t});\n\n\t\t\t\tassert.ok(\n\t\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() => {\n\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"id\", \"test\");\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tassert.ok(\n\t\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() =>\n\t\t\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() =>\n\t\t\t\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() => {\n\t\t\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"id\", \"test\");\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"If option enabled, enforce the op reentry check\", async () => {\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext() as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tenableOpReentryCheck: true,\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t\texisting: false,\n\t\t\t\t});\n\n\t\t\t\tassert.throws(() =>\n\t\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() =>\n\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"id\", \"test\"),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tassert.throws(() =>\n\t\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() =>\n\t\t\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() =>\n\t\t\t\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() =>\n\t\t\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"id\", \"test\"),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"If option enabled but disabled via feature gate, don't enforce the op reentry check\", async () => {\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext({\n\t\t\t\t\t\t\"Fluid.ContainerRuntime.DisableOpReentryCheck\": true,\n\t\t\t\t\t}) as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tenableOpReentryCheck: true,\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t\texisting: false,\n\t\t\t\t});\n\n\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() =>\n\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"id\", \"test\"),\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() =>\n\t\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() =>\n\t\t\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() =>\n\t\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"id\", \"test\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Report at most 5 reentrant ops\", async () => {\n\t\t\t\tconst mockLogger = new MockLogger();\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext({}, mockLogger) as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t\texisting: false,\n\t\t\t\t});\n\n\t\t\t\tmockLogger.clear();\n\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() => {\n\t\t\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"id\", \"test\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// We expect only 5 events\n\t\t\t\tmockLogger.assertMatchStrict(\n\t\t\t\t\tArray.from(Array(5).keys()).map(() => ({\n\t\t\t\t\t\teventName: \"ContainerRuntime:OpReentry\",\n\t\t\t\t\t\terror: \"Op was submitted from within a `ensureNoDataModelChanges` callback\",\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Can't call flush() inside ensureNoDataModelChanges's callback\", async () => {\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext() as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushMode.Immediate,\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t\texisting: false,\n\t\t\t\t});\n\n\t\t\t\tassert.throws(() =>\n\t\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() => {\n\t\t\t\t\t\tcontainerRuntime.orderSequentially(() => {});\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Can't create an infinite ensureNoDataModelChanges recursive call \", async () => {\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext() as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t\texisting: false,\n\t\t\t\t});\n\n\t\t\t\tconst callback = () => {\n\t\t\t\t\tcontainerRuntime.ensureNoDataModelChanges(() => {\n\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"id\", \"test\");\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t\tassert.throws(() => callback());\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"orderSequentially with rollback\", () =>\n\t\t\t[\n\t\t\t\tFlushMode.TurnBased,\n\t\t\t\tFlushMode.Immediate,\n\t\t\t\tFlushModeExperimental.Async as unknown as FlushMode,\n\t\t\t].forEach((flushMode: FlushMode) => {\n\t\t\t\tdescribe(`orderSequentially with flush mode: ${\n\t\t\t\t\tFlushMode[flushMode] ?? FlushModeExperimental[flushMode]\n\t\t\t\t}`, () => {\n\t\t\t\t\tlet containerRuntime: ContainerRuntime;\n\t\t\t\t\tconst containerErrors: ICriticalContainerError[] = [];\n\n\t\t\t\t\tconst getMockContextForOrderSequentially = (): Partial<IContainerContext> => ({\n\t\t\t\t\t\tattachState: AttachState.Attached,\n\t\t\t\t\t\tdeltaManager: new MockDeltaManager(),\n\t\t\t\t\t\tquorum: new MockQuorumClients(),\n\t\t\t\t\t\ttaggedLogger: mixinMonitoringContext(\n\t\t\t\t\t\t\tnew MockLogger(),\n\t\t\t\t\t\t\tconfigProvider({\n\t\t\t\t\t\t\t\t\"Fluid.ContainerRuntime.EnableRollback\": true,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t) as unknown as MockLogger,\n\t\t\t\t\t\tclientDetails: { capabilities: { interactive: true } },\n\t\t\t\t\t\tcloseFn: (error?: ICriticalContainerError): void => {\n\t\t\t\t\t\t\tif (error !== undefined) {\n\t\t\t\t\t\t\t\tcontainerErrors.push(error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tupdateDirtyContainerState: (dirty: boolean) => {},\n\t\t\t\t\t\tgetLoadedFromVersion: () => undefined,\n\t\t\t\t\t});\n\n\t\t\t\t\tbeforeEach(async () => {\n\t\t\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\t\t\tcontext: getMockContextForOrderSequentially() as IContainerContext,\n\t\t\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\t\t\texisting: false,\n\t\t\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\t\t\tsummaryOptions: {\n\t\t\t\t\t\t\t\t\tsummaryConfigOverrides: { state: \"disabled\" },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tflushMode,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontainerErrors.length = 0;\n\t\t\t\t\t});\n\n\t\t\t\t\tit(\"No errors propagate to the container on rollback\", () => {\n\t\t\t\t\t\tassert.throws(() =>\n\t\t\t\t\t\t\tcontainerRuntime.orderSequentially(() => {\n\t\t\t\t\t\t\t\tthrow new Error(\"Any\");\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tassert.strictEqual(containerErrors.length, 0);\n\t\t\t\t\t});\n\n\t\t\t\t\tit(\"No errors on successful callback with rollback set\", () => {\n\t\t\t\t\t\tcontainerRuntime.orderSequentially(() => {});\n\n\t\t\t\t\t\tassert.strictEqual(containerErrors.length, 0);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}));\n\n\t\tdescribe(\"Dirty flag\", () => {\n\t\t\tconst sandbox = createSandbox();\n\t\t\tconst createMockContext = (\n\t\t\t\tattachState: AttachState,\n\t\t\t\taddPendingMsg: boolean,\n\t\t\t): Partial<IContainerContext> => {\n\t\t\t\tconst pendingState = {\n\t\t\t\t\tpending: {\n\t\t\t\t\t\tpendingStates: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"message\",\n\t\t\t\t\t\t\t\tcontent: `{\"type\": \"${ContainerMessageType.BlobAttach}\", \"contents\": {}}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\tsavedOps: [],\n\t\t\t\t};\n\n\t\t\t\treturn {\n\t\t\t\t\tdeltaManager: new MockDeltaManager(),\n\t\t\t\t\tquorum: new MockQuorumClients(),\n\t\t\t\t\ttaggedLogger: new MockLogger(),\n\t\t\t\t\tclientDetails: { capabilities: { interactive: true } },\n\t\t\t\t\tupdateDirtyContainerState: (_dirty: boolean) => {},\n\t\t\t\t\tattachState,\n\t\t\t\t\tpendingLocalState: addPendingMsg ? pendingState : undefined,\n\t\t\t\t\tgetLoadedFromVersion: () => undefined,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tit(\"should NOT be set to dirty if context is attached with no pending ops\", async () => {\n\t\t\t\tconst mockContext = createMockContext(AttachState.Attached, false);\n\t\t\t\tconst updateDirtyStateStub = sandbox.stub(mockContext, \"updateDirtyContainerState\");\n\t\t\t\tawait ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: mockContext as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\truntimeOptions: undefined,\n\t\t\t\t\tcontainerScope: {},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t\tassert.deepStrictEqual(updateDirtyStateStub.calledOnce, true);\n\t\t\t\tassert.deepStrictEqual(updateDirtyStateStub.args, [[false]]);\n\t\t\t});\n\n\t\t\tit(\"should be set to dirty if context is attached with pending ops\", async () => {\n\t\t\t\tconst mockContext = createMockContext(AttachState.Attached, true);\n\t\t\t\tconst updateDirtyStateStub = sandbox.stub(mockContext, \"updateDirtyContainerState\");\n\t\t\t\tawait ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: mockContext as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\trequestHandler: undefined,\n\t\t\t\t\truntimeOptions: {},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t\tassert.deepStrictEqual(updateDirtyStateStub.calledOnce, true);\n\t\t\t\tassert.deepStrictEqual(updateDirtyStateStub.args, [[true]]);\n\t\t\t});\n\n\t\t\tit(\"should be set to dirty if context is attaching\", async () => {\n\t\t\t\tconst mockContext = createMockContext(AttachState.Attaching, false);\n\t\t\t\tconst updateDirtyStateStub = sandbox.stub(mockContext, \"updateDirtyContainerState\");\n\t\t\t\tawait ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: mockContext as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\trequestHandler: undefined,\n\t\t\t\t\truntimeOptions: {},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t\tassert.deepStrictEqual(updateDirtyStateStub.calledOnce, true);\n\t\t\t\tassert.deepStrictEqual(updateDirtyStateStub.args, [[true]]);\n\t\t\t});\n\n\t\t\tit(\"should be set to dirty if context is detached\", async () => {\n\t\t\t\tconst mockContext = createMockContext(AttachState.Detached, false);\n\t\t\t\tconst updateDirtyStateStub = sandbox.stub(mockContext, \"updateDirtyContainerState\");\n\t\t\t\tawait ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: mockContext as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\trequestHandler: undefined,\n\t\t\t\t\truntimeOptions: {},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t\tassert.deepStrictEqual(updateDirtyStateStub.calledOnce, true);\n\t\t\t\tassert.deepStrictEqual(updateDirtyStateStub.args, [[true]]);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Pending state progress tracking\", () => {\n\t\t\tconst maxReconnects = 7; // 7 is the default used by ContainerRuntime for the max reconnection attempts\n\n\t\t\tlet containerRuntime: ContainerRuntime;\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst containerErrors: ICriticalContainerError[] = [];\n\t\t\tconst getMockContextForPendingStateProgressTracking =\n\t\t\t\t(): Partial<IContainerContext> => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tclientId: \"fakeClientId\",\n\t\t\t\t\t\tattachState: AttachState.Attached,\n\t\t\t\t\t\tdeltaManager: new MockDeltaManager(),\n\t\t\t\t\t\tquorum: new MockQuorumClients(),\n\t\t\t\t\t\ttaggedLogger: mockLogger,\n\t\t\t\t\t\tclientDetails: { capabilities: { interactive: true } },\n\t\t\t\t\t\tcloseFn: (error?: ICriticalContainerError): void => {\n\t\t\t\t\t\t\tif (error !== undefined) {\n\t\t\t\t\t\t\t\tcontainerErrors.push(error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tupdateDirtyContainerState: (_dirty: boolean) => {},\n\t\t\t\t\t\tgetLoadedFromVersion: () => undefined,\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\tconst getMockPendingStateManager = (): PendingStateManager => {\n\t\t\t\tlet pendingMessages = 0;\n\t\t\t\treturn {\n\t\t\t\t\treplayPendingStates: () => {},\n\t\t\t\t\thasPendingMessages: (): boolean => pendingMessages > 0,\n\t\t\t\t\tprocessMessage: (_message: ISequencedDocumentMessage, _local: boolean) => {\n\t\t\t\t\t\treturn { localAck: false, localOpMetadata: undefined };\n\t\t\t\t\t},\n\t\t\t\t\tprocessPendingLocalMessage: (_message: ISequencedDocumentMessage) => {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t},\n\t\t\t\t\tget pendingMessagesCount() {\n\t\t\t\t\t\treturn pendingMessages;\n\t\t\t\t\t},\n\t\t\t\t\tonSubmitMessage: (\n\t\t\t\t\t\t_type: ContainerMessageType,\n\t\t\t\t\t\t_clientSequenceNumber: number,\n\t\t\t\t\t\t_referenceSequenceNumber: number,\n\t\t\t\t\t\t_content: any,\n\t\t\t\t\t\t_localOpMetadata: unknown,\n\t\t\t\t\t\t_opMetadata: Record<string, unknown> | undefined,\n\t\t\t\t\t) => pendingMessages++,\n\t\t\t\t} as unknown as PendingStateManager;\n\t\t\t};\n\t\t\tconst getMockChannelCollection = (): ChannelCollection => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\treturn {\n\t\t\t\t\tprocess: (..._args) => {},\n\t\t\t\t\tsetConnectionState: (..._args) => {},\n\t\t\t\t} as ChannelCollection;\n\t\t\t};\n\n\t\t\tconst getFirstContainerError = (): ICriticalContainerError => {\n\t\t\t\tassert.ok(containerErrors.length > 0, \"Container should have errors\");\n\t\t\t\treturn containerErrors[0];\n\t\t\t};\n\n\t\t\tbeforeEach(async () => {\n\t\t\t\tcontainerErrors.length = 0;\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContextForPendingStateProgressTracking() as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\trequestHandler: undefined,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tsummaryOptions: {\n\t\t\t\t\t\t\tsummaryConfigOverrides: {\n\t\t\t\t\t\t\t\tstate: \"disabled\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tfunction patchRuntime(\n\t\t\t\tpendingStateManager: PendingStateManager,\n\t\t\t\t_maxReconnects: number | undefined = undefined,\n\t\t\t) {\n\t\t\t\tconst runtime = containerRuntime as any;\n\t\t\t\truntime.pendingStateManager = pendingStateManager;\n\t\t\t\truntime.channelCollection = getMockChannelCollection();\n\t\t\t\truntime.maxConsecutiveReconnects =\n\t\t\t\t\t_maxReconnects ?? runtime.maxConsecutiveReconnects;\n\t\t\t\treturn runtime as ContainerRuntime;\n\t\t\t}\n\n\t\t\tconst toggleConnection = (runtime: ContainerRuntime) => {\n\t\t\t\truntime.setConnectionState(false);\n\t\t\t\truntime.setConnectionState(true);\n\t\t\t};\n\n\t\t\tconst addPendingMessage = (pendingStateManager: PendingStateManager): void =>\n\t\t\t\tpendingStateManager.onSubmitMessage(\"\", 0, \"\", undefined);\n\n\t\t\tit(\n\t\t\t\t`No progress for ${maxReconnects} connection state changes, with pending state, should ` +\n\t\t\t\t\t\"generate telemetry event and throw an error that closes the container\",\n\t\t\t\tasync () => {\n\t\t\t\t\tconst pendingStateManager = getMockPendingStateManager();\n\t\t\t\t\tpatchRuntime(pendingStateManager);\n\n\t\t\t\t\tfor (let i = 0; i < maxReconnects; i++) {\n\t\t\t\t\t\taddPendingMessage(pendingStateManager);\n\t\t\t\t\t\ttoggleConnection(containerRuntime);\n\t\t\t\t\t}\n\n\t\t\t\t\t// NOTE: any errors returned by getFirstContainerError() are from a variable set in a mock closeFn function passed\n\t\t\t\t\t// around during test setup, which executes when the container runtime causes the context (container) to close.\n\t\t\t\t\tconst error = getFirstContainerError();\n\t\t\t\t\tassert.strictEqual(error.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\"Runtime detected too many reconnects with no progress syncing local ops.\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(isILoggingError(error));\n\t\t\t\t\tassert.strictEqual(error.getTelemetryProperties().attempts, maxReconnects);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\terror.getTelemetryProperties().pendingMessages,\n\t\t\t\t\t\tmaxReconnects,\n\t\t\t\t\t);\n\t\t\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"ContainerRuntime:ReconnectsWithNoProgress\",\n\t\t\t\t\t\t\tattempts: 3,\n\t\t\t\t\t\t\tpendingMessages: 3,\n\t\t\t\t\t\t},\n\t\t\t\t\t]);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tit(\n\t\t\t\t`No progress for ${maxReconnects} / 2 connection state changes, with pending state, should ` +\n\t\t\t\t\t\"generate telemetry event but not throw an error that closes the container\",\n\t\t\t\tasync () => {\n\t\t\t\t\tconst pendingStateManager = getMockPendingStateManager();\n\t\t\t\t\tpatchRuntime(pendingStateManager);\n\t\t\t\t\taddPendingMessage(pendingStateManager);\n\n\t\t\t\t\tfor (let i = 0; i < maxReconnects / 2; i++) {\n\t\t\t\t\t\ttoggleConnection(containerRuntime);\n\t\t\t\t\t}\n\n\t\t\t\t\t// The particulars of the setup for this test mean that no errors here indicate the container did not close.\n\t\t\t\t\tassert.equal(containerErrors.length, 0);\n\t\t\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"ContainerRuntime:ReconnectsWithNoProgress\",\n\t\t\t\t\t\t\tattempts: 3,\n\t\t\t\t\t\t\tpendingMessages: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t]);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tit(\n\t\t\t\t`No progress for ${maxReconnects} connection state changes, with pending state, with ` +\n\t\t\t\t\t\"feature disabled, should not generate telemetry event nor throw an error that closes the container\",\n\t\t\t\tasync () => {\n\t\t\t\t\tconst pendingStateManager = getMockPendingStateManager();\n\t\t\t\t\tpatchRuntime(pendingStateManager, -1 /* maxConsecutiveReconnects */);\n\n\t\t\t\t\tfor (let i = 0; i < maxReconnects; i++) {\n\t\t\t\t\t\taddPendingMessage(pendingStateManager);\n\t\t\t\t\t\ttoggleConnection(containerRuntime);\n\t\t\t\t\t}\n\n\t\t\t\t\t// The particulars of the setup for this test mean that no errors here indicate the container did not close.\n\t\t\t\t\tassert.equal(containerErrors.length, 0);\n\t\t\t\t\tmockLogger.assertMatchNone([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"ContainerRuntime:ReconnectsWithNoProgress\",\n\t\t\t\t\t\t},\n\t\t\t\t\t]);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tit(\n\t\t\t\t`No progress for ${maxReconnects} connection state changes, with no pending state, should ` +\n\t\t\t\t\t\"not generate telemetry event nor throw an error that closes the container\",\n\t\t\t\tasync () => {\n\t\t\t\t\tconst pendingStateManager = getMockPendingStateManager();\n\t\t\t\t\tpatchRuntime(pendingStateManager);\n\n\t\t\t\t\tfor (let i = 0; i < maxReconnects; i++) {\n\t\t\t\t\t\ttoggleConnection(containerRuntime);\n\t\t\t\t\t}\n\n\t\t\t\t\t// The particulars of the setup for this test mean that no errors here indicate the container did not close.\n\t\t\t\t\tassert.equal(containerErrors.length, 0);\n\t\t\t\t\tmockLogger.assertMatchNone([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"ContainerRuntime:ReconnectsWithNoProgress\",\n\t\t\t\t\t\t},\n\t\t\t\t\t]);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tit(\n\t\t\t\t`No progress for ${maxReconnects} connection state changes, with pending state, successfully ` +\n\t\t\t\t\t\"processing local op, should not generate telemetry event nor throw an error that closes the container\",\n\t\t\t\tasync () => {\n\t\t\t\t\tconst pendingStateManager = getMockPendingStateManager();\n\t\t\t\t\tpatchRuntime(pendingStateManager);\n\t\t\t\t\taddPendingMessage(pendingStateManager);\n\n\t\t\t\t\tfor (let i = 0; i < maxReconnects; i++) {\n\t\t\t\t\t\tcontainerRuntime.setConnectionState(!containerRuntime.connected);\n\t\t\t\t\t\tcontainerRuntime.process(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"op\",\n\t\t\t\t\t\t\t\tclientId: \"clientId\",\n\t\t\t\t\t\t\t\tsequenceNumber: 0,\n\t\t\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\t\t\taddress: \"address\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} as any as ISequencedDocumentMessage,\n\t\t\t\t\t\t\ttrue /* local */,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// The particulars of the setup for this test mean that no errors here indicate the container did not close.\n\t\t\t\t\tassert.equal(containerErrors.length, 0);\n\t\t\t\t\tmockLogger.assertMatchNone([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"ContainerRuntime:ReconnectsWithNoProgress\",\n\t\t\t\t\t\t},\n\t\t\t\t\t]);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tit(\n\t\t\t\t`No progress for ${maxReconnects} connection state changes, with pending state, successfully ` +\n\t\t\t\t\t\"processing remote op and local chunked op, should generate telemetry event and throw an error that closes the container\",\n\t\t\t\tasync () => {\n\t\t\t\t\tconst pendingStateManager = getMockPendingStateManager();\n\t\t\t\t\tpatchRuntime(pendingStateManager);\n\n\t\t\t\t\tfor (let i = 0; i < maxReconnects; i++) {\n\t\t\t\t\t\taddPendingMessage(pendingStateManager);\n\t\t\t\t\t\ttoggleConnection(containerRuntime);\n\t\t\t\t\t\tcontainerRuntime.process(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"op\",\n\t\t\t\t\t\t\t\tclientId: \"a unique, remote clientId\",\n\t\t\t\t\t\t\t\tsequenceNumber: 0,\n\t\t\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\t\t\taddress: \"address\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} as any as ISequencedDocumentMessage,\n\t\t\t\t\t\t\tfalse /* local */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontainerRuntime.process(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"op\",\n\t\t\t\t\t\t\t\tclientId: \"clientId\",\n\t\t\t\t\t\t\t\tsequenceNumber: 0,\n\t\t\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\t\t\taddress: \"address\",\n\t\t\t\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\t\t\t\tchunkId: i + 1,\n\t\t\t\t\t\t\t\t\t\ttotalChunks: maxReconnects + 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ttype: \"chunkedOp\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} as any as ISequencedDocumentMessage,\n\t\t\t\t\t\t\ttrue /* local */,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// NOTE: any errors returned by getFirstContainerError() are from a variable set in a mock closeFn function passed\n\t\t\t\t\t// around during test setup, which executes when the container runtime causes the context (container) to close.\n\t\t\t\t\tconst error = getFirstContainerError();\n\t\t\t\t\tassert.strictEqual(error.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\"Runtime detected too many reconnects with no progress syncing local ops.\",\n\t\t\t\t\t);\n\t\t\t\t\tassert(isILoggingError(error));\n\t\t\t\t\tassert.strictEqual(error.getTelemetryProperties().attempts, maxReconnects);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\terror.getTelemetryProperties().pendingMessages,\n\t\t\t\t\t\tmaxReconnects,\n\t\t\t\t\t);\n\t\t\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"ContainerRuntime:ReconnectsWithNoProgress\",\n\t\t\t\t\t\t\tattempts: 3,\n\t\t\t\t\t\t\tpendingMessages: 3,\n\t\t\t\t\t\t},\n\t\t\t\t\t]);\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\n\t\tdescribe(\"Future op type compatibility\", () => {\n\t\t\tlet containerRuntime: ContainerRuntime;\n\t\t\tbeforeEach(async () => {\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext() as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\trequestHandler: undefined,\n\t\t\t\t\truntimeOptions: {},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(\"can submit op compat behavior\", async () => {\n\t\t\t\t// Create a container runtime type where the submit method is public. This makes it easier to test\n\t\t\t\t// submission and processing of ops. The other option is to send data store or alias ops whose\n\t\t\t\t// processing requires creation of data store context and runtime as well.\n\t\t\t\ttype ContainerRuntimeWithSubmit = Omit<ContainerRuntime, \"submit\"> & {\n\t\t\t\t\tsubmit(\n\t\t\t\t\t\tcontainerRuntimeMessage: OutboundContainerRuntimeMessage,\n\t\t\t\t\t\tlocalOpMetadata: unknown,\n\t\t\t\t\t\tmetadata: Record<string, unknown> | undefined,\n\t\t\t\t\t): void;\n\t\t\t\t};\n\t\t\t\tconst containerRuntimeWithSubmit =\n\t\t\t\t\tcontainerRuntime as unknown as ContainerRuntimeWithSubmit;\n\n\t\t\t\tconst runtimeCompatMessage: Omit<\n\t\t\t\t\tOutboundContainerRuntimeMessage,\n\t\t\t\t\t\"type\" | \"contents\"\n\t\t\t\t> & {\n\t\t\t\t\ttype: string;\n\t\t\t\t\tcontents: any;\n\t\t\t\t} = {\n\t\t\t\t\ttype: \"NEW\",\n\t\t\t\t\tcontents: \"Hello\",\n\t\t\t\t\tcompatDetails: { behavior: \"Ignore\" },\n\t\t\t\t};\n\n\t\t\t\tassert.doesNotThrow(\n\t\t\t\t\t() =>\n\t\t\t\t\t\tcontainerRuntimeWithSubmit.submit(\n\t\t\t\t\t\t\truntimeCompatMessage as OutboundContainerRuntimeMessage,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t),\n\t\t\t\t\t\"Cannot submit container runtime message with compatDetails\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\t/** Overwrites channelCollection property and exposes private submit function with modified typing */\n\t\t\tfunction patchContainerRuntime(): Omit<ContainerRuntime, \"submit\"> & {\n\t\t\t\tsubmit: (containerRuntimeMessage: UnknownContainerRuntimeMessage) => void;\n\t\t\t} {\n\t\t\t\tconst patched = containerRuntime as unknown as Omit<\n\t\t\t\t\tContainerRuntime,\n\t\t\t\t\t\"submit\" | \"channelCollection\"\n\t\t\t\t> & {\n\t\t\t\t\tsubmit: (containerRuntimeMessage: UnknownContainerRuntimeMessage) => void;\n\t\t\t\t\tchannelCollection: Partial<ChannelCollection>;\n\t\t\t\t};\n\n\t\t\t\tpatched.channelCollection = {\n\t\t\t\t\tsetConnectionState: (_connected: boolean, _clientId?: string) => {},\n\t\t\t\t\t// Pass data store op right back to ContainerRuntime\n\t\t\t\t\treSubmit: (type: string, envelope: any, localOpMetadata: unknown) => {\n\t\t\t\t\t\tsubmitDataStoreOp(\n\t\t\t\t\t\t\tcontainerRuntime,\n\t\t\t\t\t\t\tenvelope.address,\n\t\t\t\t\t\t\tenvelope.contents,\n\t\t\t\t\t\t\tlocalOpMetadata,\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t} satisfies Partial<ChannelCollection>;\n\n\t\t\t\treturn patched;\n\t\t\t}\n\n\t\t\tit(\"Op with unrecognized type and 'Ignore' compat behavior is ignored by resubmit\", async () => {\n\t\t\t\tconst patchedContainerRuntime = patchContainerRuntime();\n\n\t\t\t\tpatchedContainerRuntime.setConnectionState(false);\n\n\t\t\t\tsubmitDataStoreOp(patchedContainerRuntime, \"1\", \"test\");\n\t\t\t\tsubmitDataStoreOp(patchedContainerRuntime, \"2\", \"test\");\n\t\t\t\tpatchedContainerRuntime.submit({\n\t\t\t\t\ttype: \"FUTURE_TYPE\" as any,\n\t\t\t\t\tcontents: \"3\",\n\t\t\t\t\tcompatDetails: { behavior: \"Ignore\" }, // This op should be ignored by resubmit\n\t\t\t\t});\n\t\t\t\tsubmitDataStoreOp(patchedContainerRuntime, \"4\", \"test\");\n\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsubmittedOps.length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"no messages should be sent while disconnected\",\n\t\t\t\t);\n\n\t\t\t\t// Connect, which will trigger resubmit\n\t\t\t\tpatchedContainerRuntime.setConnectionState(true);\n\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsubmittedOps.length,\n\t\t\t\t\t3,\n\t\t\t\t\t\"Only 3 messages should be sent - Do not resubmit the future/unknown op\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Op with unrecognized type and no compat behavior causes resubmit to throw\", async () => {\n\t\t\t\tconst patchedContainerRuntime = patchContainerRuntime();\n\n\t\t\t\tpatchedContainerRuntime.setConnectionState(false);\n\n\t\t\t\tpatchedContainerRuntime.submit({\n\t\t\t\t\ttype: \"FUTURE_TYPE\" as any,\n\t\t\t\t\tcontents: \"3\",\n\t\t\t\t\t// No compatDetails so it will throw on resubmit.\n\t\t\t\t});\n\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsubmittedOps.length,\n\t\t\t\t\t0,\n\t\t\t\t\t\"no messages should be sent while disconnected\",\n\t\t\t\t);\n\n\t\t\t\t// Note: hitting this error case in practice would require a new op type to be deployed,\n\t\t\t\t// one such op to be stashed, then a new session loads on older code that is unaware\n\t\t\t\t// of the new op type.\n\t\t\t\tassert.throws(() => {\n\t\t\t\t\t// Connect, which will trigger resubmit\n\t\t\t\t\tpatchedContainerRuntime.setConnectionState(true);\n\t\t\t\t}, \"Expected resubmit to throw\");\n\t\t\t});\n\n\t\t\tit(\"process remote op with unrecognized type and 'Ignore' compat behavior\", async () => {\n\t\t\t\tconst futureRuntimeMessage: RecentlyAddedContainerRuntimeMessageDetails &\n\t\t\t\t\tRecord<string, unknown> = {\n\t\t\t\t\ttype: \"FROM_THE_FUTURE\",\n\t\t\t\t\tcontents: \"Hello\",\n\t\t\t\t\tcompatDetails: { behavior: \"Ignore\" },\n\t\t\t\t};\n\n\t\t\t\tconst packedOp: Omit<\n\t\t\t\t\tISequencedDocumentMessage,\n\t\t\t\t\t| \"term\"\n\t\t\t\t\t| \"minimumSequenceNumber\"\n\t\t\t\t\t| \"clientSequenceNumber\"\n\t\t\t\t\t| \"referenceSequenceNumber\"\n\t\t\t\t\t| \"timestamp\"\n\t\t\t\t> = {\n\t\t\t\t\tcontents: JSON.stringify(futureRuntimeMessage),\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tsequenceNumber: 123,\n\t\t\t\t\tclientId: \"someClientId\",\n\t\t\t\t};\n\t\t\t\tcontainerRuntime.process(packedOp as ISequencedDocumentMessage, false /* local */);\n\t\t\t});\n\n\t\t\tit(\"process remote op with unrecognized type and 'FailToProcess' compat behavior\", async () => {\n\t\t\t\tconst futureRuntimeMessage: RecentlyAddedContainerRuntimeMessageDetails &\n\t\t\t\t\tRecord<string, unknown> = {\n\t\t\t\t\ttype: \"FROM THE FUTURE\",\n\t\t\t\t\tcontents: \"Hello\",\n\t\t\t\t\tcompatDetails: { behavior: \"FailToProcess\" },\n\t\t\t\t};\n\n\t\t\t\tconst packedOp: Omit<\n\t\t\t\t\tISequencedDocumentMessage,\n\t\t\t\t\t| \"term\"\n\t\t\t\t\t| \"minimumSequenceNumber\"\n\t\t\t\t\t| \"clientSequenceNumber\"\n\t\t\t\t\t| \"referenceSequenceNumber\"\n\t\t\t\t\t| \"timestamp\"\n\t\t\t\t> = {\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tcontents: JSON.stringify(futureRuntimeMessage),\n\t\t\t\t\tsequenceNumber: 123,\n\t\t\t\t\tclientId: \"someClientId\",\n\t\t\t\t};\n\t\t\t\tassert.throws(\n\t\t\t\t\t() =>\n\t\t\t\t\t\tcontainerRuntime.process(\n\t\t\t\t\t\t\tpackedOp as ISequencedDocumentMessage,\n\t\t\t\t\t\t\tfalse /* local */,\n\t\t\t\t\t\t),\n\t\t\t\t\t(error: IErrorBase) =>\n\t\t\t\t\t\terror.errorType === ContainerErrorTypes.dataProcessingError,\n\t\t\t\t\t\"Ops with unrecognized type and 'FailToProcess' compat behavior should fail to process\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"process remote op with unrecognized type and no compat behavior\", async () => {\n\t\t\t\tconst futureRuntimeMessage = {\n\t\t\t\t\ttype: \"FROM_THE_FUTURE\",\n\t\t\t\t\tcontents: \"Hello\",\n\t\t\t\t};\n\n\t\t\t\tconst packedOp: Omit<\n\t\t\t\t\tISequencedDocumentMessage,\n\t\t\t\t\t| \"term\"\n\t\t\t\t\t| \"minimumSequenceNumber\"\n\t\t\t\t\t| \"clientSequenceNumber\"\n\t\t\t\t\t| \"referenceSequenceNumber\"\n\t\t\t\t\t| \"timestamp\"\n\t\t\t\t> = {\n\t\t\t\t\tcontents: JSON.stringify(futureRuntimeMessage),\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tsequenceNumber: 123,\n\t\t\t\t\tclientId: \"someClientId\",\n\t\t\t\t};\n\t\t\t\tassert.throws(\n\t\t\t\t\t() =>\n\t\t\t\t\t\tcontainerRuntime.process(\n\t\t\t\t\t\t\tpackedOp as ISequencedDocumentMessage,\n\t\t\t\t\t\t\tfalse /* local */,\n\t\t\t\t\t\t),\n\t\t\t\t\t(error: IErrorBase) =>\n\t\t\t\t\t\terror.errorType === ContainerErrorTypes.dataProcessingError,\n\t\t\t\t\t\"Ops with unrecognized type and no specified compat behavior should fail to process\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Supports mixin classes\", () => {\n\t\t\tit(\"new loadRuntime method works\", async () => {\n\t\t\t\tconst makeMixin = <T>(\n\t\t\t\t\tBase: typeof ContainerRuntime,\n\t\t\t\t\tmethodName: string,\n\t\t\t\t\tmethodReturn: T,\n\t\t\t\t) =>\n\t\t\t\t\tclass MixinContainerRuntime extends Base {\n\t\t\t\t\t\tpublic static async loadRuntime(params: {\n\t\t\t\t\t\t\tcontext: IContainerContext;\n\t\t\t\t\t\t\tcontainerRuntimeCtor?: typeof ContainerRuntime;\n\t\t\t\t\t\t\tprovideEntryPoint: (\n\t\t\t\t\t\t\t\tcontainerRuntime: IContainerRuntime,\n\t\t\t\t\t\t\t) => Promise<FluidObject>;\n\t\t\t\t\t\t\texisting: boolean;\n\t\t\t\t\t\t\truntimeOptions: IContainerRuntimeOptions;\n\t\t\t\t\t\t\tregistryEntries: NamedFluidDataStoreRegistryEntries;\n\t\t\t\t\t\t\tcontainerScope: FluidObject;\n\t\t\t\t\t\t}): Promise<ContainerRuntime> {\n\t\t\t\t\t\t\t// Note: we're mutating the parameter object here, normally a no-no, but shouldn't be\n\t\t\t\t\t\t\t// an issue in our tests.\n\t\t\t\t\t\t\tparams.containerRuntimeCtor =\n\t\t\t\t\t\t\t\tparams.containerRuntimeCtor ?? MixinContainerRuntime;\n\t\t\t\t\t\t\tparams.containerScope = params.containerScope ?? params.context.scope;\n\t\t\t\t\t\t\treturn Base.loadRuntime(params);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpublic [methodName](): T {\n\t\t\t\t\t\t\treturn methodReturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} as typeof ContainerRuntime;\n\n\t\t\t\tconst myEntryPoint: FluidObject = {\n\t\t\t\t\tmyProp: \"myValue\",\n\t\t\t\t};\n\n\t\t\t\tconst runtime = await makeMixin(\n\t\t\t\t\tmakeMixin(ContainerRuntime, \"method1\", \"mixed in return\"),\n\t\t\t\t\t\"method2\",\n\t\t\t\t\t42,\n\t\t\t\t).loadRuntime({\n\t\t\t\t\tcontext: getMockContext() as IContainerContext,\n\t\t\t\t\tprovideEntryPoint: async (containerRuntime) => myEntryPoint,\n\t\t\t\t\texisting: false,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t});\n\n\t\t\t\tassert.equal(\n\t\t\t\t\t(runtime as unknown as { method1: () => any }).method1(),\n\t\t\t\t\t\"mixed in return\",\n\t\t\t\t);\n\t\t\t\tassert.equal((runtime as unknown as { method2: () => any }).method2(), 42);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"EntryPoint initialized correctly\", () => {\n\t\t\tit(\"when using new loadRuntime method\", async () => {\n\t\t\t\tconst myEntryPoint: FluidObject = {\n\t\t\t\t\tmyProp: \"myValue\",\n\t\t\t\t};\n\t\t\t\tconst containerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext() as IContainerContext,\n\t\t\t\t\tprovideEntryPoint: async (ctrRuntime) => myEntryPoint,\n\t\t\t\t\texisting: false,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t});\n\n\t\t\t\t// The entryPoint should come from the provided initialization function.\n\t\t\t\tconst actualEntryPoint = await containerRuntime.getEntryPoint();\n\t\t\t\tassert(actualEntryPoint !== undefined, \"entryPoint was not initialized\");\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tactualEntryPoint,\n\t\t\t\t\tmyEntryPoint,\n\t\t\t\t\t\"entryPoint does not match expected object\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"loadRuntime accepts both requestHandlers and entryPoint\", async () => {\n\t\t\t\tconst myResponse: IResponse = {\n\t\t\t\t\tmimeType: \"fluid/object\",\n\t\t\t\t\tvalue: \"hello!\",\n\t\t\t\t\tstatus: 200,\n\t\t\t\t};\n\t\t\t\tconst myEntryPoint: FluidObject = {\n\t\t\t\t\tmyProp: \"myValue\",\n\t\t\t\t};\n\n\t\t\t\tconst containerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext() as IContainerContext,\n\t\t\t\t\trequestHandler: async (req, ctrRuntime) => myResponse,\n\t\t\t\t\tprovideEntryPoint: async (ctrRuntime) => myEntryPoint,\n\t\t\t\t\texisting: false,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t});\n\n\t\t\t\t// Calling request on the runtime should use the request handler we passed in the runtime's constructor.\n\t\t\t\tconst responseFromRequestMethod = await (containerRuntime as any).request({\n\t\t\t\t\turl: \"/\",\n\t\t\t\t});\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tresponseFromRequestMethod,\n\t\t\t\t\tmyResponse,\n\t\t\t\t\t\"request method in runtime did not return the expected object\",\n\t\t\t\t);\n\n\t\t\t\t// The entryPoint should come from the provided initialization function.\n\t\t\t\tconst actualEntryPoint = await containerRuntime.getEntryPoint();\n\t\t\t\tassert(actualEntryPoint !== undefined, \"entryPoint was not initialized\");\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tactualEntryPoint,\n\t\t\t\t\tmyEntryPoint,\n\t\t\t\t\t\"entryPoint does not match expected object\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Op content modification\", () => {\n\t\t\tlet containerRuntime: ContainerRuntime;\n\t\t\tlet pendingStateManager: PendingStateManager;\n\n\t\t\tbeforeEach(async () => {\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext() as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\truntimeOptions: {},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t\tpendingStateManager = (containerRuntime as any).pendingStateManager;\n\t\t\t});\n\n\t\t\tit(\"modifying op content after submit does not reflect in PendingStateManager\", () => {\n\t\t\t\tconst content = { prop1: 1 };\n\t\t\t\tsubmitDataStoreOp(containerRuntime, \"1\", content);\n\t\t\t\t(containerRuntime as any).flush();\n\n\t\t\t\tcontent.prop1 = 2;\n\n\t\t\t\tconst state = pendingStateManager.getLocalState();\n\n\t\t\t\tassert.notStrictEqual(state, undefined, \"expect pending local state\");\n\t\t\t\tassert.strictEqual(state?.pendingStates.length, 1, \"expect 1 pending message\");\n\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\tJSON.parse(state?.pendingStates?.[0].content).contents.contents,\n\t\t\t\t\t{\n\t\t\t\t\t\tprop1: 1,\n\t\t\t\t\t},\n\t\t\t\t\t\"content of pending local message has changed\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Container logging when loaded\", () => {\n\t\t\tlet mockLogger: MockLogger;\n\n\t\t\tconst localGetMockContext = (\n\t\t\t\tfeatureGates: Record<string, ConfigTypes> = {},\n\t\t\t): Partial<IContainerContext> => {\n\t\t\t\treturn {\n\t\t\t\t\tattachState: AttachState.Attached,\n\t\t\t\t\tdeltaManager: new MockDeltaManager(),\n\t\t\t\t\tquorum: new MockQuorumClients(),\n\t\t\t\t\ttaggedLogger: mixinMonitoringContext(\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tconfigProvider(featureGates),\n\t\t\t\t\t) as unknown as MockLogger,\n\t\t\t\t\tsupportedFeatures: new Map([[\"referenceSequenceNumbers\", true]]),\n\t\t\t\t\tclientDetails: { capabilities: { interactive: true } },\n\t\t\t\t\tcloseFn: (_error?: ICriticalContainerError): void => {},\n\t\t\t\t\tupdateDirtyContainerState: (_dirty: boolean) => {},\n\t\t\t\t\tgetLoadedFromVersion: () => undefined,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tbeforeEach(async () => {\n\t\t\t\tmockLogger = new MockLogger();\n\t\t\t});\n\n\t\t\tconst runtimeOptions = {\n\t\t\t\tcompressionOptions: {\n\t\t\t\t\tminimumBatchSizeInBytes: 1024 * 1024,\n\t\t\t\t\tcompressionAlgorithm: CompressionAlgorithms.lz4,\n\t\t\t\t},\n\t\t\t\tchunkSizeInBytes: 800 * 1024,\n\t\t\t\tgcOptions: {\n\t\t\t\t\tgcAllowed: true,\n\t\t\t\t},\n\t\t\t\tflushMode: FlushModeExperimental.Async as unknown as FlushMode,\n\t\t\t\tenableGroupedBatching: true,\n\t\t\t};\n\n\t\t\tconst defaultRuntimeOptions = {\n\t\t\t\tsummaryOptions: {},\n\t\t\t\tgcOptions: {},\n\t\t\t\tloadSequenceNumberVerification: \"close\",\n\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\tcompressionOptions: {\n\t\t\t\t\tminimumBatchSizeInBytes: 614400,\n\t\t\t\t\tcompressionAlgorithm: CompressionAlgorithms.lz4,\n\t\t\t\t},\n\t\t\t\tmaxBatchSizeInBytes: 700 * 1024,\n\t\t\t\tchunkSizeInBytes: 204800,\n\t\t\t\tenableRuntimeIdCompressor: \"off\",\n\t\t\t\tenableOpReentryCheck: false,\n\t\t\t\tenableGroupedBatching: false,\n\t\t\t};\n\t\t\tconst mergedRuntimeOptions = { ...defaultRuntimeOptions, ...runtimeOptions };\n\n\t\t\tit(\"Container load stats\", async () => {\n\t\t\t\tawait ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: localGetMockContext({}) as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\truntimeOptions,\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\n\t\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"ContainerRuntime:ContainerLoadStats\",\n\t\t\t\t\t\tcategory: \"generic\",\n\t\t\t\t\t\toptions: JSON.stringify(mergedRuntimeOptions),\n\t\t\t\t\t\tidCompressorMode: defaultRuntimeOptions.enableRuntimeIdCompressor,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tit(\"Container load stats with feature gate overrides\", async () => {\n\t\t\t\tconst featureGates = {\n\t\t\t\t\t\"Fluid.ContainerRuntime.CompressionDisabled\": true,\n\t\t\t\t\t\"Fluid.ContainerRuntime.CompressionChunkingDisabled\": true,\n\t\t\t\t\t\"Fluid.ContainerRuntime.DisableOpReentryCheck\": false,\n\t\t\t\t\t\"Fluid.ContainerRuntime.IdCompressorEnabled\": true,\n\t\t\t\t\t\"Fluid.ContainerRuntime.DisableGroupedBatching\": true,\n\t\t\t\t};\n\t\t\t\tawait ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: localGetMockContext(featureGates) as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\truntimeOptions,\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\n\t\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"ContainerRuntime:ContainerLoadStats\",\n\t\t\t\t\t\tcategory: \"generic\",\n\t\t\t\t\t\toptions: JSON.stringify(mergedRuntimeOptions),\n\t\t\t\t\t\tidCompressorMode: \"on\",\n\t\t\t\t\t\tfeatureGates: JSON.stringify({\n\t\t\t\t\t\t\tdisableCompression: true,\n\t\t\t\t\t\t\tdisableOpReentryCheck: false,\n\t\t\t\t\t\t\tdisableChunking: true,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tgroupedBatchingEnabled: false,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Container feature detection\", () => {\n\t\t\tconst mockLogger = new MockLogger();\n\n\t\t\tbeforeEach(() => {\n\t\t\t\tmockLogger.clear();\n\t\t\t});\n\n\t\t\tconst localGetMockContext = (\n\t\t\t\tfeatures?: ReadonlyMap<string, unknown>,\n\t\t\t): Partial<IContainerContext> => {\n\t\t\t\treturn {\n\t\t\t\t\tattachState: AttachState.Attached,\n\t\t\t\t\tdeltaManager: new MockDeltaManager(),\n\t\t\t\t\tquorum: new MockQuorumClients(),\n\t\t\t\t\ttaggedLogger: mockLogger,\n\t\t\t\t\tsupportedFeatures: features,\n\t\t\t\t\tclientDetails: { capabilities: { interactive: true } },\n\t\t\t\t\tcloseFn: (_error?: ICriticalContainerError): void => {},\n\t\t\t\t\tupdateDirtyContainerState: (_dirty: boolean) => {},\n\t\t\t\t\tgetLoadedFromVersion: () => undefined,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\t[\n\t\t\t\tundefined,\n\t\t\t\tnew Map([[\"referenceSequenceNumbers\", false]]),\n\t\t\t\tnew Map([\n\t\t\t\t\t[\"other\", true],\n\t\t\t\t\t[\"feature\", true],\n\t\t\t\t]),\n\t\t\t].forEach((features) => {\n\t\t\t\tit(\"Loader not supported for async FlushMode, fallback to TurnBased\", async () => {\n\t\t\t\t\tconst runtime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\t\tcontext: localGetMockContext(features) as IContainerContext,\n\t\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\t\texisting: false,\n\t\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\t\tflushMode: FlushModeExperimental.Async as unknown as FlushMode,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(runtime.flushMode, FlushMode.TurnBased);\n\t\t\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"ContainerRuntime:FlushModeFallback\",\n\t\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\t},\n\t\t\t\t\t]);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(\"Loader supported for async FlushMode\", async () => {\n\t\t\t\tconst runtime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: localGetMockContext(\n\t\t\t\t\t\tnew Map([[\"referenceSequenceNumbers\", true]]),\n\t\t\t\t\t) as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushModeExperimental.Async as unknown as FlushMode,\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\n\t\t\t\tassert.equal(runtime.flushMode, FlushModeExperimental.Async);\n\t\t\t\tmockLogger.assertMatchNone([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"ContainerRuntime:FlushModeFallback\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Summarization\", () => {\n\t\t\tlet containerRuntime: ContainerRuntime;\n\n\t\t\tasync function yieldEventLoop(): Promise<void> {\n\t\t\t\tconst yieldP = new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve);\n\t\t\t\t});\n\t\t\t\tclock.tick(1);\n\t\t\t\tawait yieldP;\n\t\t\t}\n\n\t\t\tbeforeEach(async () => {\n\t\t\t\tconst settings = {};\n\t\t\t\tsettings[\"Fluid.Summarizer.ValidateSummaryBeforeUpload\"] = true;\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext(settings) as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(\"summary is submitted successfully\", async () => {\n\t\t\t\tconst summarizeResult = await containerRuntime.submitSummary({\n\t\t\t\t\tsummaryLogger: createChildLogger(),\n\t\t\t\t\tcancellationToken: neverCancelledSummaryToken,\n\t\t\t\t\tlatestSummaryRefSeqNum: 0,\n\t\t\t\t});\n\t\t\t\tassert(summarizeResult.stage === \"submit\", \"Summary did not succeed\");\n\t\t\t});\n\n\t\t\tit(\"summary fails if summary token is canceled\", async () => {\n\t\t\t\tconst cancelledSummaryToken: ISummaryCancellationToken = {\n\t\t\t\t\tcancelled: true,\n\t\t\t\t\twaitCancelled: new Promise(() => {}),\n\t\t\t\t};\n\t\t\t\tconst summarizeResult = await containerRuntime.submitSummary({\n\t\t\t\t\tsummaryLogger: createChildLogger(),\n\t\t\t\t\tcancellationToken: cancelledSummaryToken,\n\t\t\t\t\tlatestSummaryRefSeqNum: 0,\n\t\t\t\t});\n\t\t\t\tassert(summarizeResult.stage === \"base\", \"Summary did not fail\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsummarizeResult.error,\n\t\t\t\t\t\"disconnected\",\n\t\t\t\t\t\"Summary was not canceled\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"summary fails before generate if there are pending ops\", async () => {\n\t\t\t\t// Submit an op and yield for it to be flushed from outbox to pending state manager.\n\t\t\t\tsubmitDataStoreOp(containerRuntime, \"fakeId\", \"fakeContents\");\n\t\t\t\tawait yieldEventLoop();\n\n\t\t\t\tconst summarizeResultP = containerRuntime.submitSummary({\n\t\t\t\t\tsummaryLogger: createChildLogger(),\n\t\t\t\t\tcancellationToken: neverCancelledSummaryToken,\n\t\t\t\t\tlatestSummaryRefSeqNum: 0,\n\t\t\t\t});\n\n\t\t\t\t// Advance the clock by the time that container runtime would wait for pending ops to be processed.\n\t\t\t\tclock.tick(defaultPendingOpsWaitTimeoutMs);\n\t\t\t\tconst summarizeResult = await summarizeResultP;\n\t\t\t\tassert(summarizeResult.stage === \"base\", \"Summary did not fail\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsummarizeResult.error.message,\n\t\t\t\t\t\"PendingOpsWhileSummarizing\",\n\t\t\t\t\t\"Summary did not fail with the right error\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsummarizeResult.error.beforeGenerate,\n\t\t\t\t\ttrue,\n\t\t\t\t\t\"It should have failed before generating summary\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"summary fails after generate if there are pending ops\", async () => {\n\t\t\t\t// Patch the summarize function to submit messages during it. This way there will be pending\n\t\t\t\t// messages after generating the summary.\n\t\t\t\tconst patch = (fn: (...args) => Promise<ISummaryTreeWithStats>) => {\n\t\t\t\t\tconst boundFn = fn.bind(containerRuntime);\n\t\t\t\t\treturn async (...args: any[]) => {\n\t\t\t\t\t\t// Submit an op and yield for it to be flushed from outbox to pending state manager.\n\t\t\t\t\t\tsubmitDataStoreOp(containerRuntime, \"fakeId\", \"fakeContents\");\n\t\t\t\t\t\tawait yieldEventLoop();\n\t\t\t\t\t\treturn boundFn(...args);\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tcontainerRuntime.summarize = patch(containerRuntime.summarize);\n\n\t\t\t\tconst summarizeResult = await containerRuntime.submitSummary({\n\t\t\t\t\tsummaryLogger: createChildLogger(),\n\t\t\t\t\tcancellationToken: neverCancelledSummaryToken,\n\t\t\t\t\tlatestSummaryRefSeqNum: 0,\n\t\t\t\t});\n\t\t\t\tassert(summarizeResult.stage === \"base\", \"Summary did not fail\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsummarizeResult.error.message,\n\t\t\t\t\t\"PendingOpsWhileSummarizing\",\n\t\t\t\t\t\"Summary did not fail with the right error\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsummarizeResult.error.beforeGenerate,\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"It should have failed after generating summary\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"summary passes if pending ops are processed during pending op processing timeout\", async () => {\n\t\t\t\t// Create a container runtime type where the submit method is public. This makes it easier to test\n\t\t\t\t// submission and processing of ops. The other option is to send data store or alias ops whose\n\t\t\t\t// processing requires creation of data store context and runtime as well.\n\t\t\t\ttype ContainerRuntimeWithSubmit = Omit<ContainerRuntime, \"submit\"> & {\n\t\t\t\t\tsubmit(\n\t\t\t\t\t\tcontainerRuntimeMessage: OutboundContainerRuntimeMessage,\n\t\t\t\t\t\tlocalOpMetadata: unknown,\n\t\t\t\t\t\tmetadata: Record<string, unknown> | undefined,\n\t\t\t\t\t): void;\n\t\t\t\t};\n\t\t\t\tconst containerRuntimeWithSubmit =\n\t\t\t\t\tcontainerRuntime as unknown as ContainerRuntimeWithSubmit;\n\t\t\t\t// Submit a rejoin op and yield for it to be flushed from outbox to pending state manager.\n\t\t\t\tcontainerRuntimeWithSubmit.submit(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: ContainerMessageType.Rejoin,\n\t\t\t\t\t\tcontents: undefined,\n\t\t\t\t\t},\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tawait yieldEventLoop();\n\n\t\t\t\t// Create a mock logger to validate that pending ops event is generated with correct params.\n\t\t\t\tconst mockLogger = new MockLogger();\n\t\t\t\tconst summaryLogger = createChildLogger({ logger: mockLogger });\n\t\t\t\tconst summarizeResultP = containerRuntime.submitSummary({\n\t\t\t\t\tsummaryLogger,\n\t\t\t\t\tcancellationToken: neverCancelledSummaryToken,\n\t\t\t\t\tlatestSummaryRefSeqNum: 0,\n\t\t\t\t});\n\n\t\t\t\t// Advance the clock by 1 ms less than the time waited for pending ops to be processed. This will allow\n\t\t\t\t// summarization to proceed far enough to wait for pending ops.\n\t\t\t\tclock.tick(defaultPendingOpsWaitTimeoutMs - 1);\n\t\t\t\t// Process the rejoin op so that there are no pending ops.\n\t\t\t\tcontainerRuntime.process(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"op\",\n\t\t\t\t\t\tclientId: \"fakeClientId\",\n\t\t\t\t\t\tsequenceNumber: 0,\n\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\ttype: ContainerMessageType.Rejoin,\n\t\t\t\t\t\t\tcontents: \"something\",\n\t\t\t\t\t\t},\n\t\t\t\t\t} as any as ISequencedDocumentMessage,\n\t\t\t\t\ttrue /* local */,\n\t\t\t\t);\n\t\t\t\t// Advance the clock by the remaining time so that pending ops wait is completed.\n\t\t\t\tclock.tick(1);\n\n\t\t\t\tconst summarizeResult = await summarizeResultP;\n\t\t\t\tassert(summarizeResult.stage === \"submit\", \"Summary did not succeed\");\n\t\t\t\tmockLogger.assertMatch([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"PendingOpsWhileSummarizing\",\n\t\t\t\t\t\tcountBefore: 1,\n\t\t\t\t\t\tcountAfter: 0,\n\t\t\t\t\t\tsaved: true,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"GetPendingState\", () => {\n\t\t\tit(\"No Props. No pending state\", async () => {\n\t\t\t\tconst logger = new MockLogger();\n\n\t\t\t\tconst containerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext({}, logger) as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\t\t\tenableRuntimeIdCompressor: \"on\",\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\n\t\t\t\tconst mockPendingStateManager = new Proxy<PendingStateManager>({} as any, {\n\t\t\t\t\tget: (_t, p: keyof PendingStateManager, _r) => {\n\t\t\t\t\t\tswitch (p) {\n\t\t\t\t\t\t\tcase \"getLocalState\":\n\t\t\t\t\t\t\t\treturn () => undefined;\n\t\t\t\t\t\t\tcase \"pendingMessagesCount\":\n\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tassert.fail(`unexpected access to pendingStateManager.${p}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\t(containerRuntime as any).pendingStateManager = mockPendingStateManager;\n\n\t\t\t\tconst state = containerRuntime.getPendingLocalState();\n\t\t\t\tassert.strictEqual(state, undefined);\n\t\t\t});\n\t\t\tit(\"No Props. Some pending state\", async () => {\n\t\t\t\tconst logger = new MockLogger();\n\n\t\t\t\tconst containerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext({}, logger) as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\t\t\tenableRuntimeIdCompressor: \"on\",\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t\tconst pendingStates = Array.from({ length: 5 }).map<IPendingMessage>((_, i) => ({\n\t\t\t\t\tcontent: i.toString(),\n\t\t\t\t\ttype: \"message\",\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\tlocalOpMetadata: undefined,\n\t\t\t\t\topMetadata: undefined,\n\t\t\t\t}));\n\t\t\t\tconst mockPendingStateManager = new Proxy<PendingStateManager>({} as any, {\n\t\t\t\t\tget: (_t, p: keyof PendingStateManager, _r) => {\n\t\t\t\t\t\tswitch (p) {\n\t\t\t\t\t\t\tcase \"getLocalState\":\n\t\t\t\t\t\t\t\treturn (): IPendingLocalState => ({\n\t\t\t\t\t\t\t\t\tpendingStates,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcase \"pendingMessagesCount\":\n\t\t\t\t\t\t\t\treturn 5;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tassert.fail(`unexpected access to pendingStateManager.${p}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\t(containerRuntime as any).pendingStateManager = mockPendingStateManager;\n\n\t\t\t\tconst state =\n\t\t\t\t\tcontainerRuntime.getPendingLocalState() as Partial<IPendingRuntimeState>;\n\t\t\t\tassert.strictEqual(typeof state, \"object\");\n\t\t\t\tassert.strictEqual(state.pending?.pendingStates, pendingStates);\n\t\t\t});\n\t\t\tit(\"notifyImminentClosure. Some pending state\", async () => {\n\t\t\t\tconst logger = new MockLogger();\n\n\t\t\t\tconst containerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: getMockContext({}, logger) as IContainerContext,\n\t\t\t\t\tregistryEntries: [],\n\t\t\t\t\texisting: false,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\t\t\tenableRuntimeIdCompressor: \"on\",\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t\tconst pendingStates = Array.from({ length: 5 }).map<IPendingMessage>((_, i) => ({\n\t\t\t\t\tcontent: i.toString(),\n\t\t\t\t\ttype: \"message\",\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\tlocalOpMetadata: undefined,\n\t\t\t\t\topMetadata: undefined,\n\t\t\t\t}));\n\t\t\t\tconst mockPendingStateManager = new Proxy<PendingStateManager>({} as any, {\n\t\t\t\t\tget: (_t, p: keyof PendingStateManager, _r) => {\n\t\t\t\t\t\tswitch (p) {\n\t\t\t\t\t\t\tcase \"getLocalState\":\n\t\t\t\t\t\t\t\treturn (): IPendingLocalState => ({\n\t\t\t\t\t\t\t\t\tpendingStates,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcase \"pendingMessagesCount\":\n\t\t\t\t\t\t\t\treturn 5;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tassert.fail(`unexpected access to pendingStateManager.${p}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\t(containerRuntime as any).pendingStateManager = mockPendingStateManager;\n\n\t\t\t\tconst stateP = containerRuntime.getPendingLocalState({\n\t\t\t\t\tnotifyImminentClosure: true,\n\t\t\t\t}) as PromiseLike<Partial<IPendingRuntimeState>>;\n\t\t\t\tassert(\"then\" in stateP, \"should be a promise like\");\n\t\t\t\tconst state = await stateP;\n\t\t\t\tassert.strictEqual(typeof state, \"object\");\n\t\t\t\tassert.strictEqual(state.pending?.pendingStates, pendingStates);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Load Partial Snapshot with datastores with GroupId\", () => {\n\t\t\tlet snapshotWithContents: ISnapshot;\n\t\t\tlet blobContents: Map<string, ArrayBuffer>;\n\t\t\tlet ops: ISequencedDocumentMessage[];\n\t\t\tlet containerRuntime: ContainerRuntime;\n\t\t\tlet containerContext: IContainerContext;\n\t\t\tlet entryDefault: FluidDataStoreRegistryEntry;\n\t\t\tlet snapshotTree: ISnapshotTree;\n\t\t\tlet missingDataStoreRuntime: MockFluidDataStoreRuntime;\n\t\t\tbeforeEach(async () => {\n\t\t\t\tsnapshotTree = {\n\t\t\t\t\tid: \"SnapshotId\",\n\t\t\t\t\tblobs: { \".metadata\": \"bARD4RKvW4LL1KmaUKp6hUMSp\" },\n\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\".channels\": {\n\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\t\tblobs: {\n\t\t\t\t\t\t\t\t\t\t\".component\": \"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\t\t\".channels\": {\n\t\t\t\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\t\t\t\troot: { blobs: {}, trees: {} },\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tunreferenced: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\".blobs\": { blobs: {}, trees: {} },\n\t\t\t\t\t\t\"gc\": {\n\t\t\t\t\t\t\tid: \"e8ed0760ac37fd8042020559779ce80b1d88f266\",\n\t\t\t\t\t\t\tblobs: {\n\t\t\t\t\t\t\t\t__gc_root: \"018d97818f8b519f99c418cb3c33ce5cc4e38e3f\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttrees: {},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tblobContents = new Map<string, ArrayBuffer>([\n\t\t\t\t\t[\n\t\t\t\t\t\t\"bARD4RKvW4LL1KmaUKp6hUMSp\",\n\t\t\t\t\t\tstringToBuffer(\n\t\t\t\t\t\t\tJSON.stringify({ summaryFormatVersion: 1, gcFeature: 3 }),\n\t\t\t\t\t\t\t\"utf8\",\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t\"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\t\t\t\t\tstringToBuffer(\n\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\tpkg: '[\"@fluid-example/smde\"]',\n\t\t\t\t\t\t\t\tsummaryFormatVersion: 2,\n\t\t\t\t\t\t\t\tisRootDataStore: true,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\"utf8\",\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t\"018d97818f8b519f99c418cb3c33ce5cc4e38e3f\",\n\t\t\t\t\t\tstringToBuffer(\n\t\t\t\t\t\t\tJSON.parse(\n\t\t\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\t\t\t'{\"gcNodes\":{\"/\":{\"outboundRoutes\":[\"/rootDOId\"]},\"/rootDOId\":{\"outboundRoutes\":[\"/rootDOId/de68ca53-be31-479e-8d34-a267958997e4\",\"/rootDOId/root\"]},\"/rootDOId/de68ca53-be31-479e-8d34-a267958997e4\":{\"outboundRoutes\":[\"/rootDOId\"]},\"/rootDOId/root\":{\"outboundRoutes\":[\"/rootDOId\",\"/rootDOId/de68ca53-be31-479e-8d34-a267958997e4\"]}}}',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\"utf8\",\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t]);\n\n\t\t\t\tops = [\n\t\t\t\t\t{\n\t\t\t\t\t\tclientId: \"X\",\n\t\t\t\t\t\tclientSequenceNumber: -1,\n\t\t\t\t\t\tcontents: null,\n\t\t\t\t\t\tminimumSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: -1,\n\t\t\t\t\t\tsequenceNumber: 1,\n\t\t\t\t\t\ttimestamp: 1623883807452,\n\t\t\t\t\t\ttype: \"join\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tclientId: \"Y\",\n\t\t\t\t\t\tclientSequenceNumber: -1,\n\t\t\t\t\t\tcontents: null,\n\t\t\t\t\t\tminimumSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: -1,\n\t\t\t\t\t\tsequenceNumber: 2,\n\t\t\t\t\t\ttimestamp: 1623883811928,\n\t\t\t\t\t\ttype: \"join\",\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t\tsnapshotWithContents = {\n\t\t\t\t\tblobContents,\n\t\t\t\t\tops,\n\t\t\t\t\tsnapshotTree,\n\t\t\t\t\tsequenceNumber: 0,\n\t\t\t\t\tsnapshotFormatV: 1,\n\t\t\t\t\tlatestSequenceNumber: 2,\n\t\t\t\t};\n\n\t\t\t\tconst logger = new MockLogger();\n\t\t\t\tcontainerContext = getMockContext({}, logger) as IContainerContext;\n\n\t\t\t\t(containerContext as any).snapshotWithContents = snapshotWithContents;\n\t\t\t\t(containerContext as any).baseSnapshot = snapshotWithContents.snapshotTree;\n\t\t\t\tcontainerContext.storage.readBlob = async (id: string) => {\n\t\t\t\t\treturn blobContents.get(id) as ArrayBuffer;\n\t\t\t\t};\n\t\t\t\tmissingDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\t\t\tconst entryA = createDataStoreRegistryEntry([]);\n\t\t\t\tconst entryB = createDataStoreRegistryEntry([]);\n\t\t\t\tentryDefault = createDataStoreRegistryEntry([\n\t\t\t\t\t[\"default\", Promise.resolve(entryA)],\n\t\t\t\t\t[\"missingDataStore\", Promise.resolve(entryB)],\n\t\t\t\t]);\n\n\t\t\t\tlogger.clear();\n\t\t\t});\n\n\t\t\tfunction createSnapshot(addMissindDatasore: boolean, setGroupId: boolean = true) {\n\t\t\t\tif (addMissindDatasore) {\n\t\t\t\t\tsnapshotTree.trees[\".channels\"].trees.missingDataStore = {\n\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\ttrees: {},\n\t\t\t\t\t\tgroupId: setGroupId ? \"G1\" : undefined,\n\t\t\t\t\t\tomitted: true,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Helper function that creates a FluidDataStoreRegistryEntry with the registry entries\n\t\t\t// provided to it.\n\t\t\tfunction createDataStoreRegistryEntry(\n\t\t\t\tentries: NamedFluidDataStoreRegistryEntries,\n\t\t\t): FluidDataStoreRegistryEntry {\n\t\t\t\tconst registryEntries = new Map(entries);\n\t\t\t\tconst factory: IFluidDataStoreFactory = {\n\t\t\t\t\ttype: \"store-type\",\n\t\t\t\t\tget IFluidDataStoreFactory() {\n\t\t\t\t\t\treturn factory;\n\t\t\t\t\t},\n\t\t\t\t\tinstantiateDataStore: async (context: IFluidDataStoreContext) => {\n\t\t\t\t\t\tif (context.id === \"missingDataStore\") {\n\t\t\t\t\t\t\treturn missingDataStoreRuntime;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn new MockFluidDataStoreRuntime();\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst registry: IFluidDataStoreRegistry = {\n\t\t\t\t\tget IFluidDataStoreRegistry() {\n\t\t\t\t\t\treturn registry;\n\t\t\t\t\t},\n\t\t\t\t\t// Returns the registry entry as per the entries provided in the param.\n\t\t\t\t\tget: async (pkg) => registryEntries.get(pkg),\n\t\t\t\t};\n\n\t\t\t\tconst entry: FluidDataStoreRegistryEntry = {\n\t\t\t\t\tget IFluidDataStoreFactory() {\n\t\t\t\t\t\treturn factory;\n\t\t\t\t\t},\n\t\t\t\t\tget IFluidDataStoreRegistry() {\n\t\t\t\t\t\treturn registry;\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\treturn entry;\n\t\t\t}\n\n\t\t\tit(\"Load snapshot with missing snapshot contents for datastores should fail when groupId not specified\", async () => {\n\t\t\t\t// In this test we will try to load the container runtime with a snapshot which has 2 datastores. However,\n\t\t\t\t// snapshot for datastore \"missingDataStore\" is omitted and we will check that the container runtime loads fine\n\t\t\t\t// but the \"missingDataStore\" is aliased, it fails if the snapshot for it does not have loadingGroupId to fetch\n\t\t\t\t// the omitted snapshot contents.\n\t\t\t\tcreateSnapshot(\n\t\t\t\t\ttrue /* addMissingDatastore */,\n\t\t\t\t\tfalse /* Don't set groupId property */,\n\t\t\t\t);\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: containerContext,\n\t\t\t\t\tregistryEntries: [[\"@fluid-example/smde\", Promise.resolve(entryDefault)]],\n\t\t\t\t\texisting: true,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\t\t\tenableRuntimeIdCompressor: \"on\",\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t\tconst defaultDataStore =\n\t\t\t\t\tawait containerRuntime.getAliasedDataStoreEntryPoint(\"default\");\n\t\t\t\tassert(defaultDataStore !== undefined, \"data store should load and is attached\");\n\t\t\t\tawait assert.rejects(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tawait containerRuntime.getAliasedDataStoreEntryPoint(\"missingDataStore\");\n\t\t\t\t\t},\n\t\t\t\t\t(err: IFluidErrorBase) => {\n\t\t\t\t\t\tvalidateAssertionError(err, \"groupId should be present to fetch snapshot\");\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Load snapshot with missing snapshot contents for datastores should fail for summarizer in case group snapshot is ahead of initial snapshot seq number\", async () => {\n\t\t\t\t// In this test we will try to load the container runtime with a snapshot which has 2 datastores. However,\n\t\t\t\t// snapshot for datastore \"missingDataStore\" is omitted and we will check that the container runtime loads fine\n\t\t\t\t// but the \"missingDataStore\" is requested/aliased, it fails to because for summarizer the fetched snapshot could\n\t\t\t\t// not be ahead of the base snapshot as that means that a snapshot is missing and the summarizer is not up to date.\n\t\t\t\tcontainerContext.storage.getSnapshot = async (snapshotFetchOptions) => {\n\t\t\t\t\tsnapshotTree.trees[\".channels\"].trees.missingDataStore = {\n\t\t\t\t\t\tblobs: {\n\t\t\t\t\t\t\t\".component\": \"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\".channels\": {\n\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\troot: { blobs: {}, trees: {} },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tsnapshotWithContents.sequenceNumber = 10;\n\t\t\t\t\treturn snapshotWithContents;\n\t\t\t\t};\n\t\t\t\tcreateSnapshot(true /* addMissingDatastore */);\n\t\t\t\tcontainerContext.clientDetails.type = \"summarizer\";\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: containerContext,\n\t\t\t\t\tregistryEntries: [[\"@fluid-example/smde\", Promise.resolve(entryDefault)]],\n\t\t\t\t\texisting: true,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\t\t\tenableRuntimeIdCompressor: \"on\",\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t\tconst defaultDataStore =\n\t\t\t\t\tawait containerRuntime.getAliasedDataStoreEntryPoint(\"default\");\n\t\t\t\tassert(defaultDataStore !== undefined, \"data store should load and is attached\");\n\t\t\t\tawait assert.rejects(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tawait containerRuntime.getAliasedDataStoreEntryPoint(\"missingDataStore\");\n\t\t\t\t\t},\n\t\t\t\t\t(err: IFluidErrorBase) => {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\terr.message ===\n\t\t\t\t\t\t\t\t\"Summarizer client behind, loaded newer snapshot with loadingGroupId\",\n\t\t\t\t\t\t\t\"summarizer client is behind\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Load snapshot with missing snapshot contents for datastores should load properly\", async () => {\n\t\t\t\t// In this test we will try to load the container runtime with a snapshot which has 2 datastores. However,\n\t\t\t\t// snapshot for datastore \"missingDataStore\" is omitted and we will check that the container runtime loads fine\n\t\t\t\t// container runtime loads fine and when the \"missingDataStore\" is requested/aliased, it does that successfully.\n\t\t\t\tlet getSnapshotCalledTimes = 0;\n\t\t\t\tcontainerContext.storage.getSnapshot = async (snapshotFetchOptions) => {\n\t\t\t\t\tgetSnapshotCalledTimes++;\n\t\t\t\t\tsnapshotTree.trees[\".channels\"].trees.missingDataStore = {\n\t\t\t\t\t\tblobs: {\n\t\t\t\t\t\t\t\".component\": \"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\".channels\": {\n\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\troot: { blobs: {}, trees: {} },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\treturn snapshotWithContents;\n\t\t\t\t};\n\t\t\t\tcreateSnapshot(true /* addMissingDatastore */);\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: containerContext,\n\t\t\t\t\tregistryEntries: [[\"@fluid-example/smde\", Promise.resolve(entryDefault)]],\n\t\t\t\t\texisting: true,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\t\t\tenableRuntimeIdCompressor: \"on\",\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t\tconst defaultDataStore =\n\t\t\t\t\tawait containerRuntime.getAliasedDataStoreEntryPoint(\"default\");\n\t\t\t\tassert(defaultDataStore !== undefined, \"data store should load and is attached\");\n\t\t\t\tawait assert.doesNotReject(async () => {\n\t\t\t\t\tawait containerRuntime.resolveHandle({ url: \"/missingDataStore\" });\n\t\t\t\t}, \"resolveHandle should work fine\");\n\n\t\t\t\t// Now try to get snapshot for missing data store again from container runtime. It should be returned\n\t\t\t\t// from cache.\n\t\t\t\tconst snapshot = await containerRuntime.getSnapshotForLoadingGroupId(\n\t\t\t\t\t[\"G1\"],\n\t\t\t\t\t[\"missingDataStore\"],\n\t\t\t\t);\n\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\tsnapshotTree.trees[\".channels\"].trees.missingDataStore,\n\t\t\t\t\tsnapshot.snapshotTree,\n\t\t\t\t\t\"snapshot should be equal\",\n\t\t\t\t);\n\t\t\t\tassert(getSnapshotCalledTimes === 1, \"second time should be from cache\");\n\n\t\t\t\t// Set api to undefined to see that it should not be called again.\n\t\t\t\tcontainerContext.storage.getSnapshot = undefined;\n\t\t\t\tawait assert.doesNotReject(async () => {\n\t\t\t\t\tawait containerRuntime.resolveHandle({ url: \"/missingDataStore\" });\n\t\t\t\t}, \"resolveHandle should work fine\");\n\t\t\t});\n\n\t\t\tit(\"Load snapshot with missing snapshot contents for datastores should work in case group snapshot is ahead of initial snapshot seq number\", async () => {\n\t\t\t\t// In this test we will try to load the container runtime with a snapshot which has 2 datastores. However,\n\t\t\t\t// snapshot for datastore \"missingDataStore\" is omitted and we will check that the container runtime loads fine\n\t\t\t\t// and the container runtime waits for delta manager to reach snapshot seq number before returning the snapshot.\n\t\t\t\tcontainerContext.storage.getSnapshot = async (snapshotFetchOptions) => {\n\t\t\t\t\tsnapshotTree.trees[\".channels\"].trees.missingDataStore = {\n\t\t\t\t\t\tblobs: {\n\t\t\t\t\t\t\t\".component\": \"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\".channels\": {\n\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\troot: { blobs: {}, trees: {} },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tsnapshotWithContents.sequenceNumber = 5;\n\t\t\t\t\treturn snapshotWithContents;\n\t\t\t\t};\n\t\t\t\tcreateSnapshot(true /* addMissingDatastore */);\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: containerContext,\n\t\t\t\t\tregistryEntries: [[\"@fluid-example/smde\", Promise.resolve(entryDefault)]],\n\t\t\t\t\texisting: true,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\t\t\tenableRuntimeIdCompressor: \"on\",\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t\tconst defaultDataStore =\n\t\t\t\t\tawait containerRuntime.getAliasedDataStoreEntryPoint(\"default\");\n\t\t\t\tassert(defaultDataStore !== undefined, \"data store should load and is attached\");\n\t\t\t\t// Set it to seq number of partial fetched snapshot so that it is returned successfully by container runtime.\n\t\t\t\t(containerContext.deltaManager as any).lastSequenceNumber = 5;\n\n\t\t\t\tawait assert.doesNotReject(async () => {\n\t\t\t\t\tawait containerRuntime.resolveHandle({ url: \"/missingDataStore\" });\n\t\t\t\t}, \"resolveHandle should work fine\");\n\t\t\t});\n\n\t\t\tit(\"Load snapshot with missing snapshot contents for datastores should only process ops in datastore context which are after the snapshot seq number\", async () => {\n\t\t\t\t// In this test we will try to load the container runtime with a snapshot which has 2 datastores. However,\n\t\t\t\t// snapshot for datastore \"missingDataStore\" is omitted and we will check that the container runtime loads fine\n\t\t\t\t// and the data store context only process ops which are after the snapshot seq number.\n\t\t\t\tcontainerContext.storage.getSnapshot = async (snapshotFetchOptions) => {\n\t\t\t\t\tsnapshotTree.trees[\".channels\"].trees.missingDataStore = {\n\t\t\t\t\t\tblobs: {\n\t\t\t\t\t\t\t\".component\": \"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\".channels\": {\n\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\troot: { blobs: {}, trees: {} },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tsnapshotWithContents.sequenceNumber = 2;\n\t\t\t\t\treturn snapshotWithContents;\n\t\t\t\t};\n\t\t\t\tcreateSnapshot(true /* addMissingDatastore */);\n\t\t\t\tcontainerRuntime = await ContainerRuntime.loadRuntime({\n\t\t\t\t\tcontext: containerContext,\n\t\t\t\t\tregistryEntries: [[\"@fluid-example/smde\", Promise.resolve(entryDefault)]],\n\t\t\t\t\texisting: true,\n\t\t\t\t\truntimeOptions: {\n\t\t\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\t\t\tenableRuntimeIdCompressor: \"on\",\n\t\t\t\t\t},\n\t\t\t\t\tprovideEntryPoint: mockProvideEntryPoint,\n\t\t\t\t});\n\t\t\t\tconst defaultDataStore =\n\t\t\t\t\tawait containerRuntime.getAliasedDataStoreEntryPoint(\"default\");\n\t\t\t\tassert(defaultDataStore !== undefined, \"data store should load and is attached\");\n\t\t\t\tconst missingDataStoreContext =\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\t\tcontainerRuntime[\"channelCollection\"][\"contexts\"].get(\"missingDataStore\");\n\t\t\t\tassert(missingDataStoreContext !== undefined, \"context should be there\");\n\t\t\t\t// Add ops to this context.\n\t\t\t\tconst messages = [\n\t\t\t\t\t{ sequenceNumber: 1 },\n\t\t\t\t\t{ sequenceNumber: 2 },\n\t\t\t\t\t{ sequenceNumber: 3 },\n\t\t\t\t\t{ sequenceNumber: 4 },\n\t\t\t\t];\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\tmissingDataStoreContext[\"pending\"] = messages as ISequencedDocumentMessage[];\n\n\t\t\t\t// Set it to seq number of partial fetched snapshot so that it is returned successfully by container runtime.\n\t\t\t\t(containerContext.deltaManager as any).lastSequenceNumber = 2;\n\n\t\t\t\tlet opsProcessed = 0;\n\t\t\t\tlet opsStart: number | undefined;\n\t\t\t\tmissingDataStoreRuntime.process = (\n\t\t\t\t\tmessage: ISequencedDocumentMessage,\n\t\t\t\t\tlocal: boolean,\n\t\t\t\t\tlocalOpMetadata,\n\t\t\t\t) => {\n\t\t\t\t\tif (opsProcessed === 0) {\n\t\t\t\t\t\topsStart = message.sequenceNumber;\n\t\t\t\t\t}\n\t\t\t\t\topsProcessed++;\n\t\t\t\t};\n\t\t\t\tawait assert.doesNotReject(async () => {\n\t\t\t\t\tawait containerRuntime.resolveHandle({ url: \"/missingDataStore\" });\n\t\t\t\t}, \"resolveHandle should work fine\");\n\n\t\t\t\tassert(\n\t\t\t\t\topsProcessed === 2,\n\t\t\t\t\t\"only 2 ops should be processed with seq number 3 and 4\",\n\t\t\t\t);\n\t\t\t\tassert(opsStart === 3, \"first op processed should have seq number 3\");\n\t\t\t});\n\t\t});\n\t});\n});\n"]}