@fluidframework/container-runtime 2.0.0-dev-rc.4.0.0.261659 → 2.0.0-dev-rc.5.0.0.263932

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 (178) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/api-report/container-runtime.api.md +62 -22
  3. package/dist/blobManager.d.ts +7 -7
  4. package/dist/blobManager.d.ts.map +1 -1
  5. package/dist/blobManager.js +2 -4
  6. package/dist/blobManager.js.map +1 -1
  7. package/dist/channelCollection.d.ts +6 -4
  8. package/dist/channelCollection.d.ts.map +1 -1
  9. package/dist/channelCollection.js +19 -8
  10. package/dist/channelCollection.js.map +1 -1
  11. package/dist/connectionTelemetry.d.ts +1 -1
  12. package/dist/connectionTelemetry.d.ts.map +1 -1
  13. package/dist/connectionTelemetry.js.map +1 -1
  14. package/dist/containerRuntime.d.ts +5 -8
  15. package/dist/containerRuntime.d.ts.map +1 -1
  16. package/dist/containerRuntime.js +65 -38
  17. package/dist/containerRuntime.js.map +1 -1
  18. package/dist/dataStore.js.map +1 -1
  19. package/dist/dataStoreContext.d.ts +9 -6
  20. package/dist/dataStoreContext.d.ts.map +1 -1
  21. package/dist/dataStoreContext.js +18 -5
  22. package/dist/dataStoreContext.js.map +1 -1
  23. package/dist/{deltaManagerSummarizerProxy.d.ts → deltaManagerProxies.d.ts} +28 -3
  24. package/dist/deltaManagerProxies.d.ts.map +1 -0
  25. package/dist/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +38 -2
  26. package/dist/deltaManagerProxies.js.map +1 -0
  27. package/dist/deltaScheduler.d.ts +1 -1
  28. package/dist/deltaScheduler.d.ts.map +1 -1
  29. package/dist/deltaScheduler.js.map +1 -1
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/legacy.d.ts +5 -0
  34. package/dist/messageTypes.d.ts +5 -2
  35. package/dist/messageTypes.d.ts.map +1 -1
  36. package/dist/messageTypes.js.map +1 -1
  37. package/dist/opLifecycle/batchManager.d.ts +4 -0
  38. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  39. package/dist/opLifecycle/batchManager.js.map +1 -1
  40. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  41. package/dist/opLifecycle/outbox.js +5 -4
  42. package/dist/opLifecycle/outbox.js.map +1 -1
  43. package/dist/packageVersion.d.ts +1 -1
  44. package/dist/packageVersion.js +1 -1
  45. package/dist/packageVersion.js.map +1 -1
  46. package/dist/pendingStateManager.d.ts +6 -0
  47. package/dist/pendingStateManager.d.ts.map +1 -1
  48. package/dist/pendingStateManager.js +10 -1
  49. package/dist/pendingStateManager.js.map +1 -1
  50. package/dist/scheduleManager.d.ts +1 -1
  51. package/dist/scheduleManager.d.ts.map +1 -1
  52. package/dist/scheduleManager.js.map +1 -1
  53. package/dist/summary/documentSchema.js +1 -1
  54. package/dist/summary/documentSchema.js.map +1 -1
  55. package/dist/summary/index.d.ts +1 -1
  56. package/dist/summary/index.d.ts.map +1 -1
  57. package/dist/summary/index.js.map +1 -1
  58. package/dist/summary/orderedClientElection.d.ts +1 -1
  59. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  60. package/dist/summary/orderedClientElection.js.map +1 -1
  61. package/dist/summary/runningSummarizer.js +10 -10
  62. package/dist/summary/runningSummarizer.js.map +1 -1
  63. package/dist/summary/summarizerTypes.d.ts +1 -2
  64. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  65. package/dist/summary/summarizerTypes.js.map +1 -1
  66. package/dist/summary/summaryCollection.d.ts +1 -1
  67. package/dist/summary/summaryCollection.d.ts.map +1 -1
  68. package/dist/summary/summaryCollection.js.map +1 -1
  69. package/dist/summary/summaryFormat.d.ts +25 -5
  70. package/dist/summary/summaryFormat.d.ts.map +1 -1
  71. package/dist/summary/summaryFormat.js.map +1 -1
  72. package/dist/summary/summaryGenerator.js +11 -11
  73. package/dist/summary/summaryGenerator.js.map +1 -1
  74. package/dist/summary/summaryManager.js +5 -5
  75. package/dist/summary/summaryManager.js.map +1 -1
  76. package/lib/blobManager.d.ts +7 -7
  77. package/lib/blobManager.d.ts.map +1 -1
  78. package/lib/blobManager.js +3 -5
  79. package/lib/blobManager.js.map +1 -1
  80. package/lib/channelCollection.d.ts +6 -4
  81. package/lib/channelCollection.d.ts.map +1 -1
  82. package/lib/channelCollection.js +20 -9
  83. package/lib/channelCollection.js.map +1 -1
  84. package/lib/connectionTelemetry.d.ts +1 -1
  85. package/lib/connectionTelemetry.d.ts.map +1 -1
  86. package/lib/connectionTelemetry.js.map +1 -1
  87. package/lib/containerRuntime.d.ts +5 -8
  88. package/lib/containerRuntime.d.ts.map +1 -1
  89. package/lib/containerRuntime.js +65 -38
  90. package/lib/containerRuntime.js.map +1 -1
  91. package/lib/dataStore.js.map +1 -1
  92. package/lib/dataStoreContext.d.ts +9 -6
  93. package/lib/dataStoreContext.d.ts.map +1 -1
  94. package/lib/dataStoreContext.js +20 -7
  95. package/lib/dataStoreContext.js.map +1 -1
  96. package/lib/{deltaManagerSummarizerProxy.d.ts → deltaManagerProxies.d.ts} +28 -3
  97. package/lib/deltaManagerProxies.d.ts.map +1 -0
  98. package/lib/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +36 -1
  99. package/lib/deltaManagerProxies.js.map +1 -0
  100. package/lib/deltaScheduler.d.ts +1 -1
  101. package/lib/deltaScheduler.d.ts.map +1 -1
  102. package/lib/deltaScheduler.js.map +1 -1
  103. package/lib/index.d.ts +1 -1
  104. package/lib/index.d.ts.map +1 -1
  105. package/lib/index.js.map +1 -1
  106. package/lib/legacy.d.ts +5 -0
  107. package/lib/messageTypes.d.ts +5 -2
  108. package/lib/messageTypes.d.ts.map +1 -1
  109. package/lib/messageTypes.js.map +1 -1
  110. package/lib/opLifecycle/batchManager.d.ts +4 -0
  111. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  112. package/lib/opLifecycle/batchManager.js.map +1 -1
  113. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  114. package/lib/opLifecycle/outbox.js +5 -4
  115. package/lib/opLifecycle/outbox.js.map +1 -1
  116. package/lib/packageVersion.d.ts +1 -1
  117. package/lib/packageVersion.js +1 -1
  118. package/lib/packageVersion.js.map +1 -1
  119. package/lib/pendingStateManager.d.ts +6 -0
  120. package/lib/pendingStateManager.d.ts.map +1 -1
  121. package/lib/pendingStateManager.js +10 -1
  122. package/lib/pendingStateManager.js.map +1 -1
  123. package/lib/scheduleManager.d.ts +1 -1
  124. package/lib/scheduleManager.d.ts.map +1 -1
  125. package/lib/scheduleManager.js.map +1 -1
  126. package/lib/summary/documentSchema.js +1 -1
  127. package/lib/summary/documentSchema.js.map +1 -1
  128. package/lib/summary/index.d.ts +1 -1
  129. package/lib/summary/index.d.ts.map +1 -1
  130. package/lib/summary/index.js.map +1 -1
  131. package/lib/summary/orderedClientElection.d.ts +1 -1
  132. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  133. package/lib/summary/orderedClientElection.js.map +1 -1
  134. package/lib/summary/runningSummarizer.js +1 -1
  135. package/lib/summary/runningSummarizer.js.map +1 -1
  136. package/lib/summary/summarizerTypes.d.ts +1 -2
  137. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  138. package/lib/summary/summarizerTypes.js.map +1 -1
  139. package/lib/summary/summaryCollection.d.ts +1 -1
  140. package/lib/summary/summaryCollection.d.ts.map +1 -1
  141. package/lib/summary/summaryCollection.js.map +1 -1
  142. package/lib/summary/summaryFormat.d.ts +25 -5
  143. package/lib/summary/summaryFormat.d.ts.map +1 -1
  144. package/lib/summary/summaryFormat.js.map +1 -1
  145. package/lib/summary/summaryGenerator.js +1 -1
  146. package/lib/summary/summaryGenerator.js.map +1 -1
  147. package/lib/summary/summaryManager.js +1 -1
  148. package/lib/summary/summaryManager.js.map +1 -1
  149. package/lib/tsdoc-metadata.json +1 -1
  150. package/package.json +25 -23
  151. package/src/blobManager.ts +11 -10
  152. package/src/channelCollection.ts +29 -13
  153. package/src/connectionTelemetry.ts +1 -1
  154. package/src/containerRuntime.ts +93 -53
  155. package/src/dataStore.ts +2 -2
  156. package/src/dataStoreContext.ts +56 -16
  157. package/src/{deltaManagerSummarizerProxy.ts → deltaManagerProxies.ts} +55 -3
  158. package/src/deltaScheduler.ts +1 -1
  159. package/src/index.ts +5 -0
  160. package/src/messageTypes.ts +4 -2
  161. package/src/opLifecycle/batchManager.ts +5 -0
  162. package/src/opLifecycle/outbox.ts +5 -4
  163. package/src/packageVersion.ts +1 -1
  164. package/src/pendingStateManager.ts +11 -1
  165. package/src/scheduleManager.ts +1 -1
  166. package/src/summary/documentSchema.ts +1 -1
  167. package/src/summary/index.ts +4 -0
  168. package/src/summary/orderedClientElection.ts +1 -1
  169. package/src/summary/runningSummarizer.ts +1 -1
  170. package/src/summary/summarizerTypes.ts +1 -2
  171. package/src/summary/summaryCollection.ts +1 -1
  172. package/src/summary/summaryFormat.ts +30 -4
  173. package/src/summary/summaryGenerator.ts +1 -1
  174. package/src/summary/summaryManager.ts +1 -1
  175. package/dist/deltaManagerSummarizerProxy.d.ts.map +0 -1
  176. package/dist/deltaManagerSummarizerProxy.js.map +0 -1
  177. package/lib/deltaManagerSummarizerProxy.d.ts.map +0 -1
  178. package/lib/deltaManagerSummarizerProxy.js.map +0 -1
