@fluidframework/container-runtime 2.0.0-rc.2.0.2 → 2.0.0-rc.3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/api-report/container-runtime.api.md +471 -52
  3. package/dist/batchTracker.d.ts +1 -1
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +4 -4
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +33 -30
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +82 -107
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/channelCollection.d.ts +27 -22
  12. package/dist/channelCollection.d.ts.map +1 -1
  13. package/dist/channelCollection.js +155 -165
  14. package/dist/channelCollection.js.map +1 -1
  15. package/dist/connectionTelemetry.d.ts +3 -3
  16. package/dist/connectionTelemetry.d.ts.map +1 -1
  17. package/dist/connectionTelemetry.js +17 -17
  18. package/dist/connectionTelemetry.js.map +1 -1
  19. package/dist/containerHandleContext.d.ts.map +1 -1
  20. package/dist/containerHandleContext.js +2 -2
  21. package/dist/containerHandleContext.js.map +1 -1
  22. package/dist/containerRuntime.d.ts +42 -39
  23. package/dist/containerRuntime.d.ts.map +1 -1
  24. package/dist/containerRuntime.js +425 -292
  25. package/dist/containerRuntime.js.map +1 -1
  26. package/dist/dataStore.d.ts +1 -1
  27. package/dist/dataStore.d.ts.map +1 -1
  28. package/dist/dataStore.js +8 -8
  29. package/dist/dataStore.js.map +1 -1
  30. package/dist/dataStoreContext.d.ts +58 -19
  31. package/dist/dataStoreContext.d.ts.map +1 -1
  32. package/dist/dataStoreContext.js +169 -114
  33. package/dist/dataStoreContext.js.map +1 -1
  34. package/dist/dataStoreContexts.d.ts +1 -0
  35. package/dist/dataStoreContexts.d.ts.map +1 -1
  36. package/dist/dataStoreContexts.js +12 -11
  37. package/dist/dataStoreContexts.js.map +1 -1
  38. package/dist/dataStoreRegistry.d.ts +5 -1
  39. package/dist/dataStoreRegistry.d.ts.map +1 -1
  40. package/dist/dataStoreRegistry.js +4 -4
  41. package/dist/dataStoreRegistry.js.map +1 -1
  42. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  43. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  44. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  45. package/dist/deltaScheduler.d.ts +1 -1
  46. package/dist/deltaScheduler.d.ts.map +1 -1
  47. package/dist/deltaScheduler.js +6 -6
  48. package/dist/deltaScheduler.js.map +1 -1
  49. package/dist/error.d.ts +1 -1
  50. package/dist/error.d.ts.map +1 -1
  51. package/dist/error.js +4 -4
  52. package/dist/error.js.map +1 -1
  53. package/dist/gc/garbageCollection.d.ts +3 -2
  54. package/dist/gc/garbageCollection.d.ts.map +1 -1
  55. package/dist/gc/garbageCollection.js +23 -23
  56. package/dist/gc/garbageCollection.js.map +1 -1
  57. package/dist/gc/gcConfigs.d.ts +2 -2
  58. package/dist/gc/gcConfigs.d.ts.map +1 -1
  59. package/dist/gc/gcConfigs.js +4 -5
  60. package/dist/gc/gcConfigs.js.map +1 -1
  61. package/dist/gc/gcDefinitions.d.ts +4 -5
  62. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  63. package/dist/gc/gcDefinitions.js.map +1 -1
  64. package/dist/gc/gcHelpers.d.ts +5 -1
  65. package/dist/gc/gcHelpers.d.ts.map +1 -1
  66. package/dist/gc/gcHelpers.js +21 -12
  67. package/dist/gc/gcHelpers.js.map +1 -1
  68. package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
  69. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  70. package/dist/gc/gcSummaryStateTracker.js +11 -11
  71. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  72. package/dist/gc/gcTelemetry.d.ts +2 -1
  73. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  74. package/dist/gc/gcTelemetry.js +11 -9
  75. package/dist/gc/gcTelemetry.js.map +1 -1
  76. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  77. package/dist/gc/gcUnreferencedStateTracker.js +6 -6
  78. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  79. package/dist/gc/index.d.ts +1 -1
  80. package/dist/gc/index.d.ts.map +1 -1
  81. package/dist/gc/index.js +2 -1
  82. package/dist/gc/index.js.map +1 -1
  83. package/dist/index.d.ts +5 -2
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +12 -2
  86. package/dist/index.js.map +1 -1
  87. package/dist/legacy.d.ts +91 -0
  88. package/dist/messageTypes.d.ts +11 -5
  89. package/dist/messageTypes.d.ts.map +1 -1
  90. package/dist/messageTypes.js +4 -0
  91. package/dist/messageTypes.js.map +1 -1
  92. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  93. package/dist/opLifecycle/batchManager.js.map +1 -1
  94. package/dist/opLifecycle/definitions.d.ts +2 -20
  95. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  96. package/dist/opLifecycle/definitions.js.map +1 -1
  97. package/dist/opLifecycle/index.d.ts +3 -3
  98. package/dist/opLifecycle/index.d.ts.map +1 -1
  99. package/dist/opLifecycle/index.js +3 -1
  100. package/dist/opLifecycle/index.js.map +1 -1
  101. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  102. package/dist/opLifecycle/opCompressor.js +5 -6
  103. package/dist/opLifecycle/opCompressor.js.map +1 -1
  104. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  105. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  106. package/dist/opLifecycle/opDecompressor.js +62 -63
  107. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  108. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  109. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  110. package/dist/opLifecycle/opGroupingManager.js +14 -16
  111. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  112. package/dist/opLifecycle/opSplitter.d.ts +12 -4
  113. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  114. package/dist/opLifecycle/opSplitter.js +63 -53
  115. package/dist/opLifecycle/opSplitter.js.map +1 -1
  116. package/dist/opLifecycle/outbox.d.ts +2 -1
  117. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  118. package/dist/opLifecycle/outbox.js +30 -29
  119. package/dist/opLifecycle/outbox.js.map +1 -1
  120. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  121. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  122. package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
  123. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  124. package/dist/packageVersion.d.ts +1 -1
  125. package/dist/packageVersion.js +1 -1
  126. package/dist/packageVersion.js.map +1 -1
  127. package/dist/pendingStateManager.d.ts +1 -1
  128. package/dist/pendingStateManager.d.ts.map +1 -1
  129. package/dist/pendingStateManager.js +18 -18
  130. package/dist/pendingStateManager.js.map +1 -1
  131. package/dist/public.d.ts +12 -0
  132. package/dist/scheduleManager.d.ts +1 -1
  133. package/dist/scheduleManager.d.ts.map +1 -1
  134. package/dist/scheduleManager.js +28 -24
  135. package/dist/scheduleManager.js.map +1 -1
  136. package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
  137. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
  138. package/dist/storageServiceWithAttachBlobs.js +2 -2
  139. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  140. package/dist/summary/documentSchema.d.ts +209 -0
  141. package/dist/summary/documentSchema.d.ts.map +1 -0
  142. package/dist/summary/documentSchema.js +390 -0
  143. package/dist/summary/documentSchema.js.map +1 -0
  144. package/dist/summary/index.d.ts +2 -1
  145. package/dist/summary/index.d.ts.map +1 -1
  146. package/dist/summary/index.js +4 -1
  147. package/dist/summary/index.js.map +1 -1
  148. package/dist/summary/orderedClientElection.d.ts +2 -2
  149. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  150. package/dist/summary/orderedClientElection.js +12 -7
  151. package/dist/summary/orderedClientElection.js.map +1 -1
  152. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
  153. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  154. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  155. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  156. package/dist/summary/runningSummarizer.d.ts +3 -3
  157. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  158. package/dist/summary/runningSummarizer.js +16 -16
  159. package/dist/summary/runningSummarizer.js.map +1 -1
  160. package/dist/summary/summarizer.d.ts +3 -2
  161. package/dist/summary/summarizer.d.ts.map +1 -1
  162. package/dist/summary/summarizer.js +13 -13
  163. package/dist/summary/summarizer.js.map +1 -1
  164. package/dist/summary/summarizerClientElection.d.ts +2 -2
  165. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  166. package/dist/summary/summarizerClientElection.js.map +1 -1
  167. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  168. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  169. package/dist/summary/summarizerHeuristics.js +2 -2
  170. package/dist/summary/summarizerHeuristics.js.map +1 -1
  171. package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
  172. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  173. package/dist/summary/summarizerNode/summarizerNode.js +28 -28
  174. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  175. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  176. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  177. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  178. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  179. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  180. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  181. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
  182. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  183. package/dist/summary/summarizerTypes.d.ts +5 -3
  184. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  185. package/dist/summary/summarizerTypes.js.map +1 -1
  186. package/dist/summary/summaryCollection.d.ts +2 -2
  187. package/dist/summary/summaryCollection.d.ts.map +1 -1
  188. package/dist/summary/summaryCollection.js +7 -7
  189. package/dist/summary/summaryCollection.js.map +1 -1
  190. package/dist/summary/summaryFormat.d.ts +6 -17
  191. package/dist/summary/summaryFormat.d.ts.map +1 -1
  192. package/dist/summary/summaryFormat.js +8 -8
  193. package/dist/summary/summaryFormat.js.map +1 -1
  194. package/dist/summary/summaryGenerator.d.ts +4 -3
  195. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  196. package/dist/summary/summaryGenerator.js +17 -17
  197. package/dist/summary/summaryGenerator.js.map +1 -1
  198. package/dist/summary/summaryManager.d.ts +1 -1
  199. package/dist/summary/summaryManager.d.ts.map +1 -1
  200. package/dist/summary/summaryManager.js +15 -14
  201. package/dist/summary/summaryManager.js.map +1 -1
  202. package/internal.d.ts +11 -0
  203. package/legacy.d.ts +11 -0
  204. package/lib/batchTracker.d.ts +1 -1
  205. package/lib/batchTracker.d.ts.map +1 -1
  206. package/lib/batchTracker.js +2 -2
  207. package/lib/batchTracker.js.map +1 -1
  208. package/lib/blobManager.d.ts +33 -30
  209. package/lib/blobManager.d.ts.map +1 -1
  210. package/lib/blobManager.js +48 -73
  211. package/lib/blobManager.js.map +1 -1
  212. package/lib/channelCollection.d.ts +27 -22
  213. package/lib/channelCollection.d.ts.map +1 -1
  214. package/lib/channelCollection.js +96 -106
  215. package/lib/channelCollection.js.map +1 -1
  216. package/lib/connectionTelemetry.d.ts +3 -3
  217. package/lib/connectionTelemetry.d.ts.map +1 -1
  218. package/lib/connectionTelemetry.js +3 -3
  219. package/lib/connectionTelemetry.js.map +1 -1
  220. package/lib/containerHandleContext.d.ts.map +1 -1
  221. package/lib/containerHandleContext.js +1 -1
  222. package/lib/containerHandleContext.js.map +1 -1
  223. package/lib/containerRuntime.d.ts +42 -39
  224. package/lib/containerRuntime.d.ts.map +1 -1
  225. package/lib/containerRuntime.js +276 -141
  226. package/lib/containerRuntime.js.map +1 -1
  227. package/lib/dataStore.d.ts +1 -1
  228. package/lib/dataStore.d.ts.map +1 -1
  229. package/lib/dataStore.js +3 -3
  230. package/lib/dataStore.js.map +1 -1
  231. package/lib/dataStoreContext.d.ts +58 -19
  232. package/lib/dataStoreContext.d.ts.map +1 -1
  233. package/lib/dataStoreContext.js +107 -52
  234. package/lib/dataStoreContext.js.map +1 -1
  235. package/lib/dataStoreContexts.d.ts +1 -0
  236. package/lib/dataStoreContexts.d.ts.map +1 -1
  237. package/lib/dataStoreContexts.js +3 -2
  238. package/lib/dataStoreContexts.js.map +1 -1
  239. package/lib/dataStoreRegistry.d.ts +5 -1
  240. package/lib/dataStoreRegistry.d.ts.map +1 -1
  241. package/lib/dataStoreRegistry.js +1 -1
  242. package/lib/dataStoreRegistry.js.map +1 -1
  243. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  244. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  245. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  246. package/lib/deltaScheduler.d.ts +1 -1
  247. package/lib/deltaScheduler.d.ts.map +1 -1
  248. package/lib/deltaScheduler.js +1 -1
  249. package/lib/deltaScheduler.js.map +1 -1
  250. package/lib/error.d.ts +1 -1
  251. package/lib/error.d.ts.map +1 -1
  252. package/lib/error.js +2 -2
  253. package/lib/error.js.map +1 -1
  254. package/lib/gc/garbageCollection.d.ts +3 -2
  255. package/lib/gc/garbageCollection.d.ts.map +1 -1
  256. package/lib/gc/garbageCollection.js +8 -8
  257. package/lib/gc/garbageCollection.js.map +1 -1
  258. package/lib/gc/gcConfigs.d.ts +2 -2
  259. package/lib/gc/gcConfigs.d.ts.map +1 -1
  260. package/lib/gc/gcConfigs.js +4 -5
  261. package/lib/gc/gcConfigs.js.map +1 -1
  262. package/lib/gc/gcDefinitions.d.ts +4 -5
  263. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  264. package/lib/gc/gcDefinitions.js.map +1 -1
  265. package/lib/gc/gcHelpers.d.ts +5 -1
  266. package/lib/gc/gcHelpers.d.ts.map +1 -1
  267. package/lib/gc/gcHelpers.js +10 -2
  268. package/lib/gc/gcHelpers.js.map +1 -1
  269. package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
  270. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  271. package/lib/gc/gcSummaryStateTracker.js +2 -2
  272. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  273. package/lib/gc/gcTelemetry.d.ts +2 -1
  274. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  275. package/lib/gc/gcTelemetry.js +4 -2
  276. package/lib/gc/gcTelemetry.js.map +1 -1
  277. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  278. package/lib/gc/gcUnreferencedStateTracker.js +2 -2
  279. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  280. package/lib/gc/index.d.ts +1 -1
  281. package/lib/gc/index.d.ts.map +1 -1
  282. package/lib/gc/index.js +1 -1
  283. package/lib/gc/index.js.map +1 -1
  284. package/lib/index.d.ts +5 -2
  285. package/lib/index.d.ts.map +1 -1
  286. package/lib/index.js +5 -2
  287. package/lib/index.js.map +1 -1
  288. package/lib/legacy.d.ts +91 -0
  289. package/lib/messageTypes.d.ts +11 -5
  290. package/lib/messageTypes.d.ts.map +1 -1
  291. package/lib/messageTypes.js +4 -0
  292. package/lib/messageTypes.js.map +1 -1
  293. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  294. package/lib/opLifecycle/batchManager.js.map +1 -1
  295. package/lib/opLifecycle/definitions.d.ts +2 -20
  296. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  297. package/lib/opLifecycle/definitions.js.map +1 -1
  298. package/lib/opLifecycle/index.d.ts +3 -3
  299. package/lib/opLifecycle/index.d.ts.map +1 -1
  300. package/lib/opLifecycle/index.js +2 -2
  301. package/lib/opLifecycle/index.js.map +1 -1
  302. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  303. package/lib/opLifecycle/opCompressor.js +2 -3
  304. package/lib/opLifecycle/opCompressor.js.map +1 -1
  305. package/lib/opLifecycle/opDecompressor.d.ts +15 -4
  306. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  307. package/lib/opLifecycle/opDecompressor.js +61 -62
  308. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  309. package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
  310. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  311. package/lib/opLifecycle/opGroupingManager.js +9 -12
  312. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  313. package/lib/opLifecycle/opSplitter.d.ts +12 -4
  314. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  315. package/lib/opLifecycle/opSplitter.js +47 -38
  316. package/lib/opLifecycle/opSplitter.js.map +1 -1
  317. package/lib/opLifecycle/outbox.d.ts +2 -1
  318. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  319. package/lib/opLifecycle/outbox.js +19 -18
  320. package/lib/opLifecycle/outbox.js.map +1 -1
  321. package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  322. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  323. package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
  324. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  325. package/lib/packageVersion.d.ts +1 -1
  326. package/lib/packageVersion.js +1 -1
  327. package/lib/packageVersion.js.map +1 -1
  328. package/lib/pendingStateManager.d.ts +1 -1
  329. package/lib/pendingStateManager.d.ts.map +1 -1
  330. package/lib/pendingStateManager.js +2 -2
  331. package/lib/pendingStateManager.js.map +1 -1
  332. package/lib/public.d.ts +12 -0
  333. package/lib/scheduleManager.d.ts +1 -1
  334. package/lib/scheduleManager.d.ts.map +1 -1
  335. package/lib/scheduleManager.js +7 -3
  336. package/lib/scheduleManager.js.map +1 -1
  337. package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
  338. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
  339. package/lib/storageServiceWithAttachBlobs.js +1 -1
  340. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  341. package/lib/summary/documentSchema.d.ts +209 -0
  342. package/lib/summary/documentSchema.d.ts.map +1 -0
  343. package/lib/summary/documentSchema.js +386 -0
  344. package/lib/summary/documentSchema.js.map +1 -0
  345. package/lib/summary/index.d.ts +2 -1
  346. package/lib/summary/index.d.ts.map +1 -1
  347. package/lib/summary/index.js +1 -0
  348. package/lib/summary/index.js.map +1 -1
  349. package/lib/summary/orderedClientElection.d.ts +2 -2
  350. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  351. package/lib/summary/orderedClientElection.js +7 -2
  352. package/lib/summary/orderedClientElection.js.map +1 -1
  353. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  354. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  355. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  356. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  357. package/lib/summary/runningSummarizer.d.ts +3 -3
  358. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  359. package/lib/summary/runningSummarizer.js +3 -3
  360. package/lib/summary/runningSummarizer.js.map +1 -1
  361. package/lib/summary/summarizer.d.ts +3 -2
  362. package/lib/summary/summarizer.d.ts.map +1 -1
  363. package/lib/summary/summarizer.js +3 -3
  364. package/lib/summary/summarizer.js.map +1 -1
  365. package/lib/summary/summarizerClientElection.d.ts +2 -2
  366. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  367. package/lib/summary/summarizerClientElection.js.map +1 -1
  368. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  369. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  370. package/lib/summary/summarizerHeuristics.js +1 -1
  371. package/lib/summary/summarizerHeuristics.js.map +1 -1
  372. package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
  373. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  374. package/lib/summary/summarizerNode/summarizerNode.js +5 -5
  375. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  376. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  377. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  378. package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
  379. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  380. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  381. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  382. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  383. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  384. package/lib/summary/summarizerTypes.d.ts +5 -3
  385. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  386. package/lib/summary/summarizerTypes.js.map +1 -1
  387. package/lib/summary/summaryCollection.d.ts +2 -2
  388. package/lib/summary/summaryCollection.d.ts.map +1 -1
  389. package/lib/summary/summaryCollection.js +1 -1
  390. package/lib/summary/summaryCollection.js.map +1 -1
  391. package/lib/summary/summaryFormat.d.ts +6 -17
  392. package/lib/summary/summaryFormat.d.ts.map +1 -1
  393. package/lib/summary/summaryFormat.js +3 -3
  394. package/lib/summary/summaryFormat.js.map +1 -1
  395. package/lib/summary/summaryGenerator.d.ts +4 -3
  396. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  397. package/lib/summary/summaryGenerator.js +4 -4
  398. package/lib/summary/summaryGenerator.js.map +1 -1
  399. package/lib/summary/summaryManager.d.ts +1 -1
  400. package/lib/summary/summaryManager.d.ts.map +1 -1
  401. package/lib/summary/summaryManager.js +9 -8
  402. package/lib/summary/summaryManager.js.map +1 -1
  403. package/package.json +57 -65
  404. package/src/batchTracker.ts +4 -3
  405. package/src/blobManager.ts +100 -77
  406. package/src/channelCollection.ts +180 -165
  407. package/src/connectionTelemetry.ts +12 -12
  408. package/src/containerHandleContext.ts +3 -2
  409. package/src/containerRuntime.ts +481 -277
  410. package/src/dataStore.ts +9 -4
  411. package/src/dataStoreContext.ts +195 -93
  412. package/src/dataStoreContexts.ts +5 -2
  413. package/src/dataStoreRegistry.ts +3 -2
  414. package/src/deltaManagerSummarizerProxy.ts +1 -1
  415. package/src/deltaScheduler.ts +2 -1
  416. package/src/error.ts +2 -2
  417. package/src/gc/garbageCollection.ts +21 -20
  418. package/src/gc/gcConfigs.ts +15 -18
  419. package/src/gc/gcDefinitions.ts +6 -8
  420. package/src/gc/gcHelpers.ts +22 -5
  421. package/src/gc/gcSummaryStateTracker.ts +7 -5
  422. package/src/gc/gcTelemetry.ts +13 -7
  423. package/src/gc/gcUnreferencedStateTracker.ts +3 -2
  424. package/src/gc/index.ts +1 -0
  425. package/src/index.ts +22 -1
  426. package/src/messageTypes.ts +20 -6
  427. package/src/opLifecycle/README.md +89 -0
  428. package/src/opLifecycle/batchManager.ts +1 -0
  429. package/src/opLifecycle/definitions.ts +3 -21
  430. package/src/opLifecycle/index.ts +3 -9
  431. package/src/opLifecycle/opCompressor.ts +6 -5
  432. package/src/opLifecycle/opDecompressor.ts +90 -100
  433. package/src/opLifecycle/opGroupingManager.ts +12 -14
  434. package/src/opLifecycle/opSplitter.ts +76 -48
  435. package/src/opLifecycle/outbox.ts +30 -38
  436. package/src/opLifecycle/remoteMessageProcessor.ts +43 -55
  437. package/src/packageVersion.ts +1 -1
  438. package/src/pendingStateManager.ts +6 -6
  439. package/src/scheduleManager.ts +10 -8
  440. package/src/storageServiceWithAttachBlobs.ts +2 -2
  441. package/src/summary/documentSchema.ts +631 -0
  442. package/src/summary/index.ts +10 -1
  443. package/src/summary/orderedClientElection.ts +7 -7
  444. package/src/summary/runWhileConnectedCoordinator.ts +3 -2
  445. package/src/summary/runningSummarizer.ts +22 -20
  446. package/src/summary/summarizer.ts +17 -15
  447. package/src/summary/summarizerClientElection.ts +3 -2
  448. package/src/summary/summarizerHeuristics.ts +4 -2
  449. package/src/summary/summarizerNode/summarizerNode.ts +20 -18
  450. package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
  451. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
  452. package/src/summary/summarizerTypes.ts +7 -3
  453. package/src/summary/summaryCollection.ts +3 -3
  454. package/src/summary/summaryFormat.ts +14 -26
  455. package/src/summary/summaryGenerator.ts +12 -15
  456. package/src/summary/summaryManager.ts +16 -13
  457. package/api-extractor-cjs.json +0 -8
  458. package/dist/container-runtime-alpha.d.ts +0 -1753
  459. package/dist/container-runtime-beta.d.ts +0 -268
  460. package/dist/container-runtime-public.d.ts +0 -268
  461. package/dist/container-runtime-untrimmed.d.ts +0 -1893
  462. package/lib/container-runtime-alpha.d.ts +0 -1753
  463. package/lib/container-runtime-beta.d.ts +0 -268
  464. package/lib/container-runtime-public.d.ts +0 -268
  465. package/lib/container-runtime-untrimmed.d.ts +0 -1893
  466. package/lib/test/batchTracker.spec.js +0 -88
  467. package/lib/test/batchTracker.spec.js.map +0 -1
  468. package/lib/test/blobManager.spec.js +0 -835
  469. package/lib/test/blobManager.spec.js.map +0 -1
  470. package/lib/test/channelCollection.spec.js +0 -141
  471. package/lib/test/channelCollection.spec.js.map +0 -1
  472. package/lib/test/containerRuntime.spec.js +0 -1748
  473. package/lib/test/containerRuntime.spec.js.map +0 -1
  474. package/lib/test/dataStoreContext.spec.js +0 -801
  475. package/lib/test/dataStoreContext.spec.js.map +0 -1
  476. package/lib/test/dataStoreCreation.spec.js +0 -312
  477. package/lib/test/dataStoreCreation.spec.js.map +0 -1
  478. package/lib/test/dataStoreRegistry.spec.js +0 -26
  479. package/lib/test/dataStoreRegistry.spec.js.map +0 -1
  480. package/lib/test/fuzz/fuzzUtils.js +0 -66
  481. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  482. package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
  483. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
  484. package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
  485. package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
  486. package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
  487. package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
  488. package/lib/test/gc/garbageCollection.spec.js +0 -1465
  489. package/lib/test/gc/garbageCollection.spec.js.map +0 -1
  490. package/lib/test/gc/gcConfigs.spec.js +0 -690
  491. package/lib/test/gc/gcConfigs.spec.js.map +0 -1
  492. package/lib/test/gc/gcHelpers.spec.js +0 -110
  493. package/lib/test/gc/gcHelpers.spec.js.map +0 -1
  494. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
  495. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
  496. package/lib/test/gc/gcStats.spec.js +0 -391
  497. package/lib/test/gc/gcStats.spec.js.map +0 -1
  498. package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
  499. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
  500. package/lib/test/gc/gcTelemetry.spec.js +0 -530
  501. package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
  502. package/lib/test/gc/gcUnitTestHelpers.js +0 -29
  503. package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
  504. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
  505. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
  506. package/lib/test/getPendingBlobs.spec.js +0 -193
  507. package/lib/test/getPendingBlobs.spec.js.map +0 -1
  508. package/lib/test/hardwareStats.spec.js +0 -93
  509. package/lib/test/hardwareStats.spec.js.map +0 -1
  510. package/lib/test/index.js +0 -6
  511. package/lib/test/index.js.map +0 -1
  512. package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
  513. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
  514. package/lib/test/opLifecycle/batchManager.spec.js +0 -189
  515. package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
  516. package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
  517. package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
  518. package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
  519. package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
  520. package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
  521. package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
  522. package/lib/test/opLifecycle/outbox.spec.js +0 -675
  523. package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
  524. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
  525. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
  526. package/lib/test/pendingStateManager.spec.js +0 -329
  527. package/lib/test/pendingStateManager.spec.js.map +0 -1
  528. package/lib/test/scheduleManager.spec.js +0 -270
  529. package/lib/test/scheduleManager.spec.js.map +0 -1
  530. package/lib/test/summarizerNode.spec.js +0 -326
  531. package/lib/test/summarizerNode.spec.js.map +0 -1
  532. package/lib/test/summarizerNodeWithGc.spec.js +0 -318
  533. package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
  534. package/lib/test/summary/orderedClientElection.spec.js +0 -535
  535. package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
  536. package/lib/test/summary/runningSummarizer.spec.js +0 -1349
  537. package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
  538. package/lib/test/summary/summarizer.spec.js +0 -29
  539. package/lib/test/summary/summarizer.spec.js.map +0 -1
  540. package/lib/test/summary/summarizerClientElection.spec.js +0 -436
  541. package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
  542. package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
  543. package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
  544. package/lib/test/summary/summaryCollection.spec.js +0 -200
  545. package/lib/test/summary/summaryCollection.spec.js.map +0 -1
  546. package/lib/test/summary/summaryManager.spec.js +0 -430
  547. package/lib/test/summary/summaryManager.spec.js.map +0 -1
  548. package/lib/test/summary/testQuorumClients.js +0 -34
  549. package/lib/test/summary/testQuorumClients.js.map +0 -1
  550. package/lib/test/throttler.spec.js +0 -175
  551. package/lib/test/throttler.spec.js.map +0 -1
  552. package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
  553. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
  554. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -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,86 @@ 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(
102
+ this.isCompressedMessage(message),
103
+ 0x940 /* provided message should be compressed */,
104
+ );
105
+
106
+ assert(this.activeBatch === false, 0x4b8 /* shouldn't have multiple active batches */);
107
+ this.activeBatch = true;
108
+
109
+ const batchMetadata = (message.metadata as IBatchMetadata | undefined)?.batch;
110
+ if (batchMetadata === undefined) {
111
+ this.isSingleMessageBatch = true;
112
+ } else {
113
+ assert(batchMetadata === true, 0x941 /* invalid batch metadata */);
114
+ }
115
+
116
+ const contents = IsoBuffer.from(
117
+ (message.contents as IPackedContentsContents).packedContents,
118
+ "base64",
119
+ );
120
+ const decompressedMessage = decompress(contents);
121
+ const intoString = Uint8ArrayToString(decompressedMessage);
122
+ const asObj = JSON.parse(intoString);
123
+ this.rootMessageContents = asObj;
124
+ }
125
+
126
+ /**
127
+ * Unroll the next message from the decompressed content provided to {@link decompressAndStore}
128
+ * @returns the unrolled `ISequencedDocumentMessage`
129
+ */
130
+ public unroll(message: ISequencedDocumentMessage): ISequencedDocumentMessage {
131
+ assert(this.currentlyUnrolling, 0x942 /* not currently unrolling */);
132
+ assert(this.rootMessageContents !== undefined, 0x943 /* missing rootMessageContents */);
133
+ assert(
134
+ this.rootMessageContents.length > this.processedCount,
135
+ 0x944 /* no more content to unroll */,
136
+ );
137
+
138
+ const batchMetadata = (message.metadata as IBatchMetadata | undefined)?.batch;
139
+
140
+ if (batchMetadata === false || this.isSingleMessageBatch) {
141
+ // End of compressed batch
142
+ const returnMessage = newMessage(
143
+ message,
144
+ this.rootMessageContents[this.processedCount],
145
+ );
146
+
147
+ this.activeBatch = false;
148
+ this.isSingleMessageBatch = false;
149
+ this.rootMessageContents = undefined;
150
+ this.processedCount = 0;
151
+
152
+ return returnMessage;
153
+ } else if (batchMetadata === true) {
154
+ // Start of compressed batch
155
+ return newMessage(message, this.rootMessageContents[this.processedCount++]);
156
+ }
157
+
158
+ assert(batchMetadata === undefined, 0x945 /* invalid batch metadata */);
159
+ assert(message.contents === undefined, 0x512 /* Expecting empty message */);
160
+
161
+ // Continuation of compressed batch
162
+ return newMessage(message, this.rootMessageContents[this.processedCount++]);
163
+ }
177
164
  }
