@fluidframework/container-runtime 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.224419

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 (703) hide show
  1. package/.eslintrc.js +19 -29
  2. package/.mocharc.js +12 -0
  3. package/CHANGELOG.md +427 -0
  4. package/README.md +69 -0
  5. package/api-extractor-lint.json +4 -0
  6. package/api-extractor.json +2 -2
  7. package/api-report/container-runtime.api.md +863 -0
  8. package/dist/{batchTracker.js → batchTracker.cjs} +9 -8
  9. package/dist/batchTracker.cjs.map +1 -0
  10. package/dist/batchTracker.d.ts +6 -5
  11. package/dist/batchTracker.d.ts.map +1 -1
  12. package/dist/blobManager.cjs +704 -0
  13. package/dist/blobManager.cjs.map +1 -0
  14. package/dist/blobManager.d.ts +135 -39
  15. package/dist/blobManager.d.ts.map +1 -1
  16. package/dist/connectionTelemetry.cjs +230 -0
  17. package/dist/connectionTelemetry.cjs.map +1 -0
  18. package/dist/connectionTelemetry.d.ts +2 -2
  19. package/dist/connectionTelemetry.d.ts.map +1 -1
  20. package/dist/container-runtime-alpha.d.ts +1677 -0
  21. package/dist/container-runtime-beta.d.ts +250 -0
  22. package/dist/container-runtime-public.d.ts +250 -0
  23. package/dist/container-runtime-untrimmed.d.ts +1792 -0
  24. package/dist/{containerHandleContext.js → containerHandleContext.cjs} +4 -2
  25. package/dist/containerHandleContext.cjs.map +1 -0
  26. package/dist/containerHandleContext.d.ts.map +1 -1
  27. package/dist/containerRuntime.cjs +2531 -0
  28. package/dist/containerRuntime.cjs.map +1 -0
  29. package/dist/containerRuntime.d.ts +454 -256
  30. package/dist/containerRuntime.d.ts.map +1 -1
  31. package/dist/{dataStore.js → dataStore.cjs} +54 -45
  32. package/dist/dataStore.cjs.map +1 -0
  33. package/dist/dataStore.d.ts +2 -2
  34. package/dist/dataStore.d.ts.map +1 -1
  35. package/dist/{dataStoreContext.js → dataStoreContext.cjs} +343 -247
  36. package/dist/dataStoreContext.cjs.map +1 -0
  37. package/dist/dataStoreContext.d.ts +73 -41
  38. package/dist/dataStoreContext.d.ts.map +1 -1
  39. package/dist/{dataStoreContexts.js → dataStoreContexts.cjs} +19 -15
  40. package/dist/dataStoreContexts.cjs.map +1 -0
  41. package/dist/dataStoreContexts.d.ts +1 -1
  42. package/dist/dataStoreContexts.d.ts.map +1 -1
  43. package/dist/{dataStoreRegistry.js → dataStoreRegistry.cjs} +9 -4
  44. package/dist/dataStoreRegistry.cjs.map +1 -0
  45. package/dist/dataStoreRegistry.d.ts +3 -0
  46. package/dist/dataStoreRegistry.d.ts.map +1 -1
  47. package/dist/{dataStores.js → dataStores.cjs} +273 -124
  48. package/dist/dataStores.cjs.map +1 -0
  49. package/dist/dataStores.d.ts +53 -23
  50. package/dist/dataStores.d.ts.map +1 -1
  51. package/dist/deltaManagerProxyBase.cjs +77 -0
  52. package/dist/deltaManagerProxyBase.cjs.map +1 -0
  53. package/dist/deltaManagerProxyBase.d.ts +35 -0
  54. package/dist/deltaManagerProxyBase.d.ts.map +1 -0
  55. package/dist/deltaManagerSummarizerProxy.cjs +42 -0
  56. package/dist/deltaManagerSummarizerProxy.cjs.map +1 -0
  57. package/dist/deltaManagerSummarizerProxy.d.ts +19 -0
  58. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -0
  59. package/dist/{deltaScheduler.js → deltaScheduler.cjs} +25 -18
  60. package/dist/deltaScheduler.cjs.map +1 -0
  61. package/dist/deltaScheduler.d.ts +8 -6
  62. package/dist/deltaScheduler.d.ts.map +1 -1
  63. package/dist/error.cjs +21 -0
  64. package/dist/error.cjs.map +1 -0
  65. package/dist/error.d.ts +14 -0
  66. package/dist/error.d.ts.map +1 -0
  67. package/dist/gc/garbageCollection.cjs +861 -0
  68. package/dist/gc/garbageCollection.cjs.map +1 -0
  69. package/dist/gc/garbageCollection.d.ts +224 -0
  70. package/dist/gc/garbageCollection.d.ts.map +1 -0
  71. package/dist/gc/gcConfigs.cjs +153 -0
  72. package/dist/gc/gcConfigs.cjs.map +1 -0
  73. package/dist/gc/gcConfigs.d.ts +23 -0
  74. package/dist/gc/gcConfigs.d.ts.map +1 -0
  75. package/dist/gc/gcDefinitions.cjs +96 -0
  76. package/dist/gc/gcDefinitions.cjs.map +1 -0
  77. package/dist/gc/gcDefinitions.d.ts +437 -0
  78. package/dist/gc/gcDefinitions.d.ts.map +1 -0
  79. package/dist/gc/gcHelpers.cjs +235 -0
  80. package/dist/gc/gcHelpers.cjs.map +1 -0
  81. package/dist/gc/gcHelpers.d.ts +71 -0
  82. package/dist/gc/gcHelpers.d.ts.map +1 -0
  83. package/dist/gc/gcReferenceGraphAlgorithm.cjs +49 -0
  84. package/dist/gc/gcReferenceGraphAlgorithm.cjs.map +1 -0
  85. package/dist/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
  86. package/dist/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
  87. package/dist/{summarizerTypes.js → gc/gcSummaryDefinitions.cjs} +1 -6
  88. package/dist/gc/gcSummaryDefinitions.cjs.map +1 -0
  89. package/dist/gc/gcSummaryDefinitions.d.ts +52 -0
  90. package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -0
  91. package/dist/gc/gcSummaryStateTracker.cjs +213 -0
  92. package/dist/gc/gcSummaryStateTracker.cjs.map +1 -0
  93. package/dist/gc/gcSummaryStateTracker.d.ts +94 -0
  94. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
  95. package/dist/gc/gcTelemetry.cjs +298 -0
  96. package/dist/gc/gcTelemetry.cjs.map +1 -0
  97. package/dist/gc/gcTelemetry.d.ts +92 -0
  98. package/dist/gc/gcTelemetry.d.ts.map +1 -0
  99. package/dist/gc/gcUnreferencedStateTracker.cjs +118 -0
  100. package/dist/gc/gcUnreferencedStateTracker.cjs.map +1 -0
  101. package/dist/gc/gcUnreferencedStateTracker.d.ts +40 -0
  102. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  103. package/dist/gc/index.cjs +44 -0
  104. package/dist/gc/index.cjs.map +1 -0
  105. package/dist/gc/index.d.ts +13 -0
  106. package/dist/gc/index.d.ts.map +1 -0
  107. package/dist/index.cjs +47 -0
  108. package/dist/index.cjs.map +1 -0
  109. package/dist/index.d.ts +19 -8
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/messageTypes.cjs +37 -0
  112. package/dist/messageTypes.cjs.map +1 -0
  113. package/dist/messageTypes.d.ts +142 -0
  114. package/dist/messageTypes.d.ts.map +1 -0
  115. package/dist/metadata.cjs +7 -0
  116. package/dist/metadata.cjs.map +1 -0
  117. package/dist/metadata.d.ts +24 -0
  118. package/dist/metadata.d.ts.map +1 -0
  119. package/dist/opLifecycle/batchManager.cjs +139 -0
  120. package/dist/opLifecycle/batchManager.cjs.map +1 -0
  121. package/dist/opLifecycle/batchManager.d.ts +48 -0
  122. package/dist/opLifecycle/batchManager.d.ts.map +1 -0
  123. package/dist/opLifecycle/definitions.cjs +7 -0
  124. package/dist/opLifecycle/definitions.cjs.map +1 -0
  125. package/dist/opLifecycle/definitions.d.ts +83 -0
  126. package/dist/opLifecycle/definitions.d.ts.map +1 -0
  127. package/dist/opLifecycle/index.cjs +26 -0
  128. package/dist/opLifecycle/index.cjs.map +1 -0
  129. package/dist/opLifecycle/index.d.ts +13 -0
  130. package/dist/opLifecycle/index.d.ts.map +1 -0
  131. package/dist/opLifecycle/opCompressor.cjs +84 -0
  132. package/dist/opLifecycle/opCompressor.cjs.map +1 -0
  133. package/dist/opLifecycle/opCompressor.d.ts +18 -0
  134. package/dist/opLifecycle/opCompressor.d.ts.map +1 -0
  135. package/dist/opLifecycle/opDecompressor.cjs +132 -0
  136. package/dist/opLifecycle/opDecompressor.cjs.map +1 -0
  137. package/dist/opLifecycle/opDecompressor.d.ts +25 -0
  138. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -0
  139. package/dist/opLifecycle/opGroupingManager.cjs +95 -0
  140. package/dist/opLifecycle/opGroupingManager.cjs.map +1 -0
  141. package/dist/opLifecycle/opGroupingManager.d.ts +22 -0
  142. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -0
  143. package/dist/opLifecycle/opSplitter.cjs +202 -0
  144. package/dist/opLifecycle/opSplitter.cjs.map +1 -0
  145. package/dist/opLifecycle/opSplitter.d.ts +61 -0
  146. package/dist/opLifecycle/opSplitter.d.ts.map +1 -0
  147. package/dist/opLifecycle/outbox.cjs +323 -0
  148. package/dist/opLifecycle/outbox.cjs.map +1 -0
  149. package/dist/opLifecycle/outbox.d.ts +104 -0
  150. package/dist/opLifecycle/outbox.d.ts.map +1 -0
  151. package/dist/opLifecycle/remoteMessageProcessor.cjs +136 -0
  152. package/dist/opLifecycle/remoteMessageProcessor.cjs.map +1 -0
  153. package/dist/opLifecycle/remoteMessageProcessor.d.ts +47 -0
  154. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -0
  155. package/dist/opProperties.cjs +17 -0
  156. package/dist/opProperties.cjs.map +1 -0
  157. package/dist/opProperties.d.ts +7 -0
  158. package/dist/opProperties.d.ts.map +1 -0
  159. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  160. package/dist/packageVersion.cjs.map +1 -0
  161. package/dist/packageVersion.d.ts +1 -1
  162. package/dist/packageVersion.d.ts.map +1 -1
  163. package/dist/pendingStateManager.cjs +282 -0
  164. package/dist/pendingStateManager.cjs.map +1 -0
  165. package/dist/pendingStateManager.d.ts +32 -69
  166. package/dist/pendingStateManager.d.ts.map +1 -1
  167. package/dist/scheduleManager.cjs +258 -0
  168. package/dist/scheduleManager.cjs.map +1 -0
  169. package/dist/scheduleManager.d.ts +31 -0
  170. package/dist/scheduleManager.d.ts.map +1 -0
  171. package/dist/storageServiceWithAttachBlobs.cjs +32 -0
  172. package/dist/storageServiceWithAttachBlobs.cjs.map +1 -0
  173. package/dist/storageServiceWithAttachBlobs.d.ts +17 -0
  174. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -0
  175. package/dist/summary/index.cjs +51 -0
  176. package/dist/summary/index.cjs.map +1 -0
  177. package/dist/summary/index.d.ts +17 -0
  178. package/dist/summary/index.d.ts.map +1 -0
  179. package/dist/{orderedClientElection.js → summary/orderedClientElection.cjs} +100 -84
  180. package/dist/summary/orderedClientElection.cjs.map +1 -0
  181. package/{lib → dist/summary}/orderedClientElection.d.ts +41 -18
  182. package/dist/summary/orderedClientElection.d.ts.map +1 -0
  183. package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.cjs} +12 -10
  184. package/dist/summary/runWhileConnectedCoordinator.cjs.map +1 -0
  185. package/{lib → dist/summary}/runWhileConnectedCoordinator.d.ts +8 -2
  186. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  187. package/dist/summary/runningSummarizer.cjs +679 -0
  188. package/dist/summary/runningSummarizer.cjs.map +1 -0
  189. package/dist/summary/runningSummarizer.d.ts +128 -0
  190. package/dist/summary/runningSummarizer.d.ts.map +1 -0
  191. package/dist/summary/summarizer.cjs +263 -0
  192. package/dist/summary/summarizer.cjs.map +1 -0
  193. package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +18 -33
  194. package/dist/summary/summarizer.d.ts.map +1 -0
  195. package/dist/{summarizerClientElection.js → summary/summarizerClientElection.cjs} +15 -46
  196. package/dist/summary/summarizerClientElection.cjs.map +1 -0
  197. package/{lib → dist/summary}/summarizerClientElection.d.ts +4 -4
  198. package/dist/summary/summarizerClientElection.d.ts.map +1 -0
  199. package/dist/summary/summarizerHeuristics.cjs +156 -0
  200. package/dist/summary/summarizerHeuristics.cjs.map +1 -0
  201. package/{lib → dist/summary}/summarizerHeuristics.d.ts +28 -6
  202. package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
  203. package/dist/summary/summarizerNode/index.cjs +12 -0
  204. package/dist/summary/summarizerNode/index.cjs.map +1 -0
  205. package/dist/summary/summarizerNode/index.d.ts +8 -0
  206. package/dist/summary/summarizerNode/index.d.ts.map +1 -0
  207. package/dist/summary/summarizerNode/summarizerNode.cjs +526 -0
  208. package/dist/summary/summarizerNode/summarizerNode.cjs.map +1 -0
  209. package/dist/summary/summarizerNode/summarizerNode.d.ts +167 -0
  210. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
  211. package/dist/summary/summarizerNode/summarizerNodeUtils.cjs +130 -0
  212. package/dist/summary/summarizerNode/summarizerNodeUtils.cjs.map +1 -0
  213. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +121 -0
  214. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
  215. package/dist/summary/summarizerNode/summarizerNodeWithGc.cjs +375 -0
  216. package/dist/summary/summarizerNode/summarizerNodeWithGc.cjs.map +1 -0
  217. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +153 -0
  218. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
  219. package/dist/summary/summarizerTypes.cjs +7 -0
  220. package/dist/summary/summarizerTypes.cjs.map +1 -0
  221. package/{lib → dist/summary}/summarizerTypes.d.ts +233 -83
  222. package/dist/summary/summarizerTypes.d.ts.map +1 -0
  223. package/dist/{summaryCollection.js → summary/summaryCollection.cjs} +80 -49
  224. package/dist/summary/summaryCollection.cjs.map +1 -0
  225. package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +23 -5
  226. package/dist/summary/summaryCollection.d.ts.map +1 -0
  227. package/dist/{summaryFormat.js → summary/summaryFormat.cjs} +29 -26
  228. package/dist/summary/summaryFormat.cjs.map +1 -0
  229. package/{lib → dist/summary}/summaryFormat.d.ts +25 -30
  230. package/dist/summary/summaryFormat.d.ts.map +1 -0
  231. package/dist/{summaryGenerator.js → summary/summaryGenerator.cjs} +162 -74
  232. package/dist/summary/summaryGenerator.cjs.map +1 -0
  233. package/dist/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +53 -11
  234. package/dist/summary/summaryGenerator.d.ts.map +1 -0
  235. package/dist/{summaryManager.js → summary/summaryManager.cjs} +98 -55
  236. package/dist/summary/summaryManager.cjs.map +1 -0
  237. package/{lib → dist/summary}/summaryManager.d.ts +13 -11
  238. package/dist/summary/summaryManager.d.ts.map +1 -0
  239. package/dist/{throttler.js → throttler.cjs} +21 -21
  240. package/dist/throttler.cjs.map +1 -0
  241. package/dist/throttler.d.ts +2 -2
  242. package/dist/throttler.d.ts.map +1 -1
  243. package/dist/tsdoc-metadata.json +11 -0
  244. package/lib/{batchTracker.d.ts → batchTracker.d.mts} +6 -5
  245. package/lib/batchTracker.d.mts.map +1 -0
  246. package/lib/{batchTracker.js → batchTracker.mjs} +9 -8
  247. package/lib/batchTracker.mjs.map +1 -0
  248. package/lib/blobManager.d.mts +191 -0
  249. package/lib/blobManager.d.mts.map +1 -0
  250. package/lib/blobManager.mjs +699 -0
  251. package/lib/blobManager.mjs.map +1 -0
  252. package/lib/{connectionTelemetry.d.ts → connectionTelemetry.d.mts} +2 -2
  253. package/lib/connectionTelemetry.d.mts.map +1 -0
  254. package/lib/connectionTelemetry.mjs +226 -0
  255. package/lib/connectionTelemetry.mjs.map +1 -0
  256. package/lib/container-runtime-alpha.d.mts +1677 -0
  257. package/lib/container-runtime-beta.d.mts +250 -0
  258. package/lib/container-runtime-public.d.mts +250 -0
  259. package/lib/container-runtime-untrimmed.d.mts +1792 -0
  260. package/lib/{containerHandleContext.d.ts → containerHandleContext.d.mts} +1 -1
  261. package/lib/containerHandleContext.d.mts.map +1 -0
  262. package/lib/{containerHandleContext.js → containerHandleContext.mjs} +4 -2
  263. package/lib/containerHandleContext.mjs.map +1 -0
  264. package/lib/containerRuntime.d.mts +809 -0
  265. package/lib/containerRuntime.d.mts.map +1 -0
  266. package/lib/containerRuntime.mjs +2526 -0
  267. package/lib/containerRuntime.mjs.map +1 -0
  268. package/lib/{dataStore.d.ts → dataStore.d.mts} +4 -4
  269. package/lib/dataStore.d.mts.map +1 -0
  270. package/lib/{dataStore.js → dataStore.mjs} +52 -43
  271. package/lib/dataStore.mjs.map +1 -0
  272. package/lib/{dataStoreContext.d.ts → dataStoreContext.d.mts} +74 -42
  273. package/lib/dataStoreContext.d.mts.map +1 -0
  274. package/lib/{dataStoreContext.js → dataStoreContext.mjs} +309 -213
  275. package/lib/dataStoreContext.mjs.map +1 -0
  276. package/lib/{dataStoreContexts.d.ts → dataStoreContexts.d.mts} +2 -2
  277. package/lib/dataStoreContexts.d.mts.map +1 -0
  278. package/lib/{dataStoreContexts.js → dataStoreContexts.mjs} +12 -8
  279. package/lib/dataStoreContexts.mjs.map +1 -0
  280. package/lib/{dataStoreRegistry.d.ts → dataStoreRegistry.d.mts} +3 -0
  281. package/lib/dataStoreRegistry.d.mts.map +1 -0
  282. package/lib/{dataStoreRegistry.js → dataStoreRegistry.mjs} +7 -6
  283. package/lib/dataStoreRegistry.mjs.map +1 -0
  284. package/lib/{dataStores.d.ts → dataStores.d.mts} +56 -26
  285. package/lib/dataStores.d.mts.map +1 -0
  286. package/lib/{dataStores.js → dataStores.mjs} +254 -105
  287. package/lib/dataStores.mjs.map +1 -0
  288. package/lib/deltaManagerProxyBase.d.mts +35 -0
  289. package/lib/deltaManagerProxyBase.d.mts.map +1 -0
  290. package/lib/deltaManagerProxyBase.mjs +73 -0
  291. package/lib/deltaManagerProxyBase.mjs.map +1 -0
  292. package/lib/deltaManagerSummarizerProxy.d.mts +19 -0
  293. package/lib/deltaManagerSummarizerProxy.d.mts.map +1 -0
  294. package/lib/deltaManagerSummarizerProxy.mjs +38 -0
  295. package/lib/deltaManagerSummarizerProxy.mjs.map +1 -0
  296. package/lib/{deltaScheduler.d.ts → deltaScheduler.d.mts} +8 -6
  297. package/lib/deltaScheduler.d.mts.map +1 -0
  298. package/lib/{deltaScheduler.js → deltaScheduler.mjs} +22 -15
  299. package/lib/deltaScheduler.mjs.map +1 -0
  300. package/lib/error.d.mts +14 -0
  301. package/lib/error.d.mts.map +1 -0
  302. package/lib/error.mjs +17 -0
  303. package/lib/error.mjs.map +1 -0
  304. package/lib/gc/garbageCollection.d.mts +224 -0
  305. package/lib/gc/garbageCollection.d.mts.map +1 -0
  306. package/lib/gc/garbageCollection.mjs +857 -0
  307. package/lib/gc/garbageCollection.mjs.map +1 -0
  308. package/lib/gc/gcConfigs.d.mts +23 -0
  309. package/lib/gc/gcConfigs.d.mts.map +1 -0
  310. package/lib/gc/gcConfigs.mjs +149 -0
  311. package/lib/gc/gcConfigs.mjs.map +1 -0
  312. package/lib/gc/gcDefinitions.d.mts +437 -0
  313. package/lib/gc/gcDefinitions.d.mts.map +1 -0
  314. package/lib/gc/gcDefinitions.mjs +93 -0
  315. package/lib/gc/gcDefinitions.mjs.map +1 -0
  316. package/lib/gc/gcHelpers.d.mts +71 -0
  317. package/lib/gc/gcHelpers.d.mts.map +1 -0
  318. package/lib/gc/gcHelpers.mjs +222 -0
  319. package/lib/gc/gcHelpers.mjs.map +1 -0
  320. package/lib/gc/gcReferenceGraphAlgorithm.d.mts +16 -0
  321. package/lib/gc/gcReferenceGraphAlgorithm.d.mts.map +1 -0
  322. package/lib/gc/gcReferenceGraphAlgorithm.mjs +45 -0
  323. package/lib/gc/gcReferenceGraphAlgorithm.mjs.map +1 -0
  324. package/lib/gc/gcSummaryDefinitions.d.mts +52 -0
  325. package/lib/gc/gcSummaryDefinitions.d.mts.map +1 -0
  326. package/lib/gc/gcSummaryDefinitions.mjs +6 -0
  327. package/lib/gc/gcSummaryDefinitions.mjs.map +1 -0
  328. package/lib/gc/gcSummaryStateTracker.d.mts +94 -0
  329. package/lib/gc/gcSummaryStateTracker.d.mts.map +1 -0
  330. package/lib/gc/gcSummaryStateTracker.mjs +209 -0
  331. package/lib/gc/gcSummaryStateTracker.mjs.map +1 -0
  332. package/lib/gc/gcTelemetry.d.mts +92 -0
  333. package/lib/gc/gcTelemetry.d.mts.map +1 -0
  334. package/lib/gc/gcTelemetry.mjs +293 -0
  335. package/lib/gc/gcTelemetry.mjs.map +1 -0
  336. package/lib/gc/gcUnreferencedStateTracker.d.mts +40 -0
  337. package/lib/gc/gcUnreferencedStateTracker.d.mts.map +1 -0
  338. package/lib/gc/gcUnreferencedStateTracker.mjs +114 -0
  339. package/lib/gc/gcUnreferencedStateTracker.mjs.map +1 -0
  340. package/lib/gc/index.d.mts +13 -0
  341. package/lib/gc/index.d.mts.map +1 -0
  342. package/lib/gc/index.mjs +12 -0
  343. package/lib/gc/index.mjs.map +1 -0
  344. package/lib/index.d.mts +25 -0
  345. package/lib/index.d.mts.map +1 -0
  346. package/lib/index.mjs +24 -0
  347. package/lib/index.mjs.map +1 -0
  348. package/lib/messageTypes.d.mts +142 -0
  349. package/lib/messageTypes.d.mts.map +1 -0
  350. package/lib/messageTypes.mjs +34 -0
  351. package/lib/messageTypes.mjs.map +1 -0
  352. package/lib/metadata.d.mts +24 -0
  353. package/lib/metadata.d.mts.map +1 -0
  354. package/lib/metadata.mjs +6 -0
  355. package/lib/metadata.mjs.map +1 -0
  356. package/lib/opLifecycle/batchManager.d.mts +48 -0
  357. package/lib/opLifecycle/batchManager.d.mts.map +1 -0
  358. package/lib/opLifecycle/batchManager.mjs +133 -0
  359. package/lib/opLifecycle/batchManager.mjs.map +1 -0
  360. package/lib/opLifecycle/definitions.d.mts +83 -0
  361. package/lib/opLifecycle/definitions.d.mts.map +1 -0
  362. package/lib/opLifecycle/definitions.mjs +6 -0
  363. package/lib/opLifecycle/definitions.mjs.map +1 -0
  364. package/lib/opLifecycle/index.d.mts +13 -0
  365. package/lib/opLifecycle/index.d.mts.map +1 -0
  366. package/lib/opLifecycle/index.mjs +12 -0
  367. package/lib/opLifecycle/index.mjs.map +1 -0
  368. package/lib/opLifecycle/opCompressor.d.mts +18 -0
  369. package/lib/opLifecycle/opCompressor.d.mts.map +1 -0
  370. package/lib/opLifecycle/opCompressor.mjs +80 -0
  371. package/lib/opLifecycle/opCompressor.mjs.map +1 -0
  372. package/lib/opLifecycle/opDecompressor.d.mts +25 -0
  373. package/lib/opLifecycle/opDecompressor.d.mts.map +1 -0
  374. package/lib/opLifecycle/opDecompressor.mjs +128 -0
  375. package/lib/opLifecycle/opDecompressor.mjs.map +1 -0
  376. package/lib/opLifecycle/opGroupingManager.d.mts +22 -0
  377. package/lib/opLifecycle/opGroupingManager.d.mts.map +1 -0
  378. package/lib/opLifecycle/opGroupingManager.mjs +91 -0
  379. package/lib/opLifecycle/opGroupingManager.mjs.map +1 -0
  380. package/lib/opLifecycle/opSplitter.d.mts +61 -0
  381. package/lib/opLifecycle/opSplitter.d.mts.map +1 -0
  382. package/lib/opLifecycle/opSplitter.mjs +197 -0
  383. package/lib/opLifecycle/opSplitter.mjs.map +1 -0
  384. package/lib/opLifecycle/outbox.d.mts +104 -0
  385. package/lib/opLifecycle/outbox.d.mts.map +1 -0
  386. package/lib/opLifecycle/outbox.mjs +318 -0
  387. package/lib/opLifecycle/outbox.mjs.map +1 -0
  388. package/lib/opLifecycle/remoteMessageProcessor.d.mts +47 -0
  389. package/lib/opLifecycle/remoteMessageProcessor.d.mts.map +1 -0
  390. package/lib/opLifecycle/remoteMessageProcessor.mjs +131 -0
  391. package/lib/opLifecycle/remoteMessageProcessor.mjs.map +1 -0
  392. package/lib/opProperties.d.mts +7 -0
  393. package/lib/opProperties.d.mts.map +1 -0
  394. package/lib/opProperties.mjs +13 -0
  395. package/lib/opProperties.mjs.map +1 -0
  396. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +1 -1
  397. package/lib/{packageVersion.d.ts.map → packageVersion.d.mts.map} +1 -1
  398. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  399. package/lib/packageVersion.mjs.map +1 -0
  400. package/lib/{pendingStateManager.d.ts → pendingStateManager.d.mts} +32 -69
  401. package/lib/pendingStateManager.d.mts.map +1 -0
  402. package/lib/pendingStateManager.mjs +275 -0
  403. package/lib/pendingStateManager.mjs.map +1 -0
  404. package/lib/scheduleManager.d.mts +27 -0
  405. package/lib/scheduleManager.d.mts.map +1 -0
  406. package/lib/scheduleManager.mjs +254 -0
  407. package/lib/scheduleManager.mjs.map +1 -0
  408. package/lib/storageServiceWithAttachBlobs.d.mts +17 -0
  409. package/lib/storageServiceWithAttachBlobs.d.mts.map +1 -0
  410. package/lib/storageServiceWithAttachBlobs.mjs +28 -0
  411. package/lib/storageServiceWithAttachBlobs.mjs.map +1 -0
  412. package/lib/summary/index.d.mts +17 -0
  413. package/lib/summary/index.d.mts.map +1 -0
  414. package/lib/summary/index.mjs +16 -0
  415. package/lib/summary/index.mjs.map +1 -0
  416. package/{dist/orderedClientElection.d.ts → lib/summary/orderedClientElection.d.mts} +41 -22
  417. package/lib/summary/orderedClientElection.d.mts.map +1 -0
  418. package/lib/{orderedClientElection.js → summary/orderedClientElection.mjs} +95 -79
  419. package/lib/summary/orderedClientElection.mjs.map +1 -0
  420. package/{dist/runWhileConnectedCoordinator.d.ts → lib/summary/runWhileConnectedCoordinator.d.mts} +9 -3
  421. package/lib/summary/runWhileConnectedCoordinator.d.mts.map +1 -0
  422. package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.mjs} +12 -10
  423. package/lib/summary/runWhileConnectedCoordinator.mjs.map +1 -0
  424. package/lib/summary/runningSummarizer.d.mts +128 -0
  425. package/lib/summary/runningSummarizer.d.mts.map +1 -0
  426. package/lib/summary/runningSummarizer.mjs +675 -0
  427. package/lib/summary/runningSummarizer.mjs.map +1 -0
  428. package/lib/{summarizer.d.ts → summary/summarizer.d.mts} +20 -35
  429. package/lib/summary/summarizer.d.mts.map +1 -0
  430. package/lib/summary/summarizer.mjs +257 -0
  431. package/lib/summary/summarizer.mjs.map +1 -0
  432. package/{dist/summarizerClientElection.d.ts → lib/summary/summarizerClientElection.d.mts} +6 -6
  433. package/lib/summary/summarizerClientElection.d.mts.map +1 -0
  434. package/lib/{summarizerClientElection.js → summary/summarizerClientElection.mjs} +14 -45
  435. package/lib/summary/summarizerClientElection.mjs.map +1 -0
  436. package/{dist/summarizerHeuristics.d.ts → lib/summary/summarizerHeuristics.d.mts} +29 -7
  437. package/lib/summary/summarizerHeuristics.d.mts.map +1 -0
  438. package/lib/summary/summarizerHeuristics.mjs +151 -0
  439. package/lib/summary/summarizerHeuristics.mjs.map +1 -0
  440. package/lib/summary/summarizerNode/index.d.mts +8 -0
  441. package/lib/summary/summarizerNode/index.d.mts.map +1 -0
  442. package/lib/summary/summarizerNode/index.mjs +7 -0
  443. package/lib/summary/summarizerNode/index.mjs.map +1 -0
  444. package/lib/summary/summarizerNode/summarizerNode.d.mts +167 -0
  445. package/lib/summary/summarizerNode/summarizerNode.d.mts.map +1 -0
  446. package/lib/summary/summarizerNode/summarizerNode.mjs +521 -0
  447. package/lib/summary/summarizerNode/summarizerNode.mjs.map +1 -0
  448. package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts +121 -0
  449. package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts.map +1 -0
  450. package/lib/summary/summarizerNode/summarizerNodeUtils.mjs +123 -0
  451. package/lib/summary/summarizerNode/summarizerNodeUtils.mjs.map +1 -0
  452. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts +153 -0
  453. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts.map +1 -0
  454. package/lib/summary/summarizerNode/summarizerNodeWithGc.mjs +370 -0
  455. package/lib/summary/summarizerNode/summarizerNodeWithGc.mjs.map +1 -0
  456. package/{dist/summarizerTypes.d.ts → lib/summary/summarizerTypes.d.mts} +234 -84
  457. package/lib/summary/summarizerTypes.d.mts.map +1 -0
  458. package/lib/summary/summarizerTypes.mjs +6 -0
  459. package/lib/summary/summarizerTypes.mjs.map +1 -0
  460. package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.mts} +23 -5
  461. package/lib/summary/summaryCollection.d.mts.map +1 -0
  462. package/lib/{summaryCollection.js → summary/summaryCollection.mjs} +76 -45
  463. package/lib/summary/summaryCollection.mjs.map +1 -0
  464. package/{dist/summaryFormat.d.ts → lib/summary/summaryFormat.d.mts} +25 -30
  465. package/lib/summary/summaryFormat.d.mts.map +1 -0
  466. package/lib/{summaryFormat.js → summary/summaryFormat.mjs} +30 -26
  467. package/lib/summary/summaryFormat.mjs.map +1 -0
  468. package/lib/summary/summaryGenerator.d.mts +127 -0
  469. package/lib/summary/summaryGenerator.d.mts.map +1 -0
  470. package/lib/{summaryGenerator.js → summary/summaryGenerator.mjs} +153 -67
  471. package/lib/summary/summaryGenerator.mjs.map +1 -0
  472. package/{dist/summaryManager.d.ts → lib/summary/summaryManager.d.mts} +15 -13
  473. package/lib/summary/summaryManager.d.mts.map +1 -0
  474. package/lib/{summaryManager.js → summary/summaryManager.mjs} +94 -51
  475. package/lib/summary/summaryManager.mjs.map +1 -0
  476. package/lib/{throttler.d.ts → throttler.d.mts} +2 -2
  477. package/lib/throttler.d.mts.map +1 -0
  478. package/lib/{throttler.js → throttler.mjs} +21 -21
  479. package/lib/throttler.mjs.map +1 -0
  480. package/package.json +173 -72
  481. package/prettier.config.cjs +8 -0
  482. package/src/batchTracker.ts +59 -54
  483. package/src/blobManager.ts +937 -294
  484. package/src/connectionTelemetry.ts +342 -252
  485. package/src/containerHandleContext.ts +27 -29
  486. package/src/containerRuntime.ts +3879 -3143
  487. package/src/dataStore.ts +170 -140
  488. package/src/dataStoreContext.ts +1166 -986
  489. package/src/dataStoreContexts.ts +176 -163
  490. package/src/dataStoreRegistry.ts +29 -21
  491. package/src/dataStores.ts +921 -678
  492. package/src/deltaManagerProxyBase.ts +111 -0
  493. package/src/deltaManagerSummarizerProxy.ts +49 -0
  494. package/src/deltaScheduler.ts +161 -156
  495. package/src/error.ts +21 -0
  496. package/src/gc/garbageCollection.md +106 -0
  497. package/src/gc/garbageCollection.ts +1153 -0
  498. package/src/gc/gcConfigs.ts +216 -0
  499. package/src/gc/gcDefinitions.ts +502 -0
  500. package/src/gc/gcHelpers.ts +284 -0
  501. package/src/gc/gcReferenceGraphAlgorithm.ts +52 -0
  502. package/src/gc/gcSummaryDefinitions.ts +54 -0
  503. package/src/gc/gcSummaryStateTracker.ts +299 -0
  504. package/src/gc/gcTelemetry.ts +423 -0
  505. package/src/gc/gcUnreferencedStateTracker.ts +153 -0
  506. package/src/gc/index.ts +59 -0
  507. package/src/index.ts +101 -74
  508. package/src/messageTypes.ts +238 -0
  509. package/src/metadata.ts +26 -0
  510. package/src/opLifecycle/README.md +321 -0
  511. package/src/opLifecycle/batchManager.ts +179 -0
  512. package/src/opLifecycle/definitions.ts +89 -0
  513. package/src/opLifecycle/index.ts +19 -0
  514. package/src/opLifecycle/opCompressor.ts +99 -0
  515. package/src/opLifecycle/opDecompressor.ts +190 -0
  516. package/src/opLifecycle/opGroupingManager.ts +133 -0
  517. package/src/opLifecycle/opSplitter.ts +279 -0
  518. package/src/opLifecycle/outbox.ts +471 -0
  519. package/src/opLifecycle/remoteMessageProcessor.ts +175 -0
  520. package/src/opProperties.ts +21 -0
  521. package/src/packageVersion.ts +1 -1
  522. package/src/pendingStateManager.ts +396 -465
  523. package/src/scheduleManager.ts +358 -0
  524. package/src/storageServiceWithAttachBlobs.ts +38 -0
  525. package/src/summary/index.ts +109 -0
  526. package/src/summary/orderedClientElection.ts +571 -0
  527. package/src/summary/runWhileConnectedCoordinator.ts +117 -0
  528. package/src/summary/runningSummarizer.ts +920 -0
  529. package/src/summary/summarizer.ts +352 -0
  530. package/src/summary/summarizerClientElection.ts +140 -0
  531. package/src/summary/summarizerHeuristics.ts +227 -0
  532. package/src/summary/summarizerNode/index.ts +12 -0
  533. package/src/summary/summarizerNode/summarizerNode.ts +725 -0
  534. package/src/summary/summarizerNode/summarizerNodeUtils.ts +206 -0
  535. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +571 -0
  536. package/src/summary/summarizerTypes.ts +631 -0
  537. package/src/summary/summaryCollection.ts +474 -0
  538. package/src/summary/summaryFormat.ts +249 -0
  539. package/src/summary/summaryGenerator.ts +539 -0
  540. package/src/summary/summaryManager.ts +452 -0
  541. package/src/throttler.ts +131 -122
  542. package/tsc-multi.test.json +4 -0
  543. package/tsconfig.json +11 -13
  544. package/dist/batchTracker.js.map +0 -1
  545. package/dist/blobManager.js +0 -249
  546. package/dist/blobManager.js.map +0 -1
  547. package/dist/connectionTelemetry.js +0 -178
  548. package/dist/connectionTelemetry.js.map +0 -1
  549. package/dist/containerHandleContext.js.map +0 -1
  550. package/dist/containerRuntime.js +0 -2174
  551. package/dist/containerRuntime.js.map +0 -1
  552. package/dist/dataStore.js.map +0 -1
  553. package/dist/dataStoreContext.js.map +0 -1
  554. package/dist/dataStoreContexts.js.map +0 -1
  555. package/dist/dataStoreRegistry.js.map +0 -1
  556. package/dist/dataStores.js.map +0 -1
  557. package/dist/deltaScheduler.js.map +0 -1
  558. package/dist/garbageCollection.d.ts +0 -319
  559. package/dist/garbageCollection.d.ts.map +0 -1
  560. package/dist/garbageCollection.js +0 -993
  561. package/dist/garbageCollection.js.map +0 -1
  562. package/dist/index.js +0 -33
  563. package/dist/index.js.map +0 -1
  564. package/dist/opTelemetry.d.ts +0 -22
  565. package/dist/opTelemetry.d.ts.map +0 -1
  566. package/dist/opTelemetry.js +0 -60
  567. package/dist/opTelemetry.js.map +0 -1
  568. package/dist/orderedClientElection.d.ts.map +0 -1
  569. package/dist/orderedClientElection.js.map +0 -1
  570. package/dist/packageVersion.js.map +0 -1
  571. package/dist/pendingStateManager.js +0 -346
  572. package/dist/pendingStateManager.js.map +0 -1
  573. package/dist/runWhileConnectedCoordinator.d.ts.map +0 -1
  574. package/dist/runWhileConnectedCoordinator.js.map +0 -1
  575. package/dist/runningSummarizer.d.ts +0 -93
  576. package/dist/runningSummarizer.d.ts.map +0 -1
  577. package/dist/runningSummarizer.js +0 -384
  578. package/dist/runningSummarizer.js.map +0 -1
  579. package/dist/serializedSnapshotStorage.d.ts +0 -58
  580. package/dist/serializedSnapshotStorage.d.ts.map +0 -1
  581. package/dist/serializedSnapshotStorage.js +0 -108
  582. package/dist/serializedSnapshotStorage.js.map +0 -1
  583. package/dist/summarizer.d.ts.map +0 -1
  584. package/dist/summarizer.js +0 -348
  585. package/dist/summarizer.js.map +0 -1
  586. package/dist/summarizerClientElection.d.ts.map +0 -1
  587. package/dist/summarizerClientElection.js.map +0 -1
  588. package/dist/summarizerHandle.d.ts +0 -12
  589. package/dist/summarizerHandle.d.ts.map +0 -1
  590. package/dist/summarizerHandle.js +0 -22
  591. package/dist/summarizerHandle.js.map +0 -1
  592. package/dist/summarizerHeuristics.d.ts.map +0 -1
  593. package/dist/summarizerHeuristics.js +0 -84
  594. package/dist/summarizerHeuristics.js.map +0 -1
  595. package/dist/summarizerTypes.d.ts.map +0 -1
  596. package/dist/summarizerTypes.js.map +0 -1
  597. package/dist/summaryCollection.d.ts.map +0 -1
  598. package/dist/summaryCollection.js.map +0 -1
  599. package/dist/summaryFormat.d.ts.map +0 -1
  600. package/dist/summaryFormat.js.map +0 -1
  601. package/dist/summaryGenerator.d.ts.map +0 -1
  602. package/dist/summaryGenerator.js.map +0 -1
  603. package/dist/summaryManager.d.ts.map +0 -1
  604. package/dist/summaryManager.js.map +0 -1
  605. package/dist/throttler.js.map +0 -1
  606. package/garbageCollection.md +0 -41
  607. package/lib/batchTracker.d.ts.map +0 -1
  608. package/lib/batchTracker.js.map +0 -1
  609. package/lib/blobManager.d.ts +0 -95
  610. package/lib/blobManager.d.ts.map +0 -1
  611. package/lib/blobManager.js +0 -244
  612. package/lib/blobManager.js.map +0 -1
  613. package/lib/connectionTelemetry.d.ts.map +0 -1
  614. package/lib/connectionTelemetry.js +0 -174
  615. package/lib/connectionTelemetry.js.map +0 -1
  616. package/lib/containerHandleContext.d.ts.map +0 -1
  617. package/lib/containerHandleContext.js.map +0 -1
  618. package/lib/containerRuntime.d.ts +0 -615
  619. package/lib/containerRuntime.d.ts.map +0 -1
  620. package/lib/containerRuntime.js +0 -2166
  621. package/lib/containerRuntime.js.map +0 -1
  622. package/lib/dataStore.d.ts.map +0 -1
  623. package/lib/dataStore.js.map +0 -1
  624. package/lib/dataStoreContext.d.ts.map +0 -1
  625. package/lib/dataStoreContext.js.map +0 -1
  626. package/lib/dataStoreContexts.d.ts.map +0 -1
  627. package/lib/dataStoreContexts.js.map +0 -1
  628. package/lib/dataStoreRegistry.d.ts.map +0 -1
  629. package/lib/dataStoreRegistry.js.map +0 -1
  630. package/lib/dataStores.d.ts.map +0 -1
  631. package/lib/dataStores.js.map +0 -1
  632. package/lib/deltaScheduler.d.ts.map +0 -1
  633. package/lib/deltaScheduler.js.map +0 -1
  634. package/lib/garbageCollection.d.ts +0 -319
  635. package/lib/garbageCollection.d.ts.map +0 -1
  636. package/lib/garbageCollection.js +0 -989
  637. package/lib/garbageCollection.js.map +0 -1
  638. package/lib/index.d.ts +0 -14
  639. package/lib/index.d.ts.map +0 -1
  640. package/lib/index.js +0 -13
  641. package/lib/index.js.map +0 -1
  642. package/lib/opTelemetry.d.ts +0 -22
  643. package/lib/opTelemetry.d.ts.map +0 -1
  644. package/lib/opTelemetry.js +0 -56
  645. package/lib/opTelemetry.js.map +0 -1
  646. package/lib/orderedClientElection.d.ts.map +0 -1
  647. package/lib/orderedClientElection.js.map +0 -1
  648. package/lib/packageVersion.js.map +0 -1
  649. package/lib/pendingStateManager.d.ts.map +0 -1
  650. package/lib/pendingStateManager.js +0 -339
  651. package/lib/pendingStateManager.js.map +0 -1
  652. package/lib/runWhileConnectedCoordinator.d.ts.map +0 -1
  653. package/lib/runWhileConnectedCoordinator.js.map +0 -1
  654. package/lib/runningSummarizer.d.ts +0 -93
  655. package/lib/runningSummarizer.d.ts.map +0 -1
  656. package/lib/runningSummarizer.js +0 -380
  657. package/lib/runningSummarizer.js.map +0 -1
  658. package/lib/serializedSnapshotStorage.d.ts +0 -58
  659. package/lib/serializedSnapshotStorage.d.ts.map +0 -1
  660. package/lib/serializedSnapshotStorage.js +0 -104
  661. package/lib/serializedSnapshotStorage.js.map +0 -1
  662. package/lib/summarizer.d.ts.map +0 -1
  663. package/lib/summarizer.js +0 -342
  664. package/lib/summarizer.js.map +0 -1
  665. package/lib/summarizerClientElection.d.ts.map +0 -1
  666. package/lib/summarizerClientElection.js.map +0 -1
  667. package/lib/summarizerHandle.d.ts +0 -12
  668. package/lib/summarizerHandle.d.ts.map +0 -1
  669. package/lib/summarizerHandle.js +0 -18
  670. package/lib/summarizerHandle.js.map +0 -1
  671. package/lib/summarizerHeuristics.d.ts.map +0 -1
  672. package/lib/summarizerHeuristics.js +0 -79
  673. package/lib/summarizerHeuristics.js.map +0 -1
  674. package/lib/summarizerTypes.d.ts.map +0 -1
  675. package/lib/summarizerTypes.js +0 -9
  676. package/lib/summarizerTypes.js.map +0 -1
  677. package/lib/summaryCollection.d.ts.map +0 -1
  678. package/lib/summaryCollection.js.map +0 -1
  679. package/lib/summaryFormat.d.ts.map +0 -1
  680. package/lib/summaryFormat.js.map +0 -1
  681. package/lib/summaryGenerator.d.ts +0 -85
  682. package/lib/summaryGenerator.d.ts.map +0 -1
  683. package/lib/summaryGenerator.js.map +0 -1
  684. package/lib/summaryManager.d.ts.map +0 -1
  685. package/lib/summaryManager.js.map +0 -1
  686. package/lib/throttler.d.ts.map +0 -1
  687. package/lib/throttler.js.map +0 -1
  688. package/src/garbageCollection.ts +0 -1434
  689. package/src/opTelemetry.ts +0 -71
  690. package/src/orderedClientElection.ts +0 -511
  691. package/src/runWhileConnectedCoordinator.ts +0 -106
  692. package/src/runningSummarizer.ts +0 -550
  693. package/src/serializedSnapshotStorage.ts +0 -146
  694. package/src/summarizer.ts +0 -438
  695. package/src/summarizerClientElection.ts +0 -161
  696. package/src/summarizerHandle.ts +0 -21
  697. package/src/summarizerHeuristics.ts +0 -108
  698. package/src/summarizerTypes.ts +0 -462
  699. package/src/summaryCollection.ts +0 -406
  700. package/src/summaryFormat.ts +0 -239
  701. package/src/summaryGenerator.ts +0 -427
  702. package/src/summaryManager.ts +0 -368
  703. package/tsconfig.esnext.json +0 -7
