@fluidframework/container-runtime 2.0.0-dev-rc.2.0.0.246488 → 2.0.0-dev-rc.3.0.0.253463

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 (544) hide show
  1. package/api-report/container-runtime.api.md +109 -55
  2. package/dist/batchTracker.d.ts +1 -1
  3. package/dist/batchTracker.d.ts.map +1 -1
  4. package/dist/batchTracker.js +4 -4
  5. package/dist/batchTracker.js.map +1 -1
  6. package/dist/blobManager.d.ts +33 -25
  7. package/dist/blobManager.d.ts.map +1 -1
  8. package/dist/blobManager.js +82 -100
  9. package/dist/blobManager.js.map +1 -1
  10. package/dist/channelCollection.d.ts +7 -6
  11. package/dist/channelCollection.d.ts.map +1 -1
  12. package/dist/channelCollection.js +110 -77
  13. package/dist/channelCollection.js.map +1 -1
  14. package/dist/connectionTelemetry.d.ts +3 -3
  15. package/dist/connectionTelemetry.d.ts.map +1 -1
  16. package/dist/connectionTelemetry.js +17 -17
  17. package/dist/connectionTelemetry.js.map +1 -1
  18. package/dist/container-runtime-alpha.d.ts +263 -41
  19. package/dist/container-runtime-beta.d.ts +44 -30
  20. package/dist/container-runtime-public.d.ts +44 -30
  21. package/dist/container-runtime-untrimmed.d.ts +265 -56
  22. package/dist/containerHandleContext.d.ts.map +1 -1
  23. package/dist/containerHandleContext.js +2 -2
  24. package/dist/containerHandleContext.js.map +1 -1
  25. package/dist/containerRuntime.d.ts +40 -30
  26. package/dist/containerRuntime.d.ts.map +1 -1
  27. package/dist/containerRuntime.js +376 -255
  28. package/dist/containerRuntime.js.map +1 -1
  29. package/dist/dataStore.d.ts +1 -1
  30. package/dist/dataStore.d.ts.map +1 -1
  31. package/dist/dataStore.js +7 -7
  32. package/dist/dataStore.js.map +1 -1
  33. package/dist/dataStoreContext.d.ts +9 -9
  34. package/dist/dataStoreContext.d.ts.map +1 -1
  35. package/dist/dataStoreContext.js +74 -74
  36. package/dist/dataStoreContext.js.map +1 -1
  37. package/dist/dataStoreContexts.d.ts.map +1 -1
  38. package/dist/dataStoreContexts.js +11 -11
  39. package/dist/dataStoreContexts.js.map +1 -1
  40. package/dist/dataStoreRegistry.d.ts +1 -1
  41. package/dist/dataStoreRegistry.d.ts.map +1 -1
  42. package/dist/dataStoreRegistry.js +2 -2
  43. package/dist/dataStoreRegistry.js.map +1 -1
  44. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  45. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  46. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  47. package/dist/deltaScheduler.d.ts +1 -1
  48. package/dist/deltaScheduler.d.ts.map +1 -1
  49. package/dist/deltaScheduler.js +6 -6
  50. package/dist/deltaScheduler.js.map +1 -1
  51. package/dist/error.d.ts +1 -1
  52. package/dist/error.d.ts.map +1 -1
  53. package/dist/error.js +4 -4
  54. package/dist/error.js.map +1 -1
  55. package/dist/gc/garbageCollection.d.ts +3 -2
  56. package/dist/gc/garbageCollection.d.ts.map +1 -1
  57. package/dist/gc/garbageCollection.js +21 -21
  58. package/dist/gc/garbageCollection.js.map +1 -1
  59. package/dist/gc/gcConfigs.d.ts +2 -2
  60. package/dist/gc/gcConfigs.d.ts.map +1 -1
  61. package/dist/gc/gcConfigs.js +4 -5
  62. package/dist/gc/gcConfigs.js.map +1 -1
  63. package/dist/gc/gcDefinitions.d.ts +4 -3
  64. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  65. package/dist/gc/gcDefinitions.js.map +1 -1
  66. package/dist/gc/gcHelpers.d.ts +5 -1
  67. package/dist/gc/gcHelpers.d.ts.map +1 -1
  68. package/dist/gc/gcHelpers.js +21 -12
  69. package/dist/gc/gcHelpers.js.map +1 -1
  70. package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
  71. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  72. package/dist/gc/gcSummaryStateTracker.js +11 -11
  73. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  74. package/dist/gc/gcTelemetry.d.ts +2 -1
  75. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  76. package/dist/gc/gcTelemetry.js +11 -9
  77. package/dist/gc/gcTelemetry.js.map +1 -1
  78. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  79. package/dist/gc/gcUnreferencedStateTracker.js +6 -6
  80. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  81. package/dist/gc/index.d.ts +1 -1
  82. package/dist/gc/index.d.ts.map +1 -1
  83. package/dist/gc/index.js +2 -1
  84. package/dist/gc/index.js.map +1 -1
  85. package/dist/index.d.ts +2 -2
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +4 -2
  88. package/dist/index.js.map +1 -1
  89. package/dist/messageTypes.d.ts +11 -5
  90. package/dist/messageTypes.d.ts.map +1 -1
  91. package/dist/messageTypes.js +4 -0
  92. package/dist/messageTypes.js.map +1 -1
  93. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  94. package/dist/opLifecycle/batchManager.js.map +1 -1
  95. package/dist/opLifecycle/definitions.d.ts +2 -20
  96. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  97. package/dist/opLifecycle/definitions.js.map +1 -1
  98. package/dist/opLifecycle/index.d.ts +3 -3
  99. package/dist/opLifecycle/index.d.ts.map +1 -1
  100. package/dist/opLifecycle/index.js +3 -1
  101. package/dist/opLifecycle/index.js.map +1 -1
  102. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  103. package/dist/opLifecycle/opCompressor.js +5 -6
  104. package/dist/opLifecycle/opCompressor.js.map +1 -1
  105. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  106. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  107. package/dist/opLifecycle/opDecompressor.js +62 -63
  108. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  109. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  110. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  111. package/dist/opLifecycle/opGroupingManager.js +14 -16
  112. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  113. package/dist/opLifecycle/opSplitter.d.ts +12 -4
  114. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  115. package/dist/opLifecycle/opSplitter.js +63 -53
  116. package/dist/opLifecycle/opSplitter.js.map +1 -1
  117. package/dist/opLifecycle/outbox.d.ts +2 -1
  118. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  119. package/dist/opLifecycle/outbox.js +19 -24
  120. package/dist/opLifecycle/outbox.js.map +1 -1
  121. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  122. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  123. package/dist/opLifecycle/remoteMessageProcessor.js +36 -35
  124. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  125. package/dist/packageVersion.d.ts +1 -1
  126. package/dist/packageVersion.js +1 -1
  127. package/dist/packageVersion.js.map +1 -1
  128. package/dist/pendingStateManager.d.ts +1 -1
  129. package/dist/pendingStateManager.d.ts.map +1 -1
  130. package/dist/pendingStateManager.js +18 -18
  131. package/dist/pendingStateManager.js.map +1 -1
  132. package/dist/scheduleManager.d.ts +1 -1
  133. package/dist/scheduleManager.d.ts.map +1 -1
  134. package/dist/scheduleManager.js +24 -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 +382 -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 +8 -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/lib/batchTracker.d.ts +1 -1
  203. package/lib/batchTracker.d.ts.map +1 -1
  204. package/lib/batchTracker.js +2 -2
  205. package/lib/batchTracker.js.map +1 -1
  206. package/lib/blobManager.d.ts +33 -25
  207. package/lib/blobManager.d.ts.map +1 -1
  208. package/lib/blobManager.js +48 -66
  209. package/lib/blobManager.js.map +1 -1
  210. package/lib/channelCollection.d.ts +7 -6
  211. package/lib/channelCollection.d.ts.map +1 -1
  212. package/lib/channelCollection.js +47 -14
  213. package/lib/channelCollection.js.map +1 -1
  214. package/lib/connectionTelemetry.d.ts +3 -3
  215. package/lib/connectionTelemetry.d.ts.map +1 -1
  216. package/lib/connectionTelemetry.js +3 -3
  217. package/lib/connectionTelemetry.js.map +1 -1
  218. package/lib/container-runtime-alpha.d.ts +263 -41
  219. package/lib/container-runtime-beta.d.ts +44 -30
  220. package/lib/container-runtime-public.d.ts +44 -30
  221. package/lib/container-runtime-untrimmed.d.ts +265 -56
  222. package/lib/containerHandleContext.d.ts.map +1 -1
  223. package/lib/containerHandleContext.js +1 -1
  224. package/lib/containerHandleContext.js.map +1 -1
  225. package/lib/containerRuntime.d.ts +40 -30
  226. package/lib/containerRuntime.d.ts.map +1 -1
  227. package/lib/containerRuntime.js +224 -101
  228. package/lib/containerRuntime.js.map +1 -1
  229. package/lib/dataStore.d.ts +1 -1
  230. package/lib/dataStore.d.ts.map +1 -1
  231. package/lib/dataStore.js +2 -2
  232. package/lib/dataStore.js.map +1 -1
  233. package/lib/dataStoreContext.d.ts +9 -9
  234. package/lib/dataStoreContext.d.ts.map +1 -1
  235. package/lib/dataStoreContext.js +8 -8
  236. package/lib/dataStoreContext.js.map +1 -1
  237. package/lib/dataStoreContexts.d.ts.map +1 -1
  238. package/lib/dataStoreContexts.js +2 -2
  239. package/lib/dataStoreContexts.js.map +1 -1
  240. package/lib/dataStoreRegistry.d.ts +1 -1
  241. package/lib/dataStoreRegistry.d.ts.map +1 -1
  242. package/lib/dataStoreRegistry.js +1 -1
  243. package/lib/dataStoreRegistry.js.map +1 -1
  244. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  245. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  246. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  247. package/lib/deltaScheduler.d.ts +1 -1
  248. package/lib/deltaScheduler.d.ts.map +1 -1
  249. package/lib/deltaScheduler.js +1 -1
  250. package/lib/deltaScheduler.js.map +1 -1
  251. package/lib/error.d.ts +1 -1
  252. package/lib/error.d.ts.map +1 -1
  253. package/lib/error.js +2 -2
  254. package/lib/error.js.map +1 -1
  255. package/lib/gc/garbageCollection.d.ts +3 -2
  256. package/lib/gc/garbageCollection.d.ts.map +1 -1
  257. package/lib/gc/garbageCollection.js +6 -6
  258. package/lib/gc/garbageCollection.js.map +1 -1
  259. package/lib/gc/gcConfigs.d.ts +2 -2
  260. package/lib/gc/gcConfigs.d.ts.map +1 -1
  261. package/lib/gc/gcConfigs.js +4 -5
  262. package/lib/gc/gcConfigs.js.map +1 -1
  263. package/lib/gc/gcDefinitions.d.ts +4 -3
  264. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  265. package/lib/gc/gcDefinitions.js.map +1 -1
  266. package/lib/gc/gcHelpers.d.ts +5 -1
  267. package/lib/gc/gcHelpers.d.ts.map +1 -1
  268. package/lib/gc/gcHelpers.js +10 -2
  269. package/lib/gc/gcHelpers.js.map +1 -1
  270. package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
  271. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  272. package/lib/gc/gcSummaryStateTracker.js +2 -2
  273. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  274. package/lib/gc/gcTelemetry.d.ts +2 -1
  275. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  276. package/lib/gc/gcTelemetry.js +4 -2
  277. package/lib/gc/gcTelemetry.js.map +1 -1
  278. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  279. package/lib/gc/gcUnreferencedStateTracker.js +2 -2
  280. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  281. package/lib/gc/index.d.ts +1 -1
  282. package/lib/gc/index.d.ts.map +1 -1
  283. package/lib/gc/index.js +1 -1
  284. package/lib/gc/index.js.map +1 -1
  285. package/lib/index.d.ts +2 -2
  286. package/lib/index.d.ts.map +1 -1
  287. package/lib/index.js +2 -2
  288. package/lib/index.js.map +1 -1
  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 +8 -13
  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 -35
  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/scheduleManager.d.ts +1 -1
  333. package/lib/scheduleManager.d.ts.map +1 -1
  334. package/lib/scheduleManager.js +3 -3
  335. package/lib/scheduleManager.js.map +1 -1
  336. package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
  337. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
  338. package/lib/storageServiceWithAttachBlobs.js +1 -1
  339. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  340. package/lib/summary/documentSchema.d.ts +209 -0
  341. package/lib/summary/documentSchema.d.ts.map +1 -0
  342. package/lib/summary/documentSchema.js +378 -0
  343. package/lib/summary/documentSchema.js.map +1 -0
  344. package/lib/summary/index.d.ts +2 -1
  345. package/lib/summary/index.d.ts.map +1 -1
  346. package/lib/summary/index.js +1 -0
  347. package/lib/summary/index.js.map +1 -1
  348. package/lib/summary/orderedClientElection.d.ts +2 -2
  349. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  350. package/lib/summary/orderedClientElection.js +3 -2
  351. package/lib/summary/orderedClientElection.js.map +1 -1
  352. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  353. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  354. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  355. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  356. package/lib/summary/runningSummarizer.d.ts +3 -3
  357. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  358. package/lib/summary/runningSummarizer.js +3 -3
  359. package/lib/summary/runningSummarizer.js.map +1 -1
  360. package/lib/summary/summarizer.d.ts +3 -2
  361. package/lib/summary/summarizer.d.ts.map +1 -1
  362. package/lib/summary/summarizer.js +3 -3
  363. package/lib/summary/summarizer.js.map +1 -1
  364. package/lib/summary/summarizerClientElection.d.ts +2 -2
  365. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  366. package/lib/summary/summarizerClientElection.js.map +1 -1
  367. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  368. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  369. package/lib/summary/summarizerHeuristics.js +1 -1
  370. package/lib/summary/summarizerHeuristics.js.map +1 -1
  371. package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
  372. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  373. package/lib/summary/summarizerNode/summarizerNode.js +5 -5
  374. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  375. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  376. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  377. package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
  378. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  379. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  380. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  381. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  382. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  383. package/lib/summary/summarizerTypes.d.ts +5 -3
  384. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  385. package/lib/summary/summarizerTypes.js.map +1 -1
  386. package/lib/summary/summaryCollection.d.ts +2 -2
  387. package/lib/summary/summaryCollection.d.ts.map +1 -1
  388. package/lib/summary/summaryCollection.js +1 -1
  389. package/lib/summary/summaryCollection.js.map +1 -1
  390. package/lib/summary/summaryFormat.d.ts +6 -17
  391. package/lib/summary/summaryFormat.d.ts.map +1 -1
  392. package/lib/summary/summaryFormat.js +3 -3
  393. package/lib/summary/summaryFormat.js.map +1 -1
  394. package/lib/summary/summaryGenerator.d.ts +4 -3
  395. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  396. package/lib/summary/summaryGenerator.js +4 -4
  397. package/lib/summary/summaryGenerator.js.map +1 -1
  398. package/lib/summary/summaryManager.d.ts +1 -1
  399. package/lib/summary/summaryManager.d.ts.map +1 -1
  400. package/lib/summary/summaryManager.js +9 -8
  401. package/lib/summary/summaryManager.js.map +1 -1
  402. package/lib/tsdoc-metadata.json +11 -0
  403. package/package.json +34 -32
  404. package/src/batchTracker.ts +4 -3
  405. package/src/blobManager.ts +100 -69
  406. package/src/channelCollection.ts +86 -43
  407. package/src/connectionTelemetry.ts +12 -12
  408. package/src/containerHandleContext.ts +3 -2
  409. package/src/containerRuntime.ts +419 -232
  410. package/src/dataStore.ts +5 -3
  411. package/src/dataStoreContext.ts +32 -29
  412. package/src/dataStoreContexts.ts +4 -2
  413. package/src/dataStoreRegistry.ts +2 -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 +19 -18
  418. package/src/gc/gcConfigs.ts +15 -18
  419. package/src/gc/gcDefinitions.ts +6 -6
  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 +8 -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 +84 -100
  433. package/src/opLifecycle/opGroupingManager.ts +12 -14
  434. package/src/opLifecycle/opSplitter.ts +76 -48
  435. package/src/opLifecycle/outbox.ts +17 -32
  436. package/src/opLifecycle/remoteMessageProcessor.ts +43 -59
  437. package/src/packageVersion.ts +1 -1
  438. package/src/pendingStateManager.ts +6 -6
  439. package/src/scheduleManager.ts +9 -8
  440. package/src/storageServiceWithAttachBlobs.ts +2 -2
  441. package/src/summary/documentSchema.ts +612 -0
  442. package/src/summary/index.ts +10 -1
  443. package/src/summary/orderedClientElection.ts +6 -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/lib/test/batchTracker.spec.js +0 -88
  458. package/lib/test/batchTracker.spec.js.map +0 -1
  459. package/lib/test/blobManager.spec.js +0 -835
  460. package/lib/test/blobManager.spec.js.map +0 -1
  461. package/lib/test/channelCollection.spec.js +0 -138
  462. package/lib/test/channelCollection.spec.js.map +0 -1
  463. package/lib/test/containerRuntime.spec.js +0 -1748
  464. package/lib/test/containerRuntime.spec.js.map +0 -1
  465. package/lib/test/dataStoreContext.spec.js +0 -771
  466. package/lib/test/dataStoreContext.spec.js.map +0 -1
  467. package/lib/test/dataStoreCreation.spec.js +0 -303
  468. package/lib/test/dataStoreCreation.spec.js.map +0 -1
  469. package/lib/test/dataStoreRegistry.spec.js +0 -26
  470. package/lib/test/dataStoreRegistry.spec.js.map +0 -1
  471. package/lib/test/fuzz/fuzzUtils.js +0 -66
  472. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  473. package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
  474. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
  475. package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
  476. package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
  477. package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
  478. package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
  479. package/lib/test/gc/garbageCollection.spec.js +0 -1464
  480. package/lib/test/gc/garbageCollection.spec.js.map +0 -1
  481. package/lib/test/gc/gcConfigs.spec.js +0 -689
  482. package/lib/test/gc/gcConfigs.spec.js.map +0 -1
  483. package/lib/test/gc/gcHelpers.spec.js +0 -110
  484. package/lib/test/gc/gcHelpers.spec.js.map +0 -1
  485. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
  486. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
  487. package/lib/test/gc/gcStats.spec.js +0 -390
  488. package/lib/test/gc/gcStats.spec.js.map +0 -1
  489. package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
  490. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
  491. package/lib/test/gc/gcTelemetry.spec.js +0 -530
  492. package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
  493. package/lib/test/gc/gcUnitTestHelpers.js +0 -29
  494. package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
  495. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
  496. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
  497. package/lib/test/getPendingBlobs.spec.js +0 -193
  498. package/lib/test/getPendingBlobs.spec.js.map +0 -1
  499. package/lib/test/hardwareStats.spec.js +0 -93
  500. package/lib/test/hardwareStats.spec.js.map +0 -1
  501. package/lib/test/index.js +0 -6
  502. package/lib/test/index.js.map +0 -1
  503. package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
  504. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
  505. package/lib/test/opLifecycle/batchManager.spec.js +0 -189
  506. package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
  507. package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
  508. package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
  509. package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
  510. package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
  511. package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
  512. package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
  513. package/lib/test/opLifecycle/outbox.spec.js +0 -675
  514. package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
  515. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
  516. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
  517. package/lib/test/pendingStateManager.spec.js +0 -329
  518. package/lib/test/pendingStateManager.spec.js.map +0 -1
  519. package/lib/test/scheduleManager.spec.js +0 -270
  520. package/lib/test/scheduleManager.spec.js.map +0 -1
  521. package/lib/test/summarizerNode.spec.js +0 -326
  522. package/lib/test/summarizerNode.spec.js.map +0 -1
  523. package/lib/test/summarizerNodeWithGc.spec.js +0 -318
  524. package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
  525. package/lib/test/summary/orderedClientElection.spec.js +0 -535
  526. package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
  527. package/lib/test/summary/runningSummarizer.spec.js +0 -1349
  528. package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
  529. package/lib/test/summary/summarizer.spec.js +0 -29
  530. package/lib/test/summary/summarizer.spec.js.map +0 -1
  531. package/lib/test/summary/summarizerClientElection.spec.js +0 -436
  532. package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
  533. package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
  534. package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
  535. package/lib/test/summary/summaryCollection.spec.js +0 -200
  536. package/lib/test/summary/summaryCollection.spec.js.map +0 -1
  537. package/lib/test/summary/summaryManager.spec.js +0 -430
  538. package/lib/test/summary/summaryManager.spec.js.map +0 -1
  539. package/lib/test/summary/testQuorumClients.js +0 -34
  540. package/lib/test/summary/testQuorumClients.js.map +0 -1
  541. package/lib/test/throttler.spec.js +0 -175
  542. package/lib/test/throttler.spec.js.map +0 -1
  543. package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
  544. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
