@fluidframework/container-runtime 2.20.0 → 2.21.0

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 (333) hide show
  1. package/.eslintrc.cjs +36 -6
  2. package/CHANGELOG.md +38 -0
  3. package/api-report/container-runtime.legacy.alpha.api.md +31 -31
  4. package/dist/batchTracker.d.ts +1 -2
  5. package/dist/batchTracker.d.ts.map +1 -1
  6. package/dist/batchTracker.js +1 -1
  7. package/dist/batchTracker.js.map +1 -1
  8. package/dist/blobManager/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager/blobManager.js +14 -11
  10. package/dist/blobManager/blobManager.js.map +1 -1
  11. package/dist/blobManager/blobManagerSnapSum.d.ts +1 -0
  12. package/dist/blobManager/blobManagerSnapSum.d.ts.map +1 -1
  13. package/dist/blobManager/blobManagerSnapSum.js +7 -5
  14. package/dist/blobManager/blobManagerSnapSum.js.map +1 -1
  15. package/dist/channelCollection.d.ts.map +1 -1
  16. package/dist/channelCollection.js +63 -41
  17. package/dist/channelCollection.js.map +1 -1
  18. package/dist/connectionTelemetry.d.ts +2 -2
  19. package/dist/connectionTelemetry.d.ts.map +1 -1
  20. package/dist/connectionTelemetry.js +4 -4
  21. package/dist/connectionTelemetry.js.map +1 -1
  22. package/dist/containerRuntime.d.ts +14 -30
  23. package/dist/containerRuntime.d.ts.map +1 -1
  24. package/dist/containerRuntime.js +264 -194
  25. package/dist/containerRuntime.js.map +1 -1
  26. package/dist/dataStore.js +6 -3
  27. package/dist/dataStore.js.map +1 -1
  28. package/dist/dataStoreContext.d.ts.map +1 -1
  29. package/dist/dataStoreContext.js +16 -11
  30. package/dist/dataStoreContext.js.map +1 -1
  31. package/dist/dataStoreContexts.d.ts.map +1 -1
  32. package/dist/dataStoreContexts.js +1 -0
  33. package/dist/dataStoreContexts.js.map +1 -1
  34. package/dist/deltaScheduler.d.ts.map +1 -1
  35. package/dist/deltaScheduler.js +5 -5
  36. package/dist/deltaScheduler.js.map +1 -1
  37. package/dist/gc/garbageCollection.d.ts.map +1 -1
  38. package/dist/gc/garbageCollection.js +36 -14
  39. package/dist/gc/garbageCollection.js.map +1 -1
  40. package/dist/gc/gcConfigs.d.ts.map +1 -1
  41. package/dist/gc/gcConfigs.js +2 -0
  42. package/dist/gc/gcConfigs.js.map +1 -1
  43. package/dist/gc/gcDefinitions.d.ts +8 -0
  44. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  45. package/dist/gc/gcDefinitions.js +1 -0
  46. package/dist/gc/gcDefinitions.js.map +1 -1
  47. package/dist/gc/gcHelpers.d.ts.map +1 -1
  48. package/dist/gc/gcHelpers.js +8 -5
  49. package/dist/gc/gcHelpers.js.map +1 -1
  50. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  51. package/dist/gc/gcSummaryStateTracker.js +2 -1
  52. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  53. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  54. package/dist/gc/gcTelemetry.js +29 -15
  55. package/dist/gc/gcTelemetry.js.map +1 -1
  56. package/dist/inboundBatchAggregator.js +3 -3
  57. package/dist/inboundBatchAggregator.js.map +1 -1
  58. package/dist/layerCompatState.d.ts +19 -0
  59. package/dist/layerCompatState.d.ts.map +1 -0
  60. package/dist/layerCompatState.js +64 -0
  61. package/dist/layerCompatState.js.map +1 -0
  62. package/dist/messageTypes.d.ts.map +1 -1
  63. package/dist/messageTypes.js.map +1 -1
  64. package/dist/opLifecycle/duplicateBatchDetector.js +2 -2
  65. package/dist/opLifecycle/duplicateBatchDetector.js.map +1 -1
  66. package/dist/opLifecycle/opCompressor.d.ts +3 -2
  67. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  68. package/dist/opLifecycle/opCompressor.js +13 -19
  69. package/dist/opLifecycle/opCompressor.js.map +1 -1
  70. package/dist/opLifecycle/opDecompressor.d.ts +3 -0
  71. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  72. package/dist/opLifecycle/opDecompressor.js +4 -1
  73. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  74. package/dist/opLifecycle/opGroupingManager.d.ts +1 -1
  75. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  76. package/dist/opLifecycle/opGroupingManager.js +5 -3
  77. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  78. package/dist/opLifecycle/opSplitter.d.ts +13 -10
  79. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  80. package/dist/opLifecycle/opSplitter.js +14 -11
  81. package/dist/opLifecycle/opSplitter.js.map +1 -1
  82. package/dist/opLifecycle/outbox.d.ts +3 -3
  83. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  84. package/dist/opLifecycle/outbox.js +11 -15
  85. package/dist/opLifecycle/outbox.js.map +1 -1
  86. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  87. package/dist/opLifecycle/remoteMessageProcessor.js +3 -1
  88. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  89. package/dist/packageVersion.d.ts +1 -1
  90. package/dist/packageVersion.js +1 -1
  91. package/dist/packageVersion.js.map +1 -1
  92. package/dist/pendingStateManager.d.ts +3 -4
  93. package/dist/pendingStateManager.d.ts.map +1 -1
  94. package/dist/pendingStateManager.js +11 -10
  95. package/dist/pendingStateManager.js.map +1 -1
  96. package/dist/summary/documentSchema.d.ts +7 -0
  97. package/dist/summary/documentSchema.d.ts.map +1 -1
  98. package/dist/summary/documentSchema.js +6 -4
  99. package/dist/summary/documentSchema.js.map +1 -1
  100. package/dist/summary/orderedClientElection.d.ts +1 -0
  101. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  102. package/dist/summary/orderedClientElection.js +13 -11
  103. package/dist/summary/orderedClientElection.js.map +1 -1
  104. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -0
  105. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  106. package/dist/summary/runWhileConnectedCoordinator.js +7 -2
  107. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  108. package/dist/summary/runningSummarizer.d.ts +2 -2
  109. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  110. package/dist/summary/runningSummarizer.js +38 -17
  111. package/dist/summary/runningSummarizer.js.map +1 -1
  112. package/dist/summary/summarizer.d.ts +1 -0
  113. package/dist/summary/summarizer.d.ts.map +1 -1
  114. package/dist/summary/summarizer.js +18 -9
  115. package/dist/summary/summarizer.js.map +1 -1
  116. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  117. package/dist/summary/summarizerClientElection.js +1 -0
  118. package/dist/summary/summarizerClientElection.js.map +1 -1
  119. package/dist/summary/summarizerHeuristics.js +1 -1
  120. package/dist/summary/summarizerHeuristics.js.map +1 -1
  121. package/dist/summary/summarizerNode/index.d.ts.map +1 -1
  122. package/dist/summary/summarizerNode/index.js.map +1 -1
  123. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  124. package/dist/summary/summarizerNode/summarizerNode.js +30 -31
  125. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  126. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
  127. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  128. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  129. package/dist/summary/summarizerTypes.d.ts +7 -0
  130. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  131. package/dist/summary/summarizerTypes.js.map +1 -1
  132. package/dist/summary/summaryCollection.d.ts +3 -4
  133. package/dist/summary/summaryCollection.d.ts.map +1 -1
  134. package/dist/summary/summaryCollection.js +9 -6
  135. package/dist/summary/summaryCollection.js.map +1 -1
  136. package/dist/summary/summaryFormat.d.ts +4 -1
  137. package/dist/summary/summaryFormat.d.ts.map +1 -1
  138. package/dist/summary/summaryFormat.js +3 -2
  139. package/dist/summary/summaryFormat.js.map +1 -1
  140. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  141. package/dist/summary/summaryGenerator.js +19 -8
  142. package/dist/summary/summaryGenerator.js.map +1 -1
  143. package/dist/summary/summaryManager.d.ts.map +1 -1
  144. package/dist/summary/summaryManager.js +12 -9
  145. package/dist/summary/summaryManager.js.map +1 -1
  146. package/lib/batchTracker.d.ts +1 -2
  147. package/lib/batchTracker.d.ts.map +1 -1
  148. package/lib/batchTracker.js +2 -2
  149. package/lib/batchTracker.js.map +1 -1
  150. package/lib/blobManager/blobManager.d.ts.map +1 -1
  151. package/lib/blobManager/blobManager.js +14 -11
  152. package/lib/blobManager/blobManager.js.map +1 -1
  153. package/lib/blobManager/blobManagerSnapSum.d.ts +1 -0
  154. package/lib/blobManager/blobManagerSnapSum.d.ts.map +1 -1
  155. package/lib/blobManager/blobManagerSnapSum.js +7 -5
  156. package/lib/blobManager/blobManagerSnapSum.js.map +1 -1
  157. package/lib/channelCollection.d.ts.map +1 -1
  158. package/lib/channelCollection.js +66 -42
  159. package/lib/channelCollection.js.map +1 -1
  160. package/lib/connectionTelemetry.d.ts +2 -2
  161. package/lib/connectionTelemetry.d.ts.map +1 -1
  162. package/lib/connectionTelemetry.js +5 -5
  163. package/lib/connectionTelemetry.js.map +1 -1
  164. package/lib/containerRuntime.d.ts +14 -30
  165. package/lib/containerRuntime.d.ts.map +1 -1
  166. package/lib/containerRuntime.js +271 -196
  167. package/lib/containerRuntime.js.map +1 -1
  168. package/lib/dataStore.js +6 -3
  169. package/lib/dataStore.js.map +1 -1
  170. package/lib/dataStoreContext.d.ts.map +1 -1
  171. package/lib/dataStoreContext.js +16 -11
  172. package/lib/dataStoreContext.js.map +1 -1
  173. package/lib/dataStoreContexts.d.ts.map +1 -1
  174. package/lib/dataStoreContexts.js +1 -0
  175. package/lib/dataStoreContexts.js.map +1 -1
  176. package/lib/deltaScheduler.d.ts.map +1 -1
  177. package/lib/deltaScheduler.js +6 -6
  178. package/lib/deltaScheduler.js.map +1 -1
  179. package/lib/gc/garbageCollection.d.ts.map +1 -1
  180. package/lib/gc/garbageCollection.js +39 -15
  181. package/lib/gc/garbageCollection.js.map +1 -1
  182. package/lib/gc/gcConfigs.d.ts.map +1 -1
  183. package/lib/gc/gcConfigs.js +2 -0
  184. package/lib/gc/gcConfigs.js.map +1 -1
  185. package/lib/gc/gcDefinitions.d.ts +8 -0
  186. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  187. package/lib/gc/gcDefinitions.js +1 -0
  188. package/lib/gc/gcDefinitions.js.map +1 -1
  189. package/lib/gc/gcHelpers.d.ts.map +1 -1
  190. package/lib/gc/gcHelpers.js +8 -5
  191. package/lib/gc/gcHelpers.js.map +1 -1
  192. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  193. package/lib/gc/gcSummaryStateTracker.js +2 -1
  194. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  195. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  196. package/lib/gc/gcTelemetry.js +32 -16
  197. package/lib/gc/gcTelemetry.js.map +1 -1
  198. package/lib/inboundBatchAggregator.js +4 -4
  199. package/lib/inboundBatchAggregator.js.map +1 -1
  200. package/lib/layerCompatState.d.ts +19 -0
  201. package/lib/layerCompatState.d.ts.map +1 -0
  202. package/lib/layerCompatState.js +60 -0
  203. package/lib/layerCompatState.js.map +1 -0
  204. package/lib/messageTypes.d.ts.map +1 -1
  205. package/lib/messageTypes.js.map +1 -1
  206. package/lib/opLifecycle/duplicateBatchDetector.js +2 -2
  207. package/lib/opLifecycle/duplicateBatchDetector.js.map +1 -1
  208. package/lib/opLifecycle/opCompressor.d.ts +3 -2
  209. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  210. package/lib/opLifecycle/opCompressor.js +13 -19
  211. package/lib/opLifecycle/opCompressor.js.map +1 -1
  212. package/lib/opLifecycle/opDecompressor.d.ts +3 -0
  213. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  214. package/lib/opLifecycle/opDecompressor.js +4 -1
  215. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  216. package/lib/opLifecycle/opGroupingManager.d.ts +1 -1
  217. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  218. package/lib/opLifecycle/opGroupingManager.js +5 -3
  219. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  220. package/lib/opLifecycle/opSplitter.d.ts +13 -10
  221. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  222. package/lib/opLifecycle/opSplitter.js +14 -11
  223. package/lib/opLifecycle/opSplitter.js.map +1 -1
  224. package/lib/opLifecycle/outbox.d.ts +3 -3
  225. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  226. package/lib/opLifecycle/outbox.js +11 -15
  227. package/lib/opLifecycle/outbox.js.map +1 -1
  228. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  229. package/lib/opLifecycle/remoteMessageProcessor.js +3 -1
  230. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  231. package/lib/packageVersion.d.ts +1 -1
  232. package/lib/packageVersion.js +1 -1
  233. package/lib/packageVersion.js.map +1 -1
  234. package/lib/pendingStateManager.d.ts +3 -4
  235. package/lib/pendingStateManager.d.ts.map +1 -1
  236. package/lib/pendingStateManager.js +12 -11
  237. package/lib/pendingStateManager.js.map +1 -1
  238. package/lib/summary/documentSchema.d.ts +7 -0
  239. package/lib/summary/documentSchema.d.ts.map +1 -1
  240. package/lib/summary/documentSchema.js +6 -4
  241. package/lib/summary/documentSchema.js.map +1 -1
  242. package/lib/summary/orderedClientElection.d.ts +1 -0
  243. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  244. package/lib/summary/orderedClientElection.js +13 -11
  245. package/lib/summary/orderedClientElection.js.map +1 -1
  246. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -0
  247. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  248. package/lib/summary/runWhileConnectedCoordinator.js +7 -2
  249. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  250. package/lib/summary/runningSummarizer.d.ts +2 -2
  251. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  252. package/lib/summary/runningSummarizer.js +38 -17
  253. package/lib/summary/runningSummarizer.js.map +1 -1
  254. package/lib/summary/summarizer.d.ts +1 -0
  255. package/lib/summary/summarizer.d.ts.map +1 -1
  256. package/lib/summary/summarizer.js +18 -9
  257. package/lib/summary/summarizer.js.map +1 -1
  258. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  259. package/lib/summary/summarizerClientElection.js +1 -0
  260. package/lib/summary/summarizerClientElection.js.map +1 -1
  261. package/lib/summary/summarizerHeuristics.js +1 -1
  262. package/lib/summary/summarizerHeuristics.js.map +1 -1
  263. package/lib/summary/summarizerNode/index.d.ts.map +1 -1
  264. package/lib/summary/summarizerNode/index.js.map +1 -1
  265. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  266. package/lib/summary/summarizerNode/summarizerNode.js +30 -31
  267. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  268. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
  269. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  270. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  271. package/lib/summary/summarizerTypes.d.ts +7 -0
  272. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  273. package/lib/summary/summarizerTypes.js.map +1 -1
  274. package/lib/summary/summaryCollection.d.ts +3 -4
  275. package/lib/summary/summaryCollection.d.ts.map +1 -1
  276. package/lib/summary/summaryCollection.js +9 -6
  277. package/lib/summary/summaryCollection.js.map +1 -1
  278. package/lib/summary/summaryFormat.d.ts +4 -1
  279. package/lib/summary/summaryFormat.d.ts.map +1 -1
  280. package/lib/summary/summaryFormat.js +2 -2
  281. package/lib/summary/summaryFormat.js.map +1 -1
  282. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  283. package/lib/summary/summaryGenerator.js +19 -8
  284. package/lib/summary/summaryGenerator.js.map +1 -1
  285. package/lib/summary/summaryManager.d.ts.map +1 -1
  286. package/lib/summary/summaryManager.js +12 -9
  287. package/lib/summary/summaryManager.js.map +1 -1
  288. package/package.json +21 -43
  289. package/src/batchTracker.ts +3 -3
  290. package/src/blobManager/blobManager.ts +16 -14
  291. package/src/blobManager/blobManagerSnapSum.ts +8 -8
  292. package/src/channelCollection.ts +63 -44
  293. package/src/connectionTelemetry.ts +12 -6
  294. package/src/containerRuntime.ts +306 -235
  295. package/src/dataStore.ts +6 -3
  296. package/src/dataStoreContext.ts +16 -16
  297. package/src/dataStoreContexts.ts +1 -0
  298. package/src/deltaScheduler.ts +6 -6
  299. package/src/gc/garbageCollection.ts +47 -20
  300. package/src/gc/gcConfigs.ts +9 -1
  301. package/src/gc/gcDefinitions.ts +12 -0
  302. package/src/gc/gcHelpers.ts +9 -4
  303. package/src/gc/gcSummaryStateTracker.ts +3 -1
  304. package/src/gc/gcTelemetry.ts +26 -11
  305. package/src/inboundBatchAggregator.ts +4 -4
  306. package/src/layerCompatState.ts +75 -0
  307. package/src/messageTypes.ts +2 -0
  308. package/src/opLifecycle/README.md +43 -34
  309. package/src/opLifecycle/duplicateBatchDetector.ts +2 -2
  310. package/src/opLifecycle/opCompressor.ts +16 -23
  311. package/src/opLifecycle/opDecompressor.ts +4 -1
  312. package/src/opLifecycle/opGroupingManager.ts +5 -4
  313. package/src/opLifecycle/opSplitter.ts +14 -11
  314. package/src/opLifecycle/outbox.ts +13 -20
  315. package/src/opLifecycle/remoteMessageProcessor.ts +3 -1
  316. package/src/packageVersion.ts +1 -1
  317. package/src/pendingStateManager.ts +15 -10
  318. package/src/summary/documentSchema.ts +11 -4
  319. package/src/summary/orderedClientElection.ts +14 -11
  320. package/src/summary/runWhileConnectedCoordinator.ts +6 -0
  321. package/src/summary/runningSummarizer.ts +43 -19
  322. package/src/summary/summarizer.ts +24 -11
  323. package/src/summary/summarizerClientElection.ts +2 -0
  324. package/src/summary/summarizerHeuristics.ts +1 -1
  325. package/src/summary/summarizerNode/index.ts +1 -0
  326. package/src/summary/summarizerNode/summarizerNode.ts +32 -31
  327. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +4 -4
  328. package/src/summary/summarizerTypes.ts +7 -0
  329. package/src/summary/summaryCollection.ts +19 -8
  330. package/src/summary/summaryFormat.ts +10 -5
  331. package/src/summary/summaryGenerator.ts +25 -10
  332. package/src/summary/summaryManager.ts +14 -12
  333. package/container-runtime.test-files.tar +0 -0
