@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.
- package/CHANGELOG.md +46 -0
- package/api-report/container-runtime.api.md +62 -22
- package/dist/blobManager.d.ts +7 -7
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +2 -4
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +6 -4
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +19 -8
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +5 -8
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +65 -38
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +9 -6
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +18 -5
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/{deltaManagerSummarizerProxy.d.ts → deltaManagerProxies.d.ts} +28 -3
- package/dist/deltaManagerProxies.d.ts.map +1 -0
- package/dist/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +38 -2
- package/dist/deltaManagerProxies.js.map +1 -0
- package/dist/deltaScheduler.d.ts +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +5 -0
- package/dist/messageTypes.d.ts +5 -2
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +4 -0
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +5 -4
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +6 -0
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +10 -1
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/documentSchema.js +1 -1
- package/dist/summary/documentSchema.js.map +1 -1
- package/dist/summary/index.d.ts +1 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +1 -1
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runningSummarizer.js +10 -10
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +1 -2
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +1 -1
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +25 -5
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.js +11 -11
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.js +5 -5
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/blobManager.d.ts +7 -7
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +3 -5
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +6 -4
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +20 -9
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +5 -8
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +65 -38
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +9 -6
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +20 -7
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/{deltaManagerSummarizerProxy.d.ts → deltaManagerProxies.d.ts} +28 -3
- package/lib/deltaManagerProxies.d.ts.map +1 -0
- package/lib/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +36 -1
- package/lib/deltaManagerProxies.js.map +1 -0
- package/lib/deltaScheduler.d.ts +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +5 -0
- package/lib/messageTypes.d.ts +5 -2
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts +4 -0
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +5 -4
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +6 -0
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +10 -1
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/documentSchema.js +1 -1
- package/lib/summary/documentSchema.js.map +1 -1
- package/lib/summary/index.d.ts +1 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +1 -1
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runningSummarizer.js +1 -1
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +1 -2
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +1 -1
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +25 -5
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.js +1 -1
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.js +1 -1
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/tsdoc-metadata.json +1 -1
- package/package.json +25 -23
- package/src/blobManager.ts +11 -10
- package/src/channelCollection.ts +29 -13
- package/src/connectionTelemetry.ts +1 -1
- package/src/containerRuntime.ts +93 -53
- package/src/dataStore.ts +2 -2
- package/src/dataStoreContext.ts +56 -16
- package/src/{deltaManagerSummarizerProxy.ts → deltaManagerProxies.ts} +55 -3
- package/src/deltaScheduler.ts +1 -1
- package/src/index.ts +5 -0
- package/src/messageTypes.ts +4 -2
- package/src/opLifecycle/batchManager.ts +5 -0
- package/src/opLifecycle/outbox.ts +5 -4
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +11 -1
- package/src/scheduleManager.ts +1 -1
- package/src/summary/documentSchema.ts +1 -1
- package/src/summary/index.ts +4 -0
- package/src/summary/orderedClientElection.ts +1 -1
- package/src/summary/runningSummarizer.ts +1 -1
- package/src/summary/summarizerTypes.ts +1 -2
- package/src/summary/summaryCollection.ts +1 -1
- package/src/summary/summaryFormat.ts +30 -4
- package/src/summary/summaryGenerator.ts +1 -1
- package/src/summary/summaryManager.ts +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +0 -1
- package/dist/deltaManagerSummarizerProxy.js.map +0 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +0 -1
- package/lib/deltaManagerSummarizerProxy.js.map +0 -1
package/src/dataStoreContext.ts
CHANGED
|
@@ -4,19 +4,26 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
7
|
-
import { AttachState, IAudience
|
|
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 {
|
|
19
|
-
|
|
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 {
|
|
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
|
|
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(
|
|
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?.(
|
|
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<
|
|
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.
|
|
1077
|
-
this.
|
|
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
|
-
|
|
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
|
+
}
|
package/src/deltaScheduler.ts
CHANGED
|
@@ -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";
|
package/src/messageTypes.ts
CHANGED
|
@@ -175,11 +175,13 @@ export type InboundContainerRuntimeMessage =
|
|
|
175
175
|
| UnknownContainerRuntimeMessage
|
|
176
176
|
| ContainerRuntimeDocumentSchemaMessage;
|
|
177
177
|
|
|
178
|
-
/**
|
|
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) {
|
package/src/packageVersion.ts
CHANGED
|
@@ -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
|
-
|
|
144
|
+
0x97c /* saved op should already have a sequence number */,
|
|
135
145
|
);
|
|
136
146
|
return message.sequenceNumber >= (snapshotSequenceNumber ?? 0);
|
|
137
147
|
});
|
package/src/scheduleManager.ts
CHANGED
|
@@ -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,
|
|
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.
|
package/src/summary/index.ts
CHANGED
|
@@ -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
|
-
|
|
25
|
-
interface
|
|
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
|
-
|
|
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
|
-
|
|
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"]}
|