@@ -0,0 +1,471 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import {
7
+ createChildMonitoringContext,
8
+ GenericError,
9
+ MonitoringContext,
10
+ UsageError,
11
+ } from "@fluidframework/telemetry-utils";
12
+ import { assert } from "@fluidframework/core-utils";
13
+ import { IBatchMessage, ICriticalContainerError } from "@fluidframework/container-definitions";
14
+ import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
15
+ import { ICompressionRuntimeOptions } from "../containerRuntime";
16
+ import { IPendingBatchMessage, PendingStateManager } from "../pendingStateManager";
17
+ import {
18
+ BatchManager,
19
+ BatchSequenceNumbers,
20
+ estimateSocketSize,
21
+ sequenceNumbersMatch,
22
+ } from "./batchManager";
23
+ import { BatchMessage, IBatch } from "./definitions";
24
+ import { OpCompressor } from "./opCompressor";
25
+ import { OpGroupingManager } from "./opGroupingManager";
26
+ import { OpSplitter } from "./opSplitter";
27
+
28
+ export interface IOutboxConfig {
29
+ readonly compressionOptions: ICompressionRuntimeOptions;
30
+ // The maximum size of a batch that we can send over the wire.
31
+ readonly maxBatchSizeInBytes: number;
32
+ readonly disablePartialFlush: boolean;
33
+ }
34
+
35
+ export interface IOutboxParameters {
36
+ readonly shouldSend: () => boolean;
37
+ readonly pendingStateManager: PendingStateManager;
38
+ readonly submitBatchFn:
39
+ | ((batch: IBatchMessage[], referenceSequenceNumber?: number) => number)
40
+ | undefined;
41
+ readonly legacySendBatchFn: (batch: IBatch) => void;
42
+ readonly config: IOutboxConfig;
43
+ readonly compressor: OpCompressor;
44
+ readonly splitter: OpSplitter;
45
+ readonly logger: ITelemetryBaseLogger;
46
+ readonly groupingManager: OpGroupingManager;
47
+ readonly getCurrentSequenceNumbers: () => BatchSequenceNumbers;
48
+ readonly reSubmit: (message: IPendingBatchMessage) => void;
49
+ readonly opReentrancy: () => boolean;
50
+ readonly closeContainer: (error?: ICriticalContainerError) => void;
51
+ }
52
+
53
+ /**
54
+ * Temporarily increase the stack limit while executing the provided action.
55
+ * If a negative value is provided for `length`, no stack frames will be collected.
56
+ * If Infinity is provided, all frames will be collected.
57
+ *
58
+ * ADO:4663 - add this to the common packages.
59
+ *
60
+ * @param action - action which returns an error
61
+ * @param length - number of stack frames to collect, 50 if unspecified.
62
+ * @returns the result of the action provided
63
+ */
64
+ export function getLongStack<T>(action: () => T, length: number = 50): T {
65
+ const errorObj = Error as any;
66
+ if (
67
+ /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */
68
+ // ?? is not logically equivalent when the first clause returns false.
69
+ (
70
+ Object.getOwnPropertyDescriptor(errorObj, "stackTraceLimit") ||
71
+ Object.getOwnPropertyDescriptor(Object.getPrototypeOf(errorObj), "stackTraceLimit")
72
+ )?.writable !== true
73
+ /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */
74
+ ) {
75
+ return action();
76
+ }
77
+
78
+ const originalStackTraceLimit = errorObj.stackTraceLimit;
79
+ try {
80
+ errorObj.stackTraceLimit = length;
81
+ return action();
82
+ } finally {
83
+ errorObj.stackTraceLimit = originalStackTraceLimit;
84
+ }
85
+ }
86
+
87
+ export class Outbox {
88
+ private readonly mc: MonitoringContext;
89
+ private readonly attachFlowBatch: BatchManager;
90
+ private readonly mainBatch: BatchManager;
91
+ private readonly blobAttachBatch: BatchManager;
92
+ private readonly idAllocationBatch: BatchManager;
93
+ private readonly defaultAttachFlowSoftLimitInBytes = 320 * 1024;
94
+ private batchRebasesToReport = 5;
95
+ private rebasing = false;
96
+
97
+ /**
98
+ * Track the number of ops which were detected to have a mismatched
99
+ * reference sequence number, in order to self-throttle the telemetry events.
100
+ *
101
+ * This should be removed as part of ADO:2322
102
+ */
103
+ private readonly maxMismatchedOpsToReport = 3;
104
+ private mismatchedOpsReported = 0;
105
+
106
+ constructor(private readonly params: IOutboxParameters) {
107
+ this.mc = createChildMonitoringContext({ logger: params.logger, namespace: "Outbox" });
108
+ const isCompressionEnabled =
109
+ this.params.config.compressionOptions.minimumBatchSizeInBytes !==
110
+ Number.POSITIVE_INFINITY;
111
+ // We need to allow infinite size batches if we enable compression
112
+ const hardLimit = isCompressionEnabled ? Infinity : this.params.config.maxBatchSizeInBytes;
113
+ const softLimit = isCompressionEnabled ? Infinity : this.defaultAttachFlowSoftLimitInBytes;
114
+
115
+ this.attachFlowBatch = new BatchManager({ hardLimit, softLimit });
116
+ this.mainBatch = new BatchManager({ hardLimit });
117
+ this.blobAttachBatch = new BatchManager({ hardLimit });
118
+ this.idAllocationBatch = new BatchManager({ hardLimit });
119
+ }
120
+
121
+ public get messageCount(): number {
122
+ return this.attachFlowBatch.length + this.mainBatch.length + this.blobAttachBatch.length;
123
+ }
124
+
125
+ public get isEmpty(): boolean {
126
+ return this.messageCount === 0;
127
+ }
128
+
129
+ /**
130
+ * If we detect that the reference sequence number of the incoming message does not match
131
+ * what was already in the batch managers, this means that batching has been interrupted so
132
+ * we will flush the accumulated messages to account for that and create a new batch with the new
133
+ * message as the first message.
134
+ */
135
+ private maybeFlushPartialBatch() {
136
+ const mainBatchSeqNums = this.mainBatch.sequenceNumbers;
137
+ const attachFlowBatchSeqNums = this.attachFlowBatch.sequenceNumbers;
138
+ const blobAttachSeqNums = this.blobAttachBatch.sequenceNumbers;
139
+ assert(
140
+ this.params.config.disablePartialFlush ||
141
+ (sequenceNumbersMatch(mainBatchSeqNums, attachFlowBatchSeqNums) &&
142
+ sequenceNumbersMatch(mainBatchSeqNums, blobAttachSeqNums)),
143
+ 0x58d /* Reference sequence numbers from both batches must be in sync */,
144
+ );
145
+
146
+ const currentSequenceNumbers = this.params.getCurrentSequenceNumbers();
147
+
148
+ if (
149
+ sequenceNumbersMatch(mainBatchSeqNums, currentSequenceNumbers) &&
150
+ sequenceNumbersMatch(attachFlowBatchSeqNums, currentSequenceNumbers) &&
151
+ sequenceNumbersMatch(blobAttachSeqNums, currentSequenceNumbers)
152
+ ) {
153
+ // The reference sequence numbers are stable, there is nothing to do
154
+ return;
155
+ }
156
+
157
+ if (++this.mismatchedOpsReported <= this.maxMismatchedOpsToReport) {
158
+ this.mc.logger.sendTelemetryEvent(
159
+ {
160
+ category: this.params.config.disablePartialFlush ? "error" : "generic",
161
+ eventName: "ReferenceSequenceNumberMismatch",
162
+ mainReferenceSequenceNumber: mainBatchSeqNums.referenceSequenceNumber,
163
+ mainClientSequenceNumber: mainBatchSeqNums.clientSequenceNumber,
164
+ attachReferenceSequenceNumber: attachFlowBatchSeqNums.referenceSequenceNumber,
165
+ attachClientSequenceNumber: attachFlowBatchSeqNums.clientSequenceNumber,
166
+ blobAttachReferenceSequenceNumber: blobAttachSeqNums.referenceSequenceNumber,
167
+ blobAttachClientSequenceNumber: blobAttachSeqNums.clientSequenceNumber,
168
+ currentReferenceSequenceNumber: currentSequenceNumbers.referenceSequenceNumber,
169
+ currentClientSequenceNumber: currentSequenceNumbers.clientSequenceNumber,
170
+ },
171
+ getLongStack(() => new UsageError("Submission of an out of order message")),
172
+ );
173
+ }
174
+
175
+ if (!this.params.config.disablePartialFlush) {
176
+ this.flushAll();
177
+ }
178
+ }
179
+
180
+ public submit(message: BatchMessage) {
181
+ this.maybeFlushPartialBatch();
182
+
183
+ this.addMessageToBatchManager(this.mainBatch, message);
184
+ }
185
+
186
+ public submitAttach(message: BatchMessage) {
187
+ this.maybeFlushPartialBatch();
188
+
189
+ if (
190
+ !this.attachFlowBatch.push(
191
+ message,
192
+ this.isContextReentrant(),
193
+ this.params.getCurrentSequenceNumbers().clientSequenceNumber,
194
+ )
195
+ ) {
196
+ // BatchManager has two limits - soft limit & hard limit. Soft limit is only engaged
197
+ // when queue is not empty.
198
+ // Flush queue & retry. Failure on retry would mean - single message is bigger than hard limit
199
+ this.flushInternal(this.attachFlowBatch);
200
+
201
+ this.addMessageToBatchManager(this.attachFlowBatch, message);
202
+ }
203
+
204
+ // If compression is enabled, we will always successfully receive
205
+ // attach ops and compress then send them at the next JS turn, regardless
206
+ // of the overall size of the accumulated ops in the batch.
207
+ // However, it is more efficient to flush these ops faster, preferably
208
+ // after they reach a size which would benefit from compression.
209
+ if (
210
+ this.attachFlowBatch.contentSizeInBytes >=
211
+ this.params.config.compressionOptions.minimumBatchSizeInBytes
212
+ ) {
213
+ this.flushInternal(this.attachFlowBatch);
214
+ }
215
+ }
216
+
217
+ public submitBlobAttach(message: BatchMessage) {
218
+ this.maybeFlushPartialBatch();
219
+
220
+ this.addMessageToBatchManager(this.blobAttachBatch, message);
221
+
222
+ // If compression is enabled, we will always successfully receive
223
+ // blobAttach ops and compress then send them at the next JS turn, regardless
224
+ // of the overall size of the accumulated ops in the batch.
225
+ // However, it is more efficient to flush these ops faster, preferably
226
+ // after they reach a size which would benefit from compression.
227
+ if (
228
+ this.blobAttachBatch.contentSizeInBytes >=
229
+ this.params.config.compressionOptions.minimumBatchSizeInBytes
230
+ ) {
231
+ this.flushInternal(this.blobAttachBatch);
232
+ }
233
+ }
234
+
235
+ public submitIdAllocation(message: BatchMessage) {
236
+ this.maybeFlushPartialBatch();
237
+
238
+ if (
239
+ !this.idAllocationBatch.push(
240
+ message,
241
+ this.isContextReentrant(),
242
+ this.params.getCurrentSequenceNumbers().clientSequenceNumber,
243
+ )
244
+ ) {
245
+ // BatchManager has two limits - soft limit & hard limit. Soft limit is only engaged
246
+ // when queue is not empty.
247
+ // Flush queue & retry. Failure on retry would mean - single message is bigger than hard limit
248
+ this.flushInternal(this.idAllocationBatch);
249
+
250
+ this.addMessageToBatchManager(this.idAllocationBatch, message);
251
+ }
252
+
253
+ // If compression is enabled, we will always successfully receive
254
+ // attach ops and compress then send them at the next JS turn, regardless
255
+ // of the overall size of the accumulated ops in the batch.
256
+ // However, it is more efficient to flush these ops faster, preferably
257
+ // after they reach a size which would benefit from compression.
258
+ if (
259
+ this.idAllocationBatch.contentSizeInBytes >=
260
+ this.params.config.compressionOptions.minimumBatchSizeInBytes
261
+ ) {
262
+ this.flushInternal(this.idAllocationBatch);
263
+ }
264
+ }
265
+
266
+ private addMessageToBatchManager(batchManager: BatchManager, message: BatchMessage) {
267
+ if (
268
+ !batchManager.push(
269
+ message,
270
+ this.isContextReentrant(),
271
+ this.params.getCurrentSequenceNumbers().clientSequenceNumber,
272
+ )
273
+ ) {
274
+ throw new GenericError("BatchTooLarge", /* error */ undefined, {
275
+ opSize: message.contents?.length ?? 0,
276
+ batchSize: batchManager.contentSizeInBytes,
277
+ count: batchManager.length,
278
+ limit: batchManager.options.hardLimit,
279
+ });
280
+ }
281
+ }
282
+
283
+ public flush() {
284
+ if (this.isContextReentrant()) {
285
+ const error = new UsageError("Flushing is not supported inside DDS event handlers");
286
+ this.params.closeContainer(error);
287
+ throw error;
288
+ }
289
+
290
+ this.flushAll();
291
+ }
292
+
293
+ private flushAll() {
294
+ this.flushInternal(this.idAllocationBatch);
295
+ this.flushInternal(this.attachFlowBatch);
296
+ this.flushInternal(this.blobAttachBatch, true /* disableGroupedBatching */);
297
+ this.flushInternal(this.mainBatch);
298
+ }
299
+
300
+ private flushInternal(batchManager: BatchManager, disableGroupedBatching: boolean = false) {
301
+ if (batchManager.empty) {
302
+ return;
303
+ }
304
+
305
+ const rawBatch = batchManager.popBatch();
306
+ if (
307
+ rawBatch.hasReentrantOps === true &&
308
+ this.params.groupingManager.shouldGroup(rawBatch)
309
+ ) {
310
+ assert(!this.rebasing, 0x6fa /* A rebased batch should never have reentrant ops */);
311
+ // If a batch contains reentrant ops (ops created as a result from processing another op)
312
+ // it needs to be rebased so that we can ensure consistent reference sequence numbers
313
+ // and eventual consistency at the DDS level.
314
+ this.rebase(rawBatch, batchManager);
315
+ return;
316
+ }
317
+
318
+ const processedBatch = this.compressBatch(rawBatch, disableGroupedBatching);
319
+ this.sendBatch(processedBatch);
320
+
321
+ this.persistBatch(rawBatch.content);
322
+ }
323
+
324
+ /**
325
+ * Rebases a batch. All the ops in the batch are resubmitted to the runtime and
326
+ * they will end up back in the same batch manager they were flushed from and subsequently flushed.
327
+ *
328
+ * @param rawBatch - the batch to be rebased
329
+ */
330
+ private rebase(rawBatch: IBatch, batchManager: BatchManager) {
331
+ assert(!this.rebasing, 0x6fb /* Reentrancy */);
332
+
333
+ this.rebasing = true;
334
+ for (const message of rawBatch.content) {
335
+ this.params.reSubmit({
336
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
337
+ content: message.contents!,
338
+ localOpMetadata: message.localOpMetadata,
339
+ opMetadata: message.metadata,
340
+ });
341
+ }
342
+
343
+ if (this.batchRebasesToReport > 0) {
344
+ this.mc.logger.sendTelemetryEvent(
345
+ {
346
+ eventName: "BatchRebase",
347
+ length: rawBatch.content.length,
348
+ referenceSequenceNumber: rawBatch.referenceSequenceNumber,
349
+ },
350
+ new UsageError("BatchRebase"),
351
+ );
352
+ this.batchRebasesToReport--;
353
+ }
354
+
355
+ this.flushInternal(batchManager);
356
+ this.rebasing = false;
357
+ }
358
+
359
+ private isContextReentrant(): boolean {
360
+ return this.params.opReentrancy() && !this.rebasing;
361
+ }
362
+
363
+ private compressBatch(batch: IBatch, disableGroupedBatching: boolean): IBatch {
364
+ if (
365
+ batch.content.length === 0 ||
366
+ this.params.config.compressionOptions === undefined ||
367
+ this.params.config.compressionOptions.minimumBatchSizeInBytes >
368
+ batch.contentSizeInBytes ||
369
+ this.params.submitBatchFn === undefined
370
+ ) {
371
+ // Nothing to do if the batch is empty or if compression is disabled or not supported, or if we don't need to compress
372
+ return disableGroupedBatching ? batch : this.params.groupingManager.groupBatch(batch);
373
+ }
374
+
375
+ const compressedBatch = this.params.compressor.compressBatch(
376
+ disableGroupedBatching ? batch : this.params.groupingManager.groupBatch(batch),
377
+ );
378
+
379
+ if (this.params.splitter.isBatchChunkingEnabled) {
380
+ return compressedBatch.contentSizeInBytes <= this.params.splitter.chunkSizeInBytes
381
+ ? compressedBatch
382
+ : this.params.splitter.splitFirstBatchMessage(compressedBatch);
383
+ }
384
+
385
+ if (compressedBatch.contentSizeInBytes >= this.params.config.maxBatchSizeInBytes) {
386
+ throw new GenericError("BatchTooLarge", /* error */ undefined, {
387
+ batchSize: batch.contentSizeInBytes,
388
+ compressedBatchSize: compressedBatch.contentSizeInBytes,
389
+ count: compressedBatch.content.length,
390
+ limit: this.params.config.maxBatchSizeInBytes,
391
+ chunkingEnabled: this.params.splitter.isBatchChunkingEnabled,
392
+ compressionOptions: JSON.stringify(this.params.config.compressionOptions),
393
+ socketSize: estimateSocketSize(batch),
394
+ });
395
+ }
396
+
397
+ return compressedBatch;
398
+ }
399
+
400
+ /**
401
+ * Sends the batch object to the container context to be sent over the wire.
402
+ *
403
+ * @param batch - batch to be sent
404
+ */
405
+ private sendBatch(batch: IBatch) {
406
+ const length = batch.content.length;
407
+
408
+ // Did we disconnect in the middle of turn-based batch?
409
+ // If so, do nothing, as pending state manager will resubmit it correctly on reconnect.
410
+ if (length === 0 || !this.params.shouldSend()) {
411
+ return;
412
+ }
413
+
414
+ const socketSize = estimateSocketSize(batch);
415
+ if (socketSize >= this.params.config.maxBatchSizeInBytes) {
416
+ this.mc.logger.sendPerformanceEvent({
417
+ eventName: "LargeBatch",
418
+ length: batch.content.length,
419
+ sizeInBytes: batch.contentSizeInBytes,
420
+ socketSize,
421
+ });
422
+ }
423
+
424
+ if (this.params.submitBatchFn === undefined) {
425
+ // Legacy path - supporting old loader versions. Can be removed only when LTS moves above
426
+ // version that has support for batches (submitBatchFn)
427
+ assert(
428
+ batch.content[0].compression === undefined,
429
+ 0x5a6 /* Compression should not have happened if the loader does not support it */,
430
+ );
431
+
432
+ this.params.legacySendBatchFn(batch);
433
+ } else {
434
+ assert(
435
+ batch.referenceSequenceNumber !== undefined,
436
+ 0x58e /* Batch must not be empty */,
437
+ );
438
+ this.params.submitBatchFn(
439
+ batch.content.map((message) => ({
440
+ contents: message.contents,
441
+ metadata: message.metadata,
442
+ compression: message.compression,
443
+ referenceSequenceNumber: message.referenceSequenceNumber,
444
+ })),
445
+ batch.referenceSequenceNumber,
446
+ );
447
+ }
448
+ }
449
+
450
+ private persistBatch(batch: BatchMessage[]) {
451
+ // Let the PendingStateManager know that a message was submitted.
452
+ // In future, need to shift toward keeping batch as a whole!
453
+ for (const message of batch) {
454
+ this.params.pendingStateManager.onSubmitMessage(
455
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
456
+ message.contents!,
457
+ message.referenceSequenceNumber,
458
+ message.localOpMetadata,
459
+ message.metadata,
460
+ );
461
+ }
462
+ }
463
+
464
+ public checkpoint() {
465
+ return {
466
+ mainBatch: this.mainBatch.checkpoint(),
467
+ attachFlowBatch: this.attachFlowBatch.checkpoint(),
468
+ blobAttachBatch: this.blobAttachBatch.checkpoint(),
469
+ };
470
+ }
471
+ }
@@ -0,0 +1,175 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { ISequencedDocumentMessage, MessageType } from "@fluidframework/protocol-definitions";
7
+ import {
8
+ ContainerMessageType,
9
+ type InboundContainerRuntimeMessage,
10
+ type InboundSequencedContainerRuntimeMessage,
11
+ type InboundSequencedContainerRuntimeMessageOrSystemMessage,
12
+ type InboundSequencedRecentlyAddedContainerRuntimeMessage,
13
+ } from "../messageTypes";
14
+ import { OpDecompressor } from "./opDecompressor";
15
+ import { OpGroupingManager } from "./opGroupingManager";
16
+ import { OpSplitter } from "./opSplitter";
17
+
18
+ /**
19
+ * Stateful class for processing incoming remote messages as the virtualization measures are unwrapped,
20
+ * potentially across numerous inbound ops.
21
+ *
22
+ * @internal
23
+ */
24
+ export class RemoteMessageProcessor {
25
+ constructor(
26
+ private readonly opSplitter: OpSplitter,
27
+ private readonly opDecompressor: OpDecompressor,
28
+ private readonly opGroupingManager: OpGroupingManager,
29
+ ) {}
30
+
31
+ public get partialMessages(): ReadonlyMap<string, string[]> {
32
+ return this.opSplitter.chunks;
33
+ }
34
+
35
+ public clearPartialMessagesFor(clientId: string) {
36
+ this.opSplitter.clearPartialChunks(clientId);
37
+ }
38
+
39
+ /**
40
+ * Ungroups and Unchunks the runtime ops encapsulated by the single remoteMessage received over the wire
41
+ * @param remoteMessageCopy - A shallow copy of a message from another client, possibly virtualized
42
+ * (grouped, compressed, and/or chunked).
43
+ * Being a shallow copy, it's considered mutable, meaning no other Container or other parallel procedure
44
+ * depends on this object instance.
45
+ * Note remoteMessageCopy.contents (and other object props) MUST not be modified,
46
+ * but may be overwritten (as is the case with contents).
47
+ * @returns the unchunked, decompressed, ungrouped, unpacked SequencedContainerRuntimeMessages encapsulated in the remote message.
48
+ * For ops that weren't virtualized (e.g. System ops that the ContainerRuntime will ultimately ignore),
49
+ * a singleton array [remoteMessageCopy] is returned
50
+ */
51
+ public process(
52
+ remoteMessageCopy: ISequencedDocumentMessage,
53
+ ): InboundSequencedContainerRuntimeMessageOrSystemMessage[] {
54
+ const result: InboundSequencedContainerRuntimeMessageOrSystemMessage[] = [];
55
+
56
+ ensureContentsDeserialized(remoteMessageCopy);
57
+
58
+ // Ungroup before and after decompression for back-compat (cleanup tracked by AB#4371)
59
+ for (const ungroupedMessage of this.opGroupingManager.ungroupOp(remoteMessageCopy)) {
60
+ const message = this.opDecompressor.processMessage(ungroupedMessage).message;
61
+
62
+ for (let ungroupedMessage2 of this.opGroupingManager.ungroupOp(message)) {
63
+ // unpack and unchunk the ungrouped message in place
64
+ unpackRuntimeMessage(ungroupedMessage2);
65
+ const chunkProcessingResult =
66
+ this.opSplitter.processRemoteMessage(ungroupedMessage2);
67
+ ungroupedMessage2 = chunkProcessingResult.message;
68
+
69
+ if (chunkProcessingResult.state !== "Processed") {
70
+ // If the message is not chunked or if the splitter is still rebuilding the original message,
71
+ // there is no need to continue processing
72
+ result.push(
73
+ ungroupedMessage2 as InboundSequencedContainerRuntimeMessageOrSystemMessage,
74
+ );
75
+ continue;
76
+ }
77
+
78
+ // Ungroup before and after decompression for back-compat (cleanup tracked by AB#4371)
79
+ for (const ungroupedMessageAfterChunking of this.opGroupingManager.ungroupOp(
80
+ ungroupedMessage2,
81
+ )) {
82
+ const decompressionAfterChunking = this.opDecompressor.processMessage(
83
+ ungroupedMessageAfterChunking,
84
+ );
85
+
86
+ for (const ungroupedMessageAfterChunking2 of this.opGroupingManager.ungroupOp(
87
+ decompressionAfterChunking.message,
88
+ )) {
89
+ if (decompressionAfterChunking.state === "Skipped") {
90
+ // After chunking, if the original message was not compressed,
91
+ // there is no need to continue processing
92
+ result.push(
93
+ ungroupedMessageAfterChunking2 as InboundSequencedContainerRuntimeMessageOrSystemMessage,
94
+ );
95
+ continue;
96
+ }
97
+
98
+ // The message needs to be unpacked after chunking + decompression
99
+ unpack(ungroupedMessageAfterChunking2);
100
+ result.push(ungroupedMessageAfterChunking2);
101
+ }
102
+ }
103
+ }
104
+ }
105
+
106
+ return result;
107
+ }
108
+ }
109
+
110
+ /** Takes an incoming message and if the contents is a string, JSON.parse's it in place */
111
+ function ensureContentsDeserialized(mutableMessage: ISequencedDocumentMessage): void {
112
+ // back-compat: ADO #1385: eventually should become unconditional, but only for runtime messages!
113
+ // System message may have no contents, or in some cases (mostly for back-compat) they may have actual objects.
114
+ // Old ops may contain empty string (I assume noops).
115
+ if (typeof mutableMessage.contents === "string" && mutableMessage.contents !== "") {
116
+ mutableMessage.contents = JSON.parse(mutableMessage.contents);
117
+ }
118
+ }
119
+
120
+ /**
121
+ * For a given message, it moves the nested InboundContainerRuntimeMessage props one level up.
122
+ *
123
+ * The return type illustrates the assumption that the message param
124
+ * becomes a InboundSequencedContainerRuntimeMessage by the time the function returns
125
+ * (but there is no runtime validation of the 'type' or 'compatDetails' values).
126
+ */
127
+ function unpack(
128
+ message: ISequencedDocumentMessage,
129
+ ): asserts message is InboundSequencedContainerRuntimeMessage {
130
+ // We assume the contents is an InboundContainerRuntimeMessage (the message is "packed")
131
+ const contents = message.contents as InboundContainerRuntimeMessage;
132
+
133
+ // We're going to unpack message in-place (promoting those properties of contents up to message itself)
134
+ const messageUnpacked = message as InboundSequencedContainerRuntimeMessage;
135
+
136
+ messageUnpacked.type = contents.type;
137
+ messageUnpacked.contents = contents.contents;
138
+ if ("compatDetails" in contents) {
139
+ (messageUnpacked as InboundSequencedRecentlyAddedContainerRuntimeMessage).compatDetails =
140
+ contents.compatDetails;
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Unpacks runtime messages.
146
+ *
147
+ * @remarks This API makes no promises regarding backward-compatibility. This is internal API.
148
+ * @param message - message (as it observed in storage / service)
149
+ * @returns whether the given message was unpacked
150
+ *
151
+ * @internal
152
+ */
153
+ export function unpackRuntimeMessage(message: ISequencedDocumentMessage): boolean {
154
+ if (message.type !== MessageType.Operation) {
155
+ // Legacy format, but it's already "unpacked",
156
+ // i.e. message.type is actually ContainerMessageType.
157
+ // Or it's non-runtime message.
158
+ // Nothing to do in such case.
159
+ return false;
160
+ }
161
+
162
+ // legacy op format?
163
+ // TODO: Unsure if this is a real format we should be concerned with. There doesn't appear to be anything prepared to handle the address member.
164
+ if (
165
+ (message.contents as { address?: unknown }).address !== undefined &&
166
+ (message.contents as { type?: unknown }).type === undefined
167
+ ) {
168
+ message.type = ContainerMessageType.FluidDataStoreOp;
169
+ } else {
170
+ // new format
171
+ unpack(message);
172
+ }
173
+
174
+ return true;
175
+ }
@@ -0,0 +1,21 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import {
7
+ ISequencedDocumentMessage,
8
+ ISequencedDocumentSystemMessage,
9
+ } from "@fluidframework/protocol-definitions";
10
+
11
+ export const opSize = (op: ISequencedDocumentMessage): number => {
12
+ // Some messages may already have string contents,
13
+ // so stringifying them again will add inaccurate overhead.
14
+ const content =
15
+ typeof op.contents === "string" ? op.contents : JSON.stringify(op.contents) ?? "";
16
+ const data = opHasData(op) ? op.data : "";
17
+ return content.length + data.length;
18
+ };
19
+
20
+ const opHasData = (op: ISequencedDocumentMessage): op is ISequencedDocumentSystemMessage =>
21
+ (op as ISequencedDocumentSystemMessage).data !== undefined;
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/container-runtime";
9
- export const pkgVersion = "1.4.0-121020";
9
+ export const pkgVersion = "2.0.0-dev-rc.1.0.0.224419";