@fluidframework/container-runtime 2.0.0-dev-rc.3.0.0.250606 → 2.0.0-dev-rc.3.0.0.254274

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 (486) hide show
  1. package/api-report/container-runtime.api.md +35 -34
  2. package/dist/batchTracker.d.ts.map +1 -1
  3. package/dist/batchTracker.js +4 -4
  4. package/dist/batchTracker.js.map +1 -1
  5. package/dist/blobManager.d.ts +31 -23
  6. package/dist/blobManager.d.ts.map +1 -1
  7. package/dist/blobManager.js +81 -99
  8. package/dist/blobManager.js.map +1 -1
  9. package/dist/channelCollection.d.ts +4 -2
  10. package/dist/channelCollection.d.ts.map +1 -1
  11. package/dist/channelCollection.js +75 -72
  12. package/dist/channelCollection.js.map +1 -1
  13. package/dist/connectionTelemetry.d.ts +1 -1
  14. package/dist/connectionTelemetry.d.ts.map +1 -1
  15. package/dist/connectionTelemetry.js +16 -16
  16. package/dist/connectionTelemetry.js.map +1 -1
  17. package/dist/container-runtime-alpha.d.ts +64 -36
  18. package/dist/container-runtime-beta.d.ts +28 -28
  19. package/dist/container-runtime-public.d.ts +28 -28
  20. package/dist/container-runtime-untrimmed.d.ts +68 -39
  21. package/dist/containerHandleContext.d.ts.map +1 -1
  22. package/dist/containerHandleContext.js +2 -2
  23. package/dist/containerHandleContext.js.map +1 -1
  24. package/dist/containerRuntime.d.ts +12 -8
  25. package/dist/containerRuntime.d.ts.map +1 -1
  26. package/dist/containerRuntime.js +197 -162
  27. package/dist/containerRuntime.js.map +1 -1
  28. package/dist/dataStore.d.ts +1 -1
  29. package/dist/dataStore.d.ts.map +1 -1
  30. package/dist/dataStore.js +7 -7
  31. package/dist/dataStore.js.map +1 -1
  32. package/dist/dataStoreContext.d.ts +9 -9
  33. package/dist/dataStoreContext.d.ts.map +1 -1
  34. package/dist/dataStoreContext.js +72 -62
  35. package/dist/dataStoreContext.js.map +1 -1
  36. package/dist/dataStoreContexts.d.ts.map +1 -1
  37. package/dist/dataStoreContexts.js +11 -11
  38. package/dist/dataStoreContexts.js.map +1 -1
  39. package/dist/dataStoreRegistry.d.ts +1 -1
  40. package/dist/dataStoreRegistry.d.ts.map +1 -1
  41. package/dist/dataStoreRegistry.js +2 -2
  42. package/dist/dataStoreRegistry.js.map +1 -1
  43. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  44. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  45. package/dist/deltaManagerSummarizerProxy.js.map +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 +2 -1
  54. package/dist/gc/garbageCollection.d.ts.map +1 -1
  55. package/dist/gc/garbageCollection.js +20 -20
  56. package/dist/gc/garbageCollection.js.map +1 -1
  57. package/dist/gc/gcConfigs.d.ts +1 -1
  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 +3 -2
  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 +1 -1
  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/messageTypes.d.ts +2 -2
  84. package/dist/messageTypes.d.ts.map +1 -1
  85. package/dist/messageTypes.js.map +1 -1
  86. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  87. package/dist/opLifecycle/batchManager.js.map +1 -1
  88. package/dist/opLifecycle/definitions.d.ts +1 -1
  89. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  90. package/dist/opLifecycle/definitions.js.map +1 -1
  91. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  92. package/dist/opLifecycle/opCompressor.js +5 -5
  93. package/dist/opLifecycle/opCompressor.js.map +1 -1
  94. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  95. package/dist/opLifecycle/opDecompressor.js +12 -12
  96. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  97. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  98. package/dist/opLifecycle/opGroupingManager.js +7 -7
  99. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  100. package/dist/opLifecycle/opSplitter.d.ts +1 -1
  101. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  102. package/dist/opLifecycle/opSplitter.js +17 -17
  103. package/dist/opLifecycle/opSplitter.js.map +1 -1
  104. package/dist/opLifecycle/outbox.d.ts +2 -1
  105. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  106. package/dist/opLifecycle/outbox.js +13 -13
  107. package/dist/opLifecycle/outbox.js.map +1 -1
  108. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  109. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  110. package/dist/packageVersion.d.ts +1 -1
  111. package/dist/packageVersion.js +1 -1
  112. package/dist/packageVersion.js.map +1 -1
  113. package/dist/pendingStateManager.d.ts.map +1 -1
  114. package/dist/pendingStateManager.js +18 -18
  115. package/dist/pendingStateManager.js.map +1 -1
  116. package/dist/scheduleManager.d.ts.map +1 -1
  117. package/dist/scheduleManager.js +24 -24
  118. package/dist/scheduleManager.js.map +1 -1
  119. package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
  120. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
  121. package/dist/storageServiceWithAttachBlobs.js +2 -2
  122. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  123. package/dist/summary/documentSchema.d.ts +37 -6
  124. package/dist/summary/documentSchema.d.ts.map +1 -1
  125. package/dist/summary/documentSchema.js +58 -21
  126. package/dist/summary/documentSchema.js.map +1 -1
  127. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  128. package/dist/summary/orderedClientElection.js +7 -7
  129. package/dist/summary/orderedClientElection.js.map +1 -1
  130. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  131. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  132. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  133. package/dist/summary/runningSummarizer.d.ts +1 -1
  134. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  135. package/dist/summary/runningSummarizer.js +16 -16
  136. package/dist/summary/runningSummarizer.js.map +1 -1
  137. package/dist/summary/summarizer.d.ts +2 -1
  138. package/dist/summary/summarizer.d.ts.map +1 -1
  139. package/dist/summary/summarizer.js +12 -12
  140. package/dist/summary/summarizer.js.map +1 -1
  141. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  142. package/dist/summary/summarizerClientElection.js.map +1 -1
  143. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  144. package/dist/summary/summarizerHeuristics.js +2 -2
  145. package/dist/summary/summarizerHeuristics.js.map +1 -1
  146. package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -1
  147. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  148. package/dist/summary/summarizerNode/summarizerNode.js +28 -28
  149. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  150. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  151. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  152. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  153. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  154. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  155. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  156. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
  157. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  158. package/dist/summary/summarizerTypes.d.ts +4 -2
  159. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  160. package/dist/summary/summarizerTypes.js.map +1 -1
  161. package/dist/summary/summaryCollection.js +7 -7
  162. package/dist/summary/summaryCollection.js.map +1 -1
  163. package/dist/summary/summaryFormat.d.ts +1 -1
  164. package/dist/summary/summaryFormat.d.ts.map +1 -1
  165. package/dist/summary/summaryFormat.js +8 -8
  166. package/dist/summary/summaryFormat.js.map +1 -1
  167. package/dist/summary/summaryGenerator.d.ts +3 -2
  168. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  169. package/dist/summary/summaryGenerator.js +16 -16
  170. package/dist/summary/summaryGenerator.js.map +1 -1
  171. package/dist/summary/summaryManager.d.ts.map +1 -1
  172. package/dist/summary/summaryManager.js +15 -14
  173. package/dist/summary/summaryManager.js.map +1 -1
  174. package/lib/batchTracker.d.ts.map +1 -1
  175. package/lib/batchTracker.js +2 -2
  176. package/lib/batchTracker.js.map +1 -1
  177. package/lib/blobManager.d.ts +31 -23
  178. package/lib/blobManager.d.ts.map +1 -1
  179. package/lib/blobManager.js +46 -64
  180. package/lib/blobManager.js.map +1 -1
  181. package/lib/channelCollection.d.ts +4 -2
  182. package/lib/channelCollection.d.ts.map +1 -1
  183. package/lib/channelCollection.js +10 -7
  184. package/lib/channelCollection.js.map +1 -1
  185. package/lib/connectionTelemetry.d.ts +1 -1
  186. package/lib/connectionTelemetry.d.ts.map +1 -1
  187. package/lib/connectionTelemetry.js +2 -2
  188. package/lib/connectionTelemetry.js.map +1 -1
  189. package/lib/container-runtime-alpha.d.ts +64 -36
  190. package/lib/container-runtime-beta.d.ts +28 -28
  191. package/lib/container-runtime-public.d.ts +28 -28
  192. package/lib/container-runtime-untrimmed.d.ts +68 -39
  193. package/lib/containerHandleContext.d.ts.map +1 -1
  194. package/lib/containerHandleContext.js +1 -1
  195. package/lib/containerHandleContext.js.map +1 -1
  196. package/lib/containerRuntime.d.ts +12 -8
  197. package/lib/containerRuntime.d.ts.map +1 -1
  198. package/lib/containerRuntime.js +76 -39
  199. package/lib/containerRuntime.js.map +1 -1
  200. package/lib/dataStore.d.ts +1 -1
  201. package/lib/dataStore.d.ts.map +1 -1
  202. package/lib/dataStore.js +2 -2
  203. package/lib/dataStore.js.map +1 -1
  204. package/lib/dataStoreContext.d.ts +9 -9
  205. package/lib/dataStoreContext.d.ts.map +1 -1
  206. package/lib/dataStoreContext.js +18 -8
  207. package/lib/dataStoreContext.js.map +1 -1
  208. package/lib/dataStoreContexts.d.ts.map +1 -1
  209. package/lib/dataStoreContexts.js +2 -2
  210. package/lib/dataStoreContexts.js.map +1 -1
  211. package/lib/dataStoreRegistry.d.ts +1 -1
  212. package/lib/dataStoreRegistry.d.ts.map +1 -1
  213. package/lib/dataStoreRegistry.js +1 -1
  214. package/lib/dataStoreRegistry.js.map +1 -1
  215. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  216. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  217. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  218. package/lib/deltaScheduler.d.ts.map +1 -1
  219. package/lib/deltaScheduler.js +1 -1
  220. package/lib/deltaScheduler.js.map +1 -1
  221. package/lib/error.d.ts +1 -1
  222. package/lib/error.d.ts.map +1 -1
  223. package/lib/error.js +2 -2
  224. package/lib/error.js.map +1 -1
  225. package/lib/gc/garbageCollection.d.ts +2 -1
  226. package/lib/gc/garbageCollection.d.ts.map +1 -1
  227. package/lib/gc/garbageCollection.js +4 -4
  228. package/lib/gc/garbageCollection.js.map +1 -1
  229. package/lib/gc/gcConfigs.d.ts +1 -1
  230. package/lib/gc/gcConfigs.d.ts.map +1 -1
  231. package/lib/gc/gcConfigs.js +4 -5
  232. package/lib/gc/gcConfigs.js.map +1 -1
  233. package/lib/gc/gcDefinitions.d.ts +3 -2
  234. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  235. package/lib/gc/gcDefinitions.js.map +1 -1
  236. package/lib/gc/gcHelpers.d.ts +5 -1
  237. package/lib/gc/gcHelpers.d.ts.map +1 -1
  238. package/lib/gc/gcHelpers.js +10 -2
  239. package/lib/gc/gcHelpers.js.map +1 -1
  240. package/lib/gc/gcSummaryStateTracker.d.ts +1 -1
  241. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  242. package/lib/gc/gcSummaryStateTracker.js +2 -2
  243. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  244. package/lib/gc/gcTelemetry.d.ts +2 -1
  245. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  246. package/lib/gc/gcTelemetry.js +3 -1
  247. package/lib/gc/gcTelemetry.js.map +1 -1
  248. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  249. package/lib/gc/gcUnreferencedStateTracker.js +2 -2
  250. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  251. package/lib/gc/index.d.ts +1 -1
  252. package/lib/gc/index.d.ts.map +1 -1
  253. package/lib/gc/index.js +1 -1
  254. package/lib/gc/index.js.map +1 -1
  255. package/lib/messageTypes.d.ts +2 -2
  256. package/lib/messageTypes.d.ts.map +1 -1
  257. package/lib/messageTypes.js.map +1 -1
  258. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  259. package/lib/opLifecycle/batchManager.js.map +1 -1
  260. package/lib/opLifecycle/definitions.d.ts +1 -1
  261. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  262. package/lib/opLifecycle/definitions.js.map +1 -1
  263. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  264. package/lib/opLifecycle/opCompressor.js +2 -2
  265. package/lib/opLifecycle/opCompressor.js.map +1 -1
  266. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  267. package/lib/opLifecycle/opDecompressor.js +2 -2
  268. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  269. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  270. package/lib/opLifecycle/opGroupingManager.js +2 -2
  271. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  272. package/lib/opLifecycle/opSplitter.d.ts +1 -1
  273. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  274. package/lib/opLifecycle/opSplitter.js +2 -2
  275. package/lib/opLifecycle/opSplitter.js.map +1 -1
  276. package/lib/opLifecycle/outbox.d.ts +2 -1
  277. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  278. package/lib/opLifecycle/outbox.js +2 -2
  279. package/lib/opLifecycle/outbox.js.map +1 -1
  280. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  281. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  282. package/lib/packageVersion.d.ts +1 -1
  283. package/lib/packageVersion.js +1 -1
  284. package/lib/packageVersion.js.map +1 -1
  285. package/lib/pendingStateManager.d.ts.map +1 -1
  286. package/lib/pendingStateManager.js +2 -2
  287. package/lib/pendingStateManager.js.map +1 -1
  288. package/lib/scheduleManager.d.ts.map +1 -1
  289. package/lib/scheduleManager.js +3 -3
  290. package/lib/scheduleManager.js.map +1 -1
  291. package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
  292. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
  293. package/lib/storageServiceWithAttachBlobs.js +1 -1
  294. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  295. package/lib/summary/documentSchema.d.ts +37 -6
  296. package/lib/summary/documentSchema.d.ts.map +1 -1
  297. package/lib/summary/documentSchema.js +48 -11
  298. package/lib/summary/documentSchema.js.map +1 -1
  299. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  300. package/lib/summary/orderedClientElection.js +2 -2
  301. package/lib/summary/orderedClientElection.js.map +1 -1
  302. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  303. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  304. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  305. package/lib/summary/runningSummarizer.d.ts +1 -1
  306. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  307. package/lib/summary/runningSummarizer.js +2 -2
  308. package/lib/summary/runningSummarizer.js.map +1 -1
  309. package/lib/summary/summarizer.d.ts +2 -1
  310. package/lib/summary/summarizer.d.ts.map +1 -1
  311. package/lib/summary/summarizer.js +2 -2
  312. package/lib/summary/summarizer.js.map +1 -1
  313. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  314. package/lib/summary/summarizerClientElection.js.map +1 -1
  315. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  316. package/lib/summary/summarizerHeuristics.js +1 -1
  317. package/lib/summary/summarizerHeuristics.js.map +1 -1
  318. package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -1
  319. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  320. package/lib/summary/summarizerNode/summarizerNode.js +4 -4
  321. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  322. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  323. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  324. package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
  325. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  326. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  327. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  328. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  329. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  330. package/lib/summary/summarizerTypes.d.ts +4 -2
  331. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  332. package/lib/summary/summarizerTypes.js.map +1 -1
  333. package/lib/summary/summaryCollection.js +1 -1
  334. package/lib/summary/summaryCollection.js.map +1 -1
  335. package/lib/summary/summaryFormat.d.ts +1 -1
  336. package/lib/summary/summaryFormat.d.ts.map +1 -1
  337. package/lib/summary/summaryFormat.js +3 -3
  338. package/lib/summary/summaryFormat.js.map +1 -1
  339. package/lib/summary/summaryGenerator.d.ts +3 -2
  340. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  341. package/lib/summary/summaryGenerator.js +3 -3
  342. package/lib/summary/summaryGenerator.js.map +1 -1
  343. package/lib/summary/summaryManager.d.ts.map +1 -1
  344. package/lib/summary/summaryManager.js +9 -8
  345. package/lib/summary/summaryManager.js.map +1 -1
  346. package/lib/tsdoc-metadata.json +11 -0
  347. package/package.json +25 -37
  348. package/src/batchTracker.ts +3 -2
  349. package/src/blobManager.ts +87 -56
  350. package/src/channelCollection.ts +19 -12
  351. package/src/connectionTelemetry.ts +4 -4
  352. package/src/containerHandleContext.ts +2 -1
  353. package/src/containerRuntime.ts +115 -70
  354. package/src/dataStore.ts +5 -3
  355. package/src/dataStoreContext.ts +30 -15
  356. package/src/dataStoreContexts.ts +4 -2
  357. package/src/dataStoreRegistry.ts +2 -2
  358. package/src/deltaManagerSummarizerProxy.ts +1 -1
  359. package/src/deltaScheduler.ts +2 -1
  360. package/src/error.ts +2 -2
  361. package/src/gc/garbageCollection.ts +8 -7
  362. package/src/gc/gcConfigs.ts +5 -8
  363. package/src/gc/gcDefinitions.ts +4 -4
  364. package/src/gc/gcHelpers.ts +21 -4
  365. package/src/gc/gcSummaryStateTracker.ts +5 -3
  366. package/src/gc/gcTelemetry.ts +7 -1
  367. package/src/gc/gcUnreferencedStateTracker.ts +3 -2
  368. package/src/gc/index.ts +1 -0
  369. package/src/messageTypes.ts +3 -2
  370. package/src/opLifecycle/batchManager.ts +1 -0
  371. package/src/opLifecycle/definitions.ts +2 -1
  372. package/src/opLifecycle/opCompressor.ts +4 -2
  373. package/src/opLifecycle/opDecompressor.ts +3 -2
  374. package/src/opLifecycle/opGroupingManager.ts +3 -2
  375. package/src/opLifecycle/opSplitter.ts +5 -3
  376. package/src/opLifecycle/outbox.ts +6 -3
  377. package/src/opLifecycle/remoteMessageProcessor.ts +2 -0
  378. package/src/packageVersion.ts +1 -1
  379. package/src/pendingStateManager.ts +4 -4
  380. package/src/scheduleManager.ts +5 -4
  381. package/src/storageServiceWithAttachBlobs.ts +2 -2
  382. package/src/summary/documentSchema.ts +71 -12
  383. package/src/summary/orderedClientElection.ts +4 -6
  384. package/src/summary/runWhileConnectedCoordinator.ts +2 -1
  385. package/src/summary/runningSummarizer.ts +4 -2
  386. package/src/summary/summarizer.ts +5 -3
  387. package/src/summary/summarizerClientElection.ts +1 -0
  388. package/src/summary/summarizerHeuristics.ts +3 -1
  389. package/src/summary/summarizerNode/summarizerNode.ts +10 -8
  390. package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
  391. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +14 -6
  392. package/src/summary/summarizerTypes.ts +6 -2
  393. package/src/summary/summaryCollection.ts +1 -1
  394. package/src/summary/summaryFormat.ts +7 -8
  395. package/src/summary/summaryGenerator.ts +5 -8
  396. package/src/summary/summaryManager.ts +14 -11
  397. package/lib/test/batchTracker.spec.js +0 -88
  398. package/lib/test/batchTracker.spec.js.map +0 -1
  399. package/lib/test/blobManager.spec.js +0 -835
  400. package/lib/test/blobManager.spec.js.map +0 -1
  401. package/lib/test/channelCollection.spec.js +0 -138
  402. package/lib/test/channelCollection.spec.js.map +0 -1
  403. package/lib/test/containerRuntime.spec.js +0 -1750
  404. package/lib/test/containerRuntime.spec.js.map +0 -1
  405. package/lib/test/dataStoreContext.spec.js +0 -771
  406. package/lib/test/dataStoreContext.spec.js.map +0 -1
  407. package/lib/test/dataStoreCreation.spec.js +0 -303
  408. package/lib/test/dataStoreCreation.spec.js.map +0 -1
  409. package/lib/test/dataStoreRegistry.spec.js +0 -26
  410. package/lib/test/dataStoreRegistry.spec.js.map +0 -1
  411. package/lib/test/documentSchema.spec.js +0 -282
  412. package/lib/test/documentSchema.spec.js.map +0 -1
  413. package/lib/test/fuzz/fuzzUtils.js +0 -70
  414. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  415. package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -33
  416. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
  417. package/lib/test/fuzz/summarizerFuzzMocks.js +0 -180
  418. package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
  419. package/lib/test/fuzz/summarizerFuzzSuite.js +0 -109
  420. package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
  421. package/lib/test/gc/garbageCollection.spec.js +0 -1464
  422. package/lib/test/gc/garbageCollection.spec.js.map +0 -1
  423. package/lib/test/gc/gcConfigs.spec.js +0 -689
  424. package/lib/test/gc/gcConfigs.spec.js.map +0 -1
  425. package/lib/test/gc/gcHelpers.spec.js +0 -110
  426. package/lib/test/gc/gcHelpers.spec.js.map +0 -1
  427. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
  428. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
  429. package/lib/test/gc/gcStats.spec.js +0 -390
  430. package/lib/test/gc/gcStats.spec.js.map +0 -1
  431. package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
  432. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
  433. package/lib/test/gc/gcTelemetry.spec.js +0 -530
  434. package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
  435. package/lib/test/gc/gcUnitTestHelpers.js +0 -29
  436. package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
  437. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
  438. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
  439. package/lib/test/getPendingBlobs.spec.js +0 -193
  440. package/lib/test/getPendingBlobs.spec.js.map +0 -1
  441. package/lib/test/hardwareStats.spec.js +0 -93
  442. package/lib/test/hardwareStats.spec.js.map +0 -1
  443. package/lib/test/index.js +0 -6
  444. package/lib/test/index.js.map +0 -1
  445. package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -202
  446. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
  447. package/lib/test/opLifecycle/batchManager.spec.js +0 -189
  448. package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
  449. package/lib/test/opLifecycle/opCompressor.spec.js +0 -73
  450. package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
  451. package/lib/test/opLifecycle/opDecompressor.spec.js +0 -223
  452. package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
  453. package/lib/test/opLifecycle/opSplitter.spec.js +0 -287
  454. package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
  455. package/lib/test/opLifecycle/outbox.spec.js +0 -783
  456. package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
  457. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -220
  458. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
  459. package/lib/test/pendingStateManager.spec.js +0 -329
  460. package/lib/test/pendingStateManager.spec.js.map +0 -1
  461. package/lib/test/scheduleManager.spec.js +0 -270
  462. package/lib/test/scheduleManager.spec.js.map +0 -1
  463. package/lib/test/summarizerNode.spec.js +0 -326
  464. package/lib/test/summarizerNode.spec.js.map +0 -1
  465. package/lib/test/summarizerNodeWithGc.spec.js +0 -318
  466. package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
  467. package/lib/test/summary/orderedClientElection.spec.js +0 -535
  468. package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
  469. package/lib/test/summary/runningSummarizer.spec.js +0 -1349
  470. package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
  471. package/lib/test/summary/summarizer.spec.js +0 -29
  472. package/lib/test/summary/summarizer.spec.js.map +0 -1
  473. package/lib/test/summary/summarizerClientElection.spec.js +0 -436
  474. package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
  475. package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
  476. package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
  477. package/lib/test/summary/summaryCollection.spec.js +0 -200
  478. package/lib/test/summary/summaryCollection.spec.js.map +0 -1
  479. package/lib/test/summary/summaryManager.spec.js +0 -430
  480. package/lib/test/summary/summaryManager.spec.js.map +0 -1
  481. package/lib/test/summary/testQuorumClients.js +0 -34
  482. package/lib/test/summary/testQuorumClients.js.map +0 -1
  483. package/lib/test/throttler.spec.js +0 -175
  484. package/lib/test/throttler.spec.js.map +0 -1
  485. package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -182
  486. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