178
165
 
179
166
  // We should not be mutating the input message nor its metadata
@@ -186,5 +173,8 @@ const newMessage = (
186
173
  compression: undefined,
187
174
  // 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
175
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
189
- metadata: { ...(originalMessage.metadata as any) },
176
+ metadata:
177
+ originalMessage.metadata === undefined
178
+ ? undefined
179
+ : { ...(originalMessage.metadata as any) },
190
180
  });
@@ -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), 0x946 /* 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), 0x947 /* 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), 0x948 /* 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);
@@ -3,18 +3,20 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import { ICriticalContainerError } from "@fluidframework/container-definitions";
7
+ import { IBatchMessage } from "@fluidframework/container-definitions/internal";
8
+ import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
9
+ import { assert } from "@fluidframework/core-utils/internal";
6
10
  import {
7
- createChildMonitoringContext,
8
11
  GenericError,
9
12
  MonitoringContext,
10
13
  UsageError,
11
- } from "@fluidframework/telemetry-utils";
12
- import { assert } from "@fluidframework/core-utils";
13
- import { IBatchMessage, ICriticalContainerError } from "@fluidframework/container-definitions";
14
- import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
14
+ createChildMonitoringContext,
15
+ } from "@fluidframework/telemetry-utils/internal";
16
+
15
17
  import { ICompressionRuntimeOptions } from "../containerRuntime.js";
16
18
  import { IPendingBatchMessage, PendingStateManager } from "../pendingStateManager.js";
17
- import { ContainerMessageType } from "../messageTypes.js";
19
+
18
20
  import {
19
21
  BatchManager,
20
22
  BatchSequenceNumbers,
@@ -120,7 +122,12 @@ export class Outbox {
120
122
  }
121
123
 
122
124
  public get messageCount(): number {
123
- return this.attachFlowBatch.length + this.mainBatch.length + this.blobAttachBatch.length;
125
+ return (
126
+ this.attachFlowBatch.length +
127
+ this.mainBatch.length +
128
+ this.blobAttachBatch.length +
129
+ this.idAllocationBatch.length
130
+ );
124
131
  }
125
132
 
126
133
  public get isEmpty(): boolean {
@@ -182,20 +189,12 @@ export class Outbox {
182
189
  }
183
190
 
184
191
  public submit(message: BatchMessage) {
185
- assert(
186
- message.type !== ContainerMessageType.IdAllocation,
187
- 0x8f8 /* Allocation message submitted to mainBatch. */,
188
- );
189
192
  this.maybeFlushPartialBatch();