@@ -4,19 +4,26 @@
4
4
  */
5
5
 
6
6
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
7
- import { AttachState, IAudience, IDeltaManager } from "@fluidframework/container-definitions";
7
+ import { AttachState, IAudience } from "@fluidframework/container-definitions";
8
+ import { IDeltaManager } from "@fluidframework/container-definitions/internal";
8
9
  import {
9
10
  FluidObject,
10
11
  IDisposable,
11
- IEvent,
12
- IFluidHandle,
13
12
  IRequest,
14
13
  IResponse,
15
14
  ITelemetryBaseProperties,
16
15
  } from "@fluidframework/core-interfaces";
16
+ import { type IEvent, type IFluidHandleInternal } from "@fluidframework/core-interfaces/internal";
17
17
  import { assert, LazyPromise, unreachableCase } from "@fluidframework/core-utils/internal";
18
- import { IDocumentStorageService } from "@fluidframework/driver-definitions/internal";
19
- import { BlobTreeEntry, readAndParse } from "@fluidframework/driver-utils/internal";
18
+ import {
19
+ IDocumentStorageService,
20
+ type ISnapshot,
21
+ } from "@fluidframework/driver-definitions/internal";
22
+ import {
23
+ BlobTreeEntry,
24
+ isInstanceOfISnapshot,
25
+ readAndParse,
26
+ } from "@fluidframework/driver-utils/internal";
20
27
  import type { IIdCompressor } from "@fluidframework/id-compressor";
