@fluidframework/container-runtime 2.0.0-rc.3.0.3 → 2.0.0-rc.4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/api-report/container-runtime.api.md +72 -34
  3. package/dist/batchTracker.d.ts +1 -1
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js.map +1 -1
  6. package/dist/blobManager.d.ts +7 -7
  7. package/dist/blobManager.d.ts.map +1 -1
  8. package/dist/blobManager.js +2 -4
  9. package/dist/blobManager.js.map +1 -1
  10. package/dist/channelCollection.d.ts +6 -4
  11. package/dist/channelCollection.d.ts.map +1 -1
  12. package/dist/channelCollection.js +20 -7
  13. package/dist/channelCollection.js.map +1 -1
  14. package/dist/connectionTelemetry.d.ts +2 -2
  15. package/dist/connectionTelemetry.d.ts.map +1 -1
  16. package/dist/connectionTelemetry.js +54 -5
  17. package/dist/connectionTelemetry.js.map +1 -1
  18. package/dist/containerRuntime.d.ts +17 -35
  19. package/dist/containerRuntime.d.ts.map +1 -1
  20. package/dist/containerRuntime.js +194 -163
  21. package/dist/containerRuntime.js.map +1 -1
  22. package/dist/dataStore.d.ts +1 -1
  23. package/dist/dataStore.d.ts.map +1 -1
  24. package/dist/dataStore.js.map +1 -1
  25. package/dist/dataStoreContext.d.ts +9 -6
  26. package/dist/dataStoreContext.d.ts.map +1 -1
  27. package/dist/dataStoreContext.js +19 -5
  28. package/dist/dataStoreContext.js.map +1 -1
  29. package/dist/dataStoreContexts.d.ts.map +1 -1
  30. package/dist/dataStoreContexts.js.map +1 -1
  31. package/dist/deltaManagerProxies.d.ts +81 -0
  32. package/dist/deltaManagerProxies.d.ts.map +1 -0
  33. package/dist/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +75 -20
  34. package/dist/deltaManagerProxies.js.map +1 -0
  35. package/dist/deltaScheduler.d.ts +2 -2
  36. package/dist/deltaScheduler.d.ts.map +1 -1
  37. package/dist/deltaScheduler.js.map +1 -1
  38. package/dist/gc/garbageCollection.d.ts +1 -1
  39. package/dist/gc/garbageCollection.d.ts.map +1 -1
  40. package/dist/gc/garbageCollection.js.map +1 -1
  41. package/dist/gc/gcDefinitions.d.ts +1 -1
  42. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  43. package/dist/gc/gcDefinitions.js.map +1 -1
  44. package/dist/gc/gcTelemetry.d.ts +1 -2
  45. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  46. package/dist/gc/gcTelemetry.js.map +1 -1
  47. package/dist/index.d.ts +1 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/legacy.d.ts +6 -1
  51. package/dist/messageTypes.d.ts +5 -2
  52. package/dist/messageTypes.d.ts.map +1 -1
  53. package/dist/messageTypes.js.map +1 -1
  54. package/dist/metadata.d.ts +2 -2
  55. package/dist/metadata.d.ts.map +1 -1
  56. package/dist/metadata.js.map +1 -1
  57. package/dist/opLifecycle/batchManager.d.ts +4 -1
  58. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  59. package/dist/opLifecycle/batchManager.js +0 -10
  60. package/dist/opLifecycle/batchManager.js.map +1 -1
  61. package/dist/opLifecycle/outbox.d.ts +0 -4
  62. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  63. package/dist/opLifecycle/outbox.js +7 -38
  64. package/dist/opLifecycle/outbox.js.map +1 -1
  65. package/dist/packageVersion.d.ts +1 -1
  66. package/dist/packageVersion.js +1 -1
  67. package/dist/packageVersion.js.map +1 -1
  68. package/dist/pendingStateManager.d.ts +9 -2
  69. package/dist/pendingStateManager.d.ts.map +1 -1
  70. package/dist/pendingStateManager.js +26 -10
  71. package/dist/pendingStateManager.js.map +1 -1
  72. package/dist/scheduleManager.d.ts +2 -2
  73. package/dist/scheduleManager.d.ts.map +1 -1
  74. package/dist/scheduleManager.js.map +1 -1
  75. package/dist/summary/documentSchema.d.ts +3 -1
  76. package/dist/summary/documentSchema.d.ts.map +1 -1
  77. package/dist/summary/documentSchema.js +25 -7
  78. package/dist/summary/documentSchema.js.map +1 -1
  79. package/dist/summary/index.d.ts +1 -1
  80. package/dist/summary/index.d.ts.map +1 -1
  81. package/dist/summary/index.js.map +1 -1
  82. package/dist/summary/orderedClientElection.d.ts +2 -2
  83. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  84. package/dist/summary/orderedClientElection.js.map +1 -1
  85. package/dist/summary/runningSummarizer.js +10 -10
  86. package/dist/summary/runningSummarizer.js.map +1 -1
  87. package/dist/summary/summarizer.d.ts +1 -2
  88. package/dist/summary/summarizer.d.ts.map +1 -1
  89. package/dist/summary/summarizer.js.map +1 -1
  90. package/dist/summary/summarizerClientElection.d.ts +1 -1
  91. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  92. package/dist/summary/summarizerClientElection.js.map +1 -1
  93. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  94. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  95. package/dist/summary/summarizerHeuristics.js.map +1 -1
  96. package/dist/summary/summarizerNode/summarizerNode.d.ts +4 -3
  97. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  98. package/dist/summary/summarizerNode/summarizerNode.js +4 -10
  99. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  100. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -3
  101. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  102. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  103. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -2
  104. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  105. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +2 -9
  106. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  107. package/dist/summary/summarizerTypes.d.ts +3 -5
  108. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  109. package/dist/summary/summarizerTypes.js.map +1 -1
  110. package/dist/summary/summaryCollection.d.ts +2 -2
  111. package/dist/summary/summaryCollection.d.ts.map +1 -1
  112. package/dist/summary/summaryCollection.js.map +1 -1
  113. package/dist/summary/summaryFormat.d.ts +25 -5
  114. package/dist/summary/summaryFormat.d.ts.map +1 -1
  115. package/dist/summary/summaryFormat.js.map +1 -1
  116. package/dist/summary/summaryGenerator.d.ts +1 -2
  117. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  118. package/dist/summary/summaryGenerator.js +12 -11
  119. package/dist/summary/summaryGenerator.js.map +1 -1
  120. package/dist/summary/summaryManager.d.ts.map +1 -1
  121. package/dist/summary/summaryManager.js +5 -5
  122. package/dist/summary/summaryManager.js.map +1 -1
  123. package/lib/batchTracker.d.ts +1 -1
  124. package/lib/batchTracker.d.ts.map +1 -1
  125. package/lib/batchTracker.js.map +1 -1
  126. package/lib/blobManager.d.ts +7 -7
  127. package/lib/blobManager.d.ts.map +1 -1
  128. package/lib/blobManager.js +3 -5
  129. package/lib/blobManager.js.map +1 -1
  130. package/lib/channelCollection.d.ts +6 -4
  131. package/lib/channelCollection.d.ts.map +1 -1
  132. package/lib/channelCollection.js +21 -8
  133. package/lib/channelCollection.js.map +1 -1
  134. package/lib/connectionTelemetry.d.ts +2 -2
  135. package/lib/connectionTelemetry.d.ts.map +1 -1
  136. package/lib/connectionTelemetry.js +49 -0
  137. package/lib/connectionTelemetry.js.map +1 -1
  138. package/lib/containerRuntime.d.ts +17 -35
  139. package/lib/containerRuntime.d.ts.map +1 -1
  140. package/lib/containerRuntime.js +195 -164
  141. package/lib/containerRuntime.js.map +1 -1
  142. package/lib/dataStore.d.ts +1 -1
  143. package/lib/dataStore.d.ts.map +1 -1
  144. package/lib/dataStore.js +1 -1
  145. package/lib/dataStore.js.map +1 -1
  146. package/lib/dataStoreContext.d.ts +9 -6
  147. package/lib/dataStoreContext.d.ts.map +1 -1
  148. package/lib/dataStoreContext.js +21 -7
  149. package/lib/dataStoreContext.js.map +1 -1
  150. package/lib/dataStoreContexts.d.ts.map +1 -1
  151. package/lib/dataStoreContexts.js.map +1 -1
  152. package/lib/deltaManagerProxies.d.ts +81 -0
  153. package/lib/deltaManagerProxies.d.ts.map +1 -0
  154. package/lib/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +72 -19
  155. package/lib/deltaManagerProxies.js.map +1 -0
  156. package/lib/deltaScheduler.d.ts +2 -2
  157. package/lib/deltaScheduler.d.ts.map +1 -1
  158. package/lib/deltaScheduler.js.map +1 -1
  159. package/lib/gc/garbageCollection.d.ts +1 -1
  160. package/lib/gc/garbageCollection.d.ts.map +1 -1
  161. package/lib/gc/garbageCollection.js.map +1 -1
  162. package/lib/gc/gcDefinitions.d.ts +1 -1
  163. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  164. package/lib/gc/gcDefinitions.js.map +1 -1
  165. package/lib/gc/gcTelemetry.d.ts +1 -2
  166. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  167. package/lib/gc/gcTelemetry.js.map +1 -1
  168. package/lib/index.d.ts +1 -1
  169. package/lib/index.d.ts.map +1 -1
  170. package/lib/index.js.map +1 -1
  171. package/lib/legacy.d.ts +6 -1
  172. package/lib/messageTypes.d.ts +5 -2
  173. package/lib/messageTypes.d.ts.map +1 -1
  174. package/lib/messageTypes.js.map +1 -1
  175. package/lib/metadata.d.ts +2 -2
  176. package/lib/metadata.d.ts.map +1 -1
  177. package/lib/metadata.js.map +1 -1
  178. package/lib/opLifecycle/batchManager.d.ts +4 -1
  179. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  180. package/lib/opLifecycle/batchManager.js +0 -10
  181. package/lib/opLifecycle/batchManager.js.map +1 -1
  182. package/lib/opLifecycle/outbox.d.ts +0 -4
  183. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  184. package/lib/opLifecycle/outbox.js +7 -38
  185. package/lib/opLifecycle/outbox.js.map +1 -1
  186. package/lib/packageVersion.d.ts +1 -1
  187. package/lib/packageVersion.js +1 -1
  188. package/lib/packageVersion.js.map +1 -1
  189. package/lib/pendingStateManager.d.ts +9 -2
  190. package/lib/pendingStateManager.d.ts.map +1 -1
  191. package/lib/pendingStateManager.js +27 -11
  192. package/lib/pendingStateManager.js.map +1 -1
  193. package/lib/scheduleManager.d.ts +2 -2
  194. package/lib/scheduleManager.d.ts.map +1 -1
  195. package/lib/scheduleManager.js.map +1 -1
  196. package/lib/summary/documentSchema.d.ts +3 -1
  197. package/lib/summary/documentSchema.d.ts.map +1 -1
  198. package/lib/summary/documentSchema.js +25 -7
  199. package/lib/summary/documentSchema.js.map +1 -1
  200. package/lib/summary/index.d.ts +1 -1
  201. package/lib/summary/index.d.ts.map +1 -1
  202. package/lib/summary/index.js.map +1 -1
  203. package/lib/summary/orderedClientElection.d.ts +2 -2
  204. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  205. package/lib/summary/orderedClientElection.js +1 -1
  206. package/lib/summary/orderedClientElection.js.map +1 -1
  207. package/lib/summary/runningSummarizer.js +1 -1
  208. package/lib/summary/runningSummarizer.js.map +1 -1
  209. package/lib/summary/summarizer.d.ts +1 -2
  210. package/lib/summary/summarizer.d.ts.map +1 -1
  211. package/lib/summary/summarizer.js.map +1 -1
  212. package/lib/summary/summarizerClientElection.d.ts +1 -1
  213. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  214. package/lib/summary/summarizerClientElection.js.map +1 -1
  215. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  216. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  217. package/lib/summary/summarizerHeuristics.js.map +1 -1
  218. package/lib/summary/summarizerNode/summarizerNode.d.ts +4 -3
  219. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  220. package/lib/summary/summarizerNode/summarizerNode.js +4 -10
  221. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  222. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -3
  223. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  224. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  225. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -2
  226. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  227. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +2 -9
  228. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  229. package/lib/summary/summarizerTypes.d.ts +3 -5
  230. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  231. package/lib/summary/summarizerTypes.js.map +1 -1
  232. package/lib/summary/summaryCollection.d.ts +2 -2
  233. package/lib/summary/summaryCollection.d.ts.map +1 -1
  234. package/lib/summary/summaryCollection.js.map +1 -1
  235. package/lib/summary/summaryFormat.d.ts +25 -5
  236. package/lib/summary/summaryFormat.d.ts.map +1 -1
  237. package/lib/summary/summaryFormat.js.map +1 -1
  238. package/lib/summary/summaryGenerator.d.ts +1 -2
  239. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  240. package/lib/summary/summaryGenerator.js +5 -4
  241. package/lib/summary/summaryGenerator.js.map +1 -1
  242. package/lib/summary/summaryManager.d.ts.map +1 -1
  243. package/lib/summary/summaryManager.js +2 -2
  244. package/lib/summary/summaryManager.js.map +1 -1
  245. package/lib/tsdoc-metadata.json +1 -1
  246. package/package.json +28 -50
  247. package/src/batchTracker.ts +1 -2
  248. package/src/blobManager.ts +11 -10
  249. package/src/channelCollection.ts +30 -12
  250. package/src/connectionTelemetry.ts +59 -4
  251. package/src/containerRuntime.ts +262 -239
  252. package/src/dataStore.ts +7 -4
  253. package/src/dataStoreContext.ts +57 -16
  254. package/src/dataStoreContexts.ts +1 -2
  255. package/src/{deltaManagerSummarizerProxy.ts → deltaManagerProxies.ts} +98 -24
  256. package/src/deltaScheduler.ts +2 -3
  257. package/src/gc/garbageCollection.ts +1 -1
  258. package/src/gc/gcDefinitions.ts +1 -1
  259. package/src/gc/gcTelemetry.ts +1 -3
  260. package/src/index.ts +5 -0
  261. package/src/messageTypes.ts +4 -2
  262. package/src/metadata.ts +2 -2
  263. package/src/opLifecycle/README.md +4 -4
  264. package/src/opLifecycle/batchManager.ts +5 -14
  265. package/src/opLifecycle/outbox.ts +7 -53
  266. package/src/packageVersion.ts +1 -1
  267. package/src/pendingStateManager.ts +38 -15
  268. package/src/scheduleManager.ts +2 -2
  269. package/src/summary/documentSchema.ts +37 -12
  270. package/src/summary/index.ts +4 -0
  271. package/src/summary/orderedClientElection.ts +6 -3
  272. package/src/summary/runningSummarizer.ts +1 -1
  273. package/src/summary/summarizer.ts +1 -1
  274. package/src/summary/summarizerClientElection.ts +1 -1
  275. package/src/summary/summarizerHeuristics.ts +1 -1
  276. package/src/summary/summarizerNode/summarizerNode.ts +3 -12
  277. package/src/summary/summarizerNode/summarizerNodeUtils.ts +2 -3
  278. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +1 -10
  279. package/src/summary/summarizerTypes.ts +6 -5
  280. package/src/summary/summaryCollection.ts +2 -2
  281. package/src/summary/summaryFormat.ts +30 -4
  282. package/src/summary/summaryGenerator.ts +20 -9
  283. package/src/summary/summaryManager.ts +6 -3
  284. package/dist/deltaManagerSummarizerProxy.d.ts +0 -44
  285. package/dist/deltaManagerSummarizerProxy.d.ts.map +0 -1
  286. package/dist/deltaManagerSummarizerProxy.js.map +0 -1
  287. package/lib/deltaManagerSummarizerProxy.d.ts +0 -44
  288. package/lib/deltaManagerSummarizerProxy.d.ts.map +0 -1
  289. package/lib/deltaManagerSummarizerProxy.js.map +0 -1