190
193
 
191
194
  this.addMessageToBatchManager(this.mainBatch, message);
192
195
  }
193
196
 
194
197
  public submitAttach(message: BatchMessage) {
195
- assert(
196
- message.type === ContainerMessageType.Attach,
197
- 0x8f9 /* Non attach message submitted to attachFlowBatch. */,
198
- );
199
198
  this.maybeFlushPartialBatch();
200
199
 
201
200
  if (
@@ -227,10 +226,6 @@ export class Outbox {
227
226
  }
228
227
 
229
228
  public submitBlobAttach(message: BatchMessage) {
230
- assert(
231
- message.type === ContainerMessageType.BlobAttach,
232
- 0x8fa /* Non blobAttach message submitted to blobAttachBatch. */,
233
- );
234
229
  this.maybeFlushPartialBatch();
235
230
 
236
231
  this.addMessageToBatchManager(this.blobAttachBatch, message);
@@ -249,10 +244,6 @@ export class Outbox {
249
244
  }
250
245
 
251
246
  public submitIdAllocation(message: BatchMessage) {
252
- assert(
253
- message.type === ContainerMessageType.IdAllocation,
254
- 0x8fb /* Non allocation message submitted to idAllocationBatch. */,
255
- );
256
247
  this.maybeFlushPartialBatch();
257
248
 
258
249
  if (
@@ -323,10 +314,9 @@ export class Outbox {
323
314
  }
324
315
 
325
316
  const rawBatch = batchManager.popBatch();
326
- if (
327
- rawBatch.hasReentrantOps === true &&
328
- this.params.groupingManager.shouldGroup(rawBatch)
329
- ) {
317
+ const shouldGroup =
318
+ !disableGroupedBatching && this.params.groupingManager.shouldGroup(rawBatch);
319
+ if (rawBatch.hasReentrantOps === true && shouldGroup) {
330
320
  assert(!this.rebasing, 0x6fa /* A rebased batch should never have reentrant ops */);
331
321
  // If a batch contains reentrant ops (ops created as a result from processing another op)
332
322
  // it needs to be rebased so that we can ensure consistent reference sequence numbers
@@ -335,8 +325,15 @@ export class Outbox {
335
325
  return;
336
326
  }
337
327
 
338
- const processedBatch = this.compressBatch(rawBatch, disableGroupedBatching);
339
- this.sendBatch(processedBatch);
328
+ // Did we disconnect?
329
+ // If so, do nothing, as pending state manager will resubmit it correctly on reconnect.
330
+ // Because flush() is a task that executes async (on clean stack), we can get here in disconnected state.
331
+ if (this.params.shouldSend()) {
332
+ const processedBatch = this.compressBatch(
333
+ shouldGroup ? this.params.groupingManager.groupBatch(rawBatch) : rawBatch,
334
+ );
335
+ this.sendBatch(processedBatch);
336
+ }
340
337
 
341
338
  this.persistBatch(rawBatch.content);
342
339
  }
@@ -380,7 +377,7 @@ export class Outbox {
380
377
  return this.params.opReentrancy() && !this.rebasing;
381
378
  }
382
379
 
383
- private compressBatch(batch: IBatch, disableGroupedBatching: boolean): IBatch {
380
+ private compressBatch(batch: IBatch): IBatch {
384
381
  if (
385
382
  batch.content.length === 0 ||
386
383
  this.params.config.compressionOptions === undefined ||
@@ -389,12 +386,10 @@ export class Outbox {
389
386
  this.params.submitBatchFn === undefined
390
387
  ) {
391
388
  // Nothing to do if the batch is empty or if compression is disabled or not supported, or if we don't need to compress
392
- return disableGroupedBatching ? batch : this.params.groupingManager.groupBatch(batch);
389
+ return batch;
393
390
  }
394
391
 
395
- const compressedBatch = this.params.compressor.compressBatch(
396
- disableGroupedBatching ? batch : this.params.groupingManager.groupBatch(batch),
397
- );
392
+ const compressedBatch = this.params.compressor.compressBatch(batch);
398
393
 
399
394
  if (this.params.splitter.isBatchChunkingEnabled) {
400
395
  return compressedBatch.contentSizeInBytes <= this.params.splitter.chunkSizeInBytes
@@ -424,10 +419,7 @@ export class Outbox {
424
419
  */
425
420
  private sendBatch(batch: IBatch) {
426
421
  const length = batch.content.length;
427
-
428
- // Did we disconnect in the middle of turn-based batch?
429
- // If so, do nothing, as pending state manager will resubmit it correctly on reconnect.
430
- if (length === 0 || !this.params.shouldSend()) {
422
+ if (length === 0) {
431
423
  return;
432
424
  }
433
425