21
28
  import {
22
29
  IClientDetails,
@@ -52,7 +59,11 @@ import {
52
59
  channelsTreeName,
53
60
  gcDataBlobKey,
54
61
  } from "@fluidframework/runtime-definitions/internal";
55
- import { addBlobToSummary } from "@fluidframework/runtime-utils/internal";
62
+ import {
63
+ addBlobToSummary,
64
+ isSnapshotFetchRequiredForLoadingGroupId,
65
+ toFluidHandleInternal,
66
+ } from "@fluidframework/runtime-utils/internal";
56
67
  import {
57
68
  DataCorruptionError,
58
69
  DataProcessingError,
@@ -67,6 +78,7 @@ import {
67
78
 
68
79
  import { detectOutboundRoutesViaDDSKey, sendGCUnexpectedUsageEvent } from "./gc/index.js";
69
80
  import {
81
+ // eslint-disable-next-line import/no-deprecated
70
82
  ReadFluidDataStoreAttributes,
71
83
  WriteFluidDataStoreAttributes,
72
84
  dataStoreAttributesBlobName,
@@ -164,7 +176,7 @@ export interface ILocalDetachedFluidDataStoreContextProps extends ILocalFluidDat
164
176
  * @internal
165
177
  */
166
178
  export interface IRemoteFluidDataStoreContextProps extends IFluidDataStoreContextProps {
167
- readonly snapshotTree: ISnapshotTree | undefined;
179
+ readonly snapshot: ISnapshotTree | ISnapshot | undefined;
168
180
  }
169
181
 
170
182
  // back-compat: To be removed in the future.
@@ -722,11 +734,17 @@ export abstract class FluidDataStoreContext
722
734
  * @param srcHandle - The handle of the node that added the reference.
723
735
  * @param outboundHandle - The handle of the outbound node that is referenced.
724
736
  */
725
- public addedGCOutboundReference(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) {
737
+ public addedGCOutboundReference(
738
+ srcHandle: IFluidHandleInternal,
739
+ outboundHandle: IFluidHandleInternal,
740
+ ): void {
726
741
  // By default, skip this call since the ContainerRuntime will detect the outbound route directly.
727
742
  if (this.mc.config.getBoolean(detectOutboundRoutesViaDDSKey) === true) {
728
743
  // Note: The ContainerRuntime code will check this same setting to avoid double counting.
729
- this.parentContext.addedGCOutboundReference?.(srcHandle, outboundHandle);
744
+ this.parentContext.addedGCOutboundReference?.(
745
+ toFluidHandleInternal(srcHandle),
746
+ toFluidHandleInternal(outboundHandle),
747
+ );
730
748
  }
731
749
  }
732
750
 
@@ -1054,7 +1072,7 @@ export abstract class FluidDataStoreContext
1054
1072
  public async uploadBlob(
1055
1073
  blob: ArrayBufferLike,
1056
1074
  signal?: AbortSignal,
1057
- ): Promise<IFluidHandle<ArrayBufferLike>> {
1075
+ ): Promise<IFluidHandleInternal<ArrayBufferLike>> {
1058
1076
  return this.parentContext.uploadBlob(blob, signal);
1059
1077
  }
1060
1078
  }
@@ -1062,23 +1080,28 @@ export abstract class FluidDataStoreContext
1062
1080
  /** @internal */
1063
1081
  export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
1064
1082
  // Tells whether we need to fetch the snapshot before use. This is to support Data Virtualization.
1065
- private snapshotFetchRequired: boolean;
1083
+ private snapshotFetchRequired: boolean | undefined;
1066
1084
  private readonly runtime: IContainerRuntimeBase;
1085
+ private readonly blobContents: Map<string, ArrayBuffer> | undefined;
1067
1086
 
1068
1087
  constructor(props: IRemoteFluidDataStoreContextProps) {
1069
1088
  super(props, true /* existing */, false /* isLocalDataStore */, () => {
1070
1089
  throw new Error("Already attached");
1071
1090
  });
1072
1091
 
1073
- this._baseSnapshot = props.snapshotTree;
1074
- this.snapshotFetchRequired = !!props.snapshotTree?.omitted;
1075
1092
  this.runtime = props.parentContext.containerRuntime;
1076
- if (props.snapshotTree !== undefined) {
1077
- this.summarizerNode.updateBaseSummaryState(props.snapshotTree);
1093
+ if (isInstanceOfISnapshot(props.snapshot)) {
1094
+ this.blobContents = props.snapshot.blobContents;
1095
+ this._baseSnapshot = props.snapshot.snapshotTree;
1096
+ } else {
1097
+ this._baseSnapshot = props.snapshot;
1098
+ }
1099
+ if (this._baseSnapshot !== undefined) {
1100
+ this.summarizerNode.updateBaseSummaryState(this._baseSnapshot);
1078
1101
  }
1079
1102
  }
1080
1103
 
1081
- /*
1104
+ /*
1082
1105
  This API should not be called for RemoteFluidDataStoreContext. But here is one scenario where it's not the case:
1083
1106
  The scenario (hit by stashedOps.spec.ts, "resends attach op" UT is the following (as far as I understand):
1084
1107
  1. data store is being attached in attached container
@@ -1093,6 +1116,21 @@ export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
1093
1116
  private readonly initialSnapshotDetailsP = new LazyPromise<ISnapshotDetails>(async () => {
1094
1117
  // Sequence number of the snapshot.
1095
1118
  let sequenceNumber: number | undefined;
1119
+ // Check whether we need to fetch the snapshot first to load.
1120
+ if (this.snapshotFetchRequired === undefined && this._baseSnapshot?.groupId !== undefined) {
1121
+ assert(
1122
+ this.blobContents !== undefined,
1123
+ 0x97a /* Blob contents should be present to evaluate */,
1124
+ );
1125
+ assert(
1126
+ this._baseSnapshot !== undefined,
1127
+ 0x97b /* snapshotTree should be present to evaluate */,
1128
+ );
1129
+ this.snapshotFetchRequired = isSnapshotFetchRequiredForLoadingGroupId(
1130
+ this._baseSnapshot,
1131
+ this.blobContents,
1132
+ );
1133
+ }
1096
1134
  if (this.snapshotFetchRequired) {
1097
1135
  assert(
1098
1136
  this.loadingGroupId !== undefined,
@@ -1111,6 +1149,7 @@ export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
1111
1149
 
1112
1150
  if (!!tree && tree.blobs[dataStoreAttributesBlobName] !== undefined) {
1113
1151
  // Need to get through snapshot and use that to populate extraBlobs
1152
+ // eslint-disable-next-line import/no-deprecated
1114
1153
  const attributes = await readAndParse<ReadFluidDataStoreAttributes>(
1115
1154
  this.storage,
1116
1155
  tree.blobs[dataStoreAttributesBlobName],
@@ -1287,6 +1326,7 @@ export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
1287
1326
 
1288
1327
  private readonly initialSnapshotDetailsP = new LazyPromise<ISnapshotDetails>(async () => {
1289
1328
  let snapshot = this.snapshotTree;
1329
+ // eslint-disable-next-line import/no-deprecated
1290
1330
  let attributes: ReadFluidDataStoreAttributes;
1291
1331
  let isRootDataStore = false;
1292
1332
  if (snapshot !== undefined) {
@@ -11,9 +11,9 @@ import type {
11
11
  IDeltaQueue,
12
12
  IDeltaSender,
13
13
  ReadOnlyInfo,
14
- } from "@fluidframework/container-definitions";
14
+ } from "@fluidframework/container-definitions/internal";
15
15
  import type { IErrorBase } from "@fluidframework/core-interfaces";
16
- import type { IAnyDriverError } from "@fluidframework/driver-definitions";
16
+ import type { IAnyDriverError } from "@fluidframework/driver-definitions/internal";
17
17
  import {
18
18
  IClientConfiguration,
19
19
  IClientDetails,
@@ -23,6 +23,7 @@ import {
23
23
  } from "@fluidframework/protocol-definitions";
24
24
 
25
25
  import { summarizerClientType } from "./summary/index.js";
26
+ import type { PendingStateManager } from "./pendingStateManager.js";
26
27
 
27
28
  /**
28
29
  * Base class for DeltaManager proxy that proxy's access to the real DeltaManager.
@@ -139,7 +140,10 @@ export abstract class BaseDeltaManagerProxy
139
140
  private readonly onSubmitOp = (message: IDocumentMessage): void => {
140
141
  this.emit("submitOp", message);
141
142
  };
142
- private readonly onOp = (message: ISequencedDocumentMessage, processingTime: number): void => {
143
+ protected readonly onOp = (
144
+ message: ISequencedDocumentMessage,
145
+ processingTime: number,
146
+ ): void => {
143
147
  this.emit("op", message, processingTime);
144
148
  };
145
149
  private readonly onPong = (latency: number): void => {
@@ -194,3 +198,51 @@ export class DeltaManagerSummarizerProxy extends BaseDeltaManagerProxy {
194
198
  this.isSummarizerClient = this.deltaManager.clientDetails.type === summarizerClientType;
195
199
  }
196
200
  }
201
+
202
+ export class DeltaManagerPendingOpsProxy extends BaseDeltaManagerProxy {
203
+ public get minimumSequenceNumber(): number {
204
+ const minPendingSeqNum = this.pendingStateManager.minimumPendingMessageSequenceNumber;
205
+ // There is a chance that minPendingSeqNum is greater than minimum sequence number.
206
+ // minPendingSeqNum is based on the pending ops, so it's based on ref seq number.
207
+ // Imagine an op has just be sent while there's another client that has been lagging behind,
208
+ // it will likely have a ref seq number greater than the minimum seq number.
209
+ if (
210
+ minPendingSeqNum !== undefined &&
211
+ minPendingSeqNum < this.deltaManager.minimumSequenceNumber
212
+ ) {
213
+ return minPendingSeqNum;
214
+ }
215
+ return this.deltaManager.minimumSequenceNumber;
216
+ }
217
+
218
+ public get lastMessage() {
219
+ if (this.deltaManager.lastMessage === undefined) {
220
+ return this.deltaManager.lastMessage;
221
+ }
222
+ return {
223
+ ...this.deltaManager.lastMessage,
224
+ minimumSequenceNumber: this.minimumSequenceNumber,
225
+ };
226
+ }
227
+
228
+ protected readonly onOp = (
229
+ message: ISequencedDocumentMessage,
230
+ processingTime: number,
231
+ ): void => {
232
+ const messageIntercept = {
233
+ ...message,
234
+ minimumSequenceNumber: this.minimumSequenceNumber,
235
+ };
236
+ this.emit("op", messageIntercept, processingTime);
237
+ };
238
+
239
+ constructor(
240
+ protected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,
241
+ private readonly pendingStateManager: Pick<
242
+ PendingStateManager,
243
+ "minimumPendingMessageSequenceNumber"
244
+ >,
245
+ ) {
246
+ super(deltaManager);
247
+ }
248
+ }
@@ -4,7 +4,7 @@
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 { IDocumentMessage, ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
9
9
  import { ITelemetryLoggerExt, formatTick } from "@fluidframework/telemetry-utils/internal";
10
10
 
package/src/index.ts CHANGED
@@ -107,6 +107,11 @@ export {
107
107
  DocumentsSchemaController,
108
108
  IDocumentSchemaChangeMessage,
109
109
  IDocumentSchemaFeatures,
110
+ ReadFluidDataStoreAttributes,
111
+ IFluidDataStoreAttributes0,
112
+ IFluidDataStoreAttributes1,
113
+ IFluidDataStoreAttributes2,
114
+ OmitAttributesVersions,
110
115
  } from "./summary/index.js";
111
116
  export { IChunkedOp, unpackRuntimeMessage } from "./opLifecycle/index.js";
112
117
  export { ChannelCollection } from "./channelCollection.js";
@@ -175,11 +175,13 @@ export type InboundContainerRuntimeMessage =
175
175
  | UnknownContainerRuntimeMessage
176
176
  | ContainerRuntimeDocumentSchemaMessage;
177
177
 
178
- /** A {@link TypedContainerRuntimeMessage} that has been generated by the container runtime but is not yet being sent to the server. */
178
+ /**
179
+ * A {@link TypedContainerRuntimeMessage} that has been generated by the container runtime but is not yet being sent to the server.
180
+ * These are messages generated by the local runtime, before the outbox's op virtualization step.
181
+ */
179
182
  export type LocalContainerRuntimeMessage =
180
183
  | ContainerRuntimeDataStoreOpMessage
181
184
  | OutboundContainerRuntimeAttachMessage
182
- | ContainerRuntimeChunkedOpMessage
183
185
  | ContainerRuntimeBlobAttachMessage
184
186
  | ContainerRuntimeRejoinMessage
185
187
  | ContainerRuntimeAliasMessage
@@ -10,6 +10,11 @@ import { BatchMessage, IBatch, IBatchCheckpoint } from "./definitions.js";
10
10
  export interface IBatchManagerOptions {
11
11
  readonly hardLimit: number;
12
12
  readonly compressionOptions?: ICompressionRuntimeOptions;
13
+
14
+ /**
15
+ * If true, the outbox is allowed to rebase the batch during flushing.
16
+ */
17
+ readonly canRebase: boolean;
13
18
  }
14
19
 
15
20
  export interface BatchSequenceNumbers {
@@ -112,9 +112,9 @@ export class Outbox {
112
112
  // We need to allow infinite size batches if we enable compression
113
113
  const hardLimit = isCompressionEnabled ? Infinity : this.params.config.maxBatchSizeInBytes;
114
114
 
115
- this.mainBatch = new BatchManager({ hardLimit });
116
- this.blobAttachBatch = new BatchManager({ hardLimit });
117
- this.idAllocationBatch = new BatchManager({ hardLimit });
115
+ this.mainBatch = new BatchManager({ hardLimit, canRebase: true });
116
+ this.blobAttachBatch = new BatchManager({ hardLimit, canRebase: true });
117
+ this.idAllocationBatch = new BatchManager({ hardLimit, canRebase: false });
118
118
  }
119
119
 
120
120
  public get messageCount(): number {
@@ -270,7 +270,7 @@ export class Outbox {
270
270
  const rawBatch = batchManager.popBatch();
271
271
  const shouldGroup =
272
272
  !disableGroupedBatching && this.params.groupingManager.shouldGroup(rawBatch);
273
- if (rawBatch.hasReentrantOps === true && shouldGroup) {
273
+ if (batchManager.options.canRebase && rawBatch.hasReentrantOps === true && shouldGroup) {
274
274
  assert(!this.rebasing, 0x6fa /* A rebased batch should never have reentrant ops */);
275
275
  // If a batch contains reentrant ops (ops created as a result from processing another op)
276
276
  // it needs to be rebased so that we can ensure consistent reference sequence numbers
@@ -300,6 +300,7 @@ export class Outbox {
300
300
  */
301
301
  private rebase(rawBatch: IBatch, batchManager: BatchManager) {
302
302
  assert(!this.rebasing, 0x6fb /* Reentrancy */);
303
+ assert(batchManager.options.canRebase, "BatchManager does not support rebase");
303
304
 
304
305
  this.rebasing = true;
305
306
  for (const message of rawBatch.content) {
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/container-runtime";
9
- export const pkgVersion = "2.0.0-dev-rc.4.0.0.261659";
9
+ export const pkgVersion = "2.0.0-dev-rc.5.0.0.263932";
@@ -86,6 +86,7 @@ function buildPendingMessageContent(
86
86
  */
87
87
  export class PendingStateManager implements IDisposable {
88
88
  private readonly pendingMessages = new Deque<IPendingMessage>();
89
+ // This queue represents already acked messages.
89
90
  private readonly initialMessages = new Deque<IPendingMessage>();
90
91
 
91
92
  /**
@@ -115,6 +116,15 @@ export class PendingStateManager implements IDisposable {
115
116
  return this.pendingMessages.length + this.initialMessages.length;
116
117
  }
117
118
 
119
+ /**
120
+ * The minimumPendingMessageSequenceNumber is the minimum of the first pending message and the first initial message.
121
+ *
122
+ * We need this so that we can properly keep local data and maintain the correct sequence window.
123
+ */
124
+ public get minimumPendingMessageSequenceNumber(): number | undefined {
125
+ return this.pendingMessages.peekFront()?.referenceSequenceNumber;
126
+ }
127
+
118
128
  /**
119
129
  * Called to check if there are any pending messages in the pending message queue.
120
130
  * @returns A boolean indicating whether there are messages or not.
@@ -131,7 +141,7 @@ export class PendingStateManager implements IDisposable {
131
141
  const newSavedOps = [...this.savedOps].filter((message) => {
132
142
  assert(
133
143
  message.sequenceNumber !== undefined,
134
- "saved op should already have a sequence number",
144
+ 0x97c /* saved op should already have a sequence number */,
135
145
  );
136
146
  return message.sequenceNumber >= (snapshotSequenceNumber ?? 0);
137
147
  });
@@ -5,7 +5,7 @@
5
5
 
6
6
  import type { EventEmitter } from "@fluid-internal/client-utils";
7
7
  import { performance } from "@fluid-internal/client-utils";
8
- import { IDeltaManager } from "@fluidframework/container-definitions";
8
+ import { IDeltaManager } from "@fluidframework/container-definitions/internal";
9
9
  import { assert } from "@fluidframework/core-utils/internal";
10
10
  import { isRuntimeMessage } from "@fluidframework/driver-utils/internal";
11
11
  import { IDocumentMessage, ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
@@ -628,7 +628,7 @@ export class DocumentsSchemaController {
628
628
  const schema: IDocumentSchema = { ...content, refSeq: sequenceNumber };
629
629
  this.documentSchema = schema as IDocumentSchemaCurrent;
630
630
  this.sessionSchema = and(this.documentSchema, this.desiredSchema);
631
- assert(this.sessionSchema.refSeq === sequenceNumber, "seq#");
631
+ assert(this.sessionSchema.refSeq === sequenceNumber, 0x97d /* seq# */);
632
632
 
633
633
  // legacy behavior is automatically off for the document once someone sends a schema op -
634
634
  // from now on it's fully controlled by ops.
@@ -98,6 +98,10 @@ export {
98
98
  WriteFluidDataStoreAttributes,
99
99
  wrapSummaryInChannelsTree,
100
100
  idCompressorBlobName,
101
+ IFluidDataStoreAttributes0,
102
+ IFluidDataStoreAttributes1,
103
+ IFluidDataStoreAttributes2,
104
+ OmitAttributesVersions,
101
105
  } from "./summaryFormat.js";
102
106
  export {
103
107
  IdCompressorMode,
@@ -6,7 +6,7 @@
6
6
  /* eslint-disable @rushstack/no-new-null */
7
7
 
8
8
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
9
- import { IDeltaManager } from "@fluidframework/container-definitions";
9
+ import { IDeltaManager } from "@fluidframework/container-definitions/internal";
10
10
  import { IEvent, IEventProvider, ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
11
11
  import { assert } from "@fluidframework/core-utils/internal";
12
12
  import { IClient, IQuorumClients, ISequencedClient } from "@fluidframework/protocol-definitions";
@@ -6,7 +6,7 @@
6
6
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
7
7
  import { IDisposable, ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
8
8
  import { assert, Deferred, PromiseTimer, delay } from "@fluidframework/core-utils/internal";
9
- import { DriverErrorTypes } from "@fluidframework/driver-definitions";
9
+ import { DriverErrorTypes } from "@fluidframework/driver-definitions/internal";
10
10
  import { ISequencedDocumentMessage, MessageType } from "@fluidframework/protocol-definitions";
11
11
  import {
12
12
  MonitoringContext,
@@ -3,8 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { IDeltaManager } from "@fluidframework/container-definitions";
7
- import { ContainerWarning } from "@fluidframework/container-definitions/internal";
6
+ import { IDeltaManager, ContainerWarning } from "@fluidframework/container-definitions/internal";
8
7
  import { IEvent, IEventProvider, ITelemetryBaseProperties } from "@fluidframework/core-interfaces";
9
8
  import {
10
9
  IDocumentMessage,
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
7
- import { IDeltaManager } from "@fluidframework/container-definitions";
7
+ import { IDeltaManager } from "@fluidframework/container-definitions/internal";
8
8
  import { IDisposable, IEvent } from "@fluidframework/core-interfaces";
9
9
  import { assert, Deferred } from "@fluidframework/core-utils/internal";
10
10
  import {
@@ -21,8 +21,17 @@ import { IGCMetadata } from "../gc/index.js";
21
21
 
22
22
  import { IDocumentSchema } from "./documentSchema.js";
23
23
 
24
- type OmitAttributesVersions<T> = Omit<T, "snapshotFormatVersion" | "summaryFormatVersion">;
25
- interface IFluidDataStoreAttributes0 {
24
+ /**
25
+ * @deprecated - This interface will no longer be exported in the future(AB#8004).
26
+ * @alpha
27
+ */
28
+ export type OmitAttributesVersions<T> = Omit<T, "snapshotFormatVersion" | "summaryFormatVersion">;
29
+
30
+ /**
31
+ * @deprecated - This interface will no longer be exported in the future(AB#8004).
32
+ * @alpha
33
+ */
34
+ export interface IFluidDataStoreAttributes0 {
26
35
  readonly snapshotFormatVersion?: undefined;
27
36
  readonly summaryFormatVersion?: undefined;
28
37
  pkg: string;
@@ -33,11 +42,23 @@ interface IFluidDataStoreAttributes0 {
33
42
  */
34
43
  readonly isRootDataStore?: boolean;
35
44
  }
36
- interface IFluidDataStoreAttributes1 extends OmitAttributesVersions<IFluidDataStoreAttributes0> {
45
+
46
+ /**
47
+ * @deprecated - This interface will no longer be exported in the future(AB#8004).
48
+ * @alpha
49
+ */
50
+ export interface IFluidDataStoreAttributes1
51
+ extends OmitAttributesVersions<IFluidDataStoreAttributes0> {
37
52
  readonly snapshotFormatVersion: "0.1";
38
53
  readonly summaryFormatVersion?: undefined;
39
54
  }
40
- interface IFluidDataStoreAttributes2 extends OmitAttributesVersions<IFluidDataStoreAttributes1> {
55
+
56
+ /**
57
+ * @deprecated - This interface will no longer be exported in the future(AB#8004).
58
+ * @alpha
59
+ */
60
+ export interface IFluidDataStoreAttributes2
61
+ extends OmitAttributesVersions<IFluidDataStoreAttributes1> {
41
62
  /** Switch from snapshotFormatVersion to summaryFormatVersion */
42
63
  readonly snapshotFormatVersion?: undefined;
43
64
  readonly summaryFormatVersion: 2;
@@ -53,6 +74,11 @@ interface IFluidDataStoreAttributes2 extends OmitAttributesVersions<IFluidDataSt
53
74
  * Added IFluidDataStoreAttributes similar to IChannelAttributes which will tell the attributes of a
54
75
  * store like the package, snapshotFormatVersion to take different decisions based on a particular
55
76
  * snapshotFormatVersion.
77
+ *
78
+ * @deprecated - This interface will no longer be exported in the future(AB#8004).
79
+ *
80
+ * @alpha
81
+ *
56
82
  */
57
83
  export type ReadFluidDataStoreAttributes =
58
84
  | IFluidDataStoreAttributes0
@@ -11,7 +11,7 @@ import {
11
11
  IPromiseTimerResult,
12
12
  Timer,
13
13
  } from "@fluidframework/core-utils/internal";
14
- import { DriverErrorTypes } from "@fluidframework/driver-definitions";
14
+ import { DriverErrorTypes } from "@fluidframework/driver-definitions/internal";
15
15
  import { getRetryDelaySecondsFromError } from "@fluidframework/driver-utils/internal";
16
16
  import { MessageType } from "@fluidframework/protocol-definitions";
17
17
  import {
@@ -11,7 +11,7 @@ import {
11
11
  ITelemetryBaseLogger,
12
12
  } from "@fluidframework/core-interfaces";
13
13
  import { assert } from "@fluidframework/core-utils/internal";
14
- import { DriverErrorTypes } from "@fluidframework/driver-definitions";
14
+ import { DriverErrorTypes } from "@fluidframework/driver-definitions/internal";
15
15
  import {
16
16
  ITelemetryLoggerExt,
17
17
  PerformanceEvent,
@@ -1 +0,0 @@
1
- {"version":3,"file":"deltaManagerSummarizerProxy.d.ts","sourceRoot":"","sources":["../src/deltaManagerSummarizerProxy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAEX,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EACN,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,yBAAyB,EACzB,cAAc,EACd,MAAM,sCAAsC,CAAC;AAI9C;;;;;GAKG;AACH,8BAAsB,qBACrB,SAAQ,iBAAiB,CAAC,mBAAmB,CAC7C,YAAW,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;IAmEpE,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;IAjE5F,IAAW,YAAY,IAAI,YAAY,CAEtC;IAED,IAAW,OAAO,IAAI,WAAW,CAAC,yBAAyB,CAAC,CAE3D;IAED,IAAW,QAAQ,IAAI,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAErD;IAED,IAAW,aAAa,IAAI,WAAW,CAAC,cAAc,CAAC,CAEtD;IAED,IAAW,qBAAqB,IAAI,MAAM,CAEzC;IAED,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED,IAAW,WAAW,0CAErB;IAED,IAAW,kBAAkB,WAE5B;IAED,IAAW,qBAAqB,IAAI,MAAM,CAEzC;IAED,IAAW,2BAA2B,YAErC;IAED,IAAW,aAAa,IAAI,cAAc,CAEzC;IAED,IAAW,OAAO,IAAI,MAAM,CAE3B;IAED,IAAW,cAAc,IAAI,MAAM,CAElC;IAED,IAAW,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAElE;IAED,IAAW,MAAM,IAAI,OAAO,CAE3B;IAED,IAAW,YAAY,IAAI,YAAY,CAEtC;gBAGmB,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;IAgBrF,OAAO,IAAI,IAAI;IAUf,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IAI5D,KAAK,IAAI,IAAI;IAIpB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAE5B;IACF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAEzB;IACF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAEnB;IACF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAErB;IACF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAExB;IACF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAE3B;IACF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAKzB;CACF;AAED;;;;GAIG;AACH,qBAAa,2BAA4B,SAAQ,qBAAqB;IAwBpE,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;IAvB5F,IAAW,MAAM,IAAI,OAAO,CAI3B;IAED,IAAW,YAAY,IAAI,YAAY,CAYtC;IAED,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;gBAGzB,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;CAK5F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"deltaManagerSummarizerProxy.js","sourceRoot":"","sources":["../src/deltaManagerSummarizerProxy.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type {\n\tIConnectionDetails,\n\tIDeltaManager,\n\tIDeltaManagerEvents,\n\tIDeltaQueue,\n\tIDeltaSender,\n\tReadOnlyInfo,\n} from \"@fluidframework/container-definitions\";\nimport type { IErrorBase } from \"@fluidframework/core-interfaces\";\nimport type { IAnyDriverError } from \"@fluidframework/driver-definitions\";\nimport {\n\tIClientConfiguration,\n\tIClientDetails,\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tISignalMessage,\n} from \"@fluidframework/protocol-definitions\";\n\nimport { summarizerClientType } from \"./summary/index.js\";\n\n/**\n * Base class for DeltaManager proxy that proxy's access to the real DeltaManager.\n *\n * This class allows us to build proxy functionality without actually having to implement all the methods\n * of the DeltaManager.\n */\nexport abstract class BaseDeltaManagerProxy\n\textends TypedEventEmitter<IDeltaManagerEvents>\n\timplements IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>\n{\n\tpublic get IDeltaSender(): IDeltaSender {\n\t\treturn this;\n\t}\n\n\tpublic get inbound(): IDeltaQueue<ISequencedDocumentMessage> {\n\t\treturn this.deltaManager.inbound;\n\t}\n\n\tpublic get outbound(): IDeltaQueue<IDocumentMessage[]> {\n\t\treturn this.deltaManager.outbound;\n\t}\n\n\tpublic get inboundSignal(): IDeltaQueue<ISignalMessage> {\n\t\treturn this.deltaManager.inboundSignal;\n\t}\n\n\tpublic get minimumSequenceNumber(): number {\n\t\treturn this.deltaManager.minimumSequenceNumber;\n\t}\n\n\tpublic get lastSequenceNumber(): number {\n\t\treturn this.deltaManager.lastSequenceNumber;\n\t}\n\n\tpublic get lastMessage() {\n\t\treturn this.deltaManager.lastMessage;\n\t}\n\n\tpublic get lastKnownSeqNumber() {\n\t\treturn this.deltaManager.lastKnownSeqNumber;\n\t}\n\n\tpublic get initialSequenceNumber(): number {\n\t\treturn this.deltaManager.initialSequenceNumber;\n\t}\n\n\tpublic get hasCheckpointSequenceNumber() {\n\t\treturn this.deltaManager.hasCheckpointSequenceNumber;\n\t}\n\n\tpublic get clientDetails(): IClientDetails {\n\t\treturn this.deltaManager.clientDetails;\n\t}\n\n\tpublic get version(): string {\n\t\treturn this.deltaManager.version;\n\t}\n\n\tpublic get maxMessageSize(): number {\n\t\treturn this.deltaManager.maxMessageSize;\n\t}\n\n\tpublic get serviceConfiguration(): IClientConfiguration | undefined {\n\t\treturn this.deltaManager.serviceConfiguration;\n\t}\n\n\tpublic get active(): boolean {\n\t\treturn this.deltaManager.active;\n\t}\n\n\tpublic get readOnlyInfo(): ReadOnlyInfo {\n\t\treturn this.deltaManager.readOnlyInfo;\n\t}\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper();\n\n\t\t// We are expecting this class to have many listeners, so we suppress noisy \"MaxListenersExceededWarning\" logging.\n\t\tsuper.setMaxListeners(0);\n\n\t\tthis.deltaManager.on(\"prepareSend\", this.onPrepareSend);\n\t\tthis.deltaManager.on(\"submitOp\", this.onSubmitOp);\n\t\tthis.deltaManager.on(\"op\", this.onOp);\n\t\tthis.deltaManager.on(\"pong\", this.onPong);\n\t\tthis.deltaManager.on(\"connect\", this.onConnect);\n\t\tthis.deltaManager.on(\"disconnect\", this.onDisconnect);\n\t\tthis.deltaManager.on(\"readonly\", this.onReadonly);\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.deltaManager.off(\"prepareSend\", this.onPrepareSend);\n\t\tthis.deltaManager.off(\"submitOp\", this.onSubmitOp);\n\t\tthis.deltaManager.off(\"op\", this.onOp);\n\t\tthis.deltaManager.off(\"pong\", this.onPong);\n\t\tthis.deltaManager.off(\"connect\", this.onConnect);\n\t\tthis.deltaManager.off(\"disconnect\", this.onDisconnect);\n\t\tthis.deltaManager.off(\"readonly\", this.onReadonly);\n\t}\n\n\tpublic submitSignal(content: string, targetClientId?: string): void {\n\t\treturn this.deltaManager.submitSignal(content, targetClientId);\n\t}\n\n\tpublic flush(): void {\n\t\treturn this.deltaManager.flush();\n\t}\n\n\tprivate readonly onPrepareSend = (messageBuffer: any[]): void => {\n\t\tthis.emit(\"prepareSend\", messageBuffer);\n\t};\n\tprivate readonly onSubmitOp = (message: IDocumentMessage): void => {\n\t\tthis.emit(\"submitOp\", message);\n\t};\n\tprivate readonly onOp = (message: ISequencedDocumentMessage, processingTime: number): void => {\n\t\tthis.emit(\"op\", message, processingTime);\n\t};\n\tprivate readonly onPong = (latency: number): void => {\n\t\tthis.emit(\"pong\", latency);\n\t};\n\tprivate readonly onConnect = (details: IConnectionDetails, opsBehind?: number): void => {\n\t\tthis.emit(\"connect\", details, opsBehind);\n\t};\n\tprivate readonly onDisconnect = (reason: string, error?: IAnyDriverError): void => {\n\t\tthis.emit(\"disconnect\", reason, error);\n\t};\n\tprivate readonly onReadonly = (\n\t\treadonly: boolean,\n\t\treadonlyConnectionReason?: { reason: string; error?: IErrorBase },\n\t): void => {\n\t\tthis.emit(\"readonly\", readonly, readonlyConnectionReason);\n\t};\n}\n\n/**\n * Proxy to the real IDeltaManager for restricting certain access to layers below container runtime in summarizer clients:\n * - Summarizer client should be read-only to layers below the container runtime to restrict local changes.\n * - Summarizer client should not be active to layers below the container runtime to restrict local changes.\n */\nexport class DeltaManagerSummarizerProxy extends BaseDeltaManagerProxy {\n\tpublic get active(): boolean {\n\t\t// Summarize clients should not be active. There shouldn't be any local changes (writes) in the summarizer\n\t\t// except for the SummarizeOp which is generated by the runtime.\n\t\treturn !this.isSummarizerClient && this.deltaManager.active;\n\t}\n\n\tpublic get readOnlyInfo(): ReadOnlyInfo {\n\t\t// Summarizer clients should be read-only as far as the runtime and layers below are concerned. There shouldn't\n\t\t// be any local changes (writes) in the summarizer except for the summarize op which is generated by the runtime.\n\t\tif (this.isSummarizerClient) {\n\t\t\treturn {\n\t\t\t\treadonly: true,\n\t\t\t\tforced: false,\n\t\t\t\tpermissions: undefined,\n\t\t\t\tstorageOnly: false,\n\t\t\t};\n\t\t}\n\t\treturn this.deltaManager.readOnlyInfo;\n\t}\n\n\tprivate readonly isSummarizerClient: boolean;\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper(deltaManager);\n\t\tthis.isSummarizerClient = this.deltaManager.clientDetails.type === summarizerClientType;\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"deltaManagerSummarizerProxy.d.ts","sourceRoot":"","sources":["../src/deltaManagerSummarizerProxy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAEX,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EACN,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,yBAAyB,EACzB,cAAc,EACd,MAAM,sCAAsC,CAAC;AAI9C;;;;;GAKG;AACH,8BAAsB,qBACrB,SAAQ,iBAAiB,CAAC,mBAAmB,CAC7C,YAAW,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;IAmEpE,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;IAjE5F,IAAW,YAAY,IAAI,YAAY,CAEtC;IAED,IAAW,OAAO,IAAI,WAAW,CAAC,yBAAyB,CAAC,CAE3D;IAED,IAAW,QAAQ,IAAI,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAErD;IAED,IAAW,aAAa,IAAI,WAAW,CAAC,cAAc,CAAC,CAEtD;IAED,IAAW,qBAAqB,IAAI,MAAM,CAEzC;IAED,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED,IAAW,WAAW,0CAErB;IAED,IAAW,kBAAkB,WAE5B;IAED,IAAW,qBAAqB,IAAI,MAAM,CAEzC;IAED,IAAW,2BAA2B,YAErC;IAED,IAAW,aAAa,IAAI,cAAc,CAEzC;IAED,IAAW,OAAO,IAAI,MAAM,CAE3B;IAED,IAAW,cAAc,IAAI,MAAM,CAElC;IAED,IAAW,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAElE;IAED,IAAW,MAAM,IAAI,OAAO,CAE3B;IAED,IAAW,YAAY,IAAI,YAAY,CAEtC;gBAGmB,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;IAgBrF,OAAO,IAAI,IAAI;IAUf,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IAI5D,KAAK,IAAI,IAAI;IAIpB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAE5B;IACF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAEzB;IACF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAEnB;IACF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAErB;IACF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAExB;IACF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAE3B;IACF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAKzB;CACF;AAED;;;;GAIG;AACH,qBAAa,2BAA4B,SAAQ,qBAAqB;IAwBpE,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;IAvB5F,IAAW,MAAM,IAAI,OAAO,CAI3B;IAED,IAAW,YAAY,IAAI,YAAY,CAYtC;IAED,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;gBAGzB,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;CAK5F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"deltaManagerSummarizerProxy.js","sourceRoot":"","sources":["../src/deltaManagerSummarizerProxy.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type {\n\tIConnectionDetails,\n\tIDeltaManager,\n\tIDeltaManagerEvents,\n\tIDeltaQueue,\n\tIDeltaSender,\n\tReadOnlyInfo,\n} from \"@fluidframework/container-definitions\";\nimport type { IErrorBase } from \"@fluidframework/core-interfaces\";\nimport type { IAnyDriverError } from \"@fluidframework/driver-definitions\";\nimport {\n\tIClientConfiguration,\n\tIClientDetails,\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tISignalMessage,\n} from \"@fluidframework/protocol-definitions\";\n\nimport { summarizerClientType } from \"./summary/index.js\";\n\n/**\n * Base class for DeltaManager proxy that proxy's access to the real DeltaManager.\n *\n * This class allows us to build proxy functionality without actually having to implement all the methods\n * of the DeltaManager.\n */\nexport abstract class BaseDeltaManagerProxy\n\textends TypedEventEmitter<IDeltaManagerEvents>\n\timplements IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>\n{\n\tpublic get IDeltaSender(): IDeltaSender {\n\t\treturn this;\n\t}\n\n\tpublic get inbound(): IDeltaQueue<ISequencedDocumentMessage> {\n\t\treturn this.deltaManager.inbound;\n\t}\n\n\tpublic get outbound(): IDeltaQueue<IDocumentMessage[]> {\n\t\treturn this.deltaManager.outbound;\n\t}\n\n\tpublic get inboundSignal(): IDeltaQueue<ISignalMessage> {\n\t\treturn this.deltaManager.inboundSignal;\n\t}\n\n\tpublic get minimumSequenceNumber(): number {\n\t\treturn this.deltaManager.minimumSequenceNumber;\n\t}\n\n\tpublic get lastSequenceNumber(): number {\n\t\treturn this.deltaManager.lastSequenceNumber;\n\t}\n\n\tpublic get lastMessage() {\n\t\treturn this.deltaManager.lastMessage;\n\t}\n\n\tpublic get lastKnownSeqNumber() {\n\t\treturn this.deltaManager.lastKnownSeqNumber;\n\t}\n\n\tpublic get initialSequenceNumber(): number {\n\t\treturn this.deltaManager.initialSequenceNumber;\n\t}\n\n\tpublic get hasCheckpointSequenceNumber() {\n\t\treturn this.deltaManager.hasCheckpointSequenceNumber;\n\t}\n\n\tpublic get clientDetails(): IClientDetails {\n\t\treturn this.deltaManager.clientDetails;\n\t}\n\n\tpublic get version(): string {\n\t\treturn this.deltaManager.version;\n\t}\n\n\tpublic get maxMessageSize(): number {\n\t\treturn this.deltaManager.maxMessageSize;\n\t}\n\n\tpublic get serviceConfiguration(): IClientConfiguration | undefined {\n\t\treturn this.deltaManager.serviceConfiguration;\n\t}\n\n\tpublic get active(): boolean {\n\t\treturn this.deltaManager.active;\n\t}\n\n\tpublic get readOnlyInfo(): ReadOnlyInfo {\n\t\treturn this.deltaManager.readOnlyInfo;\n\t}\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper();\n\n\t\t// We are expecting this class to have many listeners, so we suppress noisy \"MaxListenersExceededWarning\" logging.\n\t\tsuper.setMaxListeners(0);\n\n\t\tthis.deltaManager.on(\"prepareSend\", this.onPrepareSend);\n\t\tthis.deltaManager.on(\"submitOp\", this.onSubmitOp);\n\t\tthis.deltaManager.on(\"op\", this.onOp);\n\t\tthis.deltaManager.on(\"pong\", this.onPong);\n\t\tthis.deltaManager.on(\"connect\", this.onConnect);\n\t\tthis.deltaManager.on(\"disconnect\", this.onDisconnect);\n\t\tthis.deltaManager.on(\"readonly\", this.onReadonly);\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.deltaManager.off(\"prepareSend\", this.onPrepareSend);\n\t\tthis.deltaManager.off(\"submitOp\", this.onSubmitOp);\n\t\tthis.deltaManager.off(\"op\", this.onOp);\n\t\tthis.deltaManager.off(\"pong\", this.onPong);\n\t\tthis.deltaManager.off(\"connect\", this.onConnect);\n\t\tthis.deltaManager.off(\"disconnect\", this.onDisconnect);\n\t\tthis.deltaManager.off(\"readonly\", this.onReadonly);\n\t}\n\n\tpublic submitSignal(content: string, targetClientId?: string): void {\n\t\treturn this.deltaManager.submitSignal(content, targetClientId);\n\t}\n\n\tpublic flush(): void {\n\t\treturn this.deltaManager.flush();\n\t}\n\n\tprivate readonly onPrepareSend = (messageBuffer: any[]): void => {\n\t\tthis.emit(\"prepareSend\", messageBuffer);\n\t};\n\tprivate readonly onSubmitOp = (message: IDocumentMessage): void => {\n\t\tthis.emit(\"submitOp\", message);\n\t};\n\tprivate readonly onOp = (message: ISequencedDocumentMessage, processingTime: number): void => {\n\t\tthis.emit(\"op\", message, processingTime);\n\t};\n\tprivate readonly onPong = (latency: number): void => {\n\t\tthis.emit(\"pong\", latency);\n\t};\n\tprivate readonly onConnect = (details: IConnectionDetails, opsBehind?: number): void => {\n\t\tthis.emit(\"connect\", details, opsBehind);\n\t};\n\tprivate readonly onDisconnect = (reason: string, error?: IAnyDriverError): void => {\n\t\tthis.emit(\"disconnect\", reason, error);\n\t};\n\tprivate readonly onReadonly = (\n\t\treadonly: boolean,\n\t\treadonlyConnectionReason?: { reason: string; error?: IErrorBase },\n\t): void => {\n\t\tthis.emit(\"readonly\", readonly, readonlyConnectionReason);\n\t};\n}\n\n/**\n * Proxy to the real IDeltaManager for restricting certain access to layers below container runtime in summarizer clients:\n * - Summarizer client should be read-only to layers below the container runtime to restrict local changes.\n * - Summarizer client should not be active to layers below the container runtime to restrict local changes.\n */\nexport class DeltaManagerSummarizerProxy extends BaseDeltaManagerProxy {\n\tpublic get active(): boolean {\n\t\t// Summarize clients should not be active. There shouldn't be any local changes (writes) in the summarizer\n\t\t// except for the SummarizeOp which is generated by the runtime.\n\t\treturn !this.isSummarizerClient && this.deltaManager.active;\n\t}\n\n\tpublic get readOnlyInfo(): ReadOnlyInfo {\n\t\t// Summarizer clients should be read-only as far as the runtime and layers below are concerned. There shouldn't\n\t\t// be any local changes (writes) in the summarizer except for the summarize op which is generated by the runtime.\n\t\tif (this.isSummarizerClient) {\n\t\t\treturn {\n\t\t\t\treadonly: true,\n\t\t\t\tforced: false,\n\t\t\t\tpermissions: undefined,\n\t\t\t\tstorageOnly: false,\n\t\t\t};\n\t\t}\n\t\treturn this.deltaManager.readOnlyInfo;\n\t}\n\n\tprivate readonly isSummarizerClient: boolean;\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper(deltaManager);\n\t\tthis.isSummarizerClient = this.deltaManager.clientDetails.type === summarizerClientType;\n\t}\n}\n"]}