@@ -7,14 +7,19 @@ import { AttachState } from "@fluidframework/container-definitions";
7
7
  import {
8
8
  FluidObject,
9
9
  IDisposable,
10
- IFluidHandle,
11
10
  IRequest,
12
11
  IResponse,
13
12
  ITelemetryBaseLogger,
14
13
  } from "@fluidframework/core-interfaces";
14
+ import type { IFluidHandleInternal } from "@fluidframework/core-interfaces/internal";
15
15
  import { assert, Lazy, LazyPromise } from "@fluidframework/core-utils/internal";
16
16
  import { FluidObjectHandle } from "@fluidframework/datastore/internal";
17
- import { buildSnapshotTree } from "@fluidframework/driver-utils/internal";
17
+ import {
18
+ buildSnapshotTree,
19
+ getSnapshotTree,
20
+ isInstanceOfISnapshot,
21
+ } from "@fluidframework/driver-utils/internal";
22
+ import type { ISnapshot } from "@fluidframework/driver-definitions/internal";
18
23
  import { ISequencedDocumentMessage, ISnapshotTree } from "@fluidframework/protocol-definitions";
19
24
  import {
20
25
  IGarbageCollectionData,
@@ -168,6 +173,7 @@ export function wrapContext(context: IFluidParentContext): IFluidParentContext {
168
173
  getAudience: (...args) => {
169
174
  return context.getAudience(...args);
170
175
  },
176
+ // back-compat, to be removed in 2.0
171
177
  ensureNoDataModelChanges: (...args) => {
172
178
  return context.ensureNoDataModelChanges(...args);
173
179
  },
@@ -254,7 +260,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
254
260
 
255
261
  private readonly disposeOnce = new Lazy<void>(() => this.contexts.dispose());
256
262
 
257
- public readonly entryPoint: IFluidHandle<FluidObject>;
263
+ public readonly entryPoint: IFluidHandleInternal<FluidObject>;
258
264
 
259
265
  public readonly containerLoadStats: {
260
266
  // number of dataStores during loadContainer
@@ -268,7 +274,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
268
274
  private dataStoresSinceLastGC: string[] = [];
269
275
  // The handle to the container runtime. This is used mainly for GC purposes to represent outbound reference from
270
276
  // the container runtime to other nodes.
271
- private readonly containerRuntimeHandle: IFluidHandle;
277
+ private readonly containerRuntimeHandle: IFluidHandleInternal;
272
278
  private readonly pendingAliasMap: Map<string, Promise<AliasResult>> = new Map<
273
279
  string,
274
280
  Promise<AliasResult>
@@ -278,7 +284,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
278
284
  private readonly aliasedDataStores: Set<string>;
279
285
 
280
286
  constructor(
281
- protected readonly baseSnapshot: ISnapshotTree | undefined,
287
+ protected readonly baseSnapshot: ISnapshotTree | ISnapshot | undefined,
282
288
  public readonly parentContext: IFluidParentContext,
283
289
  baseLogger: ITelemetryBaseLogger,
284
290
  private readonly gcNodeUpdated: (props: IGCNodeUpdatedProps) => void,
@@ -303,7 +309,8 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
303
309
  // Extract stores stored inside the snapshot
304
310
  const fluidDataStores = new Map<string, ISnapshotTree>();
305
311
  if (baseSnapshot) {
306
- for (const [key, value] of Object.entries(baseSnapshot.trees)) {
312
+ const baseSnapshotTree = getSnapshotTree(baseSnapshot);
313
+ for (const [key, value] of Object.entries(baseSnapshotTree.trees)) {
307
314
  fluidDataStores.set(key, value);
308
315
  }
309
316
  }
@@ -319,9 +326,16 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
319
326
  }
320
327
  // If we have a detached container, then create local data store contexts.
321
328
  if (this.parentContext.attachState !== AttachState.Detached) {
329
+ let snapshotForRemoteFluidDatastoreContext: ISnapshot | ISnapshotTree = value;
330
+ if (isInstanceOfISnapshot(baseSnapshot)) {
331
+ snapshotForRemoteFluidDatastoreContext = {
332
+ ...baseSnapshot,
333
+ snapshotTree: value,
334
+ };
335
+ }
322
336
  dataStoreContext = new RemoteFluidDataStoreContext({
323
337
  id: key,
324
- snapshotTree: value,
338
+ snapshot: snapshotForRemoteFluidDatastoreContext,
325
339
  parentContext: this.wrapContextForInnerChannel(key),
326
340
  storage: this.parentContext.storage,
327
341
  scope: this.parentContext.scope,
@@ -442,9 +456,12 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
442
456
  }
443
457
 
444
458
  const flatAttachBlobs = new Map<string, ArrayBufferLike>();
445
- let snapshotTree: ISnapshotTree | undefined;
459
+ let snapshot: ISnapshotTree | ISnapshot | undefined;
446
460
  if (attachMessage.snapshot) {
447
- snapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatAttachBlobs);
461
+ snapshot = buildSnapshotTree(attachMessage.snapshot.entries, flatAttachBlobs);
462
+ if (isInstanceOfISnapshot(this.baseSnapshot)) {
463
+ snapshot = { ...this.baseSnapshot, snapshotTree: snapshot };
464
+ }
448
465
  }
449
466
 
450
467
  // Include the type of attach message which is the pkg of the store to be
@@ -452,7 +469,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
452
469
  const pkg = [attachMessage.type];
453
470
  const remoteFluidDataStoreContext = new RemoteFluidDataStoreContext({
454
471
  id: attachMessage.id,
455
- snapshotTree,
472
+ snapshot,
456
473
  parentContext: this.wrapContextForInnerChannel(attachMessage.id),
457
474
  storage: new StorageServiceWithAttachBlobs(this.parentContext.storage, flatAttachBlobs),
458
475
  scope: this.parentContext.scope,
@@ -562,8 +579,8 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
562
579
  * If the container is detached, this data store will be part of the summary that makes the container attached.
563
580
  */
564
581
  if (this.parentContext.attachState !== AttachState.Detached) {
565
- localContext.setAttachState(AttachState.Attaching);
566
582
  this.submitAttachChannelOp(localContext);
583
+ localContext.setAttachState(AttachState.Attaching);
567
584
  }
568
585
 
569
586
  this.contexts.bind(id);
@@ -643,6 +660,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
643
660
  createProps?: any,
644
661
  loadingGroupId?: string,
645
662
  ) {
663
+ assert(loadingGroupId !== "", 0x974 /* loadingGroupId should not be the empty string */);
646
664
  const context = new contextCtor({
647
665
  id,
648
666
  pkg,
@@ -1152,7 +1170,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
1152
1170
  0x166 /* "BaseSnapshot should be there as detached container loaded from snapshot" */,
1153
1171
  );
1154
1172
  dataStoreSummary = convertSnapshotTreeToSummaryTree(
1155
- this.baseSnapshot.trees[key],
1173
+ getSnapshotTree(this.baseSnapshot).trees[key],
1156
1174
  );
1157
1175
  }
1158
1176
  builder.addWithStats(key, dataStoreSummary);
@@ -4,18 +4,19 @@
4
4
  */
5
5
 
6
6
  import { performance } from "@fluid-internal/client-utils";
7
- import { IDeltaManager } from "@fluidframework/container-definitions";
7
+ import { IDeltaManager } from "@fluidframework/container-definitions/internal";
8
8
  import { IContainerRuntimeEvents } from "@fluidframework/container-runtime-definitions/internal";
9
9
  import { IEventProvider } from "@fluidframework/core-interfaces";
10
10
  import { assert } from "@fluidframework/core-utils/internal";
11
+ import { isRuntimeMessage } from "@fluidframework/driver-utils/internal";
11
12
  import {
12
13
  IDocumentMessage,
13
14
  ISequencedDocumentMessage,
14
15
  MessageType,
15
16
  } from "@fluidframework/protocol-definitions";
16
- import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
17
17
  import {
18
18
  IEventSampler,
19
+ ITelemetryLoggerExt,
19
20
  ISampledTelemetryLogger,
20
21
  createChildLogger,
21
22
  createSampledLogger,
@@ -80,6 +81,11 @@ class OpPerfTelemetry {
80
81
  private connectionStartTime = 0;
81
82
  private gap = 0;
82
83
 
84
+ /** Count of no-ops sent by this client. This variable is reset everytime the OpStats sampled event is logged */
85
+ private noOpCountForTelemetry = 0;
86
+ /** Cumulative size of the ops processed by this client. This variable is reset everytime the OpStats sampled event is logged */
87
+ private processedOpSizeForTelemetry = 0;
88
+
83
89
  private readonly logger: ITelemetryLoggerExt;
84
90
 
85
91
  private static readonly OP_LATENCY_SAMPLE_RATE = 500;
@@ -88,6 +94,9 @@ class OpPerfTelemetry {
88
94
  private static readonly DELTA_LATENCY_SAMPLE_RATE = 100;
89
95
  private readonly deltaLatencyLogger: ISampledTelemetryLogger;
90
96
 
97
+ private static readonly PROCESSED_OPS_SAMPLE_RATE = 500;
98
+ private readonly opsLogger: ISampledTelemetryLogger;
99
+
91
100
  /**
92
101
  * Create an instance of OpPerfTelemetry which starts monitoring and generating telemetry related to op performance.
93
102
  *
@@ -142,11 +151,27 @@ class OpPerfTelemetry {
142
151
  // due to complexity of the different asynchronus scenarios of the op message lifecycle.
143
152
  this.opLatencyLogger = createSampledLogger(logger);
144
153
 
154
+ const opsEventSampler: IEventSampler = (() => {
155
+ let eventCount = 0;
156
+ return {
157
+ sample: () => {
158
+ eventCount++;
159
+ const shouldSample =
160
+ eventCount % OpPerfTelemetry.PROCESSED_OPS_SAMPLE_RATE === 0;
161
+ if (shouldSample) {
162
+ eventCount = 0;
163
+ this.noOpCountForTelemetry = 0;
164
+ this.processedOpSizeForTelemetry = 0;
165
+ }
166
+ return shouldSample;
167
+ },
168
+ };
169
+ })();
170
+ this.opsLogger = createSampledLogger(logger, opsEventSampler);
171
+
145
172
  this.deltaManager.on("pong", (latency) => this.recordPingTime(latency));
146
173
  this.deltaManager.on("submitOp", (message) => this.beforeOpSubmit(message));
147
-
148
174
  this.deltaManager.on("op", (message) => this.afterProcessingOp(message));
149
-
150
175
  this.deltaManager.on("connect", (details, opsBehind) => {
151
176
  if (opsBehind !== undefined) {
152
177
  this.connectionOpSeqNumber = this.deltaManager.lastKnownSeqNumber;
@@ -226,6 +251,9 @@ class OpPerfTelemetry {
226
251
  latencyStats.opPerfData.lengthInboundQueue = this.deltaManager.inbound.length;
227
252
  }
228
253
  }
254
+ if (isRuntimeMessage(message) && typeof message.contents === "string") {
255
+ this.processedOpSizeForTelemetry += message.contents.length;
256
+ }
229
257
  });
230
258
 
231
259
  this.deltaManager.inbound.on("idle", (count: number, duration: number) => {
@@ -302,6 +330,12 @@ class OpPerfTelemetry {
302
330
  opPerfData: {},
303
331
  });
304
332
  }
333
+
334
+ if (message.type === MessageType.NoOp) {
335
+ // Count the number of no-ops submitted by this client.
336
+ // The value is reset when we log the OpStats sampled event.
337
+ this.noOpCountForTelemetry++;
338
+ }
305
339
  }
306
340
 
307
341
  private afterProcessingOp(message: ISequencedDocumentMessage) {
@@ -335,6 +369,7 @@ class OpPerfTelemetry {
335
369
 
336
370
  if (
337
371
  this.clientId === message.clientId &&
372
+ message.type === MessageType.Operation &&
338
373
  (this.opLatencyLogger.isSamplingDisabled ||
339
374
  this.clientSequenceNumberForLatencyStatistics === message.clientSequenceNumber)
340
375
  ) {
@@ -372,9 +407,29 @@ class OpPerfTelemetry {
372
407
  this.deltaManager.lastSequenceNumber - this.deltaManager.minimumSequenceNumber,
373
408
  ...latencyData.opPerfData,
374
409
  });
410
+
375
411
  this.clientSequenceNumberForLatencyStatistics = undefined;
376
412
  this.latencyStatistics.delete(message.clientSequenceNumber);
377
413
  }
414
+
415
+ if (isRuntimeMessage(message)) {
416
+ // Sampled logging of Ops that have been processed by the current client, the NoOp sent and the
417
+ // size of the ops processed within one sampling window of this log event.
418
+ // This data will be used to monitor the efficiency of NoOp-heuristics or to get approximate collab window size.
419
+ this.opsLogger.sendPerformanceEvent({
420
+ eventName: "OpStats",
421
+ // Logging as 'details' property to avoid adding new column name to the log tables */
422
+ details: {
423
+ // Count of the ops processed by the current client. Note: these counts are after
424
+ // compression/grouping/chunking (if enabled) of the ops.
425
+ processedOpCount: OpPerfTelemetry.PROCESSED_OPS_SAMPLE_RATE,
426
+ // Cumulative size of all the ops processed by the current client since the last OpStats event log
427
+ processedOpSize: this.processedOpSizeForTelemetry,
428
+ // Count of all the NoOp sent by the current client since the last OpStats event log
429
+ submitedNoOpCount: this.noOpCountForTelemetry,
430
+ },
431
+ });
432
+ }
378
433
  }
379
434
  }
380
435
  export interface IPerfSignalReport {