@@ -13,6 +13,9 @@
13
13
  - [Note about performance and latency](#note-about-performance-and-latency)
14
14
  - [How it works](#how-it-works)
15
15
  - [How grouped batching works](#how-grouped-batching-works)
16
+ - [How the overall op flow works](#How-the-overall-op-flow-works)
17
+ - [Outbound](#outbound)
18
+ - [Inbound](#inbound)
16
19
 
17
20
  ## Introduction
18
21
 
@@ -317,3 +320,89 @@ Ungrouped batch:
317
320
  | ClientSeqNum: 1 | ClientSeqNum: 2 | ClientSeqNum: 3 | ClientSeqNum: 4 | ClientSeqNum: 5 |
318
321
  +-----------------+-----------------+-----------------+-----------------+-----------------+
319
322
  ```
323
+
324
+ ## How the overall op flow works
325
+
326
+ ### Outbound
327
+
328
+ The outbound view is how ops are accumulated and sent by the runtime with `FlushMode.TurnBased` (default).
329
+
330
+ ```mermaid
331
+ stateDiagram-v2
332
+ state "* End of JS turn *" as jsTurn
333
+ state "opGroupingManager.groupBatch" as groupBatch
334
+ state "opCompressor.compress" as compress
335
+ state "outbox.flush" as flush
336
+ state "outbox.flushInternal" as flushInternal
337
+ state "Send batch over the wire" as post
338
+ state "Send chunks (partial ops) over the wire" as postChunks
339
+ state "Store original (uncompressed, unchunked, ungrouped) batch locally" as store
340
+ state if_compression <<choice>>
341
+ [*] --> ContainerRuntime.submit
342
+ ContainerRuntime.submit --> outbox.submitAttach
343
+ ContainerRuntime.submit --> outbox.submitBlobAttach
344
+ ContainerRuntime.submit --> outbox.submit
345
+ outbox.submit --> scheduleFlush
346
+ outbox.submitAttach --> scheduleFlush
347
+ outbox.submitBlobAttach --> scheduleFlush
348
+ scheduleFlush --> jsTurn
349
+ jsTurn --> flush
350
+ flush --> outbox.flushInternalMain
351
+ flush --> outbox.flushInternalAttach
352
+ flush --> outbox.flushInternalBlobAttach
353
+ outbox.flushInternalMain --> flushInternal
354
+ outbox.flushInternalAttach --> flushInternal
355
+ outbox.flushInternalBlobAttach --> flushInternal
356
+ flushInternal --> ContainerRuntime.reSubmit: if batch has reentrant ops and should group
357
+ ContainerRuntime.reSubmit --> flushInternal
358
+ flushInternal --> groupBatch: if should group
359
+ groupBatch --> if_compression
360
+ flushInternal --> if_compression
361
+ if_compression --> post
362
+ if_compression --> compress: if compression is enabled
363
+ compress --> post
364
+ compress --> opSplitter.split: if the compressed payload is larger than the chunk size
365
+ opSplitter.split --> post
366
+ opSplitter.split --> postChunks
367
+ post --> store
368
+ ```
369
+
370
+ With `FlushMode.Immediate`(deprecated) the difference is that ops are no longer accumulated in batches, but flushed as they are submitted, instead of waiting for the end of the JS turn. All the other components work in the exact same manner with the difference that they operate on batches with length 1.
371
+
372
+ ### Inbound
373
+
374
+ There is no concept of batch in the inbound view when we receive the ops. Ops are being received and processed one-by-one and the batch is reconstructed in the runtime layer. This requires individual components to maintain their own internal state in order to keep track of the batch.
375
+
376
+ ```mermaid
377
+ stateDiagram-v2
378
+ [*] --> ContainerRuntime.process
379
+ ContainerRuntime.process --> remoteMessageProcessor
380
+ state remoteMessageProcessor {
381
+ state "process chunk" as processChunk
382
+ state "return nothing" as returnNothing
383
+ state "decompress and store" as decompress
384
+ state if_chunk <<choice>>
385
+ state if_compressed <<choice>>
386
+ state if_unrolling <<choice>>
387
+ state if_grouped <<choice>>
388
+ [*] --> if_chunk
389
+ if_chunk --> if_compressed
390
+ if_chunk --> processChunk: is chunk
391
+ processChunk --> returnNothing
392
+ processChunk --> if_compressed: is final chunk
393
+ if_compressed --> if_unrolling
394
+ if_compressed --> decompress: is compressed
395
+ decompress --> if_unrolling
396
+ if_unrolling --> if_grouped
397
+ if_unrolling --> unroll: if currently unrolling
398
+ unroll --> if_grouped
399
+ if_grouped --> return
400
+ if_grouped --> ungroup: is grouped batch
401
+ ungroup --> return
402
+ return --> [*]
403
+ returnNothing --> [*]
404
+ }
405
+ remoteMessageProcessor --> ContainerRuntime.procesCore
406
+ ```
407
+
408
+ Note that a "system op" originating outside the ContainerRuntime will pass through this flow entirely.
@@ -4,6 +4,7 @@
4
4
  */
5
5
 
6
6
  import { ICompressionRuntimeOptions } from "../containerRuntime.js";
7
+
7
8
  import { BatchMessage, IBatch, IBatchCheckpoint } from "./definitions.js";
8
9
 
9
10
  export interface IBatchManagerOptions {
@@ -3,17 +3,15 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { IBatchMessage } from "@fluidframework/container-definitions";
7
- import { ISequencedDocumentMessage, MessageType } from "@fluidframework/protocol-definitions";
6
+ import { IBatchMessage } from "@fluidframework/container-definitions/internal";
7
+
8
8
  import { CompressionAlgorithms } from "../containerRuntime.js";
9
- import { ContainerMessageType } from "../messageTypes.js";
10
9
 
11
10
  /**
12
11
  * Batch message type used internally by the runtime
13
12
  */
14
13
  export type BatchMessage = IBatchMessage & {
15
- localOpMetadata: unknown;
16
- type: ContainerMessageType;
14
+ localOpMetadata?: unknown;
17
15
  referenceSequenceNumber: number;
18
16
  compression?: CompressionAlgorithms;
19
17
  };
@@ -59,7 +57,6 @@ export interface IChunkedOp {
59
57
  chunkId: number;
60
58
  totalChunks: number;
61
59
  contents: string;
62
- originalType: MessageType | ContainerMessageType;
63
60
  originalMetadata?: Record<string, unknown>;
64
61
  originalCompression?: string;
65
62
  }
@@ -72,18 +69,3 @@ export interface IChunkedOp {
72
69
  * will make the processor return `Processed`.
73
70
  */
74
71
  export type ProcessingState = "Processed" | "Skipped" | "Accepted";
75
-
76
- /**
77
- * Return type for functions which process remote messages
78
- */
79
- export interface IMessageProcessingResult {
80
- /**
81
- * A shallow copy of the input message if processing happened, or
82
- * the original message otherwise
83
- */
84
- readonly message: ISequencedDocumentMessage;
85
- /**
86
- * Processing result of the input message.
87
- */
88
- readonly state: ProcessingState;
89
- }
@@ -4,16 +4,10 @@
4
4
  */
5
5
 
6
6
  export { BatchManager, estimateSocketSize, BatchSequenceNumbers } from "./batchManager.js";
7
- export {
8
- BatchMessage,
9
- IBatch,
10
- IBatchCheckpoint,
11
- IChunkedOp,
12
- IMessageProcessingResult,
13
- } from "./definitions.js";
7
+ export { BatchMessage, IBatch, IBatchCheckpoint, IChunkedOp } from "./definitions.js";
14
8
  export { Outbox, getLongStack } from "./outbox.js";
15
9
  export { OpCompressor } from "./opCompressor.js";
16
10
  export { OpDecompressor } from "./opDecompressor.js";
17
- export { OpSplitter, splitOp } from "./opSplitter.js";
11
+ export { OpSplitter, splitOp, isChunkedMessage } from "./opSplitter.js";
18
12
  export { RemoteMessageProcessor, unpackRuntimeMessage } from "./remoteMessageProcessor.js";
19
- export { OpGroupingManager } from "./opGroupingManager.js";
13
+ export { OpGroupingManager, OpGroupingManagerConfig, isGroupedBatch } from "./opGroupingManager.js";
@@ -3,14 +3,16 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { createChildLogger, UsageError } from "@fluidframework/telemetry-utils";
7
- import { assert } from "@fluidframework/core-utils";
8
6
  import { IsoBuffer } from "@fluid-internal/client-utils";
9
- import { compress } from "lz4js";
10
7
  import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
8
+ import { assert } from "@fluidframework/core-utils/internal";
9
+ import { UsageError, createChildLogger } from "@fluidframework/telemetry-utils/internal";
10
+ import { compress } from "lz4js";
11
+
11
12
  import { CompressionAlgorithms } from "../containerRuntime.js";
13
+
12
14
  import { estimateSocketSize } from "./batchManager.js";
13
- import { IBatch, BatchMessage } from "./definitions.js";
15
+ import { BatchMessage, IBatch } from "./definitions.js";
14
16
 
15
17
  /**
16
18
  * Compresses batches of ops. It generates a single compressed op that contains
@@ -47,7 +49,6 @@ export class OpCompressor {
47
49
  // Add empty placeholder messages to reserve the sequence numbers
48
50
  for (const message of batch.content.slice(1)) {
49
51
  messages.push({
50
- type: message.type,
51
52
  localOpMetadata: message.localOpMetadata,
52
53
  metadata: message.metadata,
53
54
  referenceSequenceNumber: message.referenceSequenceNumber,
@@ -3,15 +3,15 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { decompress } from "lz4js";
7
- import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
8
- import { assert } from "@fluidframework/core-utils";
9
6
  import { IsoBuffer, Uint8ArrayToString } from "@fluid-internal/client-utils";
10
- import { createChildLogger } from "@fluidframework/telemetry-utils";
11
7
  import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
8
+ import { assert } from "@fluidframework/core-utils/internal";
9
+ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
10
+ import { createChildLogger } from "@fluidframework/telemetry-utils/internal";
11
+ import { decompress } from "lz4js";
12
+
12
13
  import { CompressionAlgorithms } from "../containerRuntime.js";
13
14
  import { IBatchMetadata } from "../metadata.js";
14
- import { IMessageProcessingResult } from "./definitions.js";
15
15
 
16
16
  /**
17
17
  * Compression makes assumptions about the shape of message contents. This interface codifies those assumptions, but does not validate them.
@@ -38,100 +38,7 @@ export class OpDecompressor {
38
38
  this.logger = createChildLogger({ logger, namespace: "OpDecompressor" });
39
39
  }
40
40
 
41
- public processMessage(message: ISequencedDocumentMessage): IMessageProcessingResult {
42
- assert(
43
- message.compression === undefined || message.compression === CompressionAlgorithms.lz4,
44
- 0x511 /* Only lz4 compression is supported */,
45
- );
46
-
47
- if (
48
- (message.metadata as IBatchMetadata | undefined)?.batch === true &&
49
- this.isCompressed(message)
50
- ) {
51
- // Beginning of a compressed batch
52
- assert(this.activeBatch === false, 0x4b8 /* shouldn't have multiple active batches */);
53
- this.activeBatch = true;
54
-
55
- const contents = IsoBuffer.from(
56
- (message.contents as IPackedContentsContents).packedContents,
57
- "base64",
58
- );
59
- const decompressedMessage = decompress(contents);
60
- const intoString = Uint8ArrayToString(decompressedMessage);
61
- const asObj = JSON.parse(intoString);
62
- this.rootMessageContents = asObj;
63
-
64
- return {
65
- message: newMessage(message, this.rootMessageContents[this.processedCount++]),
66
- state: "Accepted",
67
- };
68
- }
69
-
70
- if (
71
- this.rootMessageContents !== undefined &&
72
- (message.metadata as IBatchMetadata | undefined)?.batch === undefined &&
73
- this.activeBatch
74
- ) {
75
- assert(message.contents === undefined, 0x512 /* Expecting empty message */);
76
-
77
- // Continuation of compressed batch
78
- return {
79
- message: newMessage(message, this.rootMessageContents[this.processedCount++]),
80
- state: "Accepted",
81
- };
82
- }
83
-
84
- if (
85
- this.rootMessageContents !== undefined &&
86
- (message.metadata as IBatchMetadata | undefined)?.batch === false
87
- ) {
88
- // End of compressed batch
89
- const returnMessage = newMessage(
90
- message,
91
- this.rootMessageContents[this.processedCount++],
92
- );
93
-
94
- this.activeBatch = false;
95
- this.rootMessageContents = undefined;
96
- this.processedCount = 0;
97
-
98
- return {
99
- message: returnMessage,
100
- state: "Processed",
101
- };
102
- }
103
-
104
- if (
105
- (message.metadata as IBatchMetadata | undefined)?.batch === undefined &&
106
- this.isCompressed(message)
107
- ) {
108
- // Single compressed message
109
- assert(
110
- this.activeBatch === false,
111
- 0x4ba /* shouldn't receive compressed message in middle of a batch */,
112
- );
113
-
114
- const contents = IsoBuffer.from(
115
- (message.contents as IPackedContentsContents).packedContents,
116
- "base64",
117
- );
118
- const decompressedMessage = decompress(contents);
119
- const intoString = new TextDecoder().decode(decompressedMessage);
120
- const asObj = JSON.parse(intoString);
121
-
122
- return {
123
- message: newMessage(message, asObj[0]),
124
- state: "Processed",
125
- };
126
- }
127
-
128
- return {
129
- message,
130
- state: "Skipped",
131
- };
132
- }
133
-
134
- private isCompressed(message: ISequencedDocumentMessage) {
41
+ public isCompressedMessage(message: ISequencedDocumentMessage): boolean {
135
42
  if (message.compression === CompressionAlgorithms.lz4) {
136
43
  return true;
137
44
  }
@@ -174,6 +81,80 @@ export class OpDecompressor {
174
81
 
175
82
  return false;
176
83
  }
84
+
85
+ public get currentlyUnrolling() {
86
+ return this.activeBatch;
87
+ }
88
+
89
+ /** Is the decompressed and stored batch only comprised of a single message */
90
+ private isSingleMessageBatch = false;
91
+
92
+ /**
93
+ * Decompress the given compressed message and store it to be subsequently unrolled.
94
+ * The stored message will be of type `any[]` where each element represents a message's `contents`
95
+ */
96
+ public decompressAndStore(message: ISequencedDocumentMessage): void {
97
+ assert(
98
+ message.compression === undefined || message.compression === CompressionAlgorithms.lz4,
99
+ 0x511 /* Only lz4 compression is supported */,
100
+ );
101
+ assert(this.isCompressedMessage(message), "provided message should be compressed");
102
+
103
+ assert(this.activeBatch === false, 0x4b8 /* shouldn't have multiple active batches */);
104
+ this.activeBatch = true;
105
+
106
+ const batchMetadata = (message.metadata as IBatchMetadata | undefined)?.batch;
107
+ if (batchMetadata === undefined) {
108
+ this.isSingleMessageBatch = true;
109
+ } else {
110
+ assert(batchMetadata === true, "invalid batch metadata");
111
+ }
112
+
113
+ const contents = IsoBuffer.from(
114
+ (message.contents as IPackedContentsContents).packedContents,
115
+ "base64",
116
+ );
117
+ const decompressedMessage = decompress(contents);
118
+ const intoString = Uint8ArrayToString(decompressedMessage);
119
+ const asObj = JSON.parse(intoString);
120
+ this.rootMessageContents = asObj;
121
+ }
122
+
123
+ /**
124
+ * Unroll the next message from the decompressed content provided to {@link decompressAndStore}
125
+ * @returns the unrolled `ISequencedDocumentMessage`
126
+ */
127
+ public unroll(message: ISequencedDocumentMessage): ISequencedDocumentMessage {
128
+ assert(this.currentlyUnrolling, "not currently unrolling");
129
+ assert(this.rootMessageContents !== undefined, "missing rootMessageContents");
130
+ assert(this.rootMessageContents.length > this.processedCount, "no more content to unroll");
131
+
132
+ const batchMetadata = (message.metadata as IBatchMetadata | undefined)?.batch;
133
+
134
+ if (batchMetadata === false || this.isSingleMessageBatch) {
135
+ // End of compressed batch
136
+ const returnMessage = newMessage(
137
+ message,
138
+ this.rootMessageContents[this.processedCount],
139
+ );
140
+
141
+ this.activeBatch = false;
142
+ this.isSingleMessageBatch = false;
143
+ this.rootMessageContents = undefined;
144
+ this.processedCount = 0;
145
+
146
+ return returnMessage;
147
+ } else if (batchMetadata === true) {
148
+ // Start of compressed batch
149
+ return newMessage(message, this.rootMessageContents[this.processedCount++]);
150
+ }
151
+
152
+ assert(batchMetadata === undefined, "invalid batch metadata");
153
+ assert(message.contents === undefined, 0x512 /* Expecting empty message */);
154
+
155
+ // Continuation of compressed batch
156
+ return newMessage(message, this.rootMessageContents[this.processedCount++]);
157
+ }
177
158
  }
178
159
 
179
160
  // We should not be mutating the input message nor its metadata
@@ -186,5 +167,8 @@ const newMessage = (
186
167
  compression: undefined,
187
168
  // TODO: It should already be the case that we're not modifying any metadata, not clear if/why this shallow clone should be required.
188
169
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
189
- metadata: { ...(originalMessage.metadata as any) },
170
+ metadata:
171
+ originalMessage.metadata === undefined
172
+ ? undefined
173
+ : { ...(originalMessage.metadata as any) },
190
174
  });
@@ -3,11 +3,11 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { assert } from "@fluidframework/core-utils";
7
- import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
8
- import { createChildLogger } from "@fluidframework/telemetry-utils";
9
6
  import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
10
- import { ContainerMessageType } from "../messageTypes.js";
7
+ import { assert } from "@fluidframework/core-utils/internal";
8
+ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
9
+ import { createChildLogger } from "@fluidframework/telemetry-utils/internal";
10
+
11
11
  import { IBatch } from "./definitions.js";
12
12
 
13
13
  /**
@@ -28,6 +28,10 @@ function isGroupContents(opContents: any): opContents is IGroupedBatchMessageCon
28
28
  return opContents?.type === OpGroupingManager.groupedBatchOp;
29
29
  }
30
30
 
31
+ export function isGroupedBatch(op: ISequencedDocumentMessage): boolean {
32
+ return isGroupContents(op.contents);
33
+ }
34
+
31
35
  export interface OpGroupingManagerConfig {
32
36
  readonly groupedBatchingEnabled: boolean;
33
37
  readonly opCountThreshold: number;
@@ -46,9 +50,7 @@ export class OpGroupingManager {
46
50
  }
47
51
 
48
52
  public groupBatch(batch: IBatch): IBatch {
49
- if (!this.shouldGroup(batch)) {
50
- return batch;
51
- }
53
+ assert(this.shouldGroup(batch), "cannot group the provided batch");
52
54
 
53
55
  if (batch.content.length >= 1000) {
54
56
  this.logger.sendTelemetryEvent({
@@ -84,11 +86,9 @@ export class OpGroupingManager {
84
86
  ...batch,
85
87
  content: [
86
88
  {
87
- localOpMetadata: undefined,
88
89
  metadata: undefined,
89
90
  referenceSequenceNumber: batch.content[0].referenceSequenceNumber,
90
91
  contents: serializedContent,
91
- type: OpGroupingManager.groupedBatchOp as ContainerMessageType,
92
92
  },
93
93
  ],
94
94
  };
@@ -96,13 +96,11 @@ export class OpGroupingManager {
96
96
  }
97
97
 
98
98
  public ungroupOp(op: ISequencedDocumentMessage): ISequencedDocumentMessage[] {
99
- if (!isGroupContents(op.contents)) {
100
- return [op];
101
- }
99
+ assert(isGroupContents(op.contents), "can only ungroup a grouped batch");
100
+ const contents: IGroupedBatchMessageContents = op.contents;
102
101
 
103
- const messages = op.contents.contents;
104
102
  let fakeCsn = 1;
105
- return messages.map((subMessage) => ({
103
+ return contents.contents.map((subMessage) => ({
106
104
  ...op,
107
105
  clientSequenceNumber: fakeCsn++,
108
106
  contents: subMessage.contents,
@@ -3,18 +3,33 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import { IBatchMessage } from "@fluidframework/container-definitions/internal";
7
+ import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
8
+ import { assert } from "@fluidframework/core-utils/internal";
9
+ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
6
10
  import {
7
- createChildLogger,
8
11
  DataCorruptionError,
12
+ createChildLogger,
9
13
  extractSafePropertiesFromMessage,
10
- } from "@fluidframework/telemetry-utils";
11
- import { assert } from "@fluidframework/core-utils";
12
- import { IBatchMessage } from "@fluidframework/container-definitions";
13
- import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
14
- import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
14
+ } from "@fluidframework/telemetry-utils/internal";
15
+
15
16
  import { ContainerMessageType, ContainerRuntimeChunkedOpMessage } from "../messageTypes.js";
17
+
16
18
  import { estimateSocketSize } from "./batchManager.js";
17
- import { BatchMessage, IBatch, IChunkedOp, IMessageProcessingResult } from "./definitions.js";
19
+ import { BatchMessage, IBatch, IChunkedOp } from "./definitions.js";
20
+
21
+ export function isChunkedMessage(message: ISequencedDocumentMessage): boolean {
22
+ return isChunkedContents(message.contents);
23
+ }
24
+
25
+ interface IChunkedContents {
26
+ type: typeof ContainerMessageType.ChunkedOp;
27
+ contents: IChunkedOp;
28
+ }
29
+
30
+ function isChunkedContents(contents: any): contents is IChunkedContents {
31
+ return contents?.type === ContainerMessageType.ChunkedOp;
32
+ }
18
33
 
19
34
  /**
20
35
  * Responsible for creating and reconstructing chunked messages.
@@ -45,44 +60,6 @@ export class OpSplitter {
45
60
  return this.chunkMap;
46
61
  }
47
62
 
48
- public processRemoteMessage(message: ISequencedDocumentMessage): IMessageProcessingResult {
49
- if (message.type !== ContainerMessageType.ChunkedOp) {
50
- return {
51
- message,
52
- state: "Skipped",
53
- };
54
- }
55
-
56
- // TODO: Verify whether this should be able to handle server-generated ops (with null clientId)
57
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
58
- const clientId = message.clientId as string;
59
- const chunkedContent = message.contents as IChunkedOp;
60
- this.addChunk(clientId, chunkedContent, message);
61
-
62
- if (chunkedContent.chunkId < chunkedContent.totalChunks) {
63
- // We are processing the op in chunks but haven't reached
64
- // the last chunk yet in order to reconstruct the original op
65
- return {
66
- message,
67
- state: "Accepted",
68
- };
69
- }
70
-
71
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
72
- const serializedContent = this.chunkMap.get(clientId)!.join("");
73
- this.clearPartialChunks(clientId);
74
-
75
- const newMessage = { ...message };
76
- newMessage.contents = serializedContent === "" ? undefined : JSON.parse(serializedContent);
77
- newMessage.type = chunkedContent.originalType;
78
- newMessage.metadata = chunkedContent.originalMetadata;
79
- newMessage.compression = chunkedContent.originalCompression;
80
- return {
81
- message: newMessage,
82
- state: "Processed",
83
- };
84
- }
85
-
86
63
  public clearPartialChunks(clientId: string) {
87
64
  if (this.chunkMap.has(clientId)) {
88
65
  this.chunkMap.delete(clientId);
@@ -203,8 +180,53 @@ export class OpSplitter {
203
180
  referenceSequenceNumber: batch.referenceSequenceNumber,
204
181
  };
205
182
  }
183
+
184
+ public processChunk(message: ISequencedDocumentMessage): ProcessChunkResult {
185
+ assert(isChunkedContents(message.contents), "message not of type ChunkedOp");
186
+ const contents: IChunkedContents = message.contents;
187
+
188
+ // TODO: Verify whether this should be able to handle server-generated ops (with null clientId)
189
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
190
+ const clientId = message.clientId as string;
191
+ const chunkedContent = contents.contents;
192
+ this.addChunk(clientId, chunkedContent, message);
193
+
194
+ if (chunkedContent.chunkId < chunkedContent.totalChunks) {
195
+ // We are processing the op in chunks but haven't reached
196
+ // the last chunk yet in order to reconstruct the original op
197
+ return {
198
+ isFinalChunk: false,
199
+ };
200
+ }
201
+
202
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
203
+ const serializedContent = this.chunkMap.get(clientId)!.join("");
204
+ this.clearPartialChunks(clientId);
205
+
206
+ const newMessage = { ...message };
207
+ newMessage.contents = serializedContent === "" ? undefined : JSON.parse(serializedContent);
208
+ // back-compat with 1.x builds
209
+ // This is only required / present for non-compressed, chunked ops
210
+ // For compressed ops, we have op grouping enabled, and type of each op is preserved within compressed content.
211
+ newMessage.type = (chunkedContent as any).originalType;
212
+ newMessage.metadata = chunkedContent.originalMetadata;
213
+ newMessage.compression = chunkedContent.originalCompression;
214
+ return {
215
+ message: newMessage,
216
+ isFinalChunk: true,
217
+ };
218
+ }
206
219
  }
207
220
 
221
+ type ProcessChunkResult =
222
+ | {
223
+ readonly isFinalChunk: false;
224
+ }
225
+ | {
226
+ readonly isFinalChunk: true;
227
+ readonly message: ISequencedDocumentMessage;
228
+ };
229
+
208
230
  const chunkToBatchMessage = (
209
231
  chunk: IChunkedOp,
210
232
  referenceSequenceNumber: number,
@@ -216,9 +238,7 @@ const chunkToBatchMessage = (
216
238
  };
217
239
  return {
218
240
  contents: JSON.stringify(payload),
219
- type: payload.type,
220
241
  metadata,
221
- localOpMetadata: undefined,
222
242
  referenceSequenceNumber,
223
243
  };
224
244
  };
@@ -253,7 +273,6 @@ export const splitOp = (
253
273
  const chunk: IChunkedOp = {
254
274
  chunkId,
255
275
  contents: op.contents.substr(offset, chunkSizeInBytes),
256
- originalType: op.type,
257
276
  totalChunks: chunkCount,
258
277
  };
259
278
 
@@ -263,6 +282,15 @@ export const splitOp = (
263
282
  // last chunk, therefore it is the only one that needs it.
264
283
  chunk.originalMetadata = op.metadata;
265
284
  chunk.originalCompression = op.compression;
285
+
286
+ // back-compat with 1.x builds
287
+ // 2.x builds only do chunking for compressed ops.
288
+ // originalType is no longer used in such cases, as each op preserves its type within compressed payload.
289
+ // But, if 1.x builds see this op, and there is no type on the message, then it will ignore this message silently.
290
+ // This is really bad, as we will crash on later ops and it's very hard to debug these cases.
291
+ // If we put some known type here, then we will crash on it (as 1.x does not understand compression, and thus will not
292
+ // find info on the op like address of the channel to deliver the op)
293
+ (chunk as any).originalType = "component";
266
294
  }
267
295
 
268
296
  chunks.push(chunk);