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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (544) hide show
  1. package/api-report/container-runtime.api.md +109 -55
  2. package/dist/batchTracker.d.ts +1 -1
  3. package/dist/batchTracker.d.ts.map +1 -1
  4. package/dist/batchTracker.js +4 -4
  5. package/dist/batchTracker.js.map +1 -1
  6. package/dist/blobManager.d.ts +33 -25
  7. package/dist/blobManager.d.ts.map +1 -1
  8. package/dist/blobManager.js +82 -100
  9. package/dist/blobManager.js.map +1 -1
  10. package/dist/channelCollection.d.ts +7 -6
  11. package/dist/channelCollection.d.ts.map +1 -1
  12. package/dist/channelCollection.js +110 -77
  13. package/dist/channelCollection.js.map +1 -1
  14. package/dist/connectionTelemetry.d.ts +3 -3
  15. package/dist/connectionTelemetry.d.ts.map +1 -1
  16. package/dist/connectionTelemetry.js +17 -17
  17. package/dist/connectionTelemetry.js.map +1 -1
  18. package/dist/container-runtime-alpha.d.ts +263 -41
  19. package/dist/container-runtime-beta.d.ts +44 -30
  20. package/dist/container-runtime-public.d.ts +44 -30
  21. package/dist/container-runtime-untrimmed.d.ts +265 -56
  22. package/dist/containerHandleContext.d.ts.map +1 -1
  23. package/dist/containerHandleContext.js +2 -2
  24. package/dist/containerHandleContext.js.map +1 -1
  25. package/dist/containerRuntime.d.ts +40 -30
  26. package/dist/containerRuntime.d.ts.map +1 -1
  27. package/dist/containerRuntime.js +376 -255
  28. package/dist/containerRuntime.js.map +1 -1
  29. package/dist/dataStore.d.ts +1 -1
  30. package/dist/dataStore.d.ts.map +1 -1
  31. package/dist/dataStore.js +7 -7
  32. package/dist/dataStore.js.map +1 -1
  33. package/dist/dataStoreContext.d.ts +9 -9
  34. package/dist/dataStoreContext.d.ts.map +1 -1
  35. package/dist/dataStoreContext.js +74 -74
  36. package/dist/dataStoreContext.js.map +1 -1
  37. package/dist/dataStoreContexts.d.ts.map +1 -1
  38. package/dist/dataStoreContexts.js +11 -11
  39. package/dist/dataStoreContexts.js.map +1 -1
  40. package/dist/dataStoreRegistry.d.ts +1 -1
  41. package/dist/dataStoreRegistry.d.ts.map +1 -1
  42. package/dist/dataStoreRegistry.js +2 -2
  43. package/dist/dataStoreRegistry.js.map +1 -1
  44. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  45. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  46. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  47. package/dist/deltaScheduler.d.ts +1 -1
  48. package/dist/deltaScheduler.d.ts.map +1 -1
  49. package/dist/deltaScheduler.js +6 -6
  50. package/dist/deltaScheduler.js.map +1 -1
  51. package/dist/error.d.ts +1 -1
  52. package/dist/error.d.ts.map +1 -1
  53. package/dist/error.js +4 -4
  54. package/dist/error.js.map +1 -1
  55. package/dist/gc/garbageCollection.d.ts +3 -2
  56. package/dist/gc/garbageCollection.d.ts.map +1 -1
  57. package/dist/gc/garbageCollection.js +21 -21
  58. package/dist/gc/garbageCollection.js.map +1 -1
  59. package/dist/gc/gcConfigs.d.ts +2 -2
  60. package/dist/gc/gcConfigs.d.ts.map +1 -1
  61. package/dist/gc/gcConfigs.js +4 -5
  62. package/dist/gc/gcConfigs.js.map +1 -1
  63. package/dist/gc/gcDefinitions.d.ts +4 -3
  64. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  65. package/dist/gc/gcDefinitions.js.map +1 -1
  66. package/dist/gc/gcHelpers.d.ts +5 -1
  67. package/dist/gc/gcHelpers.d.ts.map +1 -1
  68. package/dist/gc/gcHelpers.js +21 -12
  69. package/dist/gc/gcHelpers.js.map +1 -1
  70. package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
  71. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  72. package/dist/gc/gcSummaryStateTracker.js +11 -11
  73. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  74. package/dist/gc/gcTelemetry.d.ts +2 -1
  75. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  76. package/dist/gc/gcTelemetry.js +11 -9
  77. package/dist/gc/gcTelemetry.js.map +1 -1
  78. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  79. package/dist/gc/gcUnreferencedStateTracker.js +6 -6
  80. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  81. package/dist/gc/index.d.ts +1 -1
  82. package/dist/gc/index.d.ts.map +1 -1
  83. package/dist/gc/index.js +2 -1
  84. package/dist/gc/index.js.map +1 -1
  85. package/dist/index.d.ts +2 -2
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +4 -2
  88. package/dist/index.js.map +1 -1
  89. package/dist/messageTypes.d.ts +11 -5
  90. package/dist/messageTypes.d.ts.map +1 -1
  91. package/dist/messageTypes.js +4 -0
  92. package/dist/messageTypes.js.map +1 -1
  93. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  94. package/dist/opLifecycle/batchManager.js.map +1 -1
  95. package/dist/opLifecycle/definitions.d.ts +2 -20
  96. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  97. package/dist/opLifecycle/definitions.js.map +1 -1
  98. package/dist/opLifecycle/index.d.ts +3 -3
  99. package/dist/opLifecycle/index.d.ts.map +1 -1
  100. package/dist/opLifecycle/index.js +3 -1
  101. package/dist/opLifecycle/index.js.map +1 -1
  102. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  103. package/dist/opLifecycle/opCompressor.js +5 -6
  104. package/dist/opLifecycle/opCompressor.js.map +1 -1
  105. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  106. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  107. package/dist/opLifecycle/opDecompressor.js +62 -63
  108. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  109. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  110. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  111. package/dist/opLifecycle/opGroupingManager.js +14 -16
  112. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  113. package/dist/opLifecycle/opSplitter.d.ts +12 -4
  114. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  115. package/dist/opLifecycle/opSplitter.js +63 -53
  116. package/dist/opLifecycle/opSplitter.js.map +1 -1
  117. package/dist/opLifecycle/outbox.d.ts +2 -1
  118. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  119. package/dist/opLifecycle/outbox.js +19 -24
  120. package/dist/opLifecycle/outbox.js.map +1 -1
  121. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  122. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  123. package/dist/opLifecycle/remoteMessageProcessor.js +36 -35
  124. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  125. package/dist/packageVersion.d.ts +1 -1
  126. package/dist/packageVersion.js +1 -1
  127. package/dist/packageVersion.js.map +1 -1
  128. package/dist/pendingStateManager.d.ts +1 -1
  129. package/dist/pendingStateManager.d.ts.map +1 -1
  130. package/dist/pendingStateManager.js +18 -18
  131. package/dist/pendingStateManager.js.map +1 -1
  132. package/dist/scheduleManager.d.ts +1 -1
  133. package/dist/scheduleManager.d.ts.map +1 -1
  134. package/dist/scheduleManager.js +24 -24
  135. package/dist/scheduleManager.js.map +1 -1
  136. package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
  137. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
  138. package/dist/storageServiceWithAttachBlobs.js +2 -2
  139. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  140. package/dist/summary/documentSchema.d.ts +209 -0
  141. package/dist/summary/documentSchema.d.ts.map +1 -0
  142. package/dist/summary/documentSchema.js +382 -0
  143. package/dist/summary/documentSchema.js.map +1 -0
  144. package/dist/summary/index.d.ts +2 -1
  145. package/dist/summary/index.d.ts.map +1 -1
  146. package/dist/summary/index.js +4 -1
  147. package/dist/summary/index.js.map +1 -1
  148. package/dist/summary/orderedClientElection.d.ts +2 -2
  149. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  150. package/dist/summary/orderedClientElection.js +8 -7
  151. package/dist/summary/orderedClientElection.js.map +1 -1
  152. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
  153. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  154. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  155. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  156. package/dist/summary/runningSummarizer.d.ts +3 -3
  157. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  158. package/dist/summary/runningSummarizer.js +16 -16
  159. package/dist/summary/runningSummarizer.js.map +1 -1
  160. package/dist/summary/summarizer.d.ts +3 -2
  161. package/dist/summary/summarizer.d.ts.map +1 -1
  162. package/dist/summary/summarizer.js +13 -13
  163. package/dist/summary/summarizer.js.map +1 -1
  164. package/dist/summary/summarizerClientElection.d.ts +2 -2
  165. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  166. package/dist/summary/summarizerClientElection.js.map +1 -1
  167. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  168. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  169. package/dist/summary/summarizerHeuristics.js +2 -2
  170. package/dist/summary/summarizerHeuristics.js.map +1 -1
  171. package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
  172. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  173. package/dist/summary/summarizerNode/summarizerNode.js +28 -28
  174. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  175. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  176. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  177. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  178. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  179. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  180. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  181. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
  182. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  183. package/dist/summary/summarizerTypes.d.ts +5 -3
  184. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  185. package/dist/summary/summarizerTypes.js.map +1 -1
  186. package/dist/summary/summaryCollection.d.ts +2 -2
  187. package/dist/summary/summaryCollection.d.ts.map +1 -1
  188. package/dist/summary/summaryCollection.js +7 -7
  189. package/dist/summary/summaryCollection.js.map +1 -1
  190. package/dist/summary/summaryFormat.d.ts +6 -17
  191. package/dist/summary/summaryFormat.d.ts.map +1 -1
  192. package/dist/summary/summaryFormat.js +8 -8
  193. package/dist/summary/summaryFormat.js.map +1 -1
  194. package/dist/summary/summaryGenerator.d.ts +4 -3
  195. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  196. package/dist/summary/summaryGenerator.js +17 -17
  197. package/dist/summary/summaryGenerator.js.map +1 -1
  198. package/dist/summary/summaryManager.d.ts +1 -1
  199. package/dist/summary/summaryManager.d.ts.map +1 -1
  200. package/dist/summary/summaryManager.js +15 -14
  201. package/dist/summary/summaryManager.js.map +1 -1
  202. package/lib/batchTracker.d.ts +1 -1
  203. package/lib/batchTracker.d.ts.map +1 -1
  204. package/lib/batchTracker.js +2 -2
  205. package/lib/batchTracker.js.map +1 -1
  206. package/lib/blobManager.d.ts +33 -25
  207. package/lib/blobManager.d.ts.map +1 -1
  208. package/lib/blobManager.js +48 -66
  209. package/lib/blobManager.js.map +1 -1
  210. package/lib/channelCollection.d.ts +7 -6
  211. package/lib/channelCollection.d.ts.map +1 -1
  212. package/lib/channelCollection.js +47 -14
  213. package/lib/channelCollection.js.map +1 -1
  214. package/lib/connectionTelemetry.d.ts +3 -3
  215. package/lib/connectionTelemetry.d.ts.map +1 -1
  216. package/lib/connectionTelemetry.js +3 -3
  217. package/lib/connectionTelemetry.js.map +1 -1
  218. package/lib/container-runtime-alpha.d.ts +263 -41
  219. package/lib/container-runtime-beta.d.ts +44 -30
  220. package/lib/container-runtime-public.d.ts +44 -30
  221. package/lib/container-runtime-untrimmed.d.ts +265 -56
  222. package/lib/containerHandleContext.d.ts.map +1 -1
  223. package/lib/containerHandleContext.js +1 -1
  224. package/lib/containerHandleContext.js.map +1 -1
  225. package/lib/containerRuntime.d.ts +40 -30
  226. package/lib/containerRuntime.d.ts.map +1 -1
  227. package/lib/containerRuntime.js +224 -101
  228. package/lib/containerRuntime.js.map +1 -1
  229. package/lib/dataStore.d.ts +1 -1
  230. package/lib/dataStore.d.ts.map +1 -1
  231. package/lib/dataStore.js +2 -2
  232. package/lib/dataStore.js.map +1 -1
  233. package/lib/dataStoreContext.d.ts +9 -9
  234. package/lib/dataStoreContext.d.ts.map +1 -1
  235. package/lib/dataStoreContext.js +8 -8
  236. package/lib/dataStoreContext.js.map +1 -1
  237. package/lib/dataStoreContexts.d.ts.map +1 -1
  238. package/lib/dataStoreContexts.js +2 -2
  239. package/lib/dataStoreContexts.js.map +1 -1
  240. package/lib/dataStoreRegistry.d.ts +1 -1
  241. package/lib/dataStoreRegistry.d.ts.map +1 -1
  242. package/lib/dataStoreRegistry.js +1 -1
  243. package/lib/dataStoreRegistry.js.map +1 -1
  244. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  245. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  246. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  247. package/lib/deltaScheduler.d.ts +1 -1
  248. package/lib/deltaScheduler.d.ts.map +1 -1
  249. package/lib/deltaScheduler.js +1 -1
  250. package/lib/deltaScheduler.js.map +1 -1
  251. package/lib/error.d.ts +1 -1
  252. package/lib/error.d.ts.map +1 -1
  253. package/lib/error.js +2 -2
  254. package/lib/error.js.map +1 -1
  255. package/lib/gc/garbageCollection.d.ts +3 -2
  256. package/lib/gc/garbageCollection.d.ts.map +1 -1
  257. package/lib/gc/garbageCollection.js +6 -6
  258. package/lib/gc/garbageCollection.js.map +1 -1
  259. package/lib/gc/gcConfigs.d.ts +2 -2
  260. package/lib/gc/gcConfigs.d.ts.map +1 -1
  261. package/lib/gc/gcConfigs.js +4 -5
  262. package/lib/gc/gcConfigs.js.map +1 -1
  263. package/lib/gc/gcDefinitions.d.ts +4 -3
  264. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  265. package/lib/gc/gcDefinitions.js.map +1 -1
  266. package/lib/gc/gcHelpers.d.ts +5 -1
  267. package/lib/gc/gcHelpers.d.ts.map +1 -1
  268. package/lib/gc/gcHelpers.js +10 -2
  269. package/lib/gc/gcHelpers.js.map +1 -1
  270. package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
  271. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  272. package/lib/gc/gcSummaryStateTracker.js +2 -2
  273. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  274. package/lib/gc/gcTelemetry.d.ts +2 -1
  275. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  276. package/lib/gc/gcTelemetry.js +4 -2
  277. package/lib/gc/gcTelemetry.js.map +1 -1
  278. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  279. package/lib/gc/gcUnreferencedStateTracker.js +2 -2
  280. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  281. package/lib/gc/index.d.ts +1 -1
  282. package/lib/gc/index.d.ts.map +1 -1
  283. package/lib/gc/index.js +1 -1
  284. package/lib/gc/index.js.map +1 -1
  285. package/lib/index.d.ts +2 -2
  286. package/lib/index.d.ts.map +1 -1
  287. package/lib/index.js +2 -2
  288. package/lib/index.js.map +1 -1
  289. package/lib/messageTypes.d.ts +11 -5
  290. package/lib/messageTypes.d.ts.map +1 -1
  291. package/lib/messageTypes.js +4 -0
  292. package/lib/messageTypes.js.map +1 -1
  293. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  294. package/lib/opLifecycle/batchManager.js.map +1 -1
  295. package/lib/opLifecycle/definitions.d.ts +2 -20
  296. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  297. package/lib/opLifecycle/definitions.js.map +1 -1
  298. package/lib/opLifecycle/index.d.ts +3 -3
  299. package/lib/opLifecycle/index.d.ts.map +1 -1
  300. package/lib/opLifecycle/index.js +2 -2
  301. package/lib/opLifecycle/index.js.map +1 -1
  302. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  303. package/lib/opLifecycle/opCompressor.js +2 -3
  304. package/lib/opLifecycle/opCompressor.js.map +1 -1
  305. package/lib/opLifecycle/opDecompressor.d.ts +15 -4
  306. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  307. package/lib/opLifecycle/opDecompressor.js +61 -62
  308. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  309. package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
  310. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  311. package/lib/opLifecycle/opGroupingManager.js +9 -12
  312. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  313. package/lib/opLifecycle/opSplitter.d.ts +12 -4
  314. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  315. package/lib/opLifecycle/opSplitter.js +47 -38
  316. package/lib/opLifecycle/opSplitter.js.map +1 -1
  317. package/lib/opLifecycle/outbox.d.ts +2 -1
  318. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  319. package/lib/opLifecycle/outbox.js +8 -13
  320. package/lib/opLifecycle/outbox.js.map +1 -1
  321. package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  322. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  323. package/lib/opLifecycle/remoteMessageProcessor.js +36 -35
  324. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  325. package/lib/packageVersion.d.ts +1 -1
  326. package/lib/packageVersion.js +1 -1
  327. package/lib/packageVersion.js.map +1 -1
  328. package/lib/pendingStateManager.d.ts +1 -1
  329. package/lib/pendingStateManager.d.ts.map +1 -1
  330. package/lib/pendingStateManager.js +2 -2
  331. package/lib/pendingStateManager.js.map +1 -1
  332. package/lib/scheduleManager.d.ts +1 -1
  333. package/lib/scheduleManager.d.ts.map +1 -1
  334. package/lib/scheduleManager.js +3 -3
  335. package/lib/scheduleManager.js.map +1 -1
  336. package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
  337. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
  338. package/lib/storageServiceWithAttachBlobs.js +1 -1
  339. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  340. package/lib/summary/documentSchema.d.ts +209 -0
  341. package/lib/summary/documentSchema.d.ts.map +1 -0
  342. package/lib/summary/documentSchema.js +378 -0
  343. package/lib/summary/documentSchema.js.map +1 -0
  344. package/lib/summary/index.d.ts +2 -1
  345. package/lib/summary/index.d.ts.map +1 -1
  346. package/lib/summary/index.js +1 -0
  347. package/lib/summary/index.js.map +1 -1
  348. package/lib/summary/orderedClientElection.d.ts +2 -2
  349. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  350. package/lib/summary/orderedClientElection.js +3 -2
  351. package/lib/summary/orderedClientElection.js.map +1 -1
  352. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  353. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  354. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  355. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  356. package/lib/summary/runningSummarizer.d.ts +3 -3
  357. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  358. package/lib/summary/runningSummarizer.js +3 -3
  359. package/lib/summary/runningSummarizer.js.map +1 -1
  360. package/lib/summary/summarizer.d.ts +3 -2
  361. package/lib/summary/summarizer.d.ts.map +1 -1
  362. package/lib/summary/summarizer.js +3 -3
  363. package/lib/summary/summarizer.js.map +1 -1
  364. package/lib/summary/summarizerClientElection.d.ts +2 -2
  365. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  366. package/lib/summary/summarizerClientElection.js.map +1 -1
  367. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  368. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  369. package/lib/summary/summarizerHeuristics.js +1 -1
  370. package/lib/summary/summarizerHeuristics.js.map +1 -1
  371. package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
  372. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  373. package/lib/summary/summarizerNode/summarizerNode.js +5 -5
  374. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  375. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  376. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  377. package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
  378. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  379. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  380. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  381. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  382. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  383. package/lib/summary/summarizerTypes.d.ts +5 -3
  384. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  385. package/lib/summary/summarizerTypes.js.map +1 -1
  386. package/lib/summary/summaryCollection.d.ts +2 -2
  387. package/lib/summary/summaryCollection.d.ts.map +1 -1
  388. package/lib/summary/summaryCollection.js +1 -1
  389. package/lib/summary/summaryCollection.js.map +1 -1
  390. package/lib/summary/summaryFormat.d.ts +6 -17
  391. package/lib/summary/summaryFormat.d.ts.map +1 -1
  392. package/lib/summary/summaryFormat.js +3 -3
  393. package/lib/summary/summaryFormat.js.map +1 -1
  394. package/lib/summary/summaryGenerator.d.ts +4 -3
  395. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  396. package/lib/summary/summaryGenerator.js +4 -4
  397. package/lib/summary/summaryGenerator.js.map +1 -1
  398. package/lib/summary/summaryManager.d.ts +1 -1
  399. package/lib/summary/summaryManager.d.ts.map +1 -1
  400. package/lib/summary/summaryManager.js +9 -8
  401. package/lib/summary/summaryManager.js.map +1 -1
  402. package/lib/tsdoc-metadata.json +11 -0
  403. package/package.json +34 -32
  404. package/src/batchTracker.ts +4 -3
  405. package/src/blobManager.ts +100 -69
  406. package/src/channelCollection.ts +86 -43
  407. package/src/connectionTelemetry.ts +12 -12
  408. package/src/containerHandleContext.ts +3 -2
  409. package/src/containerRuntime.ts +419 -232
  410. package/src/dataStore.ts +5 -3
  411. package/src/dataStoreContext.ts +32 -29
  412. package/src/dataStoreContexts.ts +4 -2
  413. package/src/dataStoreRegistry.ts +2 -2
  414. package/src/deltaManagerSummarizerProxy.ts +1 -1
  415. package/src/deltaScheduler.ts +2 -1
  416. package/src/error.ts +2 -2
  417. package/src/gc/garbageCollection.ts +19 -18
  418. package/src/gc/gcConfigs.ts +15 -18
  419. package/src/gc/gcDefinitions.ts +6 -6
  420. package/src/gc/gcHelpers.ts +22 -5
  421. package/src/gc/gcSummaryStateTracker.ts +7 -5
  422. package/src/gc/gcTelemetry.ts +13 -7
  423. package/src/gc/gcUnreferencedStateTracker.ts +3 -2
  424. package/src/gc/index.ts +1 -0
  425. package/src/index.ts +8 -1
  426. package/src/messageTypes.ts +20 -6
  427. package/src/opLifecycle/README.md +89 -0
  428. package/src/opLifecycle/batchManager.ts +1 -0
  429. package/src/opLifecycle/definitions.ts +3 -21
  430. package/src/opLifecycle/index.ts +3 -9
  431. package/src/opLifecycle/opCompressor.ts +6 -5
  432. package/src/opLifecycle/opDecompressor.ts +84 -100
  433. package/src/opLifecycle/opGroupingManager.ts +12 -14
  434. package/src/opLifecycle/opSplitter.ts +76 -48
  435. package/src/opLifecycle/outbox.ts +17 -32
  436. package/src/opLifecycle/remoteMessageProcessor.ts +43 -59
  437. package/src/packageVersion.ts +1 -1
  438. package/src/pendingStateManager.ts +6 -6
  439. package/src/scheduleManager.ts +9 -8
  440. package/src/storageServiceWithAttachBlobs.ts +2 -2
  441. package/src/summary/documentSchema.ts +612 -0
  442. package/src/summary/index.ts +10 -1
  443. package/src/summary/orderedClientElection.ts +6 -7
  444. package/src/summary/runWhileConnectedCoordinator.ts +3 -2
  445. package/src/summary/runningSummarizer.ts +22 -20
  446. package/src/summary/summarizer.ts +17 -15
  447. package/src/summary/summarizerClientElection.ts +3 -2
  448. package/src/summary/summarizerHeuristics.ts +4 -2
  449. package/src/summary/summarizerNode/summarizerNode.ts +20 -18
  450. package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
  451. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
  452. package/src/summary/summarizerTypes.ts +7 -3
  453. package/src/summary/summaryCollection.ts +3 -3
  454. package/src/summary/summaryFormat.ts +14 -26
  455. package/src/summary/summaryGenerator.ts +12 -15
  456. package/src/summary/summaryManager.ts +16 -13
  457. package/lib/test/batchTracker.spec.js +0 -88
  458. package/lib/test/batchTracker.spec.js.map +0 -1
  459. package/lib/test/blobManager.spec.js +0 -835
  460. package/lib/test/blobManager.spec.js.map +0 -1
  461. package/lib/test/channelCollection.spec.js +0 -138
  462. package/lib/test/channelCollection.spec.js.map +0 -1
  463. package/lib/test/containerRuntime.spec.js +0 -1748
  464. package/lib/test/containerRuntime.spec.js.map +0 -1
  465. package/lib/test/dataStoreContext.spec.js +0 -771
  466. package/lib/test/dataStoreContext.spec.js.map +0 -1
  467. package/lib/test/dataStoreCreation.spec.js +0 -303
  468. package/lib/test/dataStoreCreation.spec.js.map +0 -1
  469. package/lib/test/dataStoreRegistry.spec.js +0 -26
  470. package/lib/test/dataStoreRegistry.spec.js.map +0 -1
  471. package/lib/test/fuzz/fuzzUtils.js +0 -66
  472. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  473. package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
  474. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
  475. package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
  476. package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
  477. package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
  478. package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
  479. package/lib/test/gc/garbageCollection.spec.js +0 -1464
  480. package/lib/test/gc/garbageCollection.spec.js.map +0 -1
  481. package/lib/test/gc/gcConfigs.spec.js +0 -689
  482. package/lib/test/gc/gcConfigs.spec.js.map +0 -1
  483. package/lib/test/gc/gcHelpers.spec.js +0 -110
  484. package/lib/test/gc/gcHelpers.spec.js.map +0 -1
  485. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
  486. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
  487. package/lib/test/gc/gcStats.spec.js +0 -390
  488. package/lib/test/gc/gcStats.spec.js.map +0 -1
  489. package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
  490. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
  491. package/lib/test/gc/gcTelemetry.spec.js +0 -530
  492. package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
  493. package/lib/test/gc/gcUnitTestHelpers.js +0 -29
  494. package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
  495. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
  496. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
  497. package/lib/test/getPendingBlobs.spec.js +0 -193
  498. package/lib/test/getPendingBlobs.spec.js.map +0 -1
  499. package/lib/test/hardwareStats.spec.js +0 -93
  500. package/lib/test/hardwareStats.spec.js.map +0 -1
  501. package/lib/test/index.js +0 -6
  502. package/lib/test/index.js.map +0 -1
  503. package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
  504. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
  505. package/lib/test/opLifecycle/batchManager.spec.js +0 -189
  506. package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
  507. package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
  508. package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
  509. package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
  510. package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
  511. package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
  512. package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
  513. package/lib/test/opLifecycle/outbox.spec.js +0 -675
  514. package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
  515. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
  516. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
  517. package/lib/test/pendingStateManager.spec.js +0 -329
  518. package/lib/test/pendingStateManager.spec.js.map +0 -1
  519. package/lib/test/scheduleManager.spec.js +0 -270
  520. package/lib/test/scheduleManager.spec.js.map +0 -1
  521. package/lib/test/summarizerNode.spec.js +0 -326
  522. package/lib/test/summarizerNode.spec.js.map +0 -1
  523. package/lib/test/summarizerNodeWithGc.spec.js +0 -318
  524. package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
  525. package/lib/test/summary/orderedClientElection.spec.js +0 -535
  526. package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
  527. package/lib/test/summary/runningSummarizer.spec.js +0 -1349
  528. package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
  529. package/lib/test/summary/summarizer.spec.js +0 -29
  530. package/lib/test/summary/summarizer.spec.js.map +0 -1
  531. package/lib/test/summary/summarizerClientElection.spec.js +0 -436
  532. package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
  533. package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
  534. package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
  535. package/lib/test/summary/summaryCollection.spec.js +0 -200
  536. package/lib/test/summary/summaryCollection.spec.js.map +0 -1
  537. package/lib/test/summary/summaryManager.spec.js +0 -430
  538. package/lib/test/summary/summaryManager.spec.js.map +0 -1
  539. package/lib/test/summary/testQuorumClients.js +0 -34
  540. package/lib/test/summary/testQuorumClients.js.map +0 -1
  541. package/lib/test/throttler.spec.js +0 -175
  542. package/lib/test/throttler.spec.js.map +0 -1
  543. package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
  544. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
