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

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 (456) hide show
  1. package/api-report/container-runtime.api.md +78 -25
  2. package/dist/batchTracker.d.ts +1 -1
  3. package/dist/batchTracker.d.ts.map +1 -1
  4. package/dist/batchTracker.js +2 -2
  5. package/dist/batchTracker.js.map +1 -1
  6. package/dist/blobManager.d.ts +3 -3
  7. package/dist/blobManager.d.ts.map +1 -1
  8. package/dist/blobManager.js +3 -3
  9. package/dist/blobManager.js.map +1 -1
  10. package/dist/channelCollection.d.ts +5 -5
  11. package/dist/channelCollection.d.ts.map +1 -1
  12. package/dist/channelCollection.js +44 -11
  13. package/dist/channelCollection.js.map +1 -1
  14. package/dist/connectionTelemetry.d.ts +2 -2
  15. package/dist/connectionTelemetry.d.ts.map +1 -1
  16. package/dist/connectionTelemetry.js +3 -3
  17. package/dist/connectionTelemetry.js.map +1 -1
  18. package/dist/container-runtime-alpha.d.ts +205 -11
  19. package/dist/container-runtime-beta.d.ts +16 -2
  20. package/dist/container-runtime-public.d.ts +16 -2
  21. package/dist/container-runtime-untrimmed.d.ts +205 -24
  22. package/dist/containerHandleContext.d.ts.map +1 -1
  23. package/dist/containerHandleContext.js.map +1 -1
  24. package/dist/containerRuntime.d.ts +32 -26
  25. package/dist/containerRuntime.d.ts.map +1 -1
  26. package/dist/containerRuntime.js +213 -119
  27. package/dist/containerRuntime.js.map +1 -1
  28. package/dist/dataStore.d.ts +1 -1
  29. package/dist/dataStore.d.ts.map +1 -1
  30. package/dist/dataStore.js +2 -2
  31. package/dist/dataStore.js.map +1 -1
  32. package/dist/dataStoreContext.d.ts +4 -4
  33. package/dist/dataStoreContext.d.ts.map +1 -1
  34. package/dist/dataStoreContext.js +18 -18
  35. package/dist/dataStoreContext.js.map +1 -1
  36. package/dist/dataStoreContexts.d.ts.map +1 -1
  37. package/dist/dataStoreContexts.js.map +1 -1
  38. package/dist/dataStoreRegistry.d.ts.map +1 -1
  39. package/dist/dataStoreRegistry.js.map +1 -1
  40. package/dist/deltaScheduler.d.ts +1 -1
  41. package/dist/deltaScheduler.d.ts.map +1 -1
  42. package/dist/deltaScheduler.js +1 -1
  43. package/dist/deltaScheduler.js.map +1 -1
  44. package/dist/gc/garbageCollection.d.ts +1 -1
  45. package/dist/gc/garbageCollection.d.ts.map +1 -1
  46. package/dist/gc/garbageCollection.js +1 -1
  47. package/dist/gc/garbageCollection.js.map +1 -1
  48. package/dist/gc/gcConfigs.d.ts +1 -1
  49. package/dist/gc/gcConfigs.d.ts.map +1 -1
  50. package/dist/gc/gcConfigs.js.map +1 -1
  51. package/dist/gc/gcDefinitions.d.ts +1 -1
  52. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  53. package/dist/gc/gcDefinitions.js.map +1 -1
  54. package/dist/gc/gcHelpers.d.ts.map +1 -1
  55. package/dist/gc/gcHelpers.js.map +1 -1
  56. package/dist/gc/gcSummaryStateTracker.d.ts +1 -1
  57. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  58. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  59. package/dist/gc/gcTelemetry.d.ts +1 -1
  60. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  61. package/dist/gc/gcTelemetry.js.map +1 -1
  62. package/dist/index.d.ts +2 -2
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +4 -2
  65. package/dist/index.js.map +1 -1
  66. package/dist/messageTypes.d.ts +11 -5
  67. package/dist/messageTypes.d.ts.map +1 -1
  68. package/dist/messageTypes.js +4 -0
  69. package/dist/messageTypes.js.map +1 -1
  70. package/dist/opLifecycle/definitions.d.ts +1 -19
  71. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  72. package/dist/opLifecycle/definitions.js.map +1 -1
  73. package/dist/opLifecycle/index.d.ts +3 -3
  74. package/dist/opLifecycle/index.d.ts.map +1 -1
  75. package/dist/opLifecycle/index.js +3 -1
  76. package/dist/opLifecycle/index.js.map +1 -1
  77. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  78. package/dist/opLifecycle/opCompressor.js +2 -3
  79. package/dist/opLifecycle/opCompressor.js.map +1 -1
  80. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  81. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  82. package/dist/opLifecycle/opDecompressor.js +60 -61
  83. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  84. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  85. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  86. package/dist/opLifecycle/opGroupingManager.js +9 -11
  87. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  88. package/dist/opLifecycle/opSplitter.d.ts +11 -3
  89. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  90. package/dist/opLifecycle/opSplitter.js +48 -38
  91. package/dist/opLifecycle/opSplitter.js.map +1 -1
  92. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  93. package/dist/opLifecycle/outbox.js +7 -12
  94. package/dist/opLifecycle/outbox.js.map +1 -1
  95. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  96. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  97. package/dist/opLifecycle/remoteMessageProcessor.js +36 -35
  98. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  99. package/dist/packageVersion.d.ts +1 -1
  100. package/dist/packageVersion.js +1 -1
  101. package/dist/packageVersion.js.map +1 -1
  102. package/dist/pendingStateManager.d.ts +1 -1
  103. package/dist/pendingStateManager.d.ts.map +1 -1
  104. package/dist/pendingStateManager.js.map +1 -1
  105. package/dist/scheduleManager.d.ts +1 -1
  106. package/dist/scheduleManager.d.ts.map +1 -1
  107. package/dist/scheduleManager.js +2 -2
  108. package/dist/scheduleManager.js.map +1 -1
  109. package/dist/summary/documentSchema.d.ts +178 -0
  110. package/dist/summary/documentSchema.d.ts.map +1 -0
  111. package/dist/summary/documentSchema.js +345 -0
  112. package/dist/summary/documentSchema.js.map +1 -0
  113. package/dist/summary/index.d.ts +2 -1
  114. package/dist/summary/index.d.ts.map +1 -1
  115. package/dist/summary/index.js +4 -1
  116. package/dist/summary/index.js.map +1 -1
  117. package/dist/summary/orderedClientElection.d.ts +2 -2
  118. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  119. package/dist/summary/orderedClientElection.js +3 -2
  120. package/dist/summary/orderedClientElection.js.map +1 -1
  121. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
  122. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  123. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  124. package/dist/summary/runningSummarizer.d.ts +2 -2
  125. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  126. package/dist/summary/runningSummarizer.js +2 -2
  127. package/dist/summary/runningSummarizer.js.map +1 -1
  128. package/dist/summary/summarizer.d.ts +2 -2
  129. package/dist/summary/summarizer.d.ts.map +1 -1
  130. package/dist/summary/summarizer.js +2 -2
  131. package/dist/summary/summarizer.js.map +1 -1
  132. package/dist/summary/summarizerClientElection.d.ts +2 -2
  133. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  134. package/dist/summary/summarizerClientElection.js.map +1 -1
  135. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  136. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  137. package/dist/summary/summarizerHeuristics.js.map +1 -1
  138. package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -2
  139. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  140. package/dist/summary/summarizerNode/summarizerNode.js +3 -3
  141. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  142. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
  143. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  144. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  145. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
  146. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  147. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
  148. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  149. package/dist/summary/summarizerTypes.d.ts +3 -3
  150. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  151. package/dist/summary/summarizerTypes.js.map +1 -1
  152. package/dist/summary/summaryCollection.d.ts +2 -2
  153. package/dist/summary/summaryCollection.d.ts.map +1 -1
  154. package/dist/summary/summaryCollection.js +1 -1
  155. package/dist/summary/summaryCollection.js.map +1 -1
  156. package/dist/summary/summaryFormat.d.ts +5 -16
  157. package/dist/summary/summaryFormat.d.ts.map +1 -1
  158. package/dist/summary/summaryFormat.js.map +1 -1
  159. package/dist/summary/summaryGenerator.d.ts +2 -2
  160. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  161. package/dist/summary/summaryGenerator.js +2 -2
  162. package/dist/summary/summaryGenerator.js.map +1 -1
  163. package/dist/summary/summaryManager.d.ts +1 -1
  164. package/dist/summary/summaryManager.d.ts.map +1 -1
  165. package/dist/summary/summaryManager.js +2 -2
  166. package/dist/summary/summaryManager.js.map +1 -1
  167. package/lib/batchTracker.d.ts +1 -1
  168. package/lib/batchTracker.d.ts.map +1 -1
  169. package/lib/batchTracker.js +2 -2
  170. package/lib/batchTracker.js.map +1 -1
  171. package/lib/blobManager.d.ts +3 -3
  172. package/lib/blobManager.d.ts.map +1 -1
  173. package/lib/blobManager.js +5 -5
  174. package/lib/blobManager.js.map +1 -1
  175. package/lib/channelCollection.d.ts +5 -5
  176. package/lib/channelCollection.d.ts.map +1 -1
  177. package/lib/channelCollection.js +46 -13
  178. package/lib/channelCollection.js.map +1 -1
  179. package/lib/connectionTelemetry.d.ts +2 -2
  180. package/lib/connectionTelemetry.d.ts.map +1 -1
  181. package/lib/connectionTelemetry.js +3 -3
  182. package/lib/connectionTelemetry.js.map +1 -1
  183. package/lib/container-runtime-alpha.d.ts +205 -11
  184. package/lib/container-runtime-beta.d.ts +16 -2
  185. package/lib/container-runtime-public.d.ts +16 -2
  186. package/lib/container-runtime-untrimmed.d.ts +205 -24
  187. package/lib/containerHandleContext.d.ts.map +1 -1
  188. package/lib/containerHandleContext.js.map +1 -1
  189. package/lib/containerRuntime.d.ts +32 -26
  190. package/lib/containerRuntime.d.ts.map +1 -1
  191. package/lib/containerRuntime.js +175 -81
  192. package/lib/containerRuntime.js.map +1 -1
  193. package/lib/dataStore.d.ts +1 -1
  194. package/lib/dataStore.d.ts.map +1 -1
  195. package/lib/dataStore.js +2 -2
  196. package/lib/dataStore.js.map +1 -1
  197. package/lib/dataStoreContext.d.ts +4 -4
  198. package/lib/dataStoreContext.d.ts.map +1 -1
  199. package/lib/dataStoreContext.js +3 -3
  200. package/lib/dataStoreContext.js.map +1 -1
  201. package/lib/dataStoreContexts.d.ts.map +1 -1
  202. package/lib/dataStoreContexts.js.map +1 -1
  203. package/lib/dataStoreRegistry.d.ts.map +1 -1
  204. package/lib/dataStoreRegistry.js.map +1 -1
  205. package/lib/deltaScheduler.d.ts +1 -1
  206. package/lib/deltaScheduler.d.ts.map +1 -1
  207. package/lib/deltaScheduler.js +1 -1
  208. package/lib/deltaScheduler.js.map +1 -1
  209. package/lib/gc/garbageCollection.d.ts +1 -1
  210. package/lib/gc/garbageCollection.d.ts.map +1 -1
  211. package/lib/gc/garbageCollection.js +3 -3
  212. package/lib/gc/garbageCollection.js.map +1 -1
  213. package/lib/gc/gcConfigs.d.ts +1 -1
  214. package/lib/gc/gcConfigs.d.ts.map +1 -1
  215. package/lib/gc/gcConfigs.js +1 -1
  216. package/lib/gc/gcConfigs.js.map +1 -1
  217. package/lib/gc/gcDefinitions.d.ts +1 -1
  218. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  219. package/lib/gc/gcDefinitions.js.map +1 -1
  220. package/lib/gc/gcHelpers.d.ts.map +1 -1
  221. package/lib/gc/gcHelpers.js.map +1 -1
  222. package/lib/gc/gcSummaryStateTracker.d.ts +1 -1
  223. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  224. package/lib/gc/gcSummaryStateTracker.js +1 -1
  225. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  226. package/lib/gc/gcTelemetry.d.ts +1 -1
  227. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  228. package/lib/gc/gcTelemetry.js +1 -1
  229. package/lib/gc/gcTelemetry.js.map +1 -1
  230. package/lib/index.d.ts +2 -2
  231. package/lib/index.d.ts.map +1 -1
  232. package/lib/index.js +2 -2
  233. package/lib/index.js.map +1 -1
  234. package/lib/messageTypes.d.ts +11 -5
  235. package/lib/messageTypes.d.ts.map +1 -1
  236. package/lib/messageTypes.js +4 -0
  237. package/lib/messageTypes.js.map +1 -1
  238. package/lib/opLifecycle/definitions.d.ts +1 -19
  239. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  240. package/lib/opLifecycle/definitions.js.map +1 -1
  241. package/lib/opLifecycle/index.d.ts +3 -3
  242. package/lib/opLifecycle/index.d.ts.map +1 -1
  243. package/lib/opLifecycle/index.js +2 -2
  244. package/lib/opLifecycle/index.js.map +1 -1
  245. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  246. package/lib/opLifecycle/opCompressor.js +2 -3
  247. package/lib/opLifecycle/opCompressor.js.map +1 -1
  248. package/lib/opLifecycle/opDecompressor.d.ts +15 -4
  249. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  250. package/lib/opLifecycle/opDecompressor.js +60 -61
  251. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  252. package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
  253. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  254. package/lib/opLifecycle/opGroupingManager.js +7 -10
  255. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  256. package/lib/opLifecycle/opSplitter.d.ts +11 -3
  257. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  258. package/lib/opLifecycle/opSplitter.js +46 -37
  259. package/lib/opLifecycle/opSplitter.js.map +1 -1
  260. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  261. package/lib/opLifecycle/outbox.js +7 -12
  262. package/lib/opLifecycle/outbox.js.map +1 -1
  263. package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  264. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  265. package/lib/opLifecycle/remoteMessageProcessor.js +36 -35
  266. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  267. package/lib/packageVersion.d.ts +1 -1
  268. package/lib/packageVersion.js +1 -1
  269. package/lib/packageVersion.js.map +1 -1
  270. package/lib/pendingStateManager.d.ts +1 -1
  271. package/lib/pendingStateManager.d.ts.map +1 -1
  272. package/lib/pendingStateManager.js.map +1 -1
  273. package/lib/scheduleManager.d.ts +1 -1
  274. package/lib/scheduleManager.d.ts.map +1 -1
  275. package/lib/scheduleManager.js +2 -2
  276. package/lib/scheduleManager.js.map +1 -1
  277. package/lib/summary/documentSchema.d.ts +178 -0
  278. package/lib/summary/documentSchema.d.ts.map +1 -0
  279. package/lib/summary/documentSchema.js +341 -0
  280. package/lib/summary/documentSchema.js.map +1 -0
  281. package/lib/summary/index.d.ts +2 -1
  282. package/lib/summary/index.d.ts.map +1 -1
  283. package/lib/summary/index.js +1 -0
  284. package/lib/summary/index.js.map +1 -1
  285. package/lib/summary/orderedClientElection.d.ts +2 -2
  286. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  287. package/lib/summary/orderedClientElection.js +3 -2
  288. package/lib/summary/orderedClientElection.js.map +1 -1
  289. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  290. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  291. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  292. package/lib/summary/runningSummarizer.d.ts +2 -2
  293. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  294. package/lib/summary/runningSummarizer.js +3 -3
  295. package/lib/summary/runningSummarizer.js.map +1 -1
  296. package/lib/summary/summarizer.d.ts +2 -2
  297. package/lib/summary/summarizer.d.ts.map +1 -1
  298. package/lib/summary/summarizer.js +3 -3
  299. package/lib/summary/summarizer.js.map +1 -1
  300. package/lib/summary/summarizerClientElection.d.ts +2 -2
  301. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  302. package/lib/summary/summarizerClientElection.js.map +1 -1
  303. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  304. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  305. package/lib/summary/summarizerHeuristics.js.map +1 -1
  306. package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -2
  307. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  308. package/lib/summary/summarizerNode/summarizerNode.js +4 -4
  309. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  310. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
  311. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  312. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  313. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
  314. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  315. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
  316. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  317. package/lib/summary/summarizerTypes.d.ts +3 -3
  318. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  319. package/lib/summary/summarizerTypes.js.map +1 -1
  320. package/lib/summary/summaryCollection.d.ts +2 -2
  321. package/lib/summary/summaryCollection.d.ts.map +1 -1
  322. package/lib/summary/summaryCollection.js +1 -1
  323. package/lib/summary/summaryCollection.js.map +1 -1
  324. package/lib/summary/summaryFormat.d.ts +5 -16
  325. package/lib/summary/summaryFormat.d.ts.map +1 -1
  326. package/lib/summary/summaryFormat.js +1 -1
  327. package/lib/summary/summaryFormat.js.map +1 -1
  328. package/lib/summary/summaryGenerator.d.ts +2 -2
  329. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  330. package/lib/summary/summaryGenerator.js +3 -3
  331. package/lib/summary/summaryGenerator.js.map +1 -1
  332. package/lib/summary/summaryManager.d.ts +1 -1
  333. package/lib/summary/summaryManager.d.ts.map +1 -1
  334. package/lib/summary/summaryManager.js +2 -2
  335. package/lib/summary/summaryManager.js.map +1 -1
  336. package/lib/test/blobManager.spec.js +3 -3
  337. package/lib/test/blobManager.spec.js.map +1 -1
  338. package/lib/test/containerRuntime.spec.js +6 -4
  339. package/lib/test/containerRuntime.spec.js.map +1 -1
  340. package/lib/test/dataStoreContext.spec.js +4 -4
  341. package/lib/test/dataStoreContext.spec.js.map +1 -1
  342. package/lib/test/dataStoreCreation.spec.js +1 -1
  343. package/lib/test/dataStoreCreation.spec.js.map +1 -1
  344. package/lib/test/dataStoreRegistry.spec.js.map +1 -1
  345. package/lib/test/documentSchema.spec.js +282 -0
  346. package/lib/test/documentSchema.spec.js.map +1 -0
  347. package/lib/test/fuzz/fuzzUtils.js +11 -7
  348. package/lib/test/fuzz/fuzzUtils.js.map +1 -1
  349. package/lib/test/fuzz/summarizer.fuzz.spec.js +9 -7
  350. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +1 -1
  351. package/lib/test/fuzz/summarizerFuzzMocks.js +43 -25
  352. package/lib/test/fuzz/summarizerFuzzMocks.js.map +1 -1
  353. package/lib/test/fuzz/summarizerFuzzSuite.js +7 -4
  354. package/lib/test/fuzz/summarizerFuzzSuite.js.map +1 -1
  355. package/lib/test/gc/garbageCollection.spec.js +5 -5
  356. package/lib/test/gc/garbageCollection.spec.js.map +1 -1
  357. package/lib/test/gc/gcConfigs.spec.js +2 -2
  358. package/lib/test/gc/gcConfigs.spec.js.map +1 -1
  359. package/lib/test/gc/gcHelpers.spec.js.map +1 -1
  360. package/lib/test/gc/gcStats.spec.js +2 -2
  361. package/lib/test/gc/gcStats.spec.js.map +1 -1
  362. package/lib/test/gc/gcSummaryStateTracker.spec.js +1 -1
  363. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +1 -1
  364. package/lib/test/gc/gcTelemetry.spec.js +3 -3
  365. package/lib/test/gc/gcTelemetry.spec.js.map +1 -1
  366. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +1 -1
  367. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +1 -1
  368. package/lib/test/getPendingBlobs.spec.js +1 -1
  369. package/lib/test/getPendingBlobs.spec.js.map +1 -1
  370. package/lib/test/hardwareStats.spec.js +1 -1
  371. package/lib/test/hardwareStats.spec.js.map +1 -1
  372. package/lib/test/opLifecycle/OpGroupingManager.spec.js +95 -118
  373. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +1 -1
  374. package/lib/test/opLifecycle/batchManager.spec.js +1 -1
  375. package/lib/test/opLifecycle/batchManager.spec.js.map +1 -1
  376. package/lib/test/opLifecycle/opCompressor.spec.js +0 -1
  377. package/lib/test/opLifecycle/opCompressor.spec.js.map +1 -1
  378. package/lib/test/opLifecycle/opDecompressor.spec.js +60 -55
  379. package/lib/test/opLifecycle/opDecompressor.spec.js.map +1 -1
  380. package/lib/test/opLifecycle/opSplitter.spec.js +56 -41
  381. package/lib/test/opLifecycle/opSplitter.spec.js.map +1 -1
  382. package/lib/test/opLifecycle/outbox.spec.js +118 -10
  383. package/lib/test/opLifecycle/outbox.spec.js.map +1 -1
  384. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +115 -91
  385. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +1 -1
  386. package/lib/test/pendingStateManager.spec.js +1 -1
  387. package/lib/test/pendingStateManager.spec.js.map +1 -1
  388. package/lib/test/scheduleManager.spec.js +1 -1
  389. package/lib/test/scheduleManager.spec.js.map +1 -1
  390. package/lib/test/summarizerNode.spec.js +1 -1
  391. package/lib/test/summarizerNode.spec.js.map +1 -1
  392. package/lib/test/summarizerNodeWithGc.spec.js +1 -1
  393. package/lib/test/summarizerNodeWithGc.spec.js.map +1 -1
  394. package/lib/test/summary/runningSummarizer.spec.js +4 -4
  395. package/lib/test/summary/runningSummarizer.spec.js.map +1 -1
  396. package/lib/test/summary/summarizer.spec.js.map +1 -1
  397. package/lib/test/summary/summarizerClientElection.spec.js +2 -2
  398. package/lib/test/summary/summarizerClientElection.spec.js.map +1 -1
  399. package/lib/test/summary/summarizerHeuristics.spec.js +1 -1
  400. package/lib/test/summary/summarizerHeuristics.spec.js.map +1 -1
  401. package/lib/test/summary/summaryCollection.spec.js +1 -1
  402. package/lib/test/summary/summaryCollection.spec.js.map +1 -1
  403. package/lib/test/summary/summaryManager.spec.js +3 -3
  404. package/lib/test/summary/summaryManager.spec.js.map +1 -1
  405. package/lib/test/throttler.spec.js +1 -1
  406. package/lib/test/throttler.spec.js.map +1 -1
  407. package/lib/test/types/validateContainerRuntimePrevious.generated.js +6 -4
  408. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +1 -1
  409. package/package.json +35 -21
  410. package/src/batchTracker.ts +3 -3
  411. package/src/blobManager.ts +15 -15
  412. package/src/channelCollection.ts +75 -35
  413. package/src/connectionTelemetry.ts +10 -10
  414. package/src/containerHandleContext.ts +1 -1
  415. package/src/containerRuntime.ts +352 -197
  416. package/src/dataStore.ts +2 -2
  417. package/src/dataStoreContext.ts +19 -19
  418. package/src/dataStoreContexts.ts +2 -2
  419. package/src/dataStoreRegistry.ts +1 -1
  420. package/src/deltaScheduler.ts +1 -1
  421. package/src/gc/garbageCollection.ts +12 -12
  422. package/src/gc/gcConfigs.ts +11 -11
  423. package/src/gc/gcDefinitions.ts +2 -2
  424. package/src/gc/gcHelpers.ts +2 -2
  425. package/src/gc/gcSummaryStateTracker.ts +4 -4
  426. package/src/gc/gcTelemetry.ts +6 -6
  427. package/src/index.ts +8 -1
  428. package/src/messageTypes.ts +18 -5
  429. package/src/opLifecycle/README.md +89 -0
  430. package/src/opLifecycle/definitions.ts +1 -20
  431. package/src/opLifecycle/index.ts +3 -9
  432. package/src/opLifecycle/opCompressor.ts +4 -5
  433. package/src/opLifecycle/opDecompressor.ts +83 -100
  434. package/src/opLifecycle/opGroupingManager.ts +9 -12
  435. package/src/opLifecycle/opSplitter.ts +73 -47
  436. package/src/opLifecycle/outbox.ts +13 -31
  437. package/src/opLifecycle/remoteMessageProcessor.ts +41 -59
  438. package/src/packageVersion.ts +1 -1
  439. package/src/pendingStateManager.ts +2 -2
  440. package/src/scheduleManager.ts +7 -7
  441. package/src/summary/documentSchema.ts +553 -0
  442. package/src/summary/index.ts +10 -1
  443. package/src/summary/orderedClientElection.ts +6 -5
  444. package/src/summary/runWhileConnectedCoordinator.ts +1 -1
  445. package/src/summary/runningSummarizer.ts +19 -19
  446. package/src/summary/summarizer.ts +14 -14
  447. package/src/summary/summarizerClientElection.ts +2 -2
  448. package/src/summary/summarizerHeuristics.ts +2 -2
  449. package/src/summary/summarizerNode/summarizerNode.ts +15 -15
  450. package/src/summary/summarizerNode/summarizerNodeUtils.ts +1 -1
  451. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +4 -4
  452. package/src/summary/summarizerTypes.ts +3 -3
  453. package/src/summary/summaryCollection.ts +3 -3
  454. package/src/summary/summaryFormat.ts +8 -19
  455. package/src/summary/summaryGenerator.ts +10 -10
  456. package/src/summary/summaryManager.ts +4 -4