@@ -1,783 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "assert";
6
- import { MockLogger } from "@fluidframework/telemetry-utils";
7
- import { CompressionAlgorithms, makeLegacySendBatchFn, } from "../../containerRuntime.js";
8
- import { ContainerMessageType } from "../../messageTypes.js";
9
- import { OpGroupingManager, Outbox, } from "../../opLifecycle/index.js";
10
- function typeFromBatchedOp(op) {
11
- assert(op.contents !== undefined);
12
- return JSON.parse(op.contents).type;
13
- }
14
- describe("Outbox", () => {
15
- const maxBatchSizeInBytes = 1024;
16
- const state = {
17
- deltaManagerFlushCalls: 0,
18
- canSendOps: true,
19
- batchesSubmitted: [],
20
- batchesCompressed: [],
21
- batchesSplit: [],
22
- individualOpsSubmitted: [],
23
- pendingOpContents: [],
24
- opsSubmitted: 0,
25
- opsResubmitted: 0,
26
- isReentrant: false,
27
- };
28
- const mockLogger = new MockLogger();
29
- const getMockDeltaManager = () => ({
30
- flush() {
31
- state.deltaManagerFlushCalls++;
32
- },
33
- });
34
- const getMockContext = () => ({
35
- deltaManager: getMockDeltaManager(),
36
- clientDetails: { capabilities: { interactive: true } },
37
- updateDirtyContainerState: (_dirty) => { },
38
- submitFn: (type, contents, batch, appData) => {
39
- state.individualOpsSubmitted.push({ type, contents, batch, appData });
40
- state.opsSubmitted++;
41
- return state.opsSubmitted;
42
- },
43
- submitBatchFn: (batch, referenceSequenceNumber) => {
44
- state.batchesSubmitted.push({ messages: batch, referenceSequenceNumber });
45
- state.opsSubmitted += batch.length;
46
- return state.opsSubmitted;
47
- },
48
- });
49
- const getMockLegacyContext = () => ({
50
- deltaManager: getMockDeltaManager(),
51
- clientDetails: { capabilities: { interactive: true } },
52
- updateDirtyContainerState: (_dirty) => { },
53
- submitFn: (type, contents, batch, appData) => {
54
- state.individualOpsSubmitted.push({ type, contents, batch, appData });
55
- state.opsSubmitted++;
56
- return state.opsSubmitted;
57
- },
58
- connected: true,
59
- });
60
- const getMockCompressor = () => ({
61
- compressBatch: (batch) => {
62
- state.batchesCompressed.push(batch);
63
- return batch;
64
- },
65
- });
66
- const getMockSplitter = (enabled, chunkSizeInBytes) => ({
67
- chunkSizeInBytes,
68
- isBatchChunkingEnabled: enabled,
69
- splitFirstBatchMessage: (batch) => {
70
- state.batchesSplit.push(batch);
71
- return batch;
72
- },
73
- });
74
- const getMockPendingStateManager = () => ({
75
- onSubmitMessage: (content, referenceSequenceNumber, _localOpMetadata, opMetadata) => {
76
- state.pendingOpContents.push({ content, referenceSequenceNumber, opMetadata });
77
- },
78
- });
79
- const createMessage = (type, contents) => ({
80
- contents: JSON.stringify({ type, contents }),
81
- metadata: undefined,
82
- localOpMetadata: {},
83
- referenceSequenceNumber: Number.POSITIVE_INFINITY,
84
- });
85
- const batchedMessage = (message, batchMarker = undefined) => ({
86
- contents: message.contents,
87
- metadata: batchMarker === undefined
88
- ? message.metadata
89
- : { ...message.metadata, batch: batchMarker },
90
- compression: undefined,
91
- referenceSequenceNumber: message.referenceSequenceNumber,
92
- });
93
- const addBatchMetadata = (messages) => {
94
- if (messages.length > 1) {
95
- messages[0].metadata = {
96
- ...messages[0].metadata,
97
- batch: true,
98
- };
99
- messages[messages.length - 1].metadata = {
100
- ...messages[messages.length - 1].metadata,
101
- batch: false,
102
- };
103
- }
104
- return messages;
105
- };
106
- const toBatch = (messages) => ({
107
- content: addBatchMetadata(messages),
108
- contentSizeInBytes: messages
109
- .map((message) => message.contents?.length ?? 0)
110
- .reduce((a, b) => a + b, 0),
111
- referenceSequenceNumber: messages.length === 0 ? undefined : messages[0].referenceSequenceNumber,
112
- hasReentrantOps: false,
113
- });
114
- const DefaultCompressionOptions = {
115
- minimumBatchSizeInBytes: Number.POSITIVE_INFINITY,
116
- compressionAlgorithm: CompressionAlgorithms.lz4,
117
- };
118
- let currentSeqNumbers = {};
119
- const getOutbox = (params) => {
120
- const { submitFn, submitBatchFn, deltaManager } = params.context;
121
- const legacySendBatchFn = makeLegacySendBatchFn(submitFn, deltaManager);
122
- return new Outbox({
123
- shouldSend: () => state.canSendOps,
124
- pendingStateManager: getMockPendingStateManager(),
125
- submitBatchFn,
126
- legacySendBatchFn,
127
- compressor: getMockCompressor(),
128
- splitter: getMockSplitter(params.enableChunking ?? false, params.chunkSizeInBytes ?? Number.POSITIVE_INFINITY),
129
- config: {
130
- maxBatchSizeInBytes: params.maxBatchSize ?? maxBatchSizeInBytes,
131
- compressionOptions: params.compressionOptions ?? DefaultCompressionOptions,
132
- disablePartialFlush: params.disablePartialFlush ?? false,
133
- },
134
- logger: mockLogger,
135
- groupingManager: new OpGroupingManager(params.opGroupingConfig ?? {
136
- groupedBatchingEnabled: false,
137
- opCountThreshold: Infinity,
138
- reentrantBatchGroupingEnabled: false,
139
- }, mockLogger),
140
- getCurrentSequenceNumbers: () => currentSeqNumbers,
141
- reSubmit: (message) => {
142
- state.opsResubmitted++;
143
- },
144
- opReentrancy: () => state.isReentrant,
145
- closeContainer: (error) => { },
146
- });
147
- };
148
- beforeEach(() => {
149
- state.deltaManagerFlushCalls = 0;
150
- state.canSendOps = true;
151
- state.batchesSubmitted.splice(0);
152
- state.batchesCompressed.splice(0);
153
- state.batchesSplit.splice(0);
154
- state.individualOpsSubmitted.splice(0);
155
- state.pendingOpContents.splice(0);
156
- state.opsSubmitted = 0;
157
- state.opsResubmitted = 0;
158
- state.isReentrant = false;
159
- currentSeqNumbers = {};
160
- mockLogger.clear();
161
- });
162
- it("Sending batches", () => {
163
- const outbox = getOutbox({ context: getMockContext() });
164
- const messages = [
165
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
166
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
167
- createMessage(ContainerMessageType.Attach, "2"),
168
- createMessage(ContainerMessageType.Attach, "3"),
169
- createMessage(ContainerMessageType.FluidDataStoreOp, "4"),
170
- createMessage(ContainerMessageType.FluidDataStoreOp, "5"),
171
- ];
172
- outbox.submit(messages[0]);
173
- outbox.submit(messages[1]);
174
- outbox.submitAttach(messages[2]);
175
- outbox.submitAttach(messages[3]);
176
- outbox.flush();
177
- outbox.submit(messages[4]);
178
- outbox.flush();
179
- outbox.submit(messages[5]);
180
- assert.equal(state.opsSubmitted, messages.length - 1);
181
- assert.equal(state.individualOpsSubmitted.length, 0);
182
- assert.deepEqual(state.batchesSubmitted.map((x) => x.messages), [
183
- [batchedMessage(messages[2], true), batchedMessage(messages[3], false)],
184
- [batchedMessage(messages[0], true), batchedMessage(messages[1], false)],
185
- [batchedMessage(messages[4])], // The last message was not batched
186
- ]);
187
- assert.equal(state.deltaManagerFlushCalls, 0);
188
- const rawMessagesInFlushOrder = [
189
- messages[2],
190
- messages[3],
191
- messages[0],
192
- messages[1],
193
- messages[4],
194
- ];
195
- assert.deepEqual(state.pendingOpContents, rawMessagesInFlushOrder.map((message) => ({
196
- content: message.contents,
197
- referenceSequenceNumber: message.referenceSequenceNumber,
198
- opMetadata: message.metadata,
199
- })));
200
- });
201
- it("Will send messages only when allowed, but will store them in the pending state", () => {
202
- const outbox = getOutbox({ context: getMockContext() });
203
- const messages = [
204
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
205
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
206
- ];
207
- outbox.submit(messages[0]);
208
- outbox.flush();
209
- outbox.submit(messages[1]);
210
- state.canSendOps = false;
211
- outbox.flush();
212
- assert.equal(state.opsSubmitted, 1);
213
- assert.deepEqual(state.batchesSubmitted.map((x) => x.messages), [[batchedMessage(messages[0])]]);
214
- assert.deepEqual(state.pendingOpContents, messages.map((message) => ({
215
- content: message.contents,
216
- referenceSequenceNumber: message.referenceSequenceNumber,
217
- opMetadata: message.metadata,
218
- })));
219
- });
220
- it("Uses legacy path for legacy contexts", () => {
221
- const outbox = getOutbox({ context: getMockLegacyContext() });
222
- const messages = [
223
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
224
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
225
- createMessage(ContainerMessageType.Attach, "2"),
226
- createMessage(ContainerMessageType.FluidDataStoreOp, "3"),
227
- ];
228
- outbox.submit(messages[0]);
229
- outbox.submit(messages[1]);
230
- outbox.submitAttach(messages[2]);
231
- outbox.submit(messages[3]);
232
- outbox.flush();
233
- assert.equal(state.opsSubmitted, messages.length);
234
- assert.equal(state.batchesSubmitted.length, 0);
235
- assert.deepEqual(state.individualOpsSubmitted.length, messages.length);
236
- assert.equal(state.deltaManagerFlushCalls, 2);
237
- const rawMessagesInFlushOrder = [messages[2], messages[0], messages[1], messages[3]];
238
- assert.deepEqual(state.pendingOpContents, rawMessagesInFlushOrder.map((message) => ({
239
- content: message.contents,
240
- referenceSequenceNumber: message.referenceSequenceNumber,
241
- opMetadata: message.metadata,
242
- })));
243
- });
244
- it("Compress only if compression is enabled", () => {
245
- const outbox = getOutbox({
246
- context: getMockContext(),
247
- compressionOptions: {
248
- minimumBatchSizeInBytes: 1,
249
- compressionAlgorithm: CompressionAlgorithms.lz4,
250
- },
251
- });
252
- const messages = [
253
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
254
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
255
- createMessage(ContainerMessageType.Attach, "2"),
256
- createMessage(ContainerMessageType.FluidDataStoreOp, "3"),
257
- ];
258
- outbox.submit(messages[0]);
259
- outbox.submit(messages[1]);
260
- outbox.submitAttach(messages[2]);
261
- outbox.submit(messages[3]);
262
- outbox.flush();
263
- assert.equal(state.opsSubmitted, messages.length);
264
- assert.equal(state.batchesSubmitted.length, 2);
265
- assert.equal(state.individualOpsSubmitted.length, 0);
266
- assert.equal(state.deltaManagerFlushCalls, 0);
267
- assert.deepEqual(state.batchesCompressed, [
268
- toBatch([messages[2]]),
269
- toBatch([messages[0], messages[1], messages[3]]),
270
- ]);
271
- assert.deepEqual(state.batchesSubmitted.map((x) => x.messages), [
272
- [batchedMessage(messages[2])],
273
- [
274
- batchedMessage(messages[0], true),
275
- batchedMessage(messages[1]),
276
- batchedMessage(messages[3], false),
277
- ],
278
- ]);
279
- const rawMessagesInFlushOrder = [messages[2], messages[0], messages[1], messages[3]];
280
- assert.deepEqual(state.pendingOpContents, rawMessagesInFlushOrder.map((message) => ({
281
- content: message.contents,
282
- referenceSequenceNumber: message.referenceSequenceNumber,
283
- opMetadata: message.metadata,
284
- })));
285
- });
286
- it("Compress only if the batch is larger than the configured limit", () => {
287
- const outbox = getOutbox({
288
- context: getMockContext(),
289
- maxBatchSize: 1,
290
- compressionOptions: {
291
- minimumBatchSizeInBytes: 1024,
292
- compressionAlgorithm: CompressionAlgorithms.lz4,
293
- },
294
- });
295
- const messages = [
296
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
297
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
298
- createMessage(ContainerMessageType.Attach, "2"),
299
- createMessage(ContainerMessageType.FluidDataStoreOp, "3"),
300
- ];
301
- outbox.submit(messages[0]);
302
- outbox.submit(messages[1]);
303
- outbox.submitAttach(messages[2]);
304
- outbox.submit(messages[3]);
305
- outbox.flush();
306
- assert.equal(state.opsSubmitted, messages.length);
307
- assert.equal(state.batchesSubmitted.length, 2);
308
- assert.equal(state.individualOpsSubmitted.length, 0);
309
- assert.equal(state.deltaManagerFlushCalls, 0);
310
- assert.deepEqual(state.batchesCompressed, []);
311
- assert.deepEqual(state.batchesSubmitted.map((x) => x.messages), [
312
- [batchedMessage(messages[2])],
313
- [
314
- batchedMessage(messages[0], true),
315
- batchedMessage(messages[1]),
316
- batchedMessage(messages[3], false),
317
- ],
318
- ]);
319
- const rawMessagesInFlushOrder = [messages[2], messages[0], messages[1], messages[3]];
320
- assert.deepEqual(state.pendingOpContents, rawMessagesInFlushOrder.map((message) => ({
321
- content: message.contents,
322
- referenceSequenceNumber: message.referenceSequenceNumber,
323
- opMetadata: message.metadata,
324
- })));
325
- });
326
- it("Compress and send (only) attachment ops if compression is enabled and their size exceed the compression threshold", () => {
327
- const messages = [
328
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
329
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
330
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
331
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
332
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
333
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
334
- createMessage(ContainerMessageType.Attach, "2"),
335
- createMessage(ContainerMessageType.Attach, "3"),
336
- createMessage(ContainerMessageType.Attach, "4"),
337
- createMessage(ContainerMessageType.Attach, "5"),
338
- createMessage(ContainerMessageType.Attach, "6"),
339
- createMessage(ContainerMessageType.Attach, "7"),
340
- ];
341
- const attachMessages = messages.filter((x) => typeFromBatchedOp(x) === ContainerMessageType.Attach);
342
- assert.ok(attachMessages.length > 0 && attachMessages[0].contents !== undefined);
343
- const outbox = getOutbox({
344
- context: getMockContext(),
345
- compressionOptions: {
346
- minimumBatchSizeInBytes: attachMessages[0].contents.length * 3,
347
- compressionAlgorithm: CompressionAlgorithms.lz4,
348
- },
349
- });
350
- for (const message of messages) {
351
- if (typeFromBatchedOp(message) === ContainerMessageType.Attach) {
352
- outbox.submitAttach(message);
353
- }
354
- else {
355
- outbox.submit(message);
356
- }
357
- }
358
- // Although there was no explicit flush, the attach messages will get flushed
359
- // as their size have exceeded the compression threshold.
360
- assert.equal(state.opsSubmitted, attachMessages.length);
361
- assert.equal(state.batchesSubmitted.length, 2); // 6 messages in 2 batches
362
- assert.equal(state.individualOpsSubmitted.length, 0);
363
- assert.equal(state.deltaManagerFlushCalls, 0);
364
- assert.deepEqual(state.batchesCompressed, [
365
- toBatch(attachMessages.slice(0, 3)),
366
- toBatch(attachMessages.slice(3)),
367
- ]);
368
- assert.deepEqual(state.batchesSubmitted.map((x) => x.messages), [
369
- toBatch(attachMessages.slice(0, 3)).content.map((x) => batchedMessage(x)),
370
- toBatch(attachMessages.slice(3)).content.map((x) => batchedMessage(x)),
371
- ]);
372
- assert.deepEqual(state.pendingOpContents, attachMessages.map((message) => ({
373
- content: message.contents,
374
- referenceSequenceNumber: message.referenceSequenceNumber,
375
- opMetadata: message.metadata,
376
- })));
377
- });
378
- it("Throws at flush, when compression is enabled and the compressed batch is still larger than the threshold", () => {
379
- const outbox = getOutbox({
380
- context: getMockContext(),
381
- maxBatchSize: 1,
382
- compressionOptions: {
383
- minimumBatchSizeInBytes: 1,
384
- compressionAlgorithm: CompressionAlgorithms.lz4,
385
- },
386
- });
387
- const messages = [
388
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
389
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
390
- createMessage(ContainerMessageType.FluidDataStoreOp, "2"),
391
- ];
392
- outbox.submit(messages[0]);
393
- outbox.submit(messages[1]);
394
- outbox.submit(messages[2]);
395
- assert.throws(() => outbox.flush());
396
- // The batch is compressed
397
- assert.deepEqual(state.batchesCompressed, [toBatch(messages)]);
398
- // The batch is not persisted
399
- assert.deepEqual(state.pendingOpContents, []);
400
- });
401
- it("Chunks when compression is enabled, compressed batch is larger than the threshold and chunking is enabled", () => {
402
- const outbox = getOutbox({
403
- context: getMockContext(),
404
- maxBatchSize: 1,
405
- compressionOptions: {
406
- minimumBatchSizeInBytes: 1,
407
- compressionAlgorithm: CompressionAlgorithms.lz4,
408
- },
409
- enableChunking: true,
410
- chunkSizeInBytes: 2,
411
- });
412
- const messages = [
413
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
414
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
415
- createMessage(ContainerMessageType.Attach, "2"),
416
- createMessage(ContainerMessageType.FluidDataStoreOp, "3"),
417
- ];
418
- outbox.submit(messages[0]);
419
- outbox.submit(messages[1]);
420
- outbox.submitAttach(messages[2]);
421
- outbox.submit(messages[3]);
422
- outbox.flush();
423
- assert.deepEqual(state.batchesCompressed, [
424
- toBatch([messages[2]]),
425
- toBatch([messages[0], messages[1], messages[3]]),
426
- ]);
427
- assert.deepEqual(state.batchesSplit, [
428
- toBatch([messages[2]]),
429
- toBatch([messages[0], messages[1], messages[3]]),
430
- ]);
431
- assert.deepEqual(state.batchesSubmitted.map((x) => x.messages), [
432
- [batchedMessage(messages[2])],
433
- [
434
- batchedMessage(messages[0], true),
435
- batchedMessage(messages[1]),
436
- batchedMessage(messages[3], false),
437
- ],
438
- ]);
439
- const rawMessagesInFlushOrder = [messages[2], messages[0], messages[1], messages[3]];
440
- assert.deepEqual(state.pendingOpContents, rawMessagesInFlushOrder.map((message) => ({
441
- content: message.contents,
442
- referenceSequenceNumber: message.referenceSequenceNumber,
443
- opMetadata: message.metadata,
444
- })));
445
- });
446
- it("Does not chunk when compression is enabled, compressed batch is smaller than the threshold and chunking is enabled", () => {
447
- const outbox = getOutbox({
448
- context: getMockContext(),
449
- maxBatchSize: 1,
450
- compressionOptions: {
451
- minimumBatchSizeInBytes: 1,
452
- compressionAlgorithm: CompressionAlgorithms.lz4,
453
- },
454
- enableChunking: true,
455
- chunkSizeInBytes: 10000,
456
- });
457
- const messages = [
458
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
459
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
460
- createMessage(ContainerMessageType.Attach, "2"),
461
- createMessage(ContainerMessageType.FluidDataStoreOp, "3"),
462
- ];
463
- outbox.submit(messages[0]);
464
- outbox.submit(messages[1]);
465
- outbox.submitAttach(messages[2]);
466
- outbox.submit(messages[3]);
467
- outbox.flush();
468
- assert.deepEqual(state.batchesCompressed, [
469
- toBatch([messages[2]]),
470
- toBatch([messages[0], messages[1], messages[3]]),
471
- ]);
472
- assert.deepEqual(state.batchesSplit, []);
473
- assert.deepEqual(state.batchesSubmitted.map((x) => x.messages), [
474
- [batchedMessage(messages[2])],
475
- [
476
- batchedMessage(messages[0], true),
477
- batchedMessage(messages[1]),
478
- batchedMessage(messages[3], false),
479
- ],
480
- ]);
481
- });
482
- it("Throws at submit, when compression is enabled and the attached compressed batch is still larger than the threshold", () => {
483
- const outbox = getOutbox({
484
- context: getMockContext(),
485
- maxBatchSize: 1,
486
- compressionOptions: {
487
- minimumBatchSizeInBytes: 1,
488
- compressionAlgorithm: CompressionAlgorithms.lz4,
489
- },
490
- });
491
- const messages = [createMessage(ContainerMessageType.Attach, "0")];
492
- assert.throws(() => outbox.submitAttach(messages[0]));
493
- // The batch is compressed
494
- assert.deepEqual(state.batchesCompressed, [toBatch(messages)]);
495
- // The batch is not persisted
496
- assert.deepEqual(state.pendingOpContents, []);
497
- });
498
- it("Splits the batch when an out of order message is detected", () => {
499
- const outbox = getOutbox({ context: getMockContext() });
500
- const messages = [
501
- {
502
- ...createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
503
- referenceSequenceNumber: 0,
504
- },
505
- {
506
- ...createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
507
- referenceSequenceNumber: 1,
508
- },
509
- ];
510
- currentSeqNumbers.referenceSequenceNumber = 1;
511
- outbox.submit(messages[0]);
512
- outbox.submit(messages[1]);
513
- outbox.flush();
514
- assert.equal(state.opsSubmitted, messages.length);
515
- assert.equal(state.individualOpsSubmitted.length, 0);
516
- assert.equal(state.batchesSubmitted.length, 2);
517
- assert.deepEqual(state.batchesSubmitted.map((x) => x.messages), [[batchedMessage(messages[0])], [batchedMessage(messages[1])]]);
518
- assert.deepEqual(state.batchesSubmitted.map((x) => x.referenceSequenceNumber), [0, 1]);
519
- assert.equal(state.deltaManagerFlushCalls, 0);
520
- const rawMessagesInFlushOrder = [messages[0], messages[1]];
521
- assert.deepEqual(state.pendingOpContents, rawMessagesInFlushOrder.map((message) => ({
522
- content: message.contents,
523
- referenceSequenceNumber: message.referenceSequenceNumber,
524
- opMetadata: message.metadata,
525
- })));
526
- mockLogger.assertMatch([
527
- {
528
- eventName: "Outbox:ReferenceSequenceNumberMismatch",
529
- },
530
- ]);
531
- });
532
- [
533
- [
534
- {
535
- ...createMessage(ContainerMessageType.Attach, "0"),
536
- referenceSequenceNumber: 0,
537
- },
538
- {
539
- ...createMessage(ContainerMessageType.Attach, "0"),
540
- referenceSequenceNumber: 0,
541
- },
542
- {
543
- ...createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
544
- referenceSequenceNumber: 1,
545
- },
546
- ],
547
- [
548
- {
549
- ...createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
550
- referenceSequenceNumber: 0,
551
- },
552
- {
553
- ...createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
554
- referenceSequenceNumber: 0,
555
- },
556
- {
557
- ...createMessage(ContainerMessageType.Attach, "0"),
558
- referenceSequenceNumber: 1,
559
- },
560
- ],
561
- ].forEach((ops) => {
562
- it("Flushes all batches when an out of order message is detected in either flows", () => {
563
- const outbox = getOutbox({ context: getMockContext() });
564
- for (const op of ops) {
565
- currentSeqNumbers.referenceSequenceNumber = op.referenceSequenceNumber;
566
- if (typeFromBatchedOp(op) === ContainerMessageType.Attach) {
567
- outbox.submitAttach(op);
568
- }
569
- else {
570
- outbox.submit(op);
571
- }
572
- }
573
- assert.equal(state.opsSubmitted, ops.length - 1);
574
- assert.equal(state.individualOpsSubmitted.length, 0);
575
- assert.equal(state.batchesSubmitted.length, 1);
576
- assert.deepEqual(state.batchesSubmitted.map((x) => x.messages), [[batchedMessage(ops[0]), batchedMessage(ops[1])]]);
577
- mockLogger.assertMatch([
578
- {
579
- eventName: "Outbox:ReferenceSequenceNumberMismatch",
580
- },
581
- ]);
582
- });
583
- });
584
- it("Does not flush the batch when an out of order message is detected, if configured", () => {
585
- const outbox = getOutbox({
586
- context: getMockContext(),
587
- disablePartialFlush: true,
588
- });
589
- const messages = [
590
- {
591
- ...createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
592
- referenceSequenceNumber: 0,
593
- },
594
- {
595
- ...createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
596
- referenceSequenceNumber: 1,
597
- },
598
- {
599
- ...createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
600
- referenceSequenceNumber: 2,
601
- },
602
- {
603
- ...createMessage(ContainerMessageType.Attach, "1"),
604
- referenceSequenceNumber: 3,
605
- },
606
- {
607
- ...createMessage(ContainerMessageType.Attach, "1"),
608
- referenceSequenceNumber: 3,
609
- },
610
- ];
611
- for (const message of messages) {
612
- currentSeqNumbers.referenceSequenceNumber = message.referenceSequenceNumber;
613
- if (typeFromBatchedOp(message) === ContainerMessageType.Attach) {
614
- outbox.submitAttach(message);
615
- }
616
- else {
617
- outbox.submit(message);
618
- }
619
- }
620
- assert.equal(state.opsSubmitted, 0);
621
- assert.equal(state.individualOpsSubmitted.length, 0);
622
- assert.equal(state.batchesSubmitted.length, 0);
623
- mockLogger.assertMatch([
624
- {
625
- eventName: "Outbox:ReferenceSequenceNumberMismatch",
626
- },
627
- ]);
628
- });
629
- it("Log at most 3 reference sequence number mismatch events", () => {
630
- const outbox = getOutbox({ context: getMockContext() });
631
- for (let i = 0; i < 10; i++) {
632
- currentSeqNumbers.referenceSequenceNumber = 0;
633
- outbox.submit({
634
- ...createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
635
- referenceSequenceNumber: 0,
636
- });
637
- currentSeqNumbers.referenceSequenceNumber = 1;
638
- outbox.submit({
639
- ...createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
640
- referenceSequenceNumber: 1,
641
- });
642
- }
643
- mockLogger.assertMatch(new Array(3).fill({
644
- eventName: "Outbox:ReferenceSequenceNumberMismatch",
645
- }));
646
- });
647
- it("blobAttach ops always flush before regular ops", () => {
648
- const outbox = getOutbox({ context: getMockContext() });
649
- const messages = [
650
- createMessage(ContainerMessageType.BlobAttach, "0"),
651
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
652
- createMessage(ContainerMessageType.BlobAttach, "2"),
653
- createMessage(ContainerMessageType.FluidDataStoreOp, "3"),
654
- createMessage(ContainerMessageType.BlobAttach, "4"),
655
- ];
656
- outbox.submitBlobAttach(messages[0]);
657
- outbox.submit(messages[1]);
658
- outbox.submitBlobAttach(messages[2]);
659
- outbox.submit(messages[3]);
660
- outbox.submitBlobAttach(messages[4]);
661
- outbox.flush();
662
- assert.deepEqual(state.batchesSubmitted.map((x) => x.messages), [
663
- [
664
- batchedMessage(messages[0], true),
665
- batchedMessage(messages[2]),
666
- batchedMessage(messages[4], false),
667
- ],
668
- [batchedMessage(messages[1], true), batchedMessage(messages[3], false)],
669
- ]);
670
- const rawMessagesInFlushOrder = [
671
- messages[0],
672
- messages[2],
673
- messages[4],
674
- messages[1],
675
- messages[3],
676
- ];
677
- assert.deepEqual(state.pendingOpContents, rawMessagesInFlushOrder.map((message) => ({
678
- content: message.contents,
679
- referenceSequenceNumber: message.referenceSequenceNumber,
680
- opMetadata: message.metadata,
681
- })));
682
- });
683
- describe("flush", () => {
684
- function validateCounts(opsSubmitted, batchesSubmitted, opsResubmitted) {
685
- assert.strictEqual(state.opsSubmitted, opsSubmitted, "unexpected opsSubmitted");
686
- assert.strictEqual(state.batchesSubmitted.length, batchesSubmitted, "unexpected batchesSubmitted");
687
- assert.strictEqual(state.opsResubmitted, opsResubmitted, "unexpected opsResubmitted");
688
- }
689
- it("batch has reentrant ops, but grouped batching is off", () => {
690
- const outbox = getOutbox({
691
- context: getMockContext(),
692
- opGroupingConfig: {
693
- groupedBatchingEnabled: false,
694
- opCountThreshold: 2,
695
- reentrantBatchGroupingEnabled: true,
696
- },
697
- });
698
- const messages = [
699
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
700
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
701
- ];
702
- outbox.submit(messages[0]);
703
- outbox.submit(messages[1]);
704
- outbox.flush();
705
- validateCounts(2, 1, 0);
706
- });
707
- it("batch has reentrant ops", () => {
708
- const outbox = getOutbox({
709
- context: getMockContext(),
710
- opGroupingConfig: {
711
- groupedBatchingEnabled: true,
712
- opCountThreshold: 2,
713
- reentrantBatchGroupingEnabled: true,
714
- },
715
- });
716
- const messages = [
717
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
718
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
719
- ];
720
- state.isReentrant = true;
721
- outbox.submit(messages[0]);
722
- outbox.submit(messages[1]);
723
- state.isReentrant = false;
724
- outbox.flush();
725
- validateCounts(0, 0, 2);
726
- });
727
- it("should group the batch", () => {
728
- const outbox = getOutbox({
729
- context: getMockContext(),
730
- opGroupingConfig: {
731
- groupedBatchingEnabled: true,
732
- opCountThreshold: 2,
733
- reentrantBatchGroupingEnabled: true,
734
- },
735
- });
736
- const messages = [
737
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
738
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
739
- ];
740
- outbox.submit(messages[0]);
741
- outbox.submit(messages[1]);
742
- outbox.flush();
743
- validateCounts(1, 1, 0);
744
- });
745
- it("should not group the batch", () => {
746
- const outbox = getOutbox({
747
- context: getMockContext(),
748
- opGroupingConfig: {
749
- groupedBatchingEnabled: false,
750
- opCountThreshold: 2,
751
- reentrantBatchGroupingEnabled: true,
752
- },
753
- });
754
- const messages = [
755
- createMessage(ContainerMessageType.FluidDataStoreOp, "0"),
756
- createMessage(ContainerMessageType.FluidDataStoreOp, "1"),
757
- ];
758
- outbox.submit(messages[0]);
759
- outbox.submit(messages[1]);
760
- outbox.flush();
761
- validateCounts(2, 1, 0);
762
- });
763
- it("should not group blobAttach ops", () => {
764
- const outbox = getOutbox({
765
- context: getMockContext(),
766
- opGroupingConfig: {
767
- groupedBatchingEnabled: true,
768
- opCountThreshold: 2,
769
- reentrantBatchGroupingEnabled: true,
770
- },
771
- });
772
- const messages = [
773
- createMessage(ContainerMessageType.BlobAttach, "0"),
774
- createMessage(ContainerMessageType.BlobAttach, "1"),
775
- ];
776
- outbox.submitBlobAttach(messages[0]);
777
- outbox.submitBlobAttach(messages[1]);
778
- outbox.flush();
779
- validateCounts(2, 1, 0);
780
- });
781
- });
782
- });
783
- //# sourceMappingURL=outbox.spec.js.map