@@ -51,6 +51,7 @@ import {
51
51
  getStorageIds,
52
52
  summarizeBlobManagerState,
53
53
  toRedirectTable,
54
+ // eslint-disable-next-line import/no-deprecated
54
55
  type IBlobManagerLoadInfo,
55
56
  } from "./blobManagerSnapSum.js";
56
57
 
@@ -187,6 +188,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
187
188
 
188
189
  constructor(props: {
189
190
  readonly routeContext: IFluidHandleContext;
191
+ // eslint-disable-next-line import/no-deprecated
190
192
  snapshot: IBlobManagerLoadInfo;
191
193
  readonly getStorage: () => IDocumentStorageService;
192
194
  /**
@@ -240,7 +242,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
240
242
  this.redirectTable = toRedirectTable(snapshot, this.mc.logger, this.runtime.attachState);
241
243
 
242
244
  // Begin uploading stashed blobs from previous container instance
243
- Object.entries(stashedBlobs ?? {}).forEach(([localId, entry]) => {
245
+ for (const [localId, entry] of Object.entries(stashedBlobs ?? {})) {
244
246
  const { acked, storageId, minTTLInSeconds, uploadTime } = entry;
245
247
  const blob = stringToBuffer(entry.blob, "base64");
246
248
  const pendingEntry: PendingBlob = {
@@ -260,7 +262,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
260
262
  const timeLapseSinceLocalUpload = (Date.now() - uploadTime) / 1000;
261
263
  // stashed entries with more than half-life in storage will not be reuploaded
262
264
  if (minTTLInSeconds - timeLapseSinceLocalUpload > minTTLInSeconds / 2) {
263
- return;
265
+ continue;
264
266
  }
265
267
  }
266
268
  this.pendingStashedBlobs.set(localId, this.uploadBlob(localId, blob));
@@ -269,7 +271,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
269
271
  ...stashedPendingBlobOverrides,
270
272
  uploadP: this.pendingStashedBlobs.get(localId),
271
273
  });
272
- });
274
+ }
273
275
 
274
276
  this.stashedBlobsUploadP = new LazyPromise(async () =>
275
277
  PerformanceEvent.timedExecAsync(
@@ -337,7 +339,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
337
339
  }
338
340
 
339
341
  public hasPendingStashedUploads(): boolean {
340
- return Array.from(this.pendingBlobs.values()).some((e) => e.stashedUpload === true);
342
+ return [...this.pendingBlobs.values()].some((e) => e.stashedUpload === true);
341
343
  }
342
344
 
343
345
  public async getBlob(blobId: string): Promise<ArrayBufferLike> {
@@ -588,10 +590,10 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
588
590
  // If there is already an op for this storage ID, append the local ID to the list. Once any op for
589
591
  // this storage ID is ack'd, all pending blobs for it can be resolved since the op will keep the
590
592
  // blob alive in storage.
591
- this.opsInFlight.set(
592
- response.id,
593
- (this.opsInFlight.get(response.id) ?? []).concat(localId),
594
- );
593
+ this.opsInFlight.set(response.id, [
594
+ ...(this.opsInFlight.get(response.id) ?? []),
595
+ localId,
596
+ ]);
595
597
  }
596
598
  return response;
597
599
  }
@@ -648,7 +650,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
648
650
  // For each op corresponding to this storage ID that we are waiting for, resolve the pending blob.
649
651
  // This is safe because the server will keep the blob alive and the op containing the local ID to
650
652
  // storage ID is already in flight and any op containing this local ID will be sequenced after that.
651
- waitingBlobs.forEach((pendingLocalId) => {
653
+ for (const pendingLocalId of waitingBlobs) {
652
654
  const entry = this.pendingBlobs.get(pendingLocalId);
653
655
  assert(
654
656
  entry !== undefined,
@@ -658,7 +660,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
658
660
  entry.acked = true;
659
661
  entry.handleP.resolve(this.getBlobHandle(pendingLocalId));
660
662
  this.deletePendingBlobMaybe(pendingLocalId);
661
- });
663
+ }
662
664
  this.opsInFlight.delete(blobId);
663
665
  }
664
666
  const localEntry = this.pendingBlobs.get(localId);
@@ -703,7 +705,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
703
705
  */
704
706
  public deleteSweepReadyNodes(sweepReadyBlobRoutes: readonly string[]): readonly string[] {
705
707
  this.deleteBlobsFromRedirectTable(sweepReadyBlobRoutes);
706
- return Array.from(sweepReadyBlobRoutes);
708
+ return [...sweepReadyBlobRoutes];
707
709
  }
708
710
 
709
711
  /**
@@ -865,10 +867,10 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
865
867
  resolve();
866
868
  }
867
869
  };
868
- if (!entry.attached) {
869
- this.on("blobAttached", onBlobAttached);
870
- } else {
870
+ if (entry.attached) {
871
871
  resolve();
872
+ } else {
873
+ this.on("blobAttached", onBlobAttached);
872
874
  }
873
875
  }),
874
876
  );
@@ -17,6 +17,7 @@ import type { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/intern
17
17
  * Information from a snapshot needed to load BlobManager
18
18
  * @legacy
19
19
  * @alpha
20
+ * @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
20
21
  */
21
22
  export interface IBlobManagerLoadInfo {
22
23
  ids?: string[];
@@ -73,7 +74,9 @@ export const toRedirectTable = (
73
74
  if (snapshot.ids) {
74
75
  // If we are detached, we don't have storage IDs yet, so set to undefined
75
76
  // Otherwise, set identity (id -> id) entries.
76
- snapshot.ids.forEach((entry) => redirectTable.set(entry, detached ? undefined : entry));
77
+ for (const entry of snapshot.ids) {
78
+ redirectTable.set(entry, detached ? undefined : entry);
79
+ }
77
80
  }
78
81
  return redirectTable;
79
82
  };
@@ -90,12 +93,11 @@ const summarizeV1 = (
90
93
  const storageIds = getStorageIds(redirectTable, attachState);
91
94
 
92
95
  // if storageIds is empty, it means we are detached and have only local IDs, or that there are no blobs attached
93
- const blobIds =
94
- storageIds.size > 0 ? Array.from(storageIds) : Array.from(redirectTable.keys());
96
+ const blobIds = storageIds.size > 0 ? [...storageIds] : [...redirectTable.keys()];
95
97
  const builder = new SummaryTreeBuilder();
96
- blobIds.forEach((blobId) => {
98
+ for (const blobId of blobIds) {
97
99
  builder.addAttachment(blobId);
98
- });
100
+ }
99
101
 
100
102
  // Any non-identity entries in the table need to be saved in the summary
101
103
  if (redirectTable.size > blobIds.length) {
@@ -103,9 +105,7 @@ const summarizeV1 = (
103
105
  redirectTableBlobName,
104
106
  // filter out identity entries
105
107
  JSON.stringify(
106
- Array.from(redirectTable.entries()).filter(
107
- ([localId, storageId]) => localId !== storageId,
108
- ),
108
+ [...redirectTable.entries()].filter(([localId, storageId]) => localId !== storageId),
109
109
  ),
110
110
  );
111
111
  }
@@ -76,6 +76,7 @@ import {
76
76
  import { v4 as uuid } from "uuid";
77
77
 
78
78
  import {
79
+ // eslint-disable-next-line import/no-deprecated
79
80
  DeletedResponseHeaderKey,
80
81
  RuntimeHeaderData,
81
82
  defaultRuntimeHeaderData,
@@ -96,10 +97,12 @@ import {
96
97
  } from "./dataStoreContext.js";
97
98
  import { DataStoreContexts } from "./dataStoreContexts.js";
98
99
  import { FluidDataStoreRegistry } from "./dataStoreRegistry.js";
100
+ // eslint-disable-next-line import/no-deprecated
99
101
  import { GCNodeType, IGCNodeUpdatedProps, urlToGCNodePath } from "./gc/index.js";
100
102
  import { ContainerMessageType, LocalContainerRuntimeMessage } from "./messageTypes.js";
101
103
  import { StorageServiceWithAttachBlobs } from "./storageServiceWithAttachBlobs.js";
102
104
  import {
105
+ // eslint-disable-next-line import/no-deprecated
103
106
  IContainerRuntimeMetadata,
104
107
  nonDataStorePaths,
105
108
  rootHasIsolatedChannels,
@@ -264,6 +267,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
264
267
 
265
268
  protected readonly mc: MonitoringContext;
266
269
 
270
+ // eslint-disable-next-line unicorn/consistent-function-scoping -- Property is defined once; no need to extract inner lambda
267
271
  private readonly disposeOnce = new Lazy<void>(() => this.contexts.dispose());
268
272
 
269
273
  public readonly entryPoint: IFluidHandleInternal<FluidObject>;
@@ -320,41 +324,41 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
320
324
  unreferencedDataStoreCount++;
321
325
  }
322
326
  // If we have a detached container, then create local data store contexts.
323
- if (this.parentContext.attachState !== AttachState.Detached) {
324
- let snapshotForRemoteFluidDatastoreContext: ISnapshot | ISnapshotTree = value;
325
- if (isInstanceOfISnapshot(baseSnapshot)) {
326
- snapshotForRemoteFluidDatastoreContext = {
327
- ...baseSnapshot,
328
- snapshotTree: value,
329
- };
327
+ if (this.parentContext.attachState === AttachState.Detached) {
328
+ if (typeof value !== "object") {
329
+ throw new LoggingError("Snapshot should be there to load from!!");
330
330
  }
331
- dataStoreContext = new RemoteFluidDataStoreContext({
331
+ const snapshotTree = value;
332
+ dataStoreContext = new LocalFluidDataStoreContext({
332
333
  id: key,
333
- snapshot: snapshotForRemoteFluidDatastoreContext,
334
+ pkg: undefined,
334
335
  parentContext: this.wrapContextForInnerChannel(key),
335
336
  storage: this.parentContext.storage,
336
337
  scope: this.parentContext.scope,
337
338
  createSummarizerNodeFn: this.parentContext.getCreateChildSummarizerNodeFn(key, {
338
339
  type: CreateSummarizerNodeSource.FromSummary,
339
340
  }),
340
- loadingGroupId: value.groupId,
341
+ makeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(key),
342
+ snapshotTree,
341
343
  });
342
344
  } else {
343
- if (typeof value !== "object") {
344
- throw new LoggingError("Snapshot should be there to load from!!");
345
+ let snapshotForRemoteFluidDatastoreContext: ISnapshot | ISnapshotTree = value;
346
+ if (isInstanceOfISnapshot(baseSnapshot)) {
347
+ snapshotForRemoteFluidDatastoreContext = {
348
+ ...baseSnapshot,
349
+ snapshotTree: value,
350
+ };
345
351
  }
346
- const snapshotTree = value;
347
- dataStoreContext = new LocalFluidDataStoreContext({
352
+ dataStoreContext = new RemoteFluidDataStoreContext({
348
353
  id: key,
349
- pkg: undefined,
354
+ snapshot: snapshotForRemoteFluidDatastoreContext,
350
355
  parentContext: this.wrapContextForInnerChannel(key),
351
356
  storage: this.parentContext.storage,
352
357
  scope: this.parentContext.scope,
353
358
  createSummarizerNodeFn: this.parentContext.getCreateChildSummarizerNodeFn(key, {
354
359
  type: CreateSummarizerNodeSource.FromSummary,
355
360
  }),
356
- makeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(key),
357
- snapshotTree,
361
+ loadingGroupId: value.groupId,
358
362
  });
359
363
  }
360
364
  this.contexts.addBoundOrRemoted(dataStoreContext);
@@ -707,13 +711,16 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
707
711
  public reSubmit(type: string, content: unknown, localOpMetadata: unknown): void {
708
712
  switch (type) {
709
713
  case ContainerMessageType.Attach:
710
- case ContainerMessageType.Alias:
714
+ case ContainerMessageType.Alias: {
711
715
  this.parentContext.submitMessage(type, content, localOpMetadata);
712
716
  return;
713
- case ContainerMessageType.FluidDataStoreOp:
717
+ }
718
+ case ContainerMessageType.FluidDataStoreOp: {
714
719
  return this.reSubmitChannelOp(type, content, localOpMetadata);
715
- default:
720
+ }
721
+ default: {
716
722
  assert(false, 0x907 /* unknown op type */);
723
+ }
717
724
  }
718
725
  }
719
726
 
@@ -757,14 +764,18 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
757
764
  public async applyStashedOp(content: unknown): Promise<unknown> {
758
765
  const opContents = content as LocalContainerRuntimeMessage;
759
766
  switch (opContents.type) {
760
- case ContainerMessageType.Attach:
767
+ case ContainerMessageType.Attach: {
761
768
  return this.applyStashedAttachOp(opContents.contents);
762
- case ContainerMessageType.Alias:
769
+ }
770
+ case ContainerMessageType.Alias: {
763
771
  return;
764
- case ContainerMessageType.FluidDataStoreOp:
772
+ }
773
+ case ContainerMessageType.FluidDataStoreOp: {
765
774
  return this.applyStashedChannelChannelOp(opContents.contents);
766
- default:
775
+ }
776
+ default: {
767
777
  assert(false, 0x908 /* unknon type of op */);
778
+ }
768
779
  }
769
780
  }
770
781
 
@@ -821,7 +832,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
821
832
  // if the client is not detached put in the pending attach list
822
833
  // so that on ack of the stashed op, the context is found.
823
834
  // detached client don't send ops, so should not expect and ack.
824
- this.pendingAttach.set(message.id, message);
835
+ this.pendingAttach.set(id, message);
825
836
  }
826
837
  }
827
838
 
@@ -831,17 +842,21 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
831
842
  */
832
843
  public processMessages(messageCollection: IRuntimeMessageCollection): void {
833
844
  switch (messageCollection.envelope.type) {
834
- case ContainerMessageType.FluidDataStoreOp:
845
+ case ContainerMessageType.FluidDataStoreOp: {
835
846
  this.processChannelMessages(messageCollection);
836
847
  break;
837
- case ContainerMessageType.Attach:
848
+ }
849
+ case ContainerMessageType.Attach: {
838
850
  this.processAttachMessages(messageCollection);
839
851
  break;
840
- case ContainerMessageType.Alias:
852
+ }
853
+ case ContainerMessageType.Alias: {
841
854
  this.processAliasMessages(messageCollection);
842
855
  break;
843
- default:
856
+ }
857
+ default: {
844
858
  assert(false, 0x8e9 /* unreached */);
859
+ }
845
860
  }
846
861
  }
847
862
 
@@ -874,7 +889,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
874
889
  * @param messageCollection - The collection of messages to process.
875
890
  */
876
891
  private processChannelMessages(messageCollection: IRuntimeMessageCollection): void {
877
- const { messagesContent, local } = messageCollection;
892
+ const { envelope, messagesContent, local } = messageCollection;
878
893
  let currentMessageState: { address: string; type: string } | undefined;
879
894
  let currentMessagesContent: IRuntimeMessagesContent[] = [];
880
895
 
@@ -888,7 +903,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
888
903
  assert(!!currentContext, 0xa66 /* Context not found */);
889
904
 
890
905
  currentContext.processMessages({
891
- envelope: { ...messageCollection.envelope, type: currentMessageState.type },
906
+ envelope: { ...envelope, type: currentMessageState.type },
892
907
  messagesContent: currentMessagesContent,
893
908
  local,
894
909
  });
@@ -916,11 +931,11 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
916
931
  throw DataProcessingError.create(
917
932
  "No context for op",
918
933
  "processFluidDataStoreOp",
919
- messageCollection.envelope as ISequencedDocumentMessage,
934
+ envelope as ISequencedDocumentMessage,
920
935
  {
921
936
  local,
922
937
  messageDetails: JSON.stringify({
923
- type: messageCollection.envelope.type,
938
+ type: envelope.type,
924
939
  contentType: typeof contents,
925
940
  }),
926
941
  ...tagCodeArtifacts({ address }),
@@ -948,16 +963,12 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
948
963
  this.gcNodeUpdated({
949
964
  node: { type: "DataStore", path: `/${address}` },
950
965
  reason: "Changed",
951
- timestampMs: messageCollection.envelope.timestamp,
966
+ timestampMs: envelope.timestamp,
952
967
  packagePath: context.isLoaded ? context.packagePath : undefined,
953
968
  });
954
969
 
955
970
  detectOutboundReferences(address, contextContents, (fromPath: string, toPath: string) =>
956
- this.parentContext.addedGCOutboundRoute(
957
- fromPath,
958
- toPath,
959
- messageCollection.envelope.timestamp,
960
- ),
971
+ this.parentContext.addedGCOutboundRoute(fromPath, toPath, envelope.timestamp),
961
972
  );
962
973
  }
963
974
 
@@ -985,6 +996,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
985
996
  // The requested data store has been deleted by gc. Create a 404 response exception.
986
997
  throw responseToException(
987
998
  createResponseError(404, "DataStore was deleted", originalRequest, {
999
+ // eslint-disable-next-line import/no-deprecated
988
1000
  [DeletedResponseHeaderKey]: true,
989
1001
  }),
990
1002
  originalRequest,
@@ -1051,7 +1063,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
1051
1063
  }
1052
1064
 
1053
1065
  const idToLog =
1054
- originalRequest !== undefined ? urlToGCNodePath(originalRequest.url) : dataStoreNodePath;
1066
+ originalRequest === undefined ? dataStoreNodePath : urlToGCNodePath(originalRequest.url);
1055
1067
 
1056
1068
  // Log the package details asynchronously since getInitialSnapshotDetails is async
1057
1069
  const recentlyDeletedContext = this.contexts.getRecentlyDeletedContext(id);
@@ -1200,7 +1212,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
1200
1212
  },
1201
1213
  );
1202
1214
  // Get the outbound routes (aliased data stores) and add a GC node for this channel.
1203
- builder.addNode("/", Array.from(this.aliasedDataStores));
1215
+ builder.addNode("/", [...this.aliasedDataStores]);
1204
1216
  return builder.getGCData();
1205
1217
  }
1206
1218
 
@@ -1412,7 +1424,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
1412
1424
 
1413
1425
  this.deleteChild(dataStoreId);
1414
1426
  }
1415
- return Array.from(sweepReadyDataStoreRoutes);
1427
+ return [...sweepReadyDataStoreRoutes];
1416
1428
  }
1417
1429
 
1418
1430
  /**
@@ -1467,13 +1479,15 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
1467
1479
  // If the node belongs to a data store, return its package path. For DDSes, we return the package path of the
1468
1480
  // data store that contains it.
1469
1481
  const context = this.contexts.get(nodePath.split("/")[1]);
1470
- return (await context?.getInitialSnapshotDetails())?.pkg;
1482
+ const initialSnapshotDetails = await context?.getInitialSnapshotDetails();
1483
+ return initialSnapshotDetails?.pkg;
1471
1484
  }
1472
1485
 
1473
1486
  /**
1474
1487
  * Called by GC to determine if a node is for a data store or for an object within a data store (for e.g. DDS).
1475
1488
  * @returns the GC node type if the node belongs to a data store or object within data store, undefined otherwise.
1476
1489
  */
1490
+ // eslint-disable-next-line import/no-deprecated
1477
1491
  public getGCNodeType(nodePath: string): GCNodeType | undefined {
1478
1492
  const pathParts = nodePath.split("/");
1479
1493
  if (!this.contexts.has(pathParts[1])) {
@@ -1483,8 +1497,10 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
1483
1497
  // Data stores paths are of the format "/dataStoreId".
1484
1498
  // Sub data store paths are of the format "/dataStoreId/subPath/...".
1485
1499
  if (pathParts.length === 2) {
1500
+ // eslint-disable-next-line import/no-deprecated
1486
1501
  return GCNodeType.DataStore;
1487
1502
  }
1503
+ // eslint-disable-next-line import/no-deprecated
1488
1504
  return GCNodeType.SubDataStore;
1489
1505
  }
1490
1506
 
@@ -1549,6 +1565,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
1549
1565
 
1550
1566
  export function getSummaryForDatastores(
1551
1567
  snapshot: ISnapshotTree | undefined,
1568
+ // eslint-disable-next-line import/no-deprecated
1552
1569
  metadata?: IContainerRuntimeMetadata,
1553
1570
  ): ISnapshotTree | undefined {
1554
1571
  if (!snapshot) {
@@ -1613,7 +1630,9 @@ export function detectOutboundReferences(
1613
1630
  // GC node paths are all absolute paths, hence the "" prefix.
1614
1631
  // e.g. this will yield "/dataStoreId/ddsId"
1615
1632
  const fromPath = ["", address, ddsAddress].join("/");
1616
- outboundPaths.forEach((toPath) => addedOutboundReference(fromPath, toPath));
1633
+ for (const toPath of outboundPaths) {
1634
+ addedOutboundReference(fromPath, toPath);
1635
+ }
1617
1636
  }
1618
1637
 
1619
1638
  /**
@@ -3,9 +3,10 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { performance } from "@fluid-internal/client-utils";
6
+ import { performanceNow } from "@fluid-internal/client-utils";
7
7
  import { IDeltaManagerFull } from "@fluidframework/container-definitions/internal";
8
8
  import { IContainerRuntimeEvents } from "@fluidframework/container-runtime-definitions/internal";
9
+ import type { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
9
10
  import { IEventProvider } from "@fluidframework/core-interfaces";
10
11
  import { assert } from "@fluidframework/core-utils/internal";
11
12
  import {
@@ -91,7 +92,7 @@ class OpPerfTelemetry {
91
92
 
92
93
  private firstConnection = true;
93
94
  private connectionOpSeqNumber: number | undefined;
94
- private readonly bootTime = performance.now();
95
+ private readonly bootTime = performanceNow();
95
96
  private connectionStartTime = 0;
96
97
  private gap = 0;
97
98
 
@@ -203,7 +204,7 @@ class OpPerfTelemetry {
203
204
  if (opsBehind !== undefined) {
204
205
  this.connectionOpSeqNumber = this.deltaManager.lastKnownSeqNumber;
205
206
  this.gap = opsBehind;
206
- this.connectionStartTime = performance.now();
207
+ this.connectionStartTime = performanceNow();
207
208
 
208
209
  // We might be already up-today. If so, report it right away.
209
210
  if (this.gap <= 0) {
@@ -305,7 +306,7 @@ class OpPerfTelemetry {
305
306
  this.connectionOpSeqNumber = undefined;
306
307
  this.logger.sendPerformanceEvent({
307
308
  eventName: "ConnectionSpeed",
308
- duration: performance.now() - this.connectionStartTime,
309
+ duration: performanceNow() - this.connectionStartTime,
309
310
  ops: this.gap,
310
311
  // track time to connect only for first connection.
311
312
  timeToConnect: this.firstConnection
@@ -520,7 +521,12 @@ export function ReportOpPerfTelemetry(
520
521
  clientId: string | undefined,
521
522
  deltaManager: IDeltaManagerFull,
522
523
  containerRuntimeEvents: IEventProvider<IContainerRuntimeEvents>,
523
- logger: ITelemetryLoggerExt,
524
+ logger: ITelemetryBaseLogger,
524
525
  ): void {
525
- new OpPerfTelemetry(clientId, deltaManager, containerRuntimeEvents, logger);
526
+ new OpPerfTelemetry(
527
+ clientId,
528
+ deltaManager,
529
+ containerRuntimeEvents,
530
+ createChildLogger({ logger }),
531
+ );
526
532
  }