@@ -3,103 +3,131 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "assert";
6
+ import { generatePairwiseOptions } from "@fluid-private/test-pairwise-generator";
6
7
  import { MessageType } from "@fluidframework/protocol-definitions";
7
8
  import { MockLogger } from "@fluidframework/telemetry-utils";
8
- import { OpGroupingManager, RemoteMessageProcessor, } from "../../opLifecycle/index.js";
9
9
  import { ContainerMessageType } from "../../index.js";
10
+ import { OpCompressor, OpDecompressor, OpGroupingManager, OpSplitter, RemoteMessageProcessor, } from "../../opLifecycle/index.js";
10
11
  describe("RemoteMessageProcessor", () => {
11
- const stamp = (message, value) => {
12
- var _a;
13
- const newMessage = { ...message };
14
- newMessage.metadata = message.metadata === undefined ? {} : message.metadata;
15
- (_a = newMessage.metadata).history ?? (_a.history = []);
16
- newMessage.metadata.history.push(value);
17
- return newMessage;
18
- };
19
- const getMockSplitter = () => ({
20
- processRemoteMessage(message) {
21
- return {
22
- message: stamp(message, "reconstruct"),
23
- state: "Skipped",
24
- };
25
- },
26
- });
27
- const getMockDecompressor = () => ({
28
- processMessage(message) {
29
- return {
30
- message: stamp(message, "decompress"),
31
- state: "Skipped",
32
- };
33
- },
34
- });
35
- const getMessageProcessor = (mockSpliter = getMockSplitter(), mockDecompressor = getMockDecompressor()) => new RemoteMessageProcessor(mockSpliter, mockDecompressor, new OpGroupingManager({
36
- groupedBatchingEnabled: true,
37
- opCountThreshold: Infinity,
38
- reentrantBatchGroupingEnabled: false,
39
- }, new MockLogger()));
40
- it("Invokes internal processors in order", () => {
41
- const messageProcessor = getMessageProcessor();
42
- const message = {
43
- contents: {
12
+ function getMessageProcessor() {
13
+ const logger = new MockLogger();
14
+ return new RemoteMessageProcessor(new OpSplitter([], undefined, 1, 1, logger), new OpDecompressor(logger), new OpGroupingManager({
15
+ groupedBatchingEnabled: true,
16
+ opCountThreshold: Infinity,
17
+ reentrantBatchGroupingEnabled: false,
18
+ }, logger));
19
+ }
20
+ function getOutboundMessage(value, batchMetadata) {
21
+ return {
22
+ metadata: batchMetadata === undefined
23
+ ? undefined
24
+ : {
25
+ batch: batchMetadata,
26
+ },
27
+ referenceSequenceNumber: Infinity,
28
+ contents: JSON.stringify({
44
29
  contents: {
45
- key: "value",
30
+ key: value,
46
31
  },
47
32
  type: ContainerMessageType.FluidDataStoreOp,
33
+ }),
34
+ };
35
+ }
36
+ function getProcessedMessage(value, seqNum, clientSeqNum, batchMetadata) {
37
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
38
+ return {
39
+ type: ContainerMessageType.FluidDataStoreOp,
40
+ metadata: batchMetadata === undefined
41
+ ? undefined
42
+ : {
43
+ batch: batchMetadata,
44
+ },
45
+ compression: undefined,
46
+ sequenceNumber: seqNum,
47
+ clientSequenceNumber: clientSeqNum,
48
+ referenceSequenceNumber: Infinity,
49
+ contents: {
50
+ key: value,
48
51
  },
49
- clientId: "clientId",
50
- type: MessageType.Operation,
51
- metadata: { meta: "data" },
52
52
  };
53
- const documentMessage = message;
54
- const processResult = messageProcessor.process(documentMessage);
55
- assert.strictEqual(processResult.length, 1, "only expected a single processed message");
56
- const result = processResult[0];
57
- assert.deepStrictEqual(result.metadata.history, [
58
- "decompress",
59
- "reconstruct",
60
- ]);
61
- assert.deepStrictEqual(result.contents, message.contents.contents);
53
+ }
54
+ const messageGenerationOptions = generatePairwiseOptions({
55
+ compressionAndChunking: [
56
+ { compression: false, chunking: false },
57
+ { compression: true, chunking: false },
58
+ { compression: true, chunking: true },
59
+ ],
60
+ grouping: [true, false],
62
61
  });
63
- it("Invokes internal processors in order if the message is compressed and chunked", () => {
64
- let decompressCalls = 0;
65
- const messageProcessor = getMessageProcessor({
66
- processRemoteMessage(original) {
67
- return {
68
- message: stamp(original, "reconstruct"),
69
- state: "Processed",
70
- };
71
- },
72
- }, {
73
- processMessage(original) {
74
- return {
75
- message: stamp(original, "decompress"),
76
- state: decompressCalls++ % 2 === 0 ? "Skipped" : "Processed",
62
+ messageGenerationOptions.forEach((option) => {
63
+ it(`Correctly processes incoming messages: compression [${option.compressionAndChunking.compression}] chunking [${option.compressionAndChunking.chunking}] grouping [${option.grouping}]`, () => {
64
+ let batch = {
65
+ contentSizeInBytes: 1,
66
+ referenceSequenceNumber: Infinity,
67
+ content: [
68
+ getOutboundMessage("a", true),
69
+ getOutboundMessage("b"),
70
+ getOutboundMessage("c"),
71
+ getOutboundMessage("d"),
72
+ getOutboundMessage("e", false),
73
+ ],
74
+ };
75
+ const mockLogger = new MockLogger();
76
+ if (option.grouping) {
77
+ const groupingManager = new OpGroupingManager({
78
+ groupedBatchingEnabled: true,
79
+ opCountThreshold: 2,
80
+ reentrantBatchGroupingEnabled: false,
81
+ }, mockLogger);
82
+ batch = groupingManager.groupBatch(batch);
83
+ }
84
+ const outboundMessages = [];
85
+ if (option.compressionAndChunking.compression) {
86
+ const compressor = new OpCompressor(mockLogger);
87
+ batch = compressor.compressBatch(batch);
88
+ if (option.compressionAndChunking.chunking) {
89
+ const splitter = new OpSplitter([], (messages, refSeqNum) => {
90
+ outboundMessages.push(...messages);
91
+ return 0;
92
+ }, 2, Infinity, mockLogger);
93
+ batch = splitter.splitFirstBatchMessage(batch);
94
+ }
95
+ }
96
+ let startSeqNum = outboundMessages.length + 1;
97
+ outboundMessages.push(...batch.content);
98
+ const messageProcessor = getMessageProcessor();
99
+ const actual = [];
100
+ let seqNum = 1;
101
+ for (const message of outboundMessages) {
102
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
103
+ const inboundMessage = {
104
+ type: MessageType.Operation,
105
+ contents: message.contents,
106
+ metadata: message.metadata,
107
+ compression: message.compression,
108
+ sequenceNumber: seqNum,
109
+ clientSequenceNumber: seqNum++,
110
+ referenceSequenceNumber: message.referenceSequenceNumber,
77
111
  };
78
- },
112
+ actual.push(...messageProcessor.process(inboundMessage));
113
+ }
114
+ const expected = option.grouping
115
+ ? [
116
+ getProcessedMessage("a", startSeqNum, 1, true),
117
+ getProcessedMessage("b", startSeqNum, 2),
118
+ getProcessedMessage("c", startSeqNum, 3),
119
+ getProcessedMessage("d", startSeqNum, 4),
120
+ getProcessedMessage("e", startSeqNum, 5, false),
121
+ ]
122
+ : [
123
+ getProcessedMessage("a", startSeqNum, startSeqNum++, true),
124
+ getProcessedMessage("b", startSeqNum, startSeqNum++),
125
+ getProcessedMessage("c", startSeqNum, startSeqNum++),
126
+ getProcessedMessage("d", startSeqNum, startSeqNum++),
127
+ getProcessedMessage("e", startSeqNum, startSeqNum, false),
128
+ ];
129
+ assert.deepStrictEqual(actual, expected, "unexpected output");
79
130
  });
80
- const message = {
81
- contents: {
82
- contents: {
83
- contents: {
84
- key: "value",
85
- },
86
- },
87
- type: ContainerMessageType.FluidDataStoreOp,
88
- },
89
- clientId: "clientId",
90
- type: MessageType.Operation,
91
- metadata: { meta: "data" },
92
- };
93
- const documentMessage = message;
94
- const processResult = messageProcessor.process(documentMessage);
95
- assert.strictEqual(processResult.length, 1, "only expected a single processed message");
96
- const result = processResult[0];
97
- assert.deepStrictEqual(result.metadata.history, [
98
- "decompress",
99
- "reconstruct",
100
- "decompress",
101
- ]);
102
- assert.deepStrictEqual(result.contents, message.contents.contents.contents);
103
131
  });
104
132
  it("Processes legacy string-content message", () => {
105
133
  const messageProcessor = getMessageProcessor();
@@ -170,9 +198,7 @@ describe("RemoteMessageProcessor", () => {
170
198
  sequenceNumber: 10,
171
199
  clientSequenceNumber: 1,
172
200
  compression: undefined,
173
- metadata: {
174
- history: ["decompress", "reconstruct"],
175
- },
201
+ metadata: undefined,
176
202
  contents: {
177
203
  contents: "a",
178
204
  },
@@ -182,9 +208,7 @@ describe("RemoteMessageProcessor", () => {
182
208
  sequenceNumber: 10,
183
209
  clientSequenceNumber: 2,
184
210
  compression: undefined,
185
- metadata: {
186
- history: ["decompress", "reconstruct"],
187
- },
211
+ metadata: undefined,
188
212
  contents: {
189
213
  contents: "b",
190
214
  },
@@ -1 +1 @@
1
- {"version":3,"file":"remoteMessageProcessor.spec.js","sourceRoot":"","sources":["../../../src/test/opLifecycle/remoteMessageProcessor.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport {\n\tIMessageProcessingResult,\n\tOpDecompressor,\n\tOpGroupingManager,\n\tOpSplitter,\n\tRemoteMessageProcessor,\n} from \"../../opLifecycle/index.js\";\nimport { ContainerMessageType } from \"../../index.js\";\n\ndescribe(\"RemoteMessageProcessor\", () => {\n\tconst stamp = (\n\t\tmessage: ISequencedDocumentMessage,\n\t\tvalue: string,\n\t): ISequencedDocumentMessage => {\n\t\tconst newMessage = { ...message };\n\t\tnewMessage.metadata = message.metadata === undefined ? {} : message.metadata;\n\t\t(newMessage.metadata as { history?: string[] }).history ??= [];\n\t\t(newMessage.metadata as { history: string[] }).history.push(value);\n\t\treturn newMessage;\n\t};\n\n\tconst getMockSplitter = (): Partial<OpSplitter> => ({\n\t\tprocessRemoteMessage(message: ISequencedDocumentMessage): IMessageProcessingResult {\n\t\t\treturn {\n\t\t\t\tmessage: stamp(message, \"reconstruct\"),\n\t\t\t\tstate: \"Skipped\",\n\t\t\t};\n\t\t},\n\t});\n\n\tconst getMockDecompressor = (): Partial<OpDecompressor> => ({\n\t\tprocessMessage(message: ISequencedDocumentMessage): IMessageProcessingResult {\n\t\t\treturn {\n\t\t\t\tmessage: stamp(message, \"decompress\"),\n\t\t\t\tstate: \"Skipped\",\n\t\t\t};\n\t\t},\n\t});\n\n\tconst getMessageProcessor = (\n\t\tmockSpliter: Partial<OpSplitter> = getMockSplitter(),\n\t\tmockDecompressor: Partial<OpDecompressor> = getMockDecompressor(),\n\t): RemoteMessageProcessor =>\n\t\tnew RemoteMessageProcessor(\n\t\t\tmockSpliter as OpSplitter,\n\t\t\tmockDecompressor as OpDecompressor,\n\t\t\tnew OpGroupingManager(\n\t\t\t\t{\n\t\t\t\t\tgroupedBatchingEnabled: true,\n\t\t\t\t\topCountThreshold: Infinity,\n\t\t\t\t\treentrantBatchGroupingEnabled: false,\n\t\t\t\t},\n\t\t\t\tnew MockLogger(),\n\t\t\t),\n\t\t);\n\n\tit(\"Invokes internal processors in order\", () => {\n\t\tconst messageProcessor = getMessageProcessor();\n\t\tconst message = {\n\t\t\tcontents: {\n\t\t\t\tcontents: {\n\t\t\t\t\tkey: \"value\",\n\t\t\t\t},\n\t\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t\t},\n\t\t\tclientId: \"clientId\",\n\t\t\ttype: MessageType.Operation,\n\t\t\tmetadata: { meta: \"data\" },\n\t\t};\n\t\tconst documentMessage = message as ISequencedDocumentMessage;\n\t\tconst processResult = messageProcessor.process(documentMessage);\n\n\t\tassert.strictEqual(processResult.length, 1, \"only expected a single processed message\");\n\t\tconst result = processResult[0];\n\n\t\tassert.deepStrictEqual((result.metadata as { history?: unknown }).history, [\n\t\t\t\"decompress\",\n\t\t\t\"reconstruct\",\n\t\t]);\n\t\tassert.deepStrictEqual(result.contents, message.contents.contents);\n\t});\n\n\tit(\"Invokes internal processors in order if the message is compressed and chunked\", () => {\n\t\tlet decompressCalls = 0;\n\t\tconst messageProcessor = getMessageProcessor(\n\t\t\t{\n\t\t\t\tprocessRemoteMessage(\n\t\t\t\t\toriginal: ISequencedDocumentMessage,\n\t\t\t\t): IMessageProcessingResult {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: stamp(original, \"reconstruct\"),\n\t\t\t\t\t\tstate: \"Processed\",\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tprocessMessage(original: ISequencedDocumentMessage): IMessageProcessingResult {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: stamp(original, \"decompress\"),\n\t\t\t\t\t\tstate: decompressCalls++ % 2 === 0 ? \"Skipped\" : \"Processed\",\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\tconst message = {\n\t\t\tcontents: {\n\t\t\t\tcontents: {\n\t\t\t\t\tcontents: {\n\t\t\t\t\t\tkey: \"value\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t\t},\n\t\t\tclientId: \"clientId\",\n\t\t\ttype: MessageType.Operation,\n\t\t\tmetadata: { meta: \"data\" },\n\t\t};\n\t\tconst documentMessage = message as ISequencedDocumentMessage;\n\t\tconst processResult = messageProcessor.process(documentMessage);\n\n\t\tassert.strictEqual(processResult.length, 1, \"only expected a single processed message\");\n\t\tconst result = processResult[0];\n\n\t\tassert.deepStrictEqual((result.metadata as { history?: unknown }).history, [\n\t\t\t\"decompress\",\n\t\t\t\"reconstruct\",\n\t\t\t\"decompress\",\n\t\t]);\n\t\tassert.deepStrictEqual(result.contents, message.contents.contents.contents);\n\t});\n\n\tit(\"Processes legacy string-content message\", () => {\n\t\tconst messageProcessor = getMessageProcessor();\n\t\tconst contents = {\n\t\t\tcontents: { key: \"value\" },\n\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t};\n\t\tconst message = {\n\t\t\tcontents: JSON.stringify(contents),\n\t\t\tclientId: \"clientId\",\n\t\t\ttype: MessageType.Operation,\n\t\t\tmetadata: { meta: \"data\" },\n\t\t};\n\t\tconst documentMessage = message as ISequencedDocumentMessage;\n\t\tconst processResult = messageProcessor.process(documentMessage);\n\n\t\tassert.strictEqual(processResult.length, 1, \"only expected a single processed message\");\n\t\tconst result = processResult[0];\n\n\t\tassert.deepStrictEqual(result.contents, contents.contents);\n\t\tassert.deepStrictEqual(result.type, contents.type);\n\t});\n\n\tit(\"Don't unpack non-datastore messages\", () => {\n\t\tconst messageProcessor = getMessageProcessor();\n\t\tconst message = {\n\t\t\tcontents: { key: \"value\" },\n\t\t\tclientId: \"clientId\",\n\t\t\ttype: MessageType.Summarize,\n\t\t\tmetadata: { meta: \"data\" },\n\t\t};\n\t\tconst documentMessage = message as ISequencedDocumentMessage;\n\t\tconst processResult = messageProcessor.process(documentMessage);\n\n\t\tassert.strictEqual(processResult.length, 1, \"only expected a single processed message\");\n\t\tconst result = processResult[0];\n\n\t\tassert.deepStrictEqual(result.contents, message.contents);\n\t\tassert.deepStrictEqual(result.type, message.type);\n\t});\n\n\tit(\"Processing groupedBatch works as expected\", () => {\n\t\tconst groupedBatch = {\n\t\t\ttype: MessageType.Operation,\n\t\t\tsequenceNumber: 10,\n\t\t\tclientSequenceNumber: 12,\n\t\t\tcontents: {\n\t\t\t\ttype: OpGroupingManager.groupedBatchOp,\n\t\t\t\tcontents: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\t\tcontents: \"a\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\t\tcontents: \"b\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t};\n\t\tconst messageProcessor = getMessageProcessor();\n\t\tconst result = messageProcessor.process(groupedBatch as ISequencedDocumentMessage);\n\n\t\tconst expected = [\n\t\t\t{\n\t\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t\t\tsequenceNumber: 10,\n\t\t\t\tclientSequenceNumber: 1,\n\t\t\t\tcompression: undefined,\n\t\t\t\tmetadata: {\n\t\t\t\t\thistory: [\"decompress\", \"reconstruct\"],\n\t\t\t\t},\n\t\t\t\tcontents: {\n\t\t\t\t\tcontents: \"a\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t\t\tsequenceNumber: 10,\n\t\t\t\tclientSequenceNumber: 2,\n\t\t\t\tcompression: undefined,\n\t\t\t\tmetadata: {\n\t\t\t\t\thistory: [\"decompress\", \"reconstruct\"],\n\t\t\t\t},\n\t\t\t\tcontents: {\n\t\t\t\t\tcontents: \"b\",\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tassert.deepStrictEqual(result, expected, \"unexpected processing of groupedBatch\");\n\t});\n});\n"]}
1
+ {"version":3,"file":"remoteMessageProcessor.spec.js","sourceRoot":"","sources":["../../../src/test/opLifecycle/remoteMessageProcessor.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { generatePairwiseOptions } from \"@fluid-private/test-pairwise-generator\";\nimport type { IBatchMessage } from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { ContainerMessageType } from \"../../index.js\";\nimport {\n\ttype BatchMessage,\n\ttype IBatch,\n\tOpCompressor,\n\tOpDecompressor,\n\tOpGroupingManager,\n\tOpSplitter,\n\tRemoteMessageProcessor,\n} from \"../../opLifecycle/index.js\";\n\ndescribe(\"RemoteMessageProcessor\", () => {\n\tfunction getMessageProcessor(): RemoteMessageProcessor {\n\t\tconst logger = new MockLogger();\n\t\treturn new RemoteMessageProcessor(\n\t\t\tnew OpSplitter([], undefined, 1, 1, logger),\n\t\t\tnew OpDecompressor(logger),\n\t\t\tnew OpGroupingManager(\n\t\t\t\t{\n\t\t\t\t\tgroupedBatchingEnabled: true,\n\t\t\t\t\topCountThreshold: Infinity,\n\t\t\t\t\treentrantBatchGroupingEnabled: false,\n\t\t\t\t},\n\t\t\t\tlogger,\n\t\t\t),\n\t\t);\n\t}\n\n\tfunction getOutboundMessage(value: string, batchMetadata?: boolean): BatchMessage {\n\t\treturn {\n\t\t\tmetadata:\n\t\t\t\tbatchMetadata === undefined\n\t\t\t\t\t? undefined\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tbatch: batchMetadata,\n\t\t\t\t\t },\n\t\t\treferenceSequenceNumber: Infinity,\n\t\t\tcontents: JSON.stringify({\n\t\t\t\tcontents: {\n\t\t\t\t\tkey: value,\n\t\t\t\t},\n\t\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t\t}),\n\t\t};\n\t}\n\n\tfunction getProcessedMessage(\n\t\tvalue: string,\n\t\tseqNum: number,\n\t\tclientSeqNum: number,\n\t\tbatchMetadata?: boolean,\n\t): ISequencedDocumentMessage {\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\treturn {\n\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t\tmetadata:\n\t\t\t\tbatchMetadata === undefined\n\t\t\t\t\t? undefined\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tbatch: batchMetadata,\n\t\t\t\t\t },\n\t\t\tcompression: undefined,\n\t\t\tsequenceNumber: seqNum,\n\t\t\tclientSequenceNumber: clientSeqNum,\n\t\t\treferenceSequenceNumber: Infinity,\n\t\t\tcontents: {\n\t\t\t\tkey: value,\n\t\t\t},\n\t\t} as ISequencedDocumentMessage;\n\t}\n\n\tconst messageGenerationOptions = generatePairwiseOptions<{\n\t\t/** chunking cannot happen without compression */\n\t\tcompressionAndChunking:\n\t\t\t| {\n\t\t\t\t\tcompression: false;\n\t\t\t\t\tchunking: false;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tcompression: true;\n\t\t\t\t\tchunking: boolean;\n\t\t\t };\n\t\tgrouping: boolean;\n\t}>({\n\t\tcompressionAndChunking: [\n\t\t\t{ compression: false, chunking: false },\n\t\t\t{ compression: true, chunking: false },\n\t\t\t{ compression: true, chunking: true },\n\t\t],\n\t\tgrouping: [true, false],\n\t});\n\n\tmessageGenerationOptions.forEach((option) => {\n\t\tit(`Correctly processes incoming messages: compression [${option.compressionAndChunking.compression}] chunking [${option.compressionAndChunking.chunking}] grouping [${option.grouping}]`, () => {\n\t\t\tlet batch: IBatch = {\n\t\t\t\tcontentSizeInBytes: 1,\n\t\t\t\treferenceSequenceNumber: Infinity,\n\t\t\t\tcontent: [\n\t\t\t\t\tgetOutboundMessage(\"a\", true),\n\t\t\t\t\tgetOutboundMessage(\"b\"),\n\t\t\t\t\tgetOutboundMessage(\"c\"),\n\t\t\t\t\tgetOutboundMessage(\"d\"),\n\t\t\t\t\tgetOutboundMessage(\"e\", false),\n\t\t\t\t],\n\t\t\t};\n\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tif (option.grouping) {\n\t\t\t\tconst groupingManager = new OpGroupingManager(\n\t\t\t\t\t{\n\t\t\t\t\t\tgroupedBatchingEnabled: true,\n\t\t\t\t\t\topCountThreshold: 2,\n\t\t\t\t\t\treentrantBatchGroupingEnabled: false,\n\t\t\t\t\t},\n\t\t\t\t\tmockLogger,\n\t\t\t\t);\n\t\t\t\tbatch = groupingManager.groupBatch(batch);\n\t\t\t}\n\n\t\t\tconst outboundMessages: IBatchMessage[] = [];\n\t\t\tif (option.compressionAndChunking.compression) {\n\t\t\t\tconst compressor = new OpCompressor(mockLogger);\n\t\t\t\tbatch = compressor.compressBatch(batch);\n\n\t\t\t\tif (option.compressionAndChunking.chunking) {\n\t\t\t\t\tconst splitter = new OpSplitter(\n\t\t\t\t\t\t[],\n\t\t\t\t\t\t(messages: IBatchMessage[], refSeqNum?: number) => {\n\t\t\t\t\t\t\toutboundMessages.push(...messages);\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t2,\n\t\t\t\t\t\tInfinity,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t);\n\t\t\t\t\tbatch = splitter.splitFirstBatchMessage(batch);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet startSeqNum = outboundMessages.length + 1;\n\t\t\toutboundMessages.push(...batch.content);\n\n\t\t\tconst messageProcessor = getMessageProcessor();\n\t\t\tconst actual: ISequencedDocumentMessage[] = [];\n\t\t\tlet seqNum = 1;\n\t\t\tfor (const message of outboundMessages) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tconst inboundMessage = {\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tcontents: message.contents,\n\t\t\t\t\tmetadata: message.metadata,\n\t\t\t\t\tcompression: message.compression,\n\t\t\t\t\tsequenceNumber: seqNum,\n\t\t\t\t\tclientSequenceNumber: seqNum++,\n\t\t\t\t\treferenceSequenceNumber: message.referenceSequenceNumber,\n\t\t\t\t} as ISequencedDocumentMessage;\n\n\t\t\t\tactual.push(...messageProcessor.process(inboundMessage));\n\t\t\t}\n\n\t\t\tconst expected = option.grouping\n\t\t\t\t? [\n\t\t\t\t\t\tgetProcessedMessage(\"a\", startSeqNum, 1, true),\n\t\t\t\t\t\tgetProcessedMessage(\"b\", startSeqNum, 2),\n\t\t\t\t\t\tgetProcessedMessage(\"c\", startSeqNum, 3),\n\t\t\t\t\t\tgetProcessedMessage(\"d\", startSeqNum, 4),\n\t\t\t\t\t\tgetProcessedMessage(\"e\", startSeqNum, 5, false),\n\t\t\t\t ]\n\t\t\t\t: [\n\t\t\t\t\t\tgetProcessedMessage(\"a\", startSeqNum, startSeqNum++, true),\n\t\t\t\t\t\tgetProcessedMessage(\"b\", startSeqNum, startSeqNum++),\n\t\t\t\t\t\tgetProcessedMessage(\"c\", startSeqNum, startSeqNum++),\n\t\t\t\t\t\tgetProcessedMessage(\"d\", startSeqNum, startSeqNum++),\n\t\t\t\t\t\tgetProcessedMessage(\"e\", startSeqNum, startSeqNum, false),\n\t\t\t\t ];\n\n\t\t\tassert.deepStrictEqual(actual, expected, \"unexpected output\");\n\t\t});\n\t});\n\n\tit(\"Processes legacy string-content message\", () => {\n\t\tconst messageProcessor = getMessageProcessor();\n\t\tconst contents = {\n\t\t\tcontents: { key: \"value\" },\n\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t};\n\t\tconst message = {\n\t\t\tcontents: JSON.stringify(contents),\n\t\t\tclientId: \"clientId\",\n\t\t\ttype: MessageType.Operation,\n\t\t\tmetadata: { meta: \"data\" },\n\t\t};\n\t\tconst documentMessage = message as ISequencedDocumentMessage;\n\t\tconst processResult = messageProcessor.process(documentMessage);\n\n\t\tassert.strictEqual(processResult.length, 1, \"only expected a single processed message\");\n\t\tconst result = processResult[0];\n\n\t\tassert.deepStrictEqual(result.contents, contents.contents);\n\t\tassert.deepStrictEqual(result.type, contents.type);\n\t});\n\n\tit(\"Don't unpack non-datastore messages\", () => {\n\t\tconst messageProcessor = getMessageProcessor();\n\t\tconst message = {\n\t\t\tcontents: { key: \"value\" },\n\t\t\tclientId: \"clientId\",\n\t\t\ttype: MessageType.Summarize,\n\t\t\tmetadata: { meta: \"data\" },\n\t\t};\n\t\tconst documentMessage = message as ISequencedDocumentMessage;\n\t\tconst processResult = messageProcessor.process(documentMessage);\n\n\t\tassert.strictEqual(processResult.length, 1, \"only expected a single processed message\");\n\t\tconst result = processResult[0];\n\n\t\tassert.deepStrictEqual(result.contents, message.contents);\n\t\tassert.deepStrictEqual(result.type, message.type);\n\t});\n\n\tit(\"Processing groupedBatch works as expected\", () => {\n\t\tconst groupedBatch = {\n\t\t\ttype: MessageType.Operation,\n\t\t\tsequenceNumber: 10,\n\t\t\tclientSequenceNumber: 12,\n\t\t\tcontents: {\n\t\t\t\ttype: OpGroupingManager.groupedBatchOp,\n\t\t\t\tcontents: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\t\tcontents: \"a\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t\t\t\t\t\tcontents: {\n\t\t\t\t\t\t\t\tcontents: \"b\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t};\n\t\tconst messageProcessor = getMessageProcessor();\n\t\tconst result = messageProcessor.process(groupedBatch as ISequencedDocumentMessage);\n\n\t\tconst expected = [\n\t\t\t{\n\t\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t\t\tsequenceNumber: 10,\n\t\t\t\tclientSequenceNumber: 1,\n\t\t\t\tcompression: undefined,\n\t\t\t\tmetadata: undefined,\n\t\t\t\tcontents: {\n\t\t\t\t\tcontents: \"a\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: ContainerMessageType.FluidDataStoreOp,\n\t\t\t\tsequenceNumber: 10,\n\t\t\t\tclientSequenceNumber: 2,\n\t\t\t\tcompression: undefined,\n\t\t\t\tmetadata: undefined,\n\t\t\t\tcontents: {\n\t\t\t\t\tcontents: \"b\",\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tassert.deepStrictEqual(result, expected, \"unexpected processing of groupedBatch\");\n\t});\n});\n"]}
@@ -6,8 +6,8 @@ import assert from "assert";
6
6
  import { ContainerErrorTypes, } from "@fluidframework/container-definitions";
7
7
  import { MessageType } from "@fluidframework/protocol-definitions";
8
8
  import { isILoggingError } from "@fluidframework/telemetry-utils";
9
- import { PendingStateManager } from "../pendingStateManager.js";
10
9
  import { BatchManager } from "../opLifecycle/index.js";
10
+ import { PendingStateManager } from "../pendingStateManager.js";
11
11
  describe("Pending State Manager", () => {
12
12
  describe("Rollback", () => {
13
13
  let rollbackCalled;
@@ -1 +1 @@
1
- {"version":3,"file":"pendingStateManager.spec.js","sourceRoot":"","sources":["../../src/test/pendingStateManager.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport assert from \"assert\";\nimport Deque from \"double-ended-queue\";\n\nimport {\n\tContainerErrorTypes,\n\tICriticalContainerError,\n} from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { isILoggingError } from \"@fluidframework/telemetry-utils\";\n\nimport { IPendingMessage, PendingStateManager } from \"../pendingStateManager.js\";\nimport { BatchManager, BatchMessage } from \"../opLifecycle/index.js\";\nimport type {\n\tRecentlyAddedContainerRuntimeMessageDetails,\n\tUnknownContainerRuntimeMessage,\n} from \"../messageTypes.js\";\n\ntype PendingStateManager_WithPrivates = Omit<PendingStateManager, \"initialMessages\"> & {\n\tinitialMessages: Deque<IPendingMessage>;\n};\n\ndescribe(\"Pending State Manager\", () => {\n\tdescribe(\"Rollback\", () => {\n\t\tlet rollbackCalled;\n\t\tlet rollbackContent;\n\t\tlet rollbackShouldThrow;\n\t\tlet batchManager: BatchManager;\n\n\t\tfunction getMessage(payload: string) {\n\t\t\treturn { contents: payload } as any as BatchMessage;\n\t\t}\n\n\t\tconst rollBackCallback = (m: BatchMessage) => {\n\t\t\trollbackCalled = true;\n\t\t\trollbackContent.push(m);\n\t\t\tif (rollbackShouldThrow) {\n\t\t\t\tthrow new Error();\n\t\t\t}\n\t\t};\n\n\t\tbeforeEach(async () => {\n\t\t\trollbackCalled = false;\n\t\t\trollbackContent = [];\n\t\t\trollbackShouldThrow = false;\n\n\t\t\tbatchManager = new BatchManager({ hardLimit: 950 * 1024 });\n\t\t});\n\n\t\tit(\"should do nothing when rolling back empty pending stack\", () => {\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tcheckpoint.rollback(rollBackCallback);\n\n\t\t\tassert.strictEqual(rollbackCalled, false);\n\t\t\tassert.strictEqual(batchManager.empty, true);\n\t\t});\n\n\t\tit(\"should do nothing when rolling back nothing\", () => {\n\t\t\tbatchManager.push(getMessage(\"1\"), /* reentrant */ false);\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tcheckpoint.rollback(rollBackCallback);\n\n\t\t\tassert.strictEqual(rollbackCalled, false);\n\t\t\tassert.strictEqual(batchManager.empty, false);\n\t\t});\n\n\t\tit(\"should succeed when rolling back entire pending stack\", () => {\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tbatchManager.push(getMessage(\"11\"), /* reentrant */ false);\n\t\t\tbatchManager.push(getMessage(\"22\"), /* reentrant */ false);\n\t\t\tbatchManager.push(getMessage(\"33\"), /* reentrant */ false);\n\t\t\tcheckpoint.rollback(rollBackCallback);\n\n\t\t\tassert.strictEqual(rollbackCalled, true);\n\t\t\tassert.strictEqual(rollbackContent.length, 3);\n\t\t\tassert.strictEqual(rollbackContent[0].contents, \"33\");\n\t\t\tassert.strictEqual(rollbackContent[1].contents, \"22\");\n\t\t\tassert.strictEqual(rollbackContent[2].contents, \"11\");\n\t\t\tassert.strictEqual(batchManager.empty, true);\n\t\t});\n\n\t\tit(\"should succeed when rolling back part of pending stack\", () => {\n\t\t\tbatchManager.push(getMessage(\"11\"), /* reentrant */ false);\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tbatchManager.push(getMessage(\"22\"), /* reentrant */ false);\n\t\t\tbatchManager.push(getMessage(\"33\"), /* reentrant */ false);\n\t\t\tcheckpoint.rollback(rollBackCallback);\n\n\t\t\tassert.strictEqual(rollbackCalled, true);\n\t\t\tassert.strictEqual(rollbackContent.length, 2);\n\t\t\tassert.strictEqual(rollbackContent[0].contents, \"33\");\n\t\t\tassert.strictEqual(rollbackContent[1].contents, \"22\");\n\t\t\tassert.strictEqual(batchManager.empty, false);\n\t\t});\n\n\t\tit(\"should throw and close when rollback fails\", () => {\n\t\t\trollbackShouldThrow = true;\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tbatchManager.push(getMessage(\"11\"), /* reentrant */ false);\n\t\t\tassert.throws(() => {\n\t\t\t\tcheckpoint.rollback(rollBackCallback);\n\t\t\t});\n\n\t\t\tassert.strictEqual(rollbackCalled, true);\n\t\t});\n\t});\n\n\tdescribe(\"Op processing\", () => {\n\t\tlet pendingStateManager;\n\t\tlet closeError: ICriticalContainerError | undefined;\n\t\tconst clientId = \"clientId\";\n\n\t\tbeforeEach(async () => {\n\t\t\tcloseError = undefined;\n\t\t\tpendingStateManager = new PendingStateManager(\n\t\t\t\t{\n\t\t\t\t\tapplyStashedOp: () => {\n\t\t\t\t\t\tthrow new Error();\n\t\t\t\t\t},\n\t\t\t\t\tclientId: () => \"oldClientId\",\n\t\t\t\t\tclose: (error?: ICriticalContainerError) => (closeError = error),\n\t\t\t\t\tconnected: () => true,\n\t\t\t\t\treSubmit: () => {},\n\t\t\t\t\treSubmitBatch: () => {},\n\t\t\t\t\tisActiveConnection: () => false,\n\t\t\t\t\tisAttached: () => true,\n\t\t\t\t},\n\t\t\t\tundefined /* initialLocalState */,\n\t\t\t\tundefined /* logger */,\n\t\t\t);\n\t\t});\n\n\t\tconst submitBatch = (messages: Partial<ISequencedDocumentMessage>[]) => {\n\t\t\tmessages.forEach((message) => {\n\t\t\t\tpendingStateManager.onSubmitMessage(\n\t\t\t\t\tJSON.stringify({ type: message.type, contents: message.contents }),\n\t\t\t\t\tmessage.referenceSequenceNumber,\n\t\t\t\t\tundefined,\n\t\t\t\t\tmessage.metadata,\n\t\t\t\t);\n\t\t\t});\n\t\t};\n\n\t\tconst process = (messages: Partial<ISequencedDocumentMessage>[]) =>\n\t\t\tmessages.forEach((message) => {\n\t\t\t\tpendingStateManager.processPendingLocalMessage(message);\n\t\t\t});\n\n\t\tit(\"proper batch is processed correctly\", () => {\n\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\tmetadata: { batch: true },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 1,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tmetadata: { batch: false },\n\t\t\t\t\tclientSequenceNumber: 2,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tsubmitBatch(messages);\n\t\t\tprocess(messages);\n\t\t\tassert(closeError === undefined);\n\t\t});\n\n\t\tit(\"batch missing end message will call close\", () => {\n\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\tmetadata: { batch: true },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 1,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tsubmitBatch(messages);\n\t\t\tprocess(messages);\n\t\t\tassert(isILoggingError(closeError));\n\t\t\tassert.strictEqual(closeError.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\tassert.strictEqual(closeError.getTelemetryProperties().hasBatchStart, true);\n\t\t\tassert.strictEqual(closeError.getTelemetryProperties().hasBatchEnd, false);\n\t\t});\n\n\t\tdescribe(\"processing out of sync messages will call close\", () => {\n\t\t\tit(\"messageTypes do not match\", () => {\n\t\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsubmitBatch(messages);\n\t\t\t\tprocess(\n\t\t\t\t\tmessages.map((message) => ({\n\t\t\t\t\t\t...message,\n\t\t\t\t\t\ttype: \"otherType\",\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tassert(isILoggingError(closeError));\n\t\t\t\tassert.strictEqual(closeError.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tcloseError.getTelemetryProperties().expectedMessageType,\n\t\t\t\t\tMessageType.Operation,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"only one message has undefined content\", () => {\n\t\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\t\tcontents: {},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsubmitBatch(messages);\n\t\t\t\tprocess(\n\t\t\t\t\tmessages.map((message) => ({\n\t\t\t\t\t\t...message,\n\t\t\t\t\t\tcontents: undefined,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(closeError?.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\t});\n\n\t\t\tit(\"stringified message content does not match\", () => {\n\t\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\t\tcontents: {},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsubmitBatch(messages);\n\t\t\t\tprocess(\n\t\t\t\t\tmessages.map((message) => ({\n\t\t\t\t\t\t...message,\n\t\t\t\t\t\tcontents: { prop1: true },\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(closeError?.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\t});\n\t\t});\n\n\t\tit(\"processing in sync messages will not call close\", () => {\n\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\tcontents: { prop1: true },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tsubmitBatch(messages);\n\t\t\tprocess(\n\t\t\t\tmessages.map((message) => ({\n\t\t\t\t\t...message,\n\t\t\t\t\tcontents: { prop1: true },\n\t\t\t\t})),\n\t\t\t);\n\t\t\tassert.strictEqual(closeError, undefined, \"unexpected close\");\n\t\t});\n\t});\n\n\tdescribe(\"Local state processing\", () => {\n\t\tfunction createPendingStateManager(pendingStates): PendingStateManager_WithPrivates {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\t\treturn new PendingStateManager(\n\t\t\t\t{\n\t\t\t\t\tapplyStashedOp: async () => undefined,\n\t\t\t\t\tclientId: () => undefined,\n\t\t\t\t\tclose: () => {},\n\t\t\t\t\tconnected: () => true,\n\t\t\t\t\treSubmit: () => {},\n\t\t\t\t\treSubmitBatch: () => {},\n\t\t\t\t\tisActiveConnection: () => false,\n\t\t\t\t\tisAttached: () => true,\n\t\t\t\t},\n\t\t\t\t{ pendingStates },\n\t\t\t\tundefined /* logger */,\n\t\t\t) as any;\n\t\t}\n\n\t\tdescribe(\"Constructor pendingStates\", () => {\n\t\t\tit(\"Empty local state\", () => {\n\t\t\t\t{\n\t\t\t\t\tconst pendingStateManager = createPendingStateManager(undefined);\n\t\t\t\t\tassert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), []);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tconst pendingStateManager = createPendingStateManager([]);\n\t\t\t\t\tassert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), []);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"New format\", () => {\n\t\t\t\tconst messages = [\n\t\t\t\t\t{ type: \"message\", content: '{\"type\":\"component\"}' },\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"message\",\n\t\t\t\t\t\tcontent: '{\"type\": \"component\", \"contents\": {\"prop1\": \"value\"}}',\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t\tconst pendingStateManager = createPendingStateManager(messages);\n\t\t\t\tassert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), messages);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Future op compat behavior\", () => {\n\t\t\tit(\"pending op roundtrip\", async () => {\n\t\t\t\tconst pendingStateManager = createPendingStateManager([]);\n\t\t\t\tconst futureRuntimeMessage: Pick<ISequencedDocumentMessage, \"type\" | \"contents\"> &\n\t\t\t\t\tRecentlyAddedContainerRuntimeMessageDetails = {\n\t\t\t\t\ttype: \"FROM_THE_FUTURE\",\n\t\t\t\t\tcontents: \"Hello\",\n\t\t\t\t\tcompatDetails: { behavior: \"FailToProcess\" },\n\t\t\t\t};\n\n\t\t\t\tpendingStateManager.onSubmitMessage(\n\t\t\t\t\tJSON.stringify(futureRuntimeMessage),\n\t\t\t\t\t0,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tpendingStateManager.processPendingLocalMessage(\n\t\t\t\t\tfutureRuntimeMessage as ISequencedDocumentMessage &\n\t\t\t\t\t\tUnknownContainerRuntimeMessage,\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"Pending messages state\", () => {\n\t\tconst messages = [\n\t\t\t{ type: \"message\", content: '{\"type\":\"component\"}' },\n\t\t\t{\n\t\t\t\ttype: \"message\",\n\t\t\t\tcontent: '{\"type\": \"component\", \"contents\": {\"prop1\": \"value\"}}',\n\t\t\t},\n\t\t];\n\n\t\tfunction createPendingStateManager(pendingStates): PendingStateManager_WithPrivates {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\t\treturn new PendingStateManager(\n\t\t\t\t{\n\t\t\t\t\tapplyStashedOp: async () => undefined,\n\t\t\t\t\tclientId: () => undefined,\n\t\t\t\t\tclose: () => {},\n\t\t\t\t\tconnected: () => true,\n\t\t\t\t\treSubmit: () => {},\n\t\t\t\t\treSubmitBatch: () => {},\n\t\t\t\t\tisActiveConnection: () => false,\n\t\t\t\t\tisAttached: () => true,\n\t\t\t\t},\n\t\t\t\t{ pendingStates },\n\t\t\t\tundefined /* logger */,\n\t\t\t) as any;\n\t\t}\n\n\t\tit(\"no pending or initial messages\", () => {\n\t\t\tconst pendingStateManager = createPendingStateManager(undefined);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.hasPendingMessages(),\n\t\t\t\tfalse,\n\t\t\t\t\"There shouldn't be pending messages\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.pendingMessagesCount,\n\t\t\t\t0,\n\t\t\t\t\"Pending messages count should be 0\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"has pending messages but no initial messages\", () => {\n\t\t\tconst pendingStateManager = createPendingStateManager(undefined);\n\t\t\tfor (const message of messages) {\n\t\t\t\tpendingStateManager.onSubmitMessage(\n\t\t\t\t\tJSON.stringify(message.content),\n\t\t\t\t\t0,\n\t\t\t\t\tundefined /* localOpMetadata */,\n\t\t\t\t\tundefined /* opMetadata */,\n\t\t\t\t);\n\t\t\t}\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.hasPendingMessages(),\n\t\t\t\ttrue,\n\t\t\t\t\"There should be pending messages\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.pendingMessagesCount,\n\t\t\t\tmessages.length,\n\t\t\t\t\"Pending messages count should be same as pending messages\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"has initial messages but no pending messages\", () => {\n\t\t\tconst pendingStateManager = createPendingStateManager(messages);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.hasPendingMessages(),\n\t\t\t\ttrue,\n\t\t\t\t\"There should be initial messages\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.pendingMessagesCount,\n\t\t\t\tmessages.length,\n\t\t\t\t\"Pending messages count should be same as initial messages\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"has both pending messages and initial messages\", () => {\n\t\t\tconst pendingStateManager = createPendingStateManager(messages);\n\t\t\tfor (const message of messages) {\n\t\t\t\tpendingStateManager.onSubmitMessage(\n\t\t\t\t\tJSON.stringify(message.content),\n\t\t\t\t\t0,\n\t\t\t\t\tundefined /* localOpMetadata */,\n\t\t\t\t\tundefined /* opMetadata */,\n\t\t\t\t);\n\t\t\t}\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.hasPendingMessages(),\n\t\t\t\ttrue,\n\t\t\t\t\"There should be pending messages\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.pendingMessagesCount,\n\t\t\t\tmessages.length * 2,\n\t\t\t\t\"Pending messages count should be same as pending + initial messages\",\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"pendingStateManager.spec.js","sourceRoot":"","sources":["../../src/test/pendingStateManager.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport assert from \"assert\";\nimport Deque from \"double-ended-queue\";\n\nimport {\n\tContainerErrorTypes,\n\tICriticalContainerError,\n} from \"@fluidframework/container-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { isILoggingError } from \"@fluidframework/telemetry-utils\";\n\nimport type {\n\tRecentlyAddedContainerRuntimeMessageDetails,\n\tUnknownContainerRuntimeMessage,\n} from \"../messageTypes.js\";\nimport { BatchManager, BatchMessage } from \"../opLifecycle/index.js\";\nimport { IPendingMessage, PendingStateManager } from \"../pendingStateManager.js\";\n\ntype PendingStateManager_WithPrivates = Omit<PendingStateManager, \"initialMessages\"> & {\n\tinitialMessages: Deque<IPendingMessage>;\n};\n\ndescribe(\"Pending State Manager\", () => {\n\tdescribe(\"Rollback\", () => {\n\t\tlet rollbackCalled;\n\t\tlet rollbackContent;\n\t\tlet rollbackShouldThrow;\n\t\tlet batchManager: BatchManager;\n\n\t\tfunction getMessage(payload: string) {\n\t\t\treturn { contents: payload } as any as BatchMessage;\n\t\t}\n\n\t\tconst rollBackCallback = (m: BatchMessage) => {\n\t\t\trollbackCalled = true;\n\t\t\trollbackContent.push(m);\n\t\t\tif (rollbackShouldThrow) {\n\t\t\t\tthrow new Error();\n\t\t\t}\n\t\t};\n\n\t\tbeforeEach(async () => {\n\t\t\trollbackCalled = false;\n\t\t\trollbackContent = [];\n\t\t\trollbackShouldThrow = false;\n\n\t\t\tbatchManager = new BatchManager({ hardLimit: 950 * 1024 });\n\t\t});\n\n\t\tit(\"should do nothing when rolling back empty pending stack\", () => {\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tcheckpoint.rollback(rollBackCallback);\n\n\t\t\tassert.strictEqual(rollbackCalled, false);\n\t\t\tassert.strictEqual(batchManager.empty, true);\n\t\t});\n\n\t\tit(\"should do nothing when rolling back nothing\", () => {\n\t\t\tbatchManager.push(getMessage(\"1\"), /* reentrant */ false);\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tcheckpoint.rollback(rollBackCallback);\n\n\t\t\tassert.strictEqual(rollbackCalled, false);\n\t\t\tassert.strictEqual(batchManager.empty, false);\n\t\t});\n\n\t\tit(\"should succeed when rolling back entire pending stack\", () => {\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tbatchManager.push(getMessage(\"11\"), /* reentrant */ false);\n\t\t\tbatchManager.push(getMessage(\"22\"), /* reentrant */ false);\n\t\t\tbatchManager.push(getMessage(\"33\"), /* reentrant */ false);\n\t\t\tcheckpoint.rollback(rollBackCallback);\n\n\t\t\tassert.strictEqual(rollbackCalled, true);\n\t\t\tassert.strictEqual(rollbackContent.length, 3);\n\t\t\tassert.strictEqual(rollbackContent[0].contents, \"33\");\n\t\t\tassert.strictEqual(rollbackContent[1].contents, \"22\");\n\t\t\tassert.strictEqual(rollbackContent[2].contents, \"11\");\n\t\t\tassert.strictEqual(batchManager.empty, true);\n\t\t});\n\n\t\tit(\"should succeed when rolling back part of pending stack\", () => {\n\t\t\tbatchManager.push(getMessage(\"11\"), /* reentrant */ false);\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tbatchManager.push(getMessage(\"22\"), /* reentrant */ false);\n\t\t\tbatchManager.push(getMessage(\"33\"), /* reentrant */ false);\n\t\t\tcheckpoint.rollback(rollBackCallback);\n\n\t\t\tassert.strictEqual(rollbackCalled, true);\n\t\t\tassert.strictEqual(rollbackContent.length, 2);\n\t\t\tassert.strictEqual(rollbackContent[0].contents, \"33\");\n\t\t\tassert.strictEqual(rollbackContent[1].contents, \"22\");\n\t\t\tassert.strictEqual(batchManager.empty, false);\n\t\t});\n\n\t\tit(\"should throw and close when rollback fails\", () => {\n\t\t\trollbackShouldThrow = true;\n\t\t\tconst checkpoint = batchManager.checkpoint();\n\t\t\tbatchManager.push(getMessage(\"11\"), /* reentrant */ false);\n\t\t\tassert.throws(() => {\n\t\t\t\tcheckpoint.rollback(rollBackCallback);\n\t\t\t});\n\n\t\t\tassert.strictEqual(rollbackCalled, true);\n\t\t});\n\t});\n\n\tdescribe(\"Op processing\", () => {\n\t\tlet pendingStateManager;\n\t\tlet closeError: ICriticalContainerError | undefined;\n\t\tconst clientId = \"clientId\";\n\n\t\tbeforeEach(async () => {\n\t\t\tcloseError = undefined;\n\t\t\tpendingStateManager = new PendingStateManager(\n\t\t\t\t{\n\t\t\t\t\tapplyStashedOp: () => {\n\t\t\t\t\t\tthrow new Error();\n\t\t\t\t\t},\n\t\t\t\t\tclientId: () => \"oldClientId\",\n\t\t\t\t\tclose: (error?: ICriticalContainerError) => (closeError = error),\n\t\t\t\t\tconnected: () => true,\n\t\t\t\t\treSubmit: () => {},\n\t\t\t\t\treSubmitBatch: () => {},\n\t\t\t\t\tisActiveConnection: () => false,\n\t\t\t\t\tisAttached: () => true,\n\t\t\t\t},\n\t\t\t\tundefined /* initialLocalState */,\n\t\t\t\tundefined /* logger */,\n\t\t\t);\n\t\t});\n\n\t\tconst submitBatch = (messages: Partial<ISequencedDocumentMessage>[]) => {\n\t\t\tmessages.forEach((message) => {\n\t\t\t\tpendingStateManager.onSubmitMessage(\n\t\t\t\t\tJSON.stringify({ type: message.type, contents: message.contents }),\n\t\t\t\t\tmessage.referenceSequenceNumber,\n\t\t\t\t\tundefined,\n\t\t\t\t\tmessage.metadata,\n\t\t\t\t);\n\t\t\t});\n\t\t};\n\n\t\tconst process = (messages: Partial<ISequencedDocumentMessage>[]) =>\n\t\t\tmessages.forEach((message) => {\n\t\t\t\tpendingStateManager.processPendingLocalMessage(message);\n\t\t\t});\n\n\t\tit(\"proper batch is processed correctly\", () => {\n\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\tmetadata: { batch: true },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 1,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tmetadata: { batch: false },\n\t\t\t\t\tclientSequenceNumber: 2,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tsubmitBatch(messages);\n\t\t\tprocess(messages);\n\t\t\tassert(closeError === undefined);\n\t\t});\n\n\t\tit(\"batch missing end message will call close\", () => {\n\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\tmetadata: { batch: true },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 1,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tsubmitBatch(messages);\n\t\t\tprocess(messages);\n\t\t\tassert(isILoggingError(closeError));\n\t\t\tassert.strictEqual(closeError.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\tassert.strictEqual(closeError.getTelemetryProperties().hasBatchStart, true);\n\t\t\tassert.strictEqual(closeError.getTelemetryProperties().hasBatchEnd, false);\n\t\t});\n\n\t\tdescribe(\"processing out of sync messages will call close\", () => {\n\t\t\tit(\"messageTypes do not match\", () => {\n\t\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsubmitBatch(messages);\n\t\t\t\tprocess(\n\t\t\t\t\tmessages.map((message) => ({\n\t\t\t\t\t\t...message,\n\t\t\t\t\t\ttype: \"otherType\",\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tassert(isILoggingError(closeError));\n\t\t\t\tassert.strictEqual(closeError.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tcloseError.getTelemetryProperties().expectedMessageType,\n\t\t\t\t\tMessageType.Operation,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"only one message has undefined content\", () => {\n\t\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\t\tcontents: {},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsubmitBatch(messages);\n\t\t\t\tprocess(\n\t\t\t\t\tmessages.map((message) => ({\n\t\t\t\t\t\t...message,\n\t\t\t\t\t\tcontents: undefined,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(closeError?.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\t});\n\n\t\t\tit(\"stringified message content does not match\", () => {\n\t\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\t\tcontents: {},\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tsubmitBatch(messages);\n\t\t\t\tprocess(\n\t\t\t\t\tmessages.map((message) => ({\n\t\t\t\t\t\t...message,\n\t\t\t\t\t\tcontents: { prop1: true },\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(closeError?.errorType, ContainerErrorTypes.dataProcessingError);\n\t\t\t});\n\t\t});\n\n\t\tit(\"processing in sync messages will not call close\", () => {\n\t\t\tconst messages: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t{\n\t\t\t\t\tclientId,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tclientSequenceNumber: 0,\n\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\tcontents: { prop1: true },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tsubmitBatch(messages);\n\t\t\tprocess(\n\t\t\t\tmessages.map((message) => ({\n\t\t\t\t\t...message,\n\t\t\t\t\tcontents: { prop1: true },\n\t\t\t\t})),\n\t\t\t);\n\t\t\tassert.strictEqual(closeError, undefined, \"unexpected close\");\n\t\t});\n\t});\n\n\tdescribe(\"Local state processing\", () => {\n\t\tfunction createPendingStateManager(pendingStates): PendingStateManager_WithPrivates {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\t\treturn new PendingStateManager(\n\t\t\t\t{\n\t\t\t\t\tapplyStashedOp: async () => undefined,\n\t\t\t\t\tclientId: () => undefined,\n\t\t\t\t\tclose: () => {},\n\t\t\t\t\tconnected: () => true,\n\t\t\t\t\treSubmit: () => {},\n\t\t\t\t\treSubmitBatch: () => {},\n\t\t\t\t\tisActiveConnection: () => false,\n\t\t\t\t\tisAttached: () => true,\n\t\t\t\t},\n\t\t\t\t{ pendingStates },\n\t\t\t\tundefined /* logger */,\n\t\t\t) as any;\n\t\t}\n\n\t\tdescribe(\"Constructor pendingStates\", () => {\n\t\t\tit(\"Empty local state\", () => {\n\t\t\t\t{\n\t\t\t\t\tconst pendingStateManager = createPendingStateManager(undefined);\n\t\t\t\t\tassert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), []);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tconst pendingStateManager = createPendingStateManager([]);\n\t\t\t\t\tassert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), []);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"New format\", () => {\n\t\t\t\tconst messages = [\n\t\t\t\t\t{ type: \"message\", content: '{\"type\":\"component\"}' },\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"message\",\n\t\t\t\t\t\tcontent: '{\"type\": \"component\", \"contents\": {\"prop1\": \"value\"}}',\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t\tconst pendingStateManager = createPendingStateManager(messages);\n\t\t\t\tassert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), messages);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Future op compat behavior\", () => {\n\t\t\tit(\"pending op roundtrip\", async () => {\n\t\t\t\tconst pendingStateManager = createPendingStateManager([]);\n\t\t\t\tconst futureRuntimeMessage: Pick<ISequencedDocumentMessage, \"type\" | \"contents\"> &\n\t\t\t\t\tRecentlyAddedContainerRuntimeMessageDetails = {\n\t\t\t\t\ttype: \"FROM_THE_FUTURE\",\n\t\t\t\t\tcontents: \"Hello\",\n\t\t\t\t\tcompatDetails: { behavior: \"FailToProcess\" },\n\t\t\t\t};\n\n\t\t\t\tpendingStateManager.onSubmitMessage(\n\t\t\t\t\tJSON.stringify(futureRuntimeMessage),\n\t\t\t\t\t0,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tpendingStateManager.processPendingLocalMessage(\n\t\t\t\t\tfutureRuntimeMessage as ISequencedDocumentMessage &\n\t\t\t\t\t\tUnknownContainerRuntimeMessage,\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"Pending messages state\", () => {\n\t\tconst messages = [\n\t\t\t{ type: \"message\", content: '{\"type\":\"component\"}' },\n\t\t\t{\n\t\t\t\ttype: \"message\",\n\t\t\t\tcontent: '{\"type\": \"component\", \"contents\": {\"prop1\": \"value\"}}',\n\t\t\t},\n\t\t];\n\n\t\tfunction createPendingStateManager(pendingStates): PendingStateManager_WithPrivates {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\t\treturn new PendingStateManager(\n\t\t\t\t{\n\t\t\t\t\tapplyStashedOp: async () => undefined,\n\t\t\t\t\tclientId: () => undefined,\n\t\t\t\t\tclose: () => {},\n\t\t\t\t\tconnected: () => true,\n\t\t\t\t\treSubmit: () => {},\n\t\t\t\t\treSubmitBatch: () => {},\n\t\t\t\t\tisActiveConnection: () => false,\n\t\t\t\t\tisAttached: () => true,\n\t\t\t\t},\n\t\t\t\t{ pendingStates },\n\t\t\t\tundefined /* logger */,\n\t\t\t) as any;\n\t\t}\n\n\t\tit(\"no pending or initial messages\", () => {\n\t\t\tconst pendingStateManager = createPendingStateManager(undefined);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.hasPendingMessages(),\n\t\t\t\tfalse,\n\t\t\t\t\"There shouldn't be pending messages\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.pendingMessagesCount,\n\t\t\t\t0,\n\t\t\t\t\"Pending messages count should be 0\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"has pending messages but no initial messages\", () => {\n\t\t\tconst pendingStateManager = createPendingStateManager(undefined);\n\t\t\tfor (const message of messages) {\n\t\t\t\tpendingStateManager.onSubmitMessage(\n\t\t\t\t\tJSON.stringify(message.content),\n\t\t\t\t\t0,\n\t\t\t\t\tundefined /* localOpMetadata */,\n\t\t\t\t\tundefined /* opMetadata */,\n\t\t\t\t);\n\t\t\t}\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.hasPendingMessages(),\n\t\t\t\ttrue,\n\t\t\t\t\"There should be pending messages\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.pendingMessagesCount,\n\t\t\t\tmessages.length,\n\t\t\t\t\"Pending messages count should be same as pending messages\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"has initial messages but no pending messages\", () => {\n\t\t\tconst pendingStateManager = createPendingStateManager(messages);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.hasPendingMessages(),\n\t\t\t\ttrue,\n\t\t\t\t\"There should be initial messages\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.pendingMessagesCount,\n\t\t\t\tmessages.length,\n\t\t\t\t\"Pending messages count should be same as initial messages\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"has both pending messages and initial messages\", () => {\n\t\t\tconst pendingStateManager = createPendingStateManager(messages);\n\t\t\tfor (const message of messages) {\n\t\t\t\tpendingStateManager.onSubmitMessage(\n\t\t\t\t\tJSON.stringify(message.content),\n\t\t\t\t\t0,\n\t\t\t\t\tundefined /* localOpMetadata */,\n\t\t\t\t\tundefined /* opMetadata */,\n\t\t\t\t);\n\t\t\t}\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.hasPendingMessages(),\n\t\t\t\ttrue,\n\t\t\t\t\"There should be pending messages\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpendingStateManager.pendingMessagesCount,\n\t\t\t\tmessages.length * 2,\n\t\t\t\t\"Pending messages count should be same as pending + initial messages\",\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
@@ -5,8 +5,8 @@
5
5
  import { strict as assert } from "assert";
6
6
  import { EventEmitter } from "@fluid-internal/client-utils";
7
7
  import { MessageType } from "@fluidframework/protocol-definitions";
8
- import { MockDeltaManager } from "@fluidframework/test-runtime-utils";
9
8
  import { createChildLogger } from "@fluidframework/telemetry-utils";
9
+ import { MockDeltaManager } from "@fluidframework/test-runtime-utils";
10
10
  import { ScheduleManager } from "../scheduleManager.js";
11
11
  describe("ScheduleManager", () => {
12
12
  describe("Batch processing events", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"scheduleManager.spec.js","sourceRoot":"","sources":["../../src/test/scheduleManager.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { EventEmitter } from \"@fluid-internal/client-utils\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { MockDeltaManager } from \"@fluidframework/test-runtime-utils\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { ScheduleManager } from \"../scheduleManager.js\";\n\ndescribe(\"ScheduleManager\", () => {\n\tdescribe(\"Batch processing events\", () => {\n\t\tlet batchBegin: number = 0;\n\t\tlet batchEnd: number = 0;\n\t\tlet sequenceNumber: number = 0;\n\t\tlet emitter: EventEmitter;\n\t\tlet deltaManager: MockDeltaManager;\n\t\tlet scheduleManager: ScheduleManager;\n\t\tconst testClientId = \"test-client\";\n\n\t\tbeforeEach(() => {\n\t\t\temitter = new EventEmitter();\n\t\t\tdeltaManager = new MockDeltaManager();\n\t\t\tdeltaManager.inbound.processCallback = (message: ISequencedDocumentMessage) => {\n\t\t\t\tscheduleManager.beforeOpProcessing(message);\n\t\t\t\tscheduleManager.afterOpProcessing(undefined, message);\n\t\t\t\tdeltaManager.emit(\"op\", message);\n\t\t\t};\n\t\t\tscheduleManager = new ScheduleManager(\n\t\t\t\tdeltaManager,\n\t\t\t\temitter,\n\t\t\t\t() => testClientId,\n\t\t\t\tcreateChildLogger({ namespace: \"fluid:testScheduleManager\" }),\n\t\t\t);\n\n\t\t\temitter.on(\"batchBegin\", () => {\n\t\t\t\t// When we receive a \"batchBegin\" event, we should not have any outstanding\n\t\t\t\t// events, i.e., batchBegin and batchEnd should be equal.\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tbatchBegin,\n\t\t\t\t\tbatchEnd,\n\t\t\t\t\t\"Received batchBegin before previous batchEnd\",\n\t\t\t\t);\n\t\t\t\tbatchBegin++;\n\t\t\t});\n\n\t\t\temitter.on(\"batchEnd\", () => {\n\t\t\t\tbatchEnd++;\n\t\t\t\t// Every \"batchEnd\" event should correspond to a \"batchBegin\" event, i.e.,\n\t\t\t\t// batchBegin and batchEnd should be equal.\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tbatchBegin,\n\t\t\t\t\tbatchEnd,\n\t\t\t\t\t\"Received batchEnd without corresponding batchBegin\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tafterEach(() => {\n\t\t\tbatchBegin = 0;\n\t\t\tbatchEnd = 0;\n\t\t\tsequenceNumber = 0;\n\t\t});\n\n\t\t/**\n\t\t * Pushes single op to the inbound queue. Adds proper sequence numbers to them\n\t\t */\n\t\tfunction pushOp(partialMessage: Partial<ISequencedDocumentMessage>) {\n\t\t\tsequenceNumber++;\n\t\t\tconst message = { ...partialMessage, sequenceNumber };\n\t\t\tdeltaManager.inbound.push(message as ISequencedDocumentMessage);\n\t\t}\n\n\t\t/**\n\t\t * awaits until all ops that could be processed are processed.\n\t\t */\n\t\tasync function processOps() {\n\t\t\tconst inbound = deltaManager.inbound;\n\t\t\twhile (!inbound.paused && inbound.length > 0) {\n\t\t\t\tawait Promise.resolve();\n\t\t\t}\n\t\t}\n\n\t\tit(\"Single non-batch message\", async () => {\n\t\t\tconst message: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\t// Send a non-batch message.\n\t\t\tpushOp(message);\n\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"Did not process all ops\");\n\t\t\tassert.strictEqual(batchBegin, 1, \"Did not receive correct batchBegin events\");\n\t\t\tassert.strictEqual(batchEnd, 1, \"Did not receive correct batchEnd events\");\n\t\t});\n\n\t\tit(\"Multiple non-batch messages\", async () => {\n\t\t\tconst message: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\t// Sent 5 non-batch messages.\n\t\t\tpushOp(message);\n\t\t\tpushOp(message);\n\t\t\tpushOp(message);\n\t\t\tpushOp(message);\n\t\t\tpushOp(message);\n\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"Did not process all ops\");\n\t\t\tassert.strictEqual(batchBegin, 5, \"Did not receive correct batchBegin events\");\n\t\t\tassert.strictEqual(batchEnd, 5, \"Did not receive correct batchEnd events\");\n\t\t});\n\n\t\tit(\"Message with non batch-related metadata\", async () => {\n\t\t\tconst message: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { foo: 1 },\n\t\t\t};\n\n\t\t\tpushOp(message);\n\t\t\tawait processOps();\n\n\t\t\t// We should have a \"batchBegin\" and a \"batchEnd\" event for the batch.\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"Did not process all ops\");\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t1,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 1, \"Did not receive correct batchEnd event for the batch\");\n\t\t});\n\n\t\tit(\"Messages in a single batch\", async () => {\n\t\t\tconst batchBeginMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: true },\n\t\t\t};\n\n\t\t\tconst batchMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\tconst batchEndMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: false },\n\t\t\t};\n\n\t\t\t// Send a batch with 4 messages.\n\t\t\tpushOp(batchBeginMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\n\t\t\tawait processOps();\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t3,\n\t\t\t\t\"Some of partial batch ops were processed\",\n\t\t\t);\n\n\t\t\tpushOp(batchEndMessage);\n\t\t\tawait processOps();\n\n\t\t\t// We should have only received one \"batchBegin\" and one \"batchEnd\" event for the batch.\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"Did not process all ops\");\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t1,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 1, \"Did not receive correct batchEnd event for the batch\");\n\t\t});\n\n\t\tit(\"two batches\", async () => {\n\t\t\tconst batchBeginMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: true },\n\t\t\t};\n\n\t\t\tconst batchMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\tconst batchEndMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: false },\n\t\t\t};\n\n\t\t\t// Pause to not allow ops to be processed while we accumulated them.\n\t\t\tawait deltaManager.inbound.pause();\n\n\t\t\t// Send a batch with 4 messages.\n\t\t\tpushOp(batchBeginMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchEndMessage);\n\n\t\t\t// Add incomplete batch\n\t\t\tpushOp(batchBeginMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t7,\n\t\t\t\t\"none of the batched ops are processed yet\",\n\t\t\t);\n\n\t\t\tvoid deltaManager.inbound.resume();\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t3,\n\t\t\t\t\"none of the second batch ops are processed yet\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t1,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 1, \"Did not receive correct batchEnd event for the batch\");\n\n\t\t\t// End the batch - all ops should be processed.\n\t\t\tpushOp(batchEndMessage);\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"processed all ops\");\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t2,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 2, \"Did not receive correct batchEnd event for the batch\");\n\t\t});\n\n\t\tit(\"non-batched ops followed by batch\", async () => {\n\t\t\tconst batchBeginMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: true },\n\t\t\t};\n\n\t\t\tconst batchMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\tconst batchEndMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: false },\n\t\t\t};\n\n\t\t\t// Pause to not allow ops to be processed while we accumulated them.\n\t\t\tawait deltaManager.inbound.pause();\n\n\t\t\t// Send a batch with 2 messages.\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\n\t\t\t// Add incomplete batch\n\t\t\tpushOp(batchBeginMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t5,\n\t\t\t\t\"none of the batched ops are processed yet\",\n\t\t\t);\n\n\t\t\tvoid deltaManager.inbound.resume();\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t3,\n\t\t\t\t\"none of the second batch ops are processed yet\",\n\t\t\t);\n\n\t\t\t// End the batch - all ops should be processed.\n\t\t\tpushOp(batchEndMessage);\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"processed all ops\");\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t3,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 3, \"Did not receive correct batchEnd event for the batch\");\n\t\t});\n\n\t\tfunction testWrongBatches() {\n\t\t\tconst clientId1: string = \"test-client-1\";\n\t\t\tconst clientId2: string = \"test-client-2\";\n\n\t\t\tconst batchBeginMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: clientId1,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: true },\n\t\t\t};\n\n\t\t\tconst batchMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: clientId1,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\tconst messagesToFail: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t// System op from same client\n\t\t\t\t{\n\t\t\t\t\tclientId: clientId1,\n\t\t\t\t\ttype: MessageType.NoOp,\n\t\t\t\t},\n\n\t\t\t\t// Batch messages interleaved with a batch begin message from same client\n\t\t\t\tbatchBeginMessage,\n\n\t\t\t\t// Send a message from another client. This should result in a a violation!\n\t\t\t\t{\n\t\t\t\t\tclientId: clientId2,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t},\n\n\t\t\t\t// Send a message from another client with non batch-related metadata. This should result\n\t\t\t\t// in a \"batchEnd\" event for the previous batch since the client id changes. Also, we\n\t\t\t\t// should get a \"batchBegin\" and a \"batchEnd\" event for the new client.\n\t\t\t\t{\n\t\t\t\t\tclientId: clientId2,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tmetadata: { foo: 1 },\n\t\t\t\t},\n\n\t\t\t\t// Send a batch from another client. This should result in a \"batchEnd\" event for the\n\t\t\t\t// previous batch since the client id changes. Also, we should get one \"batchBegin\" and\n\t\t\t\t// one \"batchEnd\" event for the batch from the new client.\n\t\t\t\t{\n\t\t\t\t\tclientId: clientId2,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tmetadata: { batch: true },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tlet counter = 0;\n\t\t\tfor (const messageToFail of messagesToFail) {\n\t\t\t\tcounter++;\n\t\t\t\tit(`Partial batch messages, case ${counter}`, async () => {\n\t\t\t\t\t// Send a batch with 3 messages from first client but don't send batch end message.\n\t\t\t\t\tpushOp(batchBeginMessage);\n\t\t\t\t\tpushOp(batchMessage);\n\t\t\t\t\tpushOp(batchMessage);\n\n\t\t\t\t\tawait processOps();\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t\t\t3,\n\t\t\t\t\t\t\"Some of partial batch ops were processed\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.throws(() => pushOp(messageToFail));\n\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t\t\t4,\n\t\t\t\t\t\t\"Some of batch ops were processed\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbatchBegin,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbatchEnd,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\ttestWrongBatches();\n\t});\n});\n"]}
1
+ {"version":3,"file":"scheduleManager.spec.js","sourceRoot":"","sources":["../../src/test/scheduleManager.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { EventEmitter } from \"@fluid-internal/client-utils\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { MockDeltaManager } from \"@fluidframework/test-runtime-utils\";\nimport { ScheduleManager } from \"../scheduleManager.js\";\n\ndescribe(\"ScheduleManager\", () => {\n\tdescribe(\"Batch processing events\", () => {\n\t\tlet batchBegin: number = 0;\n\t\tlet batchEnd: number = 0;\n\t\tlet sequenceNumber: number = 0;\n\t\tlet emitter: EventEmitter;\n\t\tlet deltaManager: MockDeltaManager;\n\t\tlet scheduleManager: ScheduleManager;\n\t\tconst testClientId = \"test-client\";\n\n\t\tbeforeEach(() => {\n\t\t\temitter = new EventEmitter();\n\t\t\tdeltaManager = new MockDeltaManager();\n\t\t\tdeltaManager.inbound.processCallback = (message: ISequencedDocumentMessage) => {\n\t\t\t\tscheduleManager.beforeOpProcessing(message);\n\t\t\t\tscheduleManager.afterOpProcessing(undefined, message);\n\t\t\t\tdeltaManager.emit(\"op\", message);\n\t\t\t};\n\t\t\tscheduleManager = new ScheduleManager(\n\t\t\t\tdeltaManager,\n\t\t\t\temitter,\n\t\t\t\t() => testClientId,\n\t\t\t\tcreateChildLogger({ namespace: \"fluid:testScheduleManager\" }),\n\t\t\t);\n\n\t\t\temitter.on(\"batchBegin\", () => {\n\t\t\t\t// When we receive a \"batchBegin\" event, we should not have any outstanding\n\t\t\t\t// events, i.e., batchBegin and batchEnd should be equal.\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tbatchBegin,\n\t\t\t\t\tbatchEnd,\n\t\t\t\t\t\"Received batchBegin before previous batchEnd\",\n\t\t\t\t);\n\t\t\t\tbatchBegin++;\n\t\t\t});\n\n\t\t\temitter.on(\"batchEnd\", () => {\n\t\t\t\tbatchEnd++;\n\t\t\t\t// Every \"batchEnd\" event should correspond to a \"batchBegin\" event, i.e.,\n\t\t\t\t// batchBegin and batchEnd should be equal.\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tbatchBegin,\n\t\t\t\t\tbatchEnd,\n\t\t\t\t\t\"Received batchEnd without corresponding batchBegin\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tafterEach(() => {\n\t\t\tbatchBegin = 0;\n\t\t\tbatchEnd = 0;\n\t\t\tsequenceNumber = 0;\n\t\t});\n\n\t\t/**\n\t\t * Pushes single op to the inbound queue. Adds proper sequence numbers to them\n\t\t */\n\t\tfunction pushOp(partialMessage: Partial<ISequencedDocumentMessage>) {\n\t\t\tsequenceNumber++;\n\t\t\tconst message = { ...partialMessage, sequenceNumber };\n\t\t\tdeltaManager.inbound.push(message as ISequencedDocumentMessage);\n\t\t}\n\n\t\t/**\n\t\t * awaits until all ops that could be processed are processed.\n\t\t */\n\t\tasync function processOps() {\n\t\t\tconst inbound = deltaManager.inbound;\n\t\t\twhile (!inbound.paused && inbound.length > 0) {\n\t\t\t\tawait Promise.resolve();\n\t\t\t}\n\t\t}\n\n\t\tit(\"Single non-batch message\", async () => {\n\t\t\tconst message: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\t// Send a non-batch message.\n\t\t\tpushOp(message);\n\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"Did not process all ops\");\n\t\t\tassert.strictEqual(batchBegin, 1, \"Did not receive correct batchBegin events\");\n\t\t\tassert.strictEqual(batchEnd, 1, \"Did not receive correct batchEnd events\");\n\t\t});\n\n\t\tit(\"Multiple non-batch messages\", async () => {\n\t\t\tconst message: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\t// Sent 5 non-batch messages.\n\t\t\tpushOp(message);\n\t\t\tpushOp(message);\n\t\t\tpushOp(message);\n\t\t\tpushOp(message);\n\t\t\tpushOp(message);\n\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"Did not process all ops\");\n\t\t\tassert.strictEqual(batchBegin, 5, \"Did not receive correct batchBegin events\");\n\t\t\tassert.strictEqual(batchEnd, 5, \"Did not receive correct batchEnd events\");\n\t\t});\n\n\t\tit(\"Message with non batch-related metadata\", async () => {\n\t\t\tconst message: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { foo: 1 },\n\t\t\t};\n\n\t\t\tpushOp(message);\n\t\t\tawait processOps();\n\n\t\t\t// We should have a \"batchBegin\" and a \"batchEnd\" event for the batch.\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"Did not process all ops\");\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t1,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 1, \"Did not receive correct batchEnd event for the batch\");\n\t\t});\n\n\t\tit(\"Messages in a single batch\", async () => {\n\t\t\tconst batchBeginMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: true },\n\t\t\t};\n\n\t\t\tconst batchMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\tconst batchEndMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: false },\n\t\t\t};\n\n\t\t\t// Send a batch with 4 messages.\n\t\t\tpushOp(batchBeginMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\n\t\t\tawait processOps();\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t3,\n\t\t\t\t\"Some of partial batch ops were processed\",\n\t\t\t);\n\n\t\t\tpushOp(batchEndMessage);\n\t\t\tawait processOps();\n\n\t\t\t// We should have only received one \"batchBegin\" and one \"batchEnd\" event for the batch.\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"Did not process all ops\");\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t1,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 1, \"Did not receive correct batchEnd event for the batch\");\n\t\t});\n\n\t\tit(\"two batches\", async () => {\n\t\t\tconst batchBeginMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: true },\n\t\t\t};\n\n\t\t\tconst batchMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\tconst batchEndMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: false },\n\t\t\t};\n\n\t\t\t// Pause to not allow ops to be processed while we accumulated them.\n\t\t\tawait deltaManager.inbound.pause();\n\n\t\t\t// Send a batch with 4 messages.\n\t\t\tpushOp(batchBeginMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchEndMessage);\n\n\t\t\t// Add incomplete batch\n\t\t\tpushOp(batchBeginMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t7,\n\t\t\t\t\"none of the batched ops are processed yet\",\n\t\t\t);\n\n\t\t\tvoid deltaManager.inbound.resume();\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t3,\n\t\t\t\t\"none of the second batch ops are processed yet\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t1,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 1, \"Did not receive correct batchEnd event for the batch\");\n\n\t\t\t// End the batch - all ops should be processed.\n\t\t\tpushOp(batchEndMessage);\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"processed all ops\");\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t2,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 2, \"Did not receive correct batchEnd event for the batch\");\n\t\t});\n\n\t\tit(\"non-batched ops followed by batch\", async () => {\n\t\t\tconst batchBeginMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: true },\n\t\t\t};\n\n\t\t\tconst batchMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\tconst batchEndMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: testClientId,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: false },\n\t\t\t};\n\n\t\t\t// Pause to not allow ops to be processed while we accumulated them.\n\t\t\tawait deltaManager.inbound.pause();\n\n\t\t\t// Send a batch with 2 messages.\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\n\t\t\t// Add incomplete batch\n\t\t\tpushOp(batchBeginMessage);\n\t\t\tpushOp(batchMessage);\n\t\t\tpushOp(batchMessage);\n\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t5,\n\t\t\t\t\"none of the batched ops are processed yet\",\n\t\t\t);\n\n\t\t\tvoid deltaManager.inbound.resume();\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(\n\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t3,\n\t\t\t\t\"none of the second batch ops are processed yet\",\n\t\t\t);\n\n\t\t\t// End the batch - all ops should be processed.\n\t\t\tpushOp(batchEndMessage);\n\t\t\tawait processOps();\n\n\t\t\tassert.strictEqual(deltaManager.inbound.length, 0, \"processed all ops\");\n\t\t\tassert.strictEqual(\n\t\t\t\tbatchBegin,\n\t\t\t\t3,\n\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t);\n\t\t\tassert.strictEqual(batchEnd, 3, \"Did not receive correct batchEnd event for the batch\");\n\t\t});\n\n\t\tfunction testWrongBatches() {\n\t\t\tconst clientId1: string = \"test-client-1\";\n\t\t\tconst clientId2: string = \"test-client-2\";\n\n\t\t\tconst batchBeginMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: clientId1,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t\tmetadata: { batch: true },\n\t\t\t};\n\n\t\t\tconst batchMessage: Partial<ISequencedDocumentMessage> = {\n\t\t\t\tclientId: clientId1,\n\t\t\t\ttype: MessageType.Operation,\n\t\t\t};\n\n\t\t\tconst messagesToFail: Partial<ISequencedDocumentMessage>[] = [\n\t\t\t\t// System op from same client\n\t\t\t\t{\n\t\t\t\t\tclientId: clientId1,\n\t\t\t\t\ttype: MessageType.NoOp,\n\t\t\t\t},\n\n\t\t\t\t// Batch messages interleaved with a batch begin message from same client\n\t\t\t\tbatchBeginMessage,\n\n\t\t\t\t// Send a message from another client. This should result in a a violation!\n\t\t\t\t{\n\t\t\t\t\tclientId: clientId2,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t},\n\n\t\t\t\t// Send a message from another client with non batch-related metadata. This should result\n\t\t\t\t// in a \"batchEnd\" event for the previous batch since the client id changes. Also, we\n\t\t\t\t// should get a \"batchBegin\" and a \"batchEnd\" event for the new client.\n\t\t\t\t{\n\t\t\t\t\tclientId: clientId2,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tmetadata: { foo: 1 },\n\t\t\t\t},\n\n\t\t\t\t// Send a batch from another client. This should result in a \"batchEnd\" event for the\n\t\t\t\t// previous batch since the client id changes. Also, we should get one \"batchBegin\" and\n\t\t\t\t// one \"batchEnd\" event for the batch from the new client.\n\t\t\t\t{\n\t\t\t\t\tclientId: clientId2,\n\t\t\t\t\ttype: MessageType.Operation,\n\t\t\t\t\tmetadata: { batch: true },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tlet counter = 0;\n\t\t\tfor (const messageToFail of messagesToFail) {\n\t\t\t\tcounter++;\n\t\t\t\tit(`Partial batch messages, case ${counter}`, async () => {\n\t\t\t\t\t// Send a batch with 3 messages from first client but don't send batch end message.\n\t\t\t\t\tpushOp(batchBeginMessage);\n\t\t\t\t\tpushOp(batchMessage);\n\t\t\t\t\tpushOp(batchMessage);\n\n\t\t\t\t\tawait processOps();\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t\t\t3,\n\t\t\t\t\t\t\"Some of partial batch ops were processed\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.throws(() => pushOp(messageToFail));\n\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tdeltaManager.inbound.length,\n\t\t\t\t\t\t4,\n\t\t\t\t\t\t\"Some of batch ops were processed\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbatchBegin,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tbatchEnd,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"Did not receive correct batchBegin event for the batch\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\ttestWrongBatches();\n\t});\n});\n"]}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { strict as assert } from "assert";
6
6
  import { SummaryType, } from "@fluidframework/protocol-definitions";
7
- import { channelsTreeName, CreateSummarizerNodeSource, } from "@fluidframework/runtime-definitions";
7
+ import { CreateSummarizerNodeSource, channelsTreeName, } from "@fluidframework/runtime-definitions";
8
8
  import { mergeStats } from "@fluidframework/runtime-utils";
9
9
  import { TelemetryDataTag, createChildLogger } from "@fluidframework/telemetry-utils";
10
10
  import { createRootSummarizerNode } from "../summary/index.js";