@@ -1,329 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import assert from "assert";
6
- import { ContainerErrorTypes, } from "@fluidframework/container-definitions";
7
- import { MessageType } from "@fluidframework/protocol-definitions";
8
- import { isILoggingError } from "@fluidframework/telemetry-utils";
9
- import { PendingStateManager } from "../pendingStateManager.js";
10
- import { BatchManager } from "../opLifecycle/index.js";
11
- describe("Pending State Manager", () => {
12
- describe("Rollback", () => {
13
- let rollbackCalled;
14
- let rollbackContent;
15
- let rollbackShouldThrow;
16
- let batchManager;
17
- function getMessage(payload) {
18
- return { contents: payload };
19
- }
20
- const rollBackCallback = (m) => {
21
- rollbackCalled = true;
22
- rollbackContent.push(m);
23
- if (rollbackShouldThrow) {
24
- throw new Error();
25
- }
26
- };
27
- beforeEach(async () => {
28
- rollbackCalled = false;
29
- rollbackContent = [];
30
- rollbackShouldThrow = false;
31
- batchManager = new BatchManager({ hardLimit: 950 * 1024 });
32
- });
33
- it("should do nothing when rolling back empty pending stack", () => {
34
- const checkpoint = batchManager.checkpoint();
35
- checkpoint.rollback(rollBackCallback);
36
- assert.strictEqual(rollbackCalled, false);
37
- assert.strictEqual(batchManager.empty, true);
38
- });
39
- it("should do nothing when rolling back nothing", () => {
40
- batchManager.push(getMessage("1"), /* reentrant */ false);
41
- const checkpoint = batchManager.checkpoint();
42
- checkpoint.rollback(rollBackCallback);
43
- assert.strictEqual(rollbackCalled, false);
44
- assert.strictEqual(batchManager.empty, false);
45
- });
46
- it("should succeed when rolling back entire pending stack", () => {
47
- const checkpoint = batchManager.checkpoint();
48
- batchManager.push(getMessage("11"), /* reentrant */ false);
49
- batchManager.push(getMessage("22"), /* reentrant */ false);
50
- batchManager.push(getMessage("33"), /* reentrant */ false);
51
- checkpoint.rollback(rollBackCallback);
52
- assert.strictEqual(rollbackCalled, true);
53
- assert.strictEqual(rollbackContent.length, 3);
54
- assert.strictEqual(rollbackContent[0].contents, "33");
55
- assert.strictEqual(rollbackContent[1].contents, "22");
56
- assert.strictEqual(rollbackContent[2].contents, "11");
57
- assert.strictEqual(batchManager.empty, true);
58
- });
59
- it("should succeed when rolling back part of pending stack", () => {
60
- batchManager.push(getMessage("11"), /* reentrant */ false);
61
- const checkpoint = batchManager.checkpoint();
62
- batchManager.push(getMessage("22"), /* reentrant */ false);
63
- batchManager.push(getMessage("33"), /* reentrant */ false);
64
- checkpoint.rollback(rollBackCallback);
65
- assert.strictEqual(rollbackCalled, true);
66
- assert.strictEqual(rollbackContent.length, 2);
67
- assert.strictEqual(rollbackContent[0].contents, "33");
68
- assert.strictEqual(rollbackContent[1].contents, "22");
69
- assert.strictEqual(batchManager.empty, false);
70
- });
71
- it("should throw and close when rollback fails", () => {
72
- rollbackShouldThrow = true;
73
- const checkpoint = batchManager.checkpoint();
74
- batchManager.push(getMessage("11"), /* reentrant */ false);
75
- assert.throws(() => {
76
- checkpoint.rollback(rollBackCallback);
77
- });
78
- assert.strictEqual(rollbackCalled, true);
79
- });
80
- });
81
- describe("Op processing", () => {
82
- let pendingStateManager;
83
- let closeError;
84
- const clientId = "clientId";
85
- beforeEach(async () => {
86
- closeError = undefined;
87
- pendingStateManager = new PendingStateManager({
88
- applyStashedOp: () => {
89
- throw new Error();
90
- },
91
- clientId: () => "oldClientId",
92
- close: (error) => (closeError = error),
93
- connected: () => true,
94
- reSubmit: () => { },
95
- reSubmitBatch: () => { },
96
- isActiveConnection: () => false,
97
- isAttached: () => true,
98
- }, undefined /* initialLocalState */, undefined /* logger */);
99
- });
100
- const submitBatch = (messages) => {
101
- messages.forEach((message) => {
102
- pendingStateManager.onSubmitMessage(JSON.stringify({ type: message.type, contents: message.contents }), message.referenceSequenceNumber, undefined, message.metadata);
103
- });
104
- };
105
- const process = (messages) => messages.forEach((message) => {
106
- pendingStateManager.processPendingLocalMessage(message);
107
- });
108
- it("proper batch is processed correctly", () => {
109
- const messages = [
110
- {
111
- clientId,
112
- type: MessageType.Operation,
113
- clientSequenceNumber: 0,
114
- referenceSequenceNumber: 0,
115
- metadata: { batch: true },
116
- },
117
- {
118
- clientId,
119
- type: MessageType.Operation,
120
- clientSequenceNumber: 1,
121
- referenceSequenceNumber: 0,
122
- },
123
- {
124
- clientId,
125
- type: MessageType.Operation,
126
- metadata: { batch: false },
127
- clientSequenceNumber: 2,
128
- referenceSequenceNumber: 0,
129
- },
130
- ];
131
- submitBatch(messages);
132
- process(messages);
133
- assert(closeError === undefined);
134
- });
135
- it("batch missing end message will call close", () => {
136
- const messages = [
137
- {
138
- clientId,
139
- type: MessageType.Operation,
140
- clientSequenceNumber: 0,
141
- referenceSequenceNumber: 0,
142
- metadata: { batch: true },
143
- },
144
- {
145
- clientId,
146
- type: MessageType.Operation,
147
- clientSequenceNumber: 1,
148
- referenceSequenceNumber: 0,
149
- },
150
- ];
151
- submitBatch(messages);
152
- process(messages);
153
- assert(isILoggingError(closeError));
154
- assert.strictEqual(closeError.errorType, ContainerErrorTypes.dataProcessingError);
155
- assert.strictEqual(closeError.getTelemetryProperties().hasBatchStart, true);
156
- assert.strictEqual(closeError.getTelemetryProperties().hasBatchEnd, false);
157
- });
158
- describe("processing out of sync messages will call close", () => {
159
- it("messageTypes do not match", () => {
160
- const messages = [
161
- {
162
- clientId,
163
- type: MessageType.Operation,
164
- clientSequenceNumber: 0,
165
- referenceSequenceNumber: 0,
166
- },
167
- ];
168
- submitBatch(messages);
169
- process(messages.map((message) => ({
170
- ...message,
171
- type: "otherType",
172
- })));
173
- assert(isILoggingError(closeError));
174
- assert.strictEqual(closeError.errorType, ContainerErrorTypes.dataProcessingError);
175
- assert.strictEqual(closeError.getTelemetryProperties().expectedMessageType, MessageType.Operation);
176
- });
177
- it("only one message has undefined content", () => {
178
- const messages = [
179
- {
180
- clientId,
181
- type: MessageType.Operation,
182
- clientSequenceNumber: 0,
183
- referenceSequenceNumber: 0,
184
- contents: {},
185
- },
186
- ];
187
- submitBatch(messages);
188
- process(messages.map((message) => ({
189
- ...message,
190
- contents: undefined,
191
- })));
192
- assert.strictEqual(closeError?.errorType, ContainerErrorTypes.dataProcessingError);
193
- });
194
- it("stringified message content does not match", () => {
195
- const messages = [
196
- {
197
- clientId,
198
- type: MessageType.Operation,
199
- clientSequenceNumber: 0,
200
- referenceSequenceNumber: 0,
201
- contents: {},
202
- },
203
- ];
204
- submitBatch(messages);
205
- process(messages.map((message) => ({
206
- ...message,
207
- contents: { prop1: true },
208
- })));
209
- assert.strictEqual(closeError?.errorType, ContainerErrorTypes.dataProcessingError);
210
- });
211
- });
212
- it("processing in sync messages will not call close", () => {
213
- const messages = [
214
- {
215
- clientId,
216
- type: MessageType.Operation,
217
- clientSequenceNumber: 0,
218
- referenceSequenceNumber: 0,
219
- contents: { prop1: true },
220
- },
221
- ];
222
- submitBatch(messages);
223
- process(messages.map((message) => ({
224
- ...message,
225
- contents: { prop1: true },
226
- })));
227
- assert.strictEqual(closeError, undefined, "unexpected close");
228
- });
229
- });
230
- describe("Local state processing", () => {
231
- function createPendingStateManager(pendingStates) {
232
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
233
- return new PendingStateManager({
234
- applyStashedOp: async () => undefined,
235
- clientId: () => undefined,
236
- close: () => { },
237
- connected: () => true,
238
- reSubmit: () => { },
239
- reSubmitBatch: () => { },
240
- isActiveConnection: () => false,
241
- isAttached: () => true,
242
- }, { pendingStates }, undefined /* logger */);
243
- }
244
- describe("Constructor pendingStates", () => {
245
- it("Empty local state", () => {
246
- {
247
- const pendingStateManager = createPendingStateManager(undefined);
248
- assert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), []);
249
- }
250
- {
251
- const pendingStateManager = createPendingStateManager([]);
252
- assert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), []);
253
- }
254
- });
255
- it("New format", () => {
256
- const messages = [
257
- { type: "message", content: '{"type":"component"}' },
258
- {
259
- type: "message",
260
- content: '{"type": "component", "contents": {"prop1": "value"}}',
261
- },
262
- ];
263
- const pendingStateManager = createPendingStateManager(messages);
264
- assert.deepStrictEqual(pendingStateManager.initialMessages.toArray(), messages);
265
- });
266
- });
267
- describe("Future op compat behavior", () => {
268
- it("pending op roundtrip", async () => {
269
- const pendingStateManager = createPendingStateManager([]);
270
- const futureRuntimeMessage = {
271
- type: "FROM_THE_FUTURE",
272
- contents: "Hello",
273
- compatDetails: { behavior: "FailToProcess" },
274
- };
275
- pendingStateManager.onSubmitMessage(JSON.stringify(futureRuntimeMessage), 0, undefined, undefined);
276
- pendingStateManager.processPendingLocalMessage(futureRuntimeMessage);
277
- });
278
- });
279
- });
280
- describe("Pending messages state", () => {
281
- const messages = [
282
- { type: "message", content: '{"type":"component"}' },
283
- {
284
- type: "message",
285
- content: '{"type": "component", "contents": {"prop1": "value"}}',
286
- },
287
- ];
288
- function createPendingStateManager(pendingStates) {
289
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
290
- return new PendingStateManager({
291
- applyStashedOp: async () => undefined,
292
- clientId: () => undefined,
293
- close: () => { },
294
- connected: () => true,
295
- reSubmit: () => { },
296
- reSubmitBatch: () => { },
297
- isActiveConnection: () => false,
298
- isAttached: () => true,
299
- }, { pendingStates }, undefined /* logger */);
300
- }
301
- it("no pending or initial messages", () => {
302
- const pendingStateManager = createPendingStateManager(undefined);
303
- assert.strictEqual(pendingStateManager.hasPendingMessages(), false, "There shouldn't be pending messages");
304
- assert.strictEqual(pendingStateManager.pendingMessagesCount, 0, "Pending messages count should be 0");
305
- });
306
- it("has pending messages but no initial messages", () => {
307
- const pendingStateManager = createPendingStateManager(undefined);
308
- for (const message of messages) {
309
- pendingStateManager.onSubmitMessage(JSON.stringify(message.content), 0, undefined /* localOpMetadata */, undefined /* opMetadata */);
310
- }
311
- assert.strictEqual(pendingStateManager.hasPendingMessages(), true, "There should be pending messages");
312
- assert.strictEqual(pendingStateManager.pendingMessagesCount, messages.length, "Pending messages count should be same as pending messages");
313
- });
314
- it("has initial messages but no pending messages", () => {
315
- const pendingStateManager = createPendingStateManager(messages);
316
- assert.strictEqual(pendingStateManager.hasPendingMessages(), true, "There should be initial messages");
317
- assert.strictEqual(pendingStateManager.pendingMessagesCount, messages.length, "Pending messages count should be same as initial messages");
318
- });
319
- it("has both pending messages and initial messages", () => {
320
- const pendingStateManager = createPendingStateManager(messages);
321
- for (const message of messages) {
322
- pendingStateManager.onSubmitMessage(JSON.stringify(message.content), 0, undefined /* localOpMetadata */, undefined /* opMetadata */);
323
- }
324
- assert.strictEqual(pendingStateManager.hasPendingMessages(), true, "There should be pending messages");
325
- assert.strictEqual(pendingStateManager.pendingMessagesCount, messages.length * 2, "Pending messages count should be same as pending + initial messages");
326
- });
327
- });
328
- });
329
- //# sourceMappingURL=pendingStateManager.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pendingStateManager.spec.js","sourceRoot":"","sources":["../../src/test/pendingStateManager.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,OAAO,EACN,mBAAmB,GAEnB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAA6B,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAmB,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,YAAY,EAAgB,MAAM,yBAAyB,CAAC;AAUrE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACtC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACzB,IAAI,cAAc,CAAC;QACnB,IAAI,eAAe,CAAC;QACpB,IAAI,mBAAmB,CAAC;QACxB,IAAI,YAA0B,CAAC;QAE/B,SAAS,UAAU,CAAC,OAAe;YAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAyB,CAAC;QACrD,CAAC;QAED,MAAM,gBAAgB,GAAG,CAAC,CAAe,EAAE,EAAE;YAC5C,cAAc,GAAG,IAAI,CAAC;YACtB,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,mBAAmB,EAAE;gBACxB,MAAM,IAAI,KAAK,EAAE,CAAC;aAClB;QACF,CAAC,CAAC;QAEF,UAAU,CAAC,KAAK,IAAI,EAAE;YACrB,cAAc,GAAG,KAAK,CAAC;YACvB,eAAe,GAAG,EAAE,CAAC;YACrB,mBAAmB,GAAG,KAAK,CAAC;YAE5B,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YAClE,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;YAC7C,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAEtC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACtD,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;YAC1D,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;YAC7C,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAEtC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAChE,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;YAC7C,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3D,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3D,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3D,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAEtC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YACjE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3D,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;YAC7C,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3D,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3D,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAEtC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACrD,mBAAmB,GAAG,IAAI,CAAC;YAC3B,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;YAC7C,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;gBAClB,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC9B,IAAI,mBAAmB,CAAC;QACxB,IAAI,UAA+C,CAAC;QACpD,MAAM,QAAQ,GAAG,UAAU,CAAC;QAE5B,UAAU,CAAC,KAAK,IAAI,EAAE;YACrB,UAAU,GAAG,SAAS,CAAC;YACvB,mBAAmB,GAAG,IAAI,mBAAmB,CAC5C;gBACC,cAAc,EAAE,GAAG,EAAE;oBACpB,MAAM,IAAI,KAAK,EAAE,CAAC;gBACnB,CAAC;gBACD,QAAQ,EAAE,GAAG,EAAE,CAAC,aAAa;gBAC7B,KAAK,EAAE,CAAC,KAA+B,EAAE,EAAE,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC;gBAChE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;gBACrB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;gBAClB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;gBACvB,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAK;gBAC/B,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;aACtB,EACD,SAAS,CAAC,uBAAuB,EACjC,SAAS,CAAC,YAAY,CACtB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,CAAC,QAA8C,EAAE,EAAE;YACtE,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC5B,mBAAmB,CAAC,eAAe,CAClC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,EAClE,OAAO,CAAC,uBAAuB,EAC/B,SAAS,EACT,OAAO,CAAC,QAAQ,CAChB,CAAC;YACH,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,CAAC,QAA8C,EAAE,EAAE,CAClE,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,mBAAmB,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEJ,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC9C,MAAM,QAAQ,GAAyC;gBACtD;oBACC,QAAQ;oBACR,IAAI,EAAE,WAAW,CAAC,SAAS;oBAC3B,oBAAoB,EAAE,CAAC;oBACvB,uBAAuB,EAAE,CAAC;oBAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;iBACzB;gBACD;oBACC,QAAQ;oBACR,IAAI,EAAE,WAAW,CAAC,SAAS;oBAC3B,oBAAoB,EAAE,CAAC;oBACvB,uBAAuB,EAAE,CAAC;iBAC1B;gBACD;oBACC,QAAQ;oBACR,IAAI,EAAE,WAAW,CAAC,SAAS;oBAC3B,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;oBAC1B,oBAAoB,EAAE,CAAC;oBACvB,uBAAuB,EAAE,CAAC;iBAC1B;aACD,CAAC;YAEF,WAAW,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClB,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACpD,MAAM,QAAQ,GAAyC;gBACtD;oBACC,QAAQ;oBACR,IAAI,EAAE,WAAW,CAAC,SAAS;oBAC3B,oBAAoB,EAAE,CAAC;oBACvB,uBAAuB,EAAE,CAAC;oBAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;iBACzB;gBACD;oBACC,QAAQ;oBACR,IAAI,EAAE,WAAW,CAAC,SAAS;oBAC3B,oBAAoB,EAAE,CAAC;oBACvB,uBAAuB,EAAE,CAAC;iBAC1B;aACD,CAAC;YAEF,WAAW,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClB,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;YAClF,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAC5E,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;YAChE,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;gBACpC,MAAM,QAAQ,GAAyC;oBACtD;wBACC,QAAQ;wBACR,IAAI,EAAE,WAAW,CAAC,SAAS;wBAC3B,oBAAoB,EAAE,CAAC;wBACvB,uBAAuB,EAAE,CAAC;qBAC1B;iBACD,CAAC;gBAEF,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO,CACN,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBAC1B,GAAG,OAAO;oBACV,IAAI,EAAE,WAAW;iBACjB,CAAC,CAAC,CACH,CAAC;gBACF,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;gBACpC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;gBAClF,MAAM,CAAC,WAAW,CACjB,UAAU,CAAC,sBAAsB,EAAE,CAAC,mBAAmB,EACvD,WAAW,CAAC,SAAS,CACrB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;gBACjD,MAAM,QAAQ,GAAyC;oBACtD;wBACC,QAAQ;wBACR,IAAI,EAAE,WAAW,CAAC,SAAS;wBAC3B,oBAAoB,EAAE,CAAC;wBACvB,uBAAuB,EAAE,CAAC;wBAC1B,QAAQ,EAAE,EAAE;qBACZ;iBACD,CAAC;gBAEF,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO,CACN,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBAC1B,GAAG,OAAO;oBACV,QAAQ,EAAE,SAAS;iBACnB,CAAC,CAAC,CACH,CAAC;gBACF,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;YACpF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;gBACrD,MAAM,QAAQ,GAAyC;oBACtD;wBACC,QAAQ;wBACR,IAAI,EAAE,WAAW,CAAC,SAAS;wBAC3B,oBAAoB,EAAE,CAAC;wBACvB,uBAAuB,EAAE,CAAC;wBAC1B,QAAQ,EAAE,EAAE;qBACZ;iBACD,CAAC;gBAEF,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO,CACN,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBAC1B,GAAG,OAAO;oBACV,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;iBACzB,CAAC,CAAC,CACH,CAAC;gBACF,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;YACpF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YAC1D,MAAM,QAAQ,GAAyC;gBACtD;oBACC,QAAQ;oBACR,IAAI,EAAE,WAAW,CAAC,SAAS;oBAC3B,oBAAoB,EAAE,CAAC;oBACvB,uBAAuB,EAAE,CAAC;oBAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;iBACzB;aACD,CAAC;YAEF,WAAW,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO,CACN,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC1B,GAAG,OAAO;gBACV,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;aACzB,CAAC,CAAC,CACH,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACvC,SAAS,yBAAyB,CAAC,aAAa;YAC/C,+DAA+D;YAC/D,OAAO,IAAI,mBAAmB,CAC7B;gBACC,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;gBACrC,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS;gBACzB,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;gBACf,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;gBACrB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;gBAClB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;gBACvB,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAK;gBAC/B,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;aACtB,EACD,EAAE,aAAa,EAAE,EACjB,SAAS,CAAC,YAAY,CACf,CAAC;QACV,CAAC;QAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;YAC1C,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;gBAC5B;oBACC,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;oBACjE,MAAM,CAAC,eAAe,CAAC,mBAAmB,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;iBAC1E;gBACD;oBACC,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,EAAE,CAAC,CAAC;oBAC1D,MAAM,CAAC,eAAe,CAAC,mBAAmB,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;iBAC1E;YACF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;gBACrB,MAAM,QAAQ,GAAG;oBAChB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,EAAE;oBACpD;wBACC,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,uDAAuD;qBAChE;iBACD,CAAC;gBACF,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;gBAChE,MAAM,CAAC,eAAe,CAAC,mBAAmB,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;YACjF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;YAC1C,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;gBACrC,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,EAAE,CAAC,CAAC;gBAC1D,MAAM,oBAAoB,GACqB;oBAC9C,IAAI,EAAE,iBAAiB;oBACvB,QAAQ,EAAE,OAAO;oBACjB,aAAa,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;iBAC5C,CAAC;gBAEF,mBAAmB,CAAC,eAAe,CAClC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,EACpC,CAAC,EACD,SAAS,EACT,SAAS,CACT,CAAC;gBACF,mBAAmB,CAAC,0BAA0B,CAC7C,oBAC+B,CAC/B,CAAC;YACH,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACvC,MAAM,QAAQ,GAAG;YAChB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,EAAE;YACpD;gBACC,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,uDAAuD;aAChE;SACD,CAAC;QAEF,SAAS,yBAAyB,CAAC,aAAa;YAC/C,+DAA+D;YAC/D,OAAO,IAAI,mBAAmB,CAC7B;gBACC,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;gBACrC,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS;gBACzB,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;gBACf,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;gBACrB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;gBAClB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;gBACvB,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAK;gBAC/B,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;aACtB,EACD,EAAE,aAAa,EAAE,EACjB,SAAS,CAAC,YAAY,CACf,CAAC;QACV,CAAC;QAED,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACzC,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;YACjE,MAAM,CAAC,WAAW,CACjB,mBAAmB,CAAC,kBAAkB,EAAE,EACxC,KAAK,EACL,qCAAqC,CACrC,CAAC;YACF,MAAM,CAAC,WAAW,CACjB,mBAAmB,CAAC,oBAAoB,EACxC,CAAC,EACD,oCAAoC,CACpC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACvD,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;YACjE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC/B,mBAAmB,CAAC,eAAe,CAClC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAC/B,CAAC,EACD,SAAS,CAAC,qBAAqB,EAC/B,SAAS,CAAC,gBAAgB,CAC1B,CAAC;aACF;YACD,MAAM,CAAC,WAAW,CACjB,mBAAmB,CAAC,kBAAkB,EAAE,EACxC,IAAI,EACJ,kCAAkC,CAClC,CAAC;YACF,MAAM,CAAC,WAAW,CACjB,mBAAmB,CAAC,oBAAoB,EACxC,QAAQ,CAAC,MAAM,EACf,2DAA2D,CAC3D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACvD,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,CACjB,mBAAmB,CAAC,kBAAkB,EAAE,EACxC,IAAI,EACJ,kCAAkC,CAClC,CAAC;YACF,MAAM,CAAC,WAAW,CACjB,mBAAmB,CAAC,oBAAoB,EACxC,QAAQ,CAAC,MAAM,EACf,2DAA2D,CAC3D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACzD,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;YAChE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC/B,mBAAmB,CAAC,eAAe,CAClC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAC/B,CAAC,EACD,SAAS,CAAC,qBAAqB,EAC/B,SAAS,CAAC,gBAAgB,CAC1B,CAAC;aACF;YACD,MAAM,CAAC,WAAW,CACjB,mBAAmB,CAAC,kBAAkB,EAAE,EACxC,IAAI,EACJ,kCAAkC,CAClC,CAAC;YACF,MAAM,CAAC,WAAW,CACjB,mBAAmB,CAAC,oBAAoB,EACxC,QAAQ,CAAC,MAAM,GAAG,CAAC,EACnB,qEAAqE,CACrE,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","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,270 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "assert";
6
- import { EventEmitter } from "@fluid-internal/client-utils";
7
- import { MessageType } from "@fluidframework/protocol-definitions";
8
- import { MockDeltaManager } from "@fluidframework/test-runtime-utils";
9
- import { createChildLogger } from "@fluidframework/telemetry-utils";
10
- import { ScheduleManager } from "../scheduleManager.js";
11
- describe("ScheduleManager", () => {
12
- describe("Batch processing events", () => {
13
- let batchBegin = 0;
14
- let batchEnd = 0;
15
- let sequenceNumber = 0;
16
- let emitter;
17
- let deltaManager;
18
- let scheduleManager;
19
- const testClientId = "test-client";
20
- beforeEach(() => {
21
- emitter = new EventEmitter();
22
- deltaManager = new MockDeltaManager();
23
- deltaManager.inbound.processCallback = (message) => {
24
- scheduleManager.beforeOpProcessing(message);
25
- scheduleManager.afterOpProcessing(undefined, message);
26
- deltaManager.emit("op", message);
27
- };
28
- scheduleManager = new ScheduleManager(deltaManager, emitter, () => testClientId, createChildLogger({ namespace: "fluid:testScheduleManager" }));
29
- emitter.on("batchBegin", () => {
30
- // When we receive a "batchBegin" event, we should not have any outstanding
31
- // events, i.e., batchBegin and batchEnd should be equal.
32
- assert.strictEqual(batchBegin, batchEnd, "Received batchBegin before previous batchEnd");
33
- batchBegin++;
34
- });
35
- emitter.on("batchEnd", () => {
36
- batchEnd++;
37
- // Every "batchEnd" event should correspond to a "batchBegin" event, i.e.,
38
- // batchBegin and batchEnd should be equal.
39
- assert.strictEqual(batchBegin, batchEnd, "Received batchEnd without corresponding batchBegin");
40
- });
41
- });
42
- afterEach(() => {
43
- batchBegin = 0;
44
- batchEnd = 0;
45
- sequenceNumber = 0;
46
- });
47
- /**
48
- * Pushes single op to the inbound queue. Adds proper sequence numbers to them
49
- */
50
- function pushOp(partialMessage) {
51
- sequenceNumber++;
52
- const message = { ...partialMessage, sequenceNumber };
53
- deltaManager.inbound.push(message);
54
- }
55
- /**
56
- * awaits until all ops that could be processed are processed.
57
- */
58
- async function processOps() {
59
- const inbound = deltaManager.inbound;
60
- while (!inbound.paused && inbound.length > 0) {
61
- await Promise.resolve();
62
- }
63
- }
64
- it("Single non-batch message", async () => {
65
- const message = {
66
- clientId: testClientId,
67
- type: MessageType.Operation,
68
- };
69
- // Send a non-batch message.
70
- pushOp(message);
71
- await processOps();
72
- assert.strictEqual(deltaManager.inbound.length, 0, "Did not process all ops");
73
- assert.strictEqual(batchBegin, 1, "Did not receive correct batchBegin events");
74
- assert.strictEqual(batchEnd, 1, "Did not receive correct batchEnd events");
75
- });
76
- it("Multiple non-batch messages", async () => {
77
- const message = {
78
- clientId: testClientId,
79
- type: MessageType.Operation,
80
- };
81
- // Sent 5 non-batch messages.
82
- pushOp(message);
83
- pushOp(message);
84
- pushOp(message);
85
- pushOp(message);
86
- pushOp(message);
87
- await processOps();
88
- assert.strictEqual(deltaManager.inbound.length, 0, "Did not process all ops");
89
- assert.strictEqual(batchBegin, 5, "Did not receive correct batchBegin events");
90
- assert.strictEqual(batchEnd, 5, "Did not receive correct batchEnd events");
91
- });
92
- it("Message with non batch-related metadata", async () => {
93
- const message = {
94
- clientId: testClientId,
95
- type: MessageType.Operation,
96
- metadata: { foo: 1 },
97
- };
98
- pushOp(message);
99
- await processOps();
100
- // We should have a "batchBegin" and a "batchEnd" event for the batch.
101
- assert.strictEqual(deltaManager.inbound.length, 0, "Did not process all ops");
102
- assert.strictEqual(batchBegin, 1, "Did not receive correct batchBegin event for the batch");
103
- assert.strictEqual(batchEnd, 1, "Did not receive correct batchEnd event for the batch");
104
- });
105
- it("Messages in a single batch", async () => {
106
- const batchBeginMessage = {
107
- clientId: testClientId,
108
- type: MessageType.Operation,
109
- metadata: { batch: true },
110
- };
111
- const batchMessage = {
112
- clientId: testClientId,
113
- type: MessageType.Operation,
114
- };
115
- const batchEndMessage = {
116
- clientId: testClientId,
117
- type: MessageType.Operation,
118
- metadata: { batch: false },
119
- };
120
- // Send a batch with 4 messages.
121
- pushOp(batchBeginMessage);
122
- pushOp(batchMessage);
123
- pushOp(batchMessage);
124
- await processOps();
125
- assert.strictEqual(deltaManager.inbound.length, 3, "Some of partial batch ops were processed");
126
- pushOp(batchEndMessage);
127
- await processOps();
128
- // We should have only received one "batchBegin" and one "batchEnd" event for the batch.
129
- assert.strictEqual(deltaManager.inbound.length, 0, "Did not process all ops");
130
- assert.strictEqual(batchBegin, 1, "Did not receive correct batchBegin event for the batch");
131
- assert.strictEqual(batchEnd, 1, "Did not receive correct batchEnd event for the batch");
132
- });
133
- it("two batches", async () => {
134
- const batchBeginMessage = {
135
- clientId: testClientId,
136
- type: MessageType.Operation,
137
- metadata: { batch: true },
138
- };
139
- const batchMessage = {
140
- clientId: testClientId,
141
- type: MessageType.Operation,
142
- };
143
- const batchEndMessage = {
144
- clientId: testClientId,
145
- type: MessageType.Operation,
146
- metadata: { batch: false },
147
- };
148
- // Pause to not allow ops to be processed while we accumulated them.
149
- await deltaManager.inbound.pause();
150
- // Send a batch with 4 messages.
151
- pushOp(batchBeginMessage);
152
- pushOp(batchMessage);
153
- pushOp(batchMessage);
154
- pushOp(batchEndMessage);
155
- // Add incomplete batch
156
- pushOp(batchBeginMessage);
157
- pushOp(batchMessage);
158
- pushOp(batchMessage);
159
- assert.strictEqual(deltaManager.inbound.length, 7, "none of the batched ops are processed yet");
160
- void deltaManager.inbound.resume();
161
- await processOps();
162
- assert.strictEqual(deltaManager.inbound.length, 3, "none of the second batch ops are processed yet");
163
- assert.strictEqual(batchBegin, 1, "Did not receive correct batchBegin event for the batch");
164
- assert.strictEqual(batchEnd, 1, "Did not receive correct batchEnd event for the batch");
165
- // End the batch - all ops should be processed.
166
- pushOp(batchEndMessage);
167
- await processOps();
168
- assert.strictEqual(deltaManager.inbound.length, 0, "processed all ops");
169
- assert.strictEqual(batchBegin, 2, "Did not receive correct batchBegin event for the batch");
170
- assert.strictEqual(batchEnd, 2, "Did not receive correct batchEnd event for the batch");
171
- });
172
- it("non-batched ops followed by batch", async () => {
173
- const batchBeginMessage = {
174
- clientId: testClientId,
175
- type: MessageType.Operation,
176
- metadata: { batch: true },
177
- };
178
- const batchMessage = {
179
- clientId: testClientId,
180
- type: MessageType.Operation,
181
- };
182
- const batchEndMessage = {
183
- clientId: testClientId,
184
- type: MessageType.Operation,
185
- metadata: { batch: false },
186
- };
187
- // Pause to not allow ops to be processed while we accumulated them.
188
- await deltaManager.inbound.pause();
189
- // Send a batch with 2 messages.
190
- pushOp(batchMessage);
191
- pushOp(batchMessage);
192
- // Add incomplete batch
193
- pushOp(batchBeginMessage);
194
- pushOp(batchMessage);
195
- pushOp(batchMessage);
196
- await processOps();
197
- assert.strictEqual(deltaManager.inbound.length, 5, "none of the batched ops are processed yet");
198
- void deltaManager.inbound.resume();
199
- await processOps();
200
- assert.strictEqual(deltaManager.inbound.length, 3, "none of the second batch ops are processed yet");
201
- // End the batch - all ops should be processed.
202
- pushOp(batchEndMessage);
203
- await processOps();
204
- assert.strictEqual(deltaManager.inbound.length, 0, "processed all ops");
205
- assert.strictEqual(batchBegin, 3, "Did not receive correct batchBegin event for the batch");
206
- assert.strictEqual(batchEnd, 3, "Did not receive correct batchEnd event for the batch");
207
- });
208
- function testWrongBatches() {
209
- const clientId1 = "test-client-1";
210
- const clientId2 = "test-client-2";
211
- const batchBeginMessage = {
212
- clientId: clientId1,
213
- type: MessageType.Operation,
214
- metadata: { batch: true },
215
- };
216
- const batchMessage = {
217
- clientId: clientId1,
218
- type: MessageType.Operation,
219
- };
220
- const messagesToFail = [
221
- // System op from same client
222
- {
223
- clientId: clientId1,
224
- type: MessageType.NoOp,
225
- },
226
- // Batch messages interleaved with a batch begin message from same client
227
- batchBeginMessage,
228
- // Send a message from another client. This should result in a a violation!
229
- {
230
- clientId: clientId2,
231
- type: MessageType.Operation,
232
- },
233
- // Send a message from another client with non batch-related metadata. This should result
234
- // in a "batchEnd" event for the previous batch since the client id changes. Also, we
235
- // should get a "batchBegin" and a "batchEnd" event for the new client.
236
- {
237
- clientId: clientId2,
238
- type: MessageType.Operation,
239
- metadata: { foo: 1 },
240
- },
241
- // Send a batch from another client. This should result in a "batchEnd" event for the
242
- // previous batch since the client id changes. Also, we should get one "batchBegin" and
243
- // one "batchEnd" event for the batch from the new client.
244
- {
245
- clientId: clientId2,
246
- type: MessageType.Operation,
247
- metadata: { batch: true },
248
- },
249
- ];
250
- let counter = 0;
251
- for (const messageToFail of messagesToFail) {
252
- counter++;
253
- it(`Partial batch messages, case ${counter}`, async () => {
254
- // Send a batch with 3 messages from first client but don't send batch end message.
255
- pushOp(batchBeginMessage);
256
- pushOp(batchMessage);
257
- pushOp(batchMessage);
258
- await processOps();
259
- assert.strictEqual(deltaManager.inbound.length, 3, "Some of partial batch ops were processed");
260
- assert.throws(() => pushOp(messageToFail));
261
- assert.strictEqual(deltaManager.inbound.length, 4, "Some of batch ops were processed");
262
- assert.strictEqual(batchBegin, 0, "Did not receive correct batchBegin event for the batch");
263
- assert.strictEqual(batchEnd, 0, "Did not receive correct batchBegin event for the batch");
264
- });
265
- }
266
- }
267
- testWrongBatches();
268
- });
269
- });
270
- //# sourceMappingURL=scheduleManager.spec.js.map