@fluidframework/register-collection 0.59.2001 → 0.59.3000
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/dist/consensusRegisterCollection.d.ts.map +1 -1
- package/dist/consensusRegisterCollection.js +10 -10
- package/dist/consensusRegisterCollection.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/lib/consensusRegisterCollection.d.ts.map +1 -1
- package/lib/consensusRegisterCollection.js +1 -1
- package/lib/consensusRegisterCollection.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/package.json +13 -12
- package/src/consensusRegisterCollection.ts +8 -10
- package/src/packageVersion.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consensusRegisterCollection.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EACH,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACzB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAA2B,gBAAgB,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAC7G,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,4BAA4B,EAAE,UAAU,EAAE,kCAAkC,EAAE,MAAM,cAAc,CAAC;AAoE5G;;GAEG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CACtC,SAAQ,YAAY,CAAC,kCAAkC,CAAE,YAAW,4BAA4B,CAAC,CAAC,CAAC;IACnG;;;;;;OAMG;WAEW,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,MAAM;IAIpE;;;;OAIG;WACW,UAAU;IAIxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IAEzD;;;OAGG;gBAEC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;IAKlC;;;;;OAKG;IACU,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB3D;;;;OAIG;IACI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,UAA8B,GAAG,CAAC,GAAG,SAAS;IAe5E,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS;IAK1C,IAAI,IAAI,MAAM,EAAE;IAIvB,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IAO5E;;OAEG;cACa,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxE,SAAS,CAAC,YAAY;IAEtB,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO;IAqClG,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"consensusRegisterCollection.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EACH,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACzB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAA2B,gBAAgB,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAC7G,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,4BAA4B,EAAE,UAAU,EAAE,kCAAkC,EAAE,MAAM,cAAc,CAAC;AAoE5G;;GAEG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CACtC,SAAQ,YAAY,CAAC,kCAAkC,CAAE,YAAW,4BAA4B,CAAC,CAAC,CAAC;IACnG;;;;;;OAMG;WAEW,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,MAAM;IAIpE;;;;OAIG;WACW,UAAU;IAIxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IAEzD;;;OAGG;gBAEC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;IAKlC;;;;;OAKG;IACU,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB3D;;;;OAIG;IACI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,UAA8B,GAAG,CAAC,GAAG,SAAS;IAe5E,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS;IAK1C,IAAI,IAAI,MAAM,EAAE;IAIvB,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IAO5E;;OAEG;cACa,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxE,SAAS,CAAC,YAAY;IAEtB,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO;IAqClG,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IA4D3B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,KAAK;IAKb,SAAS,CAAC,cAAc;CAI3B"}
|
|
@@ -89,7 +89,7 @@ class ConsensusRegisterCollection extends shared_object_base_1.SharedObject {
|
|
|
89
89
|
const versions = this.readVersions(key);
|
|
90
90
|
if (versions !== undefined) {
|
|
91
91
|
// We don't support deletion. So there should be at least one value.
|
|
92
|
-
common_utils_1.assert(versions.length > 0, 0x06c /* "Value should be undefined or non-empty" */);
|
|
92
|
+
(0, common_utils_1.assert)(versions.length > 0, 0x06c /* "Value should be undefined or non-empty" */);
|
|
93
93
|
return versions[versions.length - 1];
|
|
94
94
|
}
|
|
95
95
|
}
|
|
@@ -103,7 +103,7 @@ class ConsensusRegisterCollection extends shared_object_base_1.SharedObject {
|
|
|
103
103
|
summarizeCore(serializer) {
|
|
104
104
|
const dataObj = {};
|
|
105
105
|
this.data.forEach((v, k) => { dataObj[k] = v; });
|
|
106
|
-
return shared_object_base_1.createSingleBlobSummary(snapshotFileName, this.stringify(dataObj, serializer));
|
|
106
|
+
return (0, shared_object_base_1.createSingleBlobSummary)(snapshotFileName, this.stringify(dataObj, serializer));
|
|
107
107
|
}
|
|
108
108
|
/**
|
|
109
109
|
* {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}
|
|
@@ -111,10 +111,10 @@ class ConsensusRegisterCollection extends shared_object_base_1.SharedObject {
|
|
|
111
111
|
async loadCore(storage) {
|
|
112
112
|
var _a;
|
|
113
113
|
const blob = await storage.readBlob(snapshotFileName);
|
|
114
|
-
const header = common_utils_1.bufferToString(blob, "utf8");
|
|
114
|
+
const header = (0, common_utils_1.bufferToString)(blob, "utf8");
|
|
115
115
|
const dataObj = this.parse(header, this.serializer);
|
|
116
116
|
for (const key of Object.keys(dataObj)) {
|
|
117
|
-
common_utils_1.assert(((_a = dataObj[key].atomic) === null || _a === void 0 ? void 0 : _a.value.type) !== "Shared",
|
|
117
|
+
(0, common_utils_1.assert)(((_a = dataObj[key].atomic) === null || _a === void 0 ? void 0 : _a.value.type) !== "Shared",
|
|
118
118
|
// eslint-disable-next-line max-len
|
|
119
119
|
0x06d /* "SharedObjects contained in ConsensusRegisterCollection can no longer be deserialized as of 0.17" */);
|
|
120
120
|
this.data.set(key, dataObj[key]);
|
|
@@ -134,7 +134,7 @@ class ConsensusRegisterCollection extends shared_object_base_1.SharedObject {
|
|
|
134
134
|
// Message can be delivered with delay - e.g. resubmitted on reconnect.
|
|
135
135
|
// Use the refSeq from when the op was created, not when it was transmitted
|
|
136
136
|
const refSeqWhenCreated = op.refSeq;
|
|
137
|
-
common_utils_1.assert(refSeqWhenCreated <= message.referenceSequenceNumber, 0x06e /* "Message's reference sequence number < op's reference sequence number!" */);
|
|
137
|
+
(0, common_utils_1.assert)(refSeqWhenCreated <= message.referenceSequenceNumber, 0x06e /* "Message's reference sequence number < op's reference sequence number!" */);
|
|
138
138
|
const value = incomingOpMatchesCurrentFormat(op)
|
|
139
139
|
? this.parse(op.serializedValue, this.serializer)
|
|
140
140
|
: op.value.value;
|
|
@@ -146,7 +146,7 @@ class ConsensusRegisterCollection extends shared_object_base_1.SharedObject {
|
|
|
146
146
|
}
|
|
147
147
|
break;
|
|
148
148
|
}
|
|
149
|
-
default: common_utils_1.unreachableCase(op.type);
|
|
149
|
+
default: (0, common_utils_1.unreachableCase)(op.type);
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
}
|
|
@@ -172,7 +172,7 @@ class ConsensusRegisterCollection extends shared_object_base_1.SharedObject {
|
|
|
172
172
|
if (data === undefined) {
|
|
173
173
|
data = {
|
|
174
174
|
atomic: atomicUpdate,
|
|
175
|
-
versions: [],
|
|
175
|
+
versions: [], // we'll update versions next, leave it empty for now
|
|
176
176
|
};
|
|
177
177
|
this.data.set(key, data);
|
|
178
178
|
}
|
|
@@ -181,7 +181,7 @@ class ConsensusRegisterCollection extends shared_object_base_1.SharedObject {
|
|
|
181
181
|
}
|
|
182
182
|
}
|
|
183
183
|
else {
|
|
184
|
-
common_utils_1.assert(!!data, 0x06f /* "data missing for non-atomic inbound update!" */);
|
|
184
|
+
(0, common_utils_1.assert)(!!data, 0x06f /* "data missing for non-atomic inbound update!" */);
|
|
185
185
|
}
|
|
186
186
|
// Remove versions that were known to the remote client at the time of write
|
|
187
187
|
while (data.versions.length > 0 && refSeq >= data.versions[0].sequenceNumber) {
|
|
@@ -190,10 +190,10 @@ class ConsensusRegisterCollection extends shared_object_base_1.SharedObject {
|
|
|
190
190
|
const versionUpdate = newLocalRegister(sequenceNumber, value);
|
|
191
191
|
// Asserts for data integrity
|
|
192
192
|
if (!this.isAttached()) {
|
|
193
|
-
common_utils_1.assert(refSeq === 0 && sequenceNumber === 0, 0x070 /* "sequence numbers are expected to be 0 when unattached" */);
|
|
193
|
+
(0, common_utils_1.assert)(refSeq === 0 && sequenceNumber === 0, 0x070 /* "sequence numbers are expected to be 0 when unattached" */);
|
|
194
194
|
}
|
|
195
195
|
else if (data.versions.length > 0) {
|
|
196
|
-
common_utils_1.assert(sequenceNumber > data.versions[data.versions.length - 1].sequenceNumber, 0x071 /* "Versions should naturally be ordered by sequenceNumber" */);
|
|
196
|
+
(0, common_utils_1.assert)(sequenceNumber > data.versions[data.versions.length - 1].sequenceNumber, 0x071 /* "Versions should naturally be ordered by sequenceNumber" */);
|
|
197
197
|
}
|
|
198
198
|
// Push the new element.
|
|
199
199
|
data.versions.push(versionUpdate);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consensusRegisterCollection.js","sourceRoot":"","sources":["../src/consensusRegisterCollection.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 { assert, bufferToString, unreachableCase } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n IChannelAttributes,\n IFluidDataStoreRuntime,\n IChannelStorageService,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { createSingleBlobSummary, IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { ConsensusRegisterCollectionFactory } from \"./consensusRegisterCollectionFactory\";\nimport { IConsensusRegisterCollection, ReadPolicy, IConsensusRegisterCollectionEvents } from \"./interfaces\";\n\ninterface ILocalData<T> {\n // Atomic version\n atomic: ILocalRegister<T>;\n\n // All concurrent versions awaiting consensus\n versions: ILocalRegister<T>[];\n}\n\ninterface ILocalRegister<T> {\n // Register value, wrapped for backwards compatibility with < 0.17\n value: {\n type: \"Plain\",\n value: T,\n };\n\n // The sequence number when last consensus was reached\n sequenceNumber: number;\n}\n\nconst newLocalRegister = <T>(sequenceNumber: number, value: T): ILocalRegister<T> => ({\n sequenceNumber,\n value: {\n type: \"Plain\",\n value,\n },\n});\n\n/**\n * An operation for consensus register collection\n */\ninterface IRegisterOperation {\n key: string;\n type: \"write\";\n serializedValue: string;\n\n // Message can be delivered with delay - resubmitted on reconnect.\n // As such, refSeq needs to reference seq # at the time op was created,\n // not when op was actually sent over wire (ISequencedDocumentMessage.referenceSequenceNumber),\n // as client can ingest ops in between.\n refSeq: number | undefined;\n}\n\n/**\n * IRegisterOperation format in versions < 0.17\n */\ninterface IRegisterOperationOld<T> {\n key: string;\n type: \"write\";\n value: {\n type: \"Plain\",\n value: T,\n };\n refSeq: number;\n}\n\n/** Incoming ops could match any of these types */\ntype IIncomingRegisterOperation<T> = IRegisterOperation | IRegisterOperationOld<T>;\n\n/** Distinguish between incoming op formats so we know which type it is */\nconst incomingOpMatchesCurrentFormat = (op): op is IRegisterOperation => \"serializedValue\" in op;\n\n/** The type of the resolve function to call after the local operation is ack'd */\ntype PendingResolve = (winner: boolean) => void;\n\nconst snapshotFileName = \"header\";\n\n/**\n * Implementation of a consensus register collection\n */\nexport class ConsensusRegisterCollection<T>\n extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {\n /**\n * Create a new consensus register collection\n *\n * @param runtime - data store runtime the new consensus register collection belongs to\n * @param id - optional name of the consensus register collection\n * @returns newly create consensus register collection (but not attached yet)\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n public static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {\n return runtime.createChannel(id, ConsensusRegisterCollectionFactory.Type) as ConsensusRegisterCollection<T>;\n }\n\n /**\n * Get a factory for ConsensusRegisterCollection to register with the data store.\n *\n * @returns a factory that creates and load ConsensusRegisterCollection\n */\n public static getFactory() {\n return new ConsensusRegisterCollectionFactory();\n }\n\n private readonly data = new Map<string, ILocalData<T>>();\n\n /**\n * Constructs a new consensus register collection. If the object is non-local an id and service interfaces will\n * be provided\n */\n public constructor(\n id: string,\n runtime: IFluidDataStoreRuntime,\n attributes: IChannelAttributes,\n ) {\n super(id, runtime, attributes);\n }\n\n /**\n * Creates a new register or writes a new value.\n * Returns a promise that will resolve when the write is acked.\n *\n * @returns Promise<true> if write was non-concurrent\n */\n public async write(key: string, value: T): Promise<boolean> {\n const serializedValue = this.stringify(value, this.serializer);\n\n if (!this.isAttached()) {\n // JSON-roundtrip value for local writes to match the behavior of going through the wire\n this.processInboundWrite(key, this.parse(serializedValue, this.serializer), 0, 0, true);\n return true;\n }\n\n const message: IRegisterOperation = {\n key,\n type: \"write\",\n serializedValue,\n refSeq: this.runtime.deltaManager.lastSequenceNumber,\n };\n\n return this.newAckBasedPromise<boolean>((resolve) => {\n // Send the resolve function as the localOpMetadata. This will be provided back to us when the\n // op is ack'd.\n this.submitLocalMessage(message, resolve);\n // If we fail due to runtime being disposed, it's better to return false then unhandled exception.\n }).catch((error) => false);\n }\n\n /**\n * Returns the most recent local value of a register.\n * @param key - The key to read\n * @param readPolicy - The ReadPolicy to apply. Defaults to Atomic.\n */\n public read(key: string, readPolicy: ReadPolicy = ReadPolicy.Atomic): T | undefined {\n if (readPolicy === ReadPolicy.Atomic) {\n return this.readAtomic(key);\n }\n\n const versions = this.readVersions(key);\n\n if (versions !== undefined) {\n // We don't support deletion. So there should be at least one value.\n assert(versions.length > 0, 0x06c /* \"Value should be undefined or non-empty\" */);\n\n return versions[versions.length - 1];\n }\n }\n\n public readVersions(key: string): T[] | undefined {\n const data = this.data.get(key);\n return data?.versions.map((element: ILocalRegister<T>) => element.value.value);\n }\n\n public keys(): string[] {\n return [...this.data.keys()];\n }\n\n protected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n const dataObj: { [key: string]: ILocalData<T> } = {};\n this.data.forEach((v, k) => { dataObj[k] = v; });\n\n return createSingleBlobSummary(snapshotFileName, this.stringify(dataObj, serializer));\n }\n\n /**\n * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n */\n protected async loadCore(storage: IChannelStorageService): Promise<void> {\n const blob = await storage.readBlob(snapshotFileName);\n const header = bufferToString(blob, \"utf8\");\n const dataObj = this.parse(header, this.serializer);\n\n for (const key of Object.keys(dataObj)) {\n assert(dataObj[key].atomic?.value.type !== \"Shared\",\n // eslint-disable-next-line max-len\n 0x06d /* \"SharedObjects contained in ConsensusRegisterCollection can no longer be deserialized as of 0.17\" */);\n\n this.data.set(key, dataObj[key]);\n }\n }\n\n protected onDisconnect() {}\n\n protected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n if (message.type === MessageType.Operation) {\n const op: IIncomingRegisterOperation<T> = message.contents;\n switch (op.type) {\n case \"write\": {\n // backward compatibility: File at rest written with runtime <= 0.13 do not have refSeq\n // when the refSeq property didn't exist\n if (op.refSeq === undefined) {\n op.refSeq = message.referenceSequenceNumber;\n }\n // Message can be delivered with delay - e.g. resubmitted on reconnect.\n // Use the refSeq from when the op was created, not when it was transmitted\n const refSeqWhenCreated = op.refSeq;\n assert(refSeqWhenCreated <= message.referenceSequenceNumber,\n 0x06e /* \"Message's reference sequence number < op's reference sequence number!\" */);\n\n const value = incomingOpMatchesCurrentFormat(op)\n ? this.parse(op.serializedValue, this.serializer) as T\n : op.value.value;\n const winner = this.processInboundWrite(\n op.key,\n value,\n refSeqWhenCreated,\n message.sequenceNumber,\n local);\n if (local) {\n // Resolve the pending promise for this operation now that we have received an ack for it.\n const resolve = localOpMetadata as PendingResolve;\n resolve(winner);\n }\n break;\n }\n default: unreachableCase(op.type);\n }\n }\n }\n\n private readAtomic(key: string): T | undefined {\n const data = this.data.get(key);\n return data?.atomic.value.value;\n }\n\n /**\n * Process an inbound write op\n * @param key - Key that was written to\n * @param value - Incoming value\n * @param refSeq - RefSeq at the time of write on the remote client\n * @param sequenceNumber - Sequence Number of this write op\n * @param local - Did this write originate on this client\n */\n private processInboundWrite(\n key: string,\n value: T,\n refSeq: number,\n sequenceNumber: number,\n local: boolean,\n ): boolean {\n let data = this.data.get(key);\n // Atomic update if it's a new register or the write was not concurrent,\n // meaning our state was known to the remote client at the time of write\n const winner = data === undefined || refSeq >= data.atomic.sequenceNumber;\n if (winner) {\n const atomicUpdate = newLocalRegister<T>(\n sequenceNumber,\n value,\n );\n if (data === undefined) {\n data = {\n atomic: atomicUpdate,\n versions: [], // we'll update versions next, leave it empty for now\n };\n this.data.set(key, data);\n } else {\n data.atomic = atomicUpdate;\n }\n }\n else {\n assert(!!data, 0x06f /* \"data missing for non-atomic inbound update!\" */);\n }\n\n // Remove versions that were known to the remote client at the time of write\n while (data.versions.length > 0 && refSeq >= data.versions[0].sequenceNumber) {\n data.versions.shift();\n }\n\n const versionUpdate = newLocalRegister<T>(\n sequenceNumber,\n value,\n );\n\n // Asserts for data integrity\n if (!this.isAttached()) {\n assert(refSeq === 0 && sequenceNumber === 0,\n 0x070 /* \"sequence numbers are expected to be 0 when unattached\" */);\n }\n else if (data.versions.length > 0) {\n assert(sequenceNumber > data.versions[data.versions.length - 1].sequenceNumber,\n 0x071 /* \"Versions should naturally be ordered by sequenceNumber\" */);\n }\n\n // Push the new element.\n data.versions.push(versionUpdate);\n\n // Raise events at the end, to avoid reentrancy issues\n if (winner) {\n this.emit(\"atomicChanged\", key, value, local);\n }\n this.emit(\"versionChanged\", key, value, local);\n\n return winner;\n }\n\n private stringify(value: any, serializer: IFluidSerializer): string {\n return serializer.stringify(value, this.handle);\n }\n\n private parse(content: string, serializer: IFluidSerializer): any {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return serializer.parse(content);\n }\n\n protected applyStashedOp() {\n // empty implementation\n return () => { };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"consensusRegisterCollection.js","sourceRoot":"","sources":["../src/consensusRegisterCollection.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 { assert, bufferToString, unreachableCase } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n IChannelAttributes,\n IFluidDataStoreRuntime,\n IChannelStorageService,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { createSingleBlobSummary, IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { ConsensusRegisterCollectionFactory } from \"./consensusRegisterCollectionFactory\";\nimport { IConsensusRegisterCollection, ReadPolicy, IConsensusRegisterCollectionEvents } from \"./interfaces\";\n\ninterface ILocalData<T> {\n // Atomic version\n atomic: ILocalRegister<T>;\n\n // All concurrent versions awaiting consensus\n versions: ILocalRegister<T>[];\n}\n\ninterface ILocalRegister<T> {\n // Register value, wrapped for backwards compatibility with < 0.17\n value: {\n type: \"Plain\";\n value: T;\n };\n\n // The sequence number when last consensus was reached\n sequenceNumber: number;\n}\n\nconst newLocalRegister = <T>(sequenceNumber: number, value: T): ILocalRegister<T> => ({\n sequenceNumber,\n value: {\n type: \"Plain\",\n value,\n },\n});\n\n/**\n * An operation for consensus register collection\n */\ninterface IRegisterOperation {\n key: string;\n type: \"write\";\n serializedValue: string;\n\n // Message can be delivered with delay - resubmitted on reconnect.\n // As such, refSeq needs to reference seq # at the time op was created,\n // not when op was actually sent over wire (ISequencedDocumentMessage.referenceSequenceNumber),\n // as client can ingest ops in between.\n refSeq: number | undefined;\n}\n\n/**\n * IRegisterOperation format in versions \\< 0.17\n */\ninterface IRegisterOperationOld<T> {\n key: string;\n type: \"write\";\n value: {\n type: \"Plain\";\n value: T;\n };\n refSeq: number;\n}\n\n/** Incoming ops could match any of these types */\ntype IIncomingRegisterOperation<T> = IRegisterOperation | IRegisterOperationOld<T>;\n\n/** Distinguish between incoming op formats so we know which type it is */\nconst incomingOpMatchesCurrentFormat = (op): op is IRegisterOperation => \"serializedValue\" in op;\n\n/** The type of the resolve function to call after the local operation is ack'd */\ntype PendingResolve = (winner: boolean) => void;\n\nconst snapshotFileName = \"header\";\n\n/**\n * Implementation of a consensus register collection\n */\nexport class ConsensusRegisterCollection<T>\n extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {\n /**\n * Create a new consensus register collection\n *\n * @param runtime - data store runtime the new consensus register collection belongs to\n * @param id - optional name of the consensus register collection\n * @returns newly create consensus register collection (but not attached yet)\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n public static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {\n return runtime.createChannel(id, ConsensusRegisterCollectionFactory.Type) as ConsensusRegisterCollection<T>;\n }\n\n /**\n * Get a factory for ConsensusRegisterCollection to register with the data store.\n *\n * @returns a factory that creates and load ConsensusRegisterCollection\n */\n public static getFactory() {\n return new ConsensusRegisterCollectionFactory();\n }\n\n private readonly data = new Map<string, ILocalData<T>>();\n\n /**\n * Constructs a new consensus register collection. If the object is non-local an id and service interfaces will\n * be provided\n */\n public constructor(\n id: string,\n runtime: IFluidDataStoreRuntime,\n attributes: IChannelAttributes,\n ) {\n super(id, runtime, attributes);\n }\n\n /**\n * Creates a new register or writes a new value.\n * Returns a promise that will resolve when the write is acked.\n *\n * @returns Promise<true> if write was non-concurrent\n */\n public async write(key: string, value: T): Promise<boolean> {\n const serializedValue = this.stringify(value, this.serializer);\n\n if (!this.isAttached()) {\n // JSON-roundtrip value for local writes to match the behavior of going through the wire\n this.processInboundWrite(key, this.parse(serializedValue, this.serializer), 0, 0, true);\n return true;\n }\n\n const message: IRegisterOperation = {\n key,\n type: \"write\",\n serializedValue,\n refSeq: this.runtime.deltaManager.lastSequenceNumber,\n };\n\n return this.newAckBasedPromise<boolean>((resolve) => {\n // Send the resolve function as the localOpMetadata. This will be provided back to us when the\n // op is ack'd.\n this.submitLocalMessage(message, resolve);\n // If we fail due to runtime being disposed, it's better to return false then unhandled exception.\n }).catch((error) => false);\n }\n\n /**\n * Returns the most recent local value of a register.\n * @param key - The key to read\n * @param readPolicy - The ReadPolicy to apply. Defaults to Atomic.\n */\n public read(key: string, readPolicy: ReadPolicy = ReadPolicy.Atomic): T | undefined {\n if (readPolicy === ReadPolicy.Atomic) {\n return this.readAtomic(key);\n }\n\n const versions = this.readVersions(key);\n\n if (versions !== undefined) {\n // We don't support deletion. So there should be at least one value.\n assert(versions.length > 0, 0x06c /* \"Value should be undefined or non-empty\" */);\n\n return versions[versions.length - 1];\n }\n }\n\n public readVersions(key: string): T[] | undefined {\n const data = this.data.get(key);\n return data?.versions.map((element: ILocalRegister<T>) => element.value.value);\n }\n\n public keys(): string[] {\n return [...this.data.keys()];\n }\n\n protected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n const dataObj: { [key: string]: ILocalData<T>; } = {};\n this.data.forEach((v, k) => { dataObj[k] = v; });\n\n return createSingleBlobSummary(snapshotFileName, this.stringify(dataObj, serializer));\n }\n\n /**\n * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n */\n protected async loadCore(storage: IChannelStorageService): Promise<void> {\n const blob = await storage.readBlob(snapshotFileName);\n const header = bufferToString(blob, \"utf8\");\n const dataObj = this.parse(header, this.serializer);\n\n for (const key of Object.keys(dataObj)) {\n assert(dataObj[key].atomic?.value.type !== \"Shared\",\n // eslint-disable-next-line max-len\n 0x06d /* \"SharedObjects contained in ConsensusRegisterCollection can no longer be deserialized as of 0.17\" */);\n\n this.data.set(key, dataObj[key]);\n }\n }\n\n protected onDisconnect() {}\n\n protected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n if (message.type === MessageType.Operation) {\n const op: IIncomingRegisterOperation<T> = message.contents;\n switch (op.type) {\n case \"write\": {\n // backward compatibility: File at rest written with runtime <= 0.13 do not have refSeq\n // when the refSeq property didn't exist\n if (op.refSeq === undefined) {\n op.refSeq = message.referenceSequenceNumber;\n }\n // Message can be delivered with delay - e.g. resubmitted on reconnect.\n // Use the refSeq from when the op was created, not when it was transmitted\n const refSeqWhenCreated = op.refSeq;\n assert(refSeqWhenCreated <= message.referenceSequenceNumber,\n 0x06e /* \"Message's reference sequence number < op's reference sequence number!\" */);\n\n const value = incomingOpMatchesCurrentFormat(op)\n ? this.parse(op.serializedValue, this.serializer) as T\n : op.value.value;\n const winner = this.processInboundWrite(\n op.key,\n value,\n refSeqWhenCreated,\n message.sequenceNumber,\n local);\n if (local) {\n // Resolve the pending promise for this operation now that we have received an ack for it.\n const resolve = localOpMetadata as PendingResolve;\n resolve(winner);\n }\n break;\n }\n default: unreachableCase(op.type);\n }\n }\n }\n\n private readAtomic(key: string): T | undefined {\n const data = this.data.get(key);\n return data?.atomic.value.value;\n }\n\n /**\n * Process an inbound write op\n * @param key - Key that was written to\n * @param value - Incoming value\n * @param refSeq - RefSeq at the time of write on the remote client\n * @param sequenceNumber - Sequence Number of this write op\n * @param local - Did this write originate on this client\n */\n private processInboundWrite(\n key: string,\n value: T,\n refSeq: number,\n sequenceNumber: number,\n local: boolean,\n ): boolean {\n let data = this.data.get(key);\n // Atomic update if it's a new register or the write was not concurrent,\n // meaning our state was known to the remote client at the time of write\n const winner = data === undefined || refSeq >= data.atomic.sequenceNumber;\n if (winner) {\n const atomicUpdate = newLocalRegister<T>(\n sequenceNumber,\n value,\n );\n if (data === undefined) {\n data = {\n atomic: atomicUpdate,\n versions: [], // we'll update versions next, leave it empty for now\n };\n this.data.set(key, data);\n } else {\n data.atomic = atomicUpdate;\n }\n } else {\n assert(!!data, 0x06f /* \"data missing for non-atomic inbound update!\" */);\n }\n\n // Remove versions that were known to the remote client at the time of write\n while (data.versions.length > 0 && refSeq >= data.versions[0].sequenceNumber) {\n data.versions.shift();\n }\n\n const versionUpdate = newLocalRegister<T>(\n sequenceNumber,\n value,\n );\n\n // Asserts for data integrity\n if (!this.isAttached()) {\n assert(refSeq === 0 && sequenceNumber === 0,\n 0x070 /* \"sequence numbers are expected to be 0 when unattached\" */);\n } else if (data.versions.length > 0) {\n assert(sequenceNumber > data.versions[data.versions.length - 1].sequenceNumber,\n 0x071 /* \"Versions should naturally be ordered by sequenceNumber\" */);\n }\n\n // Push the new element.\n data.versions.push(versionUpdate);\n\n // Raise events at the end, to avoid reentrancy issues\n if (winner) {\n this.emit(\"atomicChanged\", key, value, local);\n }\n this.emit(\"versionChanged\", key, value, local);\n\n return winner;\n }\n\n private stringify(value: any, serializer: IFluidSerializer): string {\n return serializer.stringify(value, this.handle);\n }\n\n private parse(content: string, serializer: IFluidSerializer): any {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return serializer.parse(content);\n }\n\n protected applyStashedOp() {\n // empty implementation\n return () => { };\n }\n}\n"]}
|
package/dist/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/register-collection";
|
|
8
|
-
export declare const pkgVersion = "0.59.
|
|
8
|
+
export declare const pkgVersion = "0.59.3000";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/dist/packageVersion.js
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/register-collection";
|
|
11
|
-
exports.pkgVersion = "0.59.
|
|
11
|
+
exports.pkgVersion = "0.59.3000";
|
|
12
12
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,qCAAqC,CAAC;AAChD,QAAA,UAAU,GAAG,WAAW,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/register-collection\";\nexport const pkgVersion = \"0.59.
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,qCAAqC,CAAC;AAChD,QAAA,UAAU,GAAG,WAAW,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/register-collection\";\nexport const pkgVersion = \"0.59.3000\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consensusRegisterCollection.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EACH,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACzB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAA2B,gBAAgB,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAC7G,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,4BAA4B,EAAE,UAAU,EAAE,kCAAkC,EAAE,MAAM,cAAc,CAAC;AAoE5G;;GAEG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CACtC,SAAQ,YAAY,CAAC,kCAAkC,CAAE,YAAW,4BAA4B,CAAC,CAAC,CAAC;IACnG;;;;;;OAMG;WAEW,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,MAAM;IAIpE;;;;OAIG;WACW,UAAU;IAIxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IAEzD;;;OAGG;gBAEC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;IAKlC;;;;;OAKG;IACU,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB3D;;;;OAIG;IACI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,UAA8B,GAAG,CAAC,GAAG,SAAS;IAe5E,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS;IAK1C,IAAI,IAAI,MAAM,EAAE;IAIvB,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IAO5E;;OAEG;cACa,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxE,SAAS,CAAC,YAAY;IAEtB,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO;IAqClG,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"consensusRegisterCollection.d.ts","sourceRoot":"","sources":["../src/consensusRegisterCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EACH,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACzB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAA2B,gBAAgB,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAC7G,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,4BAA4B,EAAE,UAAU,EAAE,kCAAkC,EAAE,MAAM,cAAc,CAAC;AAoE5G;;GAEG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CACtC,SAAQ,YAAY,CAAC,kCAAkC,CAAE,YAAW,4BAA4B,CAAC,CAAC,CAAC;IACnG;;;;;;OAMG;WAEW,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,MAAM;IAIpE;;;;OAIG;WACW,UAAU;IAIxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IAEzD;;;OAGG;gBAEC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;IAKlC;;;;;OAKG;IACU,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB3D;;;;OAIG;IACI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,UAA8B,GAAG,CAAC,GAAG,SAAS;IAe5E,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS;IAK1C,IAAI,IAAI,MAAM,EAAE;IAIvB,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IAO5E;;OAEG;cACa,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxE,SAAS,CAAC,YAAY;IAEtB,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO;IAqClG,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IA4D3B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,KAAK;IAKb,SAAS,CAAC,cAAc;CAI3B"}
|
|
@@ -169,7 +169,7 @@ export class ConsensusRegisterCollection extends SharedObject {
|
|
|
169
169
|
if (data === undefined) {
|
|
170
170
|
data = {
|
|
171
171
|
atomic: atomicUpdate,
|
|
172
|
-
versions: [],
|
|
172
|
+
versions: [], // we'll update versions next, leave it empty for now
|
|
173
173
|
};
|
|
174
174
|
this.data.set(key, data);
|
|
175
175
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consensusRegisterCollection.js","sourceRoot":"","sources":["../src/consensusRegisterCollection.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 { assert, bufferToString, unreachableCase } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n IChannelAttributes,\n IFluidDataStoreRuntime,\n IChannelStorageService,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { createSingleBlobSummary, IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { ConsensusRegisterCollectionFactory } from \"./consensusRegisterCollectionFactory\";\nimport { IConsensusRegisterCollection, ReadPolicy, IConsensusRegisterCollectionEvents } from \"./interfaces\";\n\ninterface ILocalData<T> {\n // Atomic version\n atomic: ILocalRegister<T>;\n\n // All concurrent versions awaiting consensus\n versions: ILocalRegister<T>[];\n}\n\ninterface ILocalRegister<T> {\n // Register value, wrapped for backwards compatibility with < 0.17\n value: {\n type: \"Plain\",\n value: T,\n };\n\n // The sequence number when last consensus was reached\n sequenceNumber: number;\n}\n\nconst newLocalRegister = <T>(sequenceNumber: number, value: T): ILocalRegister<T> => ({\n sequenceNumber,\n value: {\n type: \"Plain\",\n value,\n },\n});\n\n/**\n * An operation for consensus register collection\n */\ninterface IRegisterOperation {\n key: string;\n type: \"write\";\n serializedValue: string;\n\n // Message can be delivered with delay - resubmitted on reconnect.\n // As such, refSeq needs to reference seq # at the time op was created,\n // not when op was actually sent over wire (ISequencedDocumentMessage.referenceSequenceNumber),\n // as client can ingest ops in between.\n refSeq: number | undefined;\n}\n\n/**\n * IRegisterOperation format in versions < 0.17\n */\ninterface IRegisterOperationOld<T> {\n key: string;\n type: \"write\";\n value: {\n type: \"Plain\",\n value: T,\n };\n refSeq: number;\n}\n\n/** Incoming ops could match any of these types */\ntype IIncomingRegisterOperation<T> = IRegisterOperation | IRegisterOperationOld<T>;\n\n/** Distinguish between incoming op formats so we know which type it is */\nconst incomingOpMatchesCurrentFormat = (op): op is IRegisterOperation => \"serializedValue\" in op;\n\n/** The type of the resolve function to call after the local operation is ack'd */\ntype PendingResolve = (winner: boolean) => void;\n\nconst snapshotFileName = \"header\";\n\n/**\n * Implementation of a consensus register collection\n */\nexport class ConsensusRegisterCollection<T>\n extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {\n /**\n * Create a new consensus register collection\n *\n * @param runtime - data store runtime the new consensus register collection belongs to\n * @param id - optional name of the consensus register collection\n * @returns newly create consensus register collection (but not attached yet)\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n public static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {\n return runtime.createChannel(id, ConsensusRegisterCollectionFactory.Type) as ConsensusRegisterCollection<T>;\n }\n\n /**\n * Get a factory for ConsensusRegisterCollection to register with the data store.\n *\n * @returns a factory that creates and load ConsensusRegisterCollection\n */\n public static getFactory() {\n return new ConsensusRegisterCollectionFactory();\n }\n\n private readonly data = new Map<string, ILocalData<T>>();\n\n /**\n * Constructs a new consensus register collection. If the object is non-local an id and service interfaces will\n * be provided\n */\n public constructor(\n id: string,\n runtime: IFluidDataStoreRuntime,\n attributes: IChannelAttributes,\n ) {\n super(id, runtime, attributes);\n }\n\n /**\n * Creates a new register or writes a new value.\n * Returns a promise that will resolve when the write is acked.\n *\n * @returns Promise<true> if write was non-concurrent\n */\n public async write(key: string, value: T): Promise<boolean> {\n const serializedValue = this.stringify(value, this.serializer);\n\n if (!this.isAttached()) {\n // JSON-roundtrip value for local writes to match the behavior of going through the wire\n this.processInboundWrite(key, this.parse(serializedValue, this.serializer), 0, 0, true);\n return true;\n }\n\n const message: IRegisterOperation = {\n key,\n type: \"write\",\n serializedValue,\n refSeq: this.runtime.deltaManager.lastSequenceNumber,\n };\n\n return this.newAckBasedPromise<boolean>((resolve) => {\n // Send the resolve function as the localOpMetadata. This will be provided back to us when the\n // op is ack'd.\n this.submitLocalMessage(message, resolve);\n // If we fail due to runtime being disposed, it's better to return false then unhandled exception.\n }).catch((error) => false);\n }\n\n /**\n * Returns the most recent local value of a register.\n * @param key - The key to read\n * @param readPolicy - The ReadPolicy to apply. Defaults to Atomic.\n */\n public read(key: string, readPolicy: ReadPolicy = ReadPolicy.Atomic): T | undefined {\n if (readPolicy === ReadPolicy.Atomic) {\n return this.readAtomic(key);\n }\n\n const versions = this.readVersions(key);\n\n if (versions !== undefined) {\n // We don't support deletion. So there should be at least one value.\n assert(versions.length > 0, 0x06c /* \"Value should be undefined or non-empty\" */);\n\n return versions[versions.length - 1];\n }\n }\n\n public readVersions(key: string): T[] | undefined {\n const data = this.data.get(key);\n return data?.versions.map((element: ILocalRegister<T>) => element.value.value);\n }\n\n public keys(): string[] {\n return [...this.data.keys()];\n }\n\n protected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n const dataObj: { [key: string]: ILocalData<T> } = {};\n this.data.forEach((v, k) => { dataObj[k] = v; });\n\n return createSingleBlobSummary(snapshotFileName, this.stringify(dataObj, serializer));\n }\n\n /**\n * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n */\n protected async loadCore(storage: IChannelStorageService): Promise<void> {\n const blob = await storage.readBlob(snapshotFileName);\n const header = bufferToString(blob, \"utf8\");\n const dataObj = this.parse(header, this.serializer);\n\n for (const key of Object.keys(dataObj)) {\n assert(dataObj[key].atomic?.value.type !== \"Shared\",\n // eslint-disable-next-line max-len\n 0x06d /* \"SharedObjects contained in ConsensusRegisterCollection can no longer be deserialized as of 0.17\" */);\n\n this.data.set(key, dataObj[key]);\n }\n }\n\n protected onDisconnect() {}\n\n protected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n if (message.type === MessageType.Operation) {\n const op: IIncomingRegisterOperation<T> = message.contents;\n switch (op.type) {\n case \"write\": {\n // backward compatibility: File at rest written with runtime <= 0.13 do not have refSeq\n // when the refSeq property didn't exist\n if (op.refSeq === undefined) {\n op.refSeq = message.referenceSequenceNumber;\n }\n // Message can be delivered with delay - e.g. resubmitted on reconnect.\n // Use the refSeq from when the op was created, not when it was transmitted\n const refSeqWhenCreated = op.refSeq;\n assert(refSeqWhenCreated <= message.referenceSequenceNumber,\n 0x06e /* \"Message's reference sequence number < op's reference sequence number!\" */);\n\n const value = incomingOpMatchesCurrentFormat(op)\n ? this.parse(op.serializedValue, this.serializer) as T\n : op.value.value;\n const winner = this.processInboundWrite(\n op.key,\n value,\n refSeqWhenCreated,\n message.sequenceNumber,\n local);\n if (local) {\n // Resolve the pending promise for this operation now that we have received an ack for it.\n const resolve = localOpMetadata as PendingResolve;\n resolve(winner);\n }\n break;\n }\n default: unreachableCase(op.type);\n }\n }\n }\n\n private readAtomic(key: string): T | undefined {\n const data = this.data.get(key);\n return data?.atomic.value.value;\n }\n\n /**\n * Process an inbound write op\n * @param key - Key that was written to\n * @param value - Incoming value\n * @param refSeq - RefSeq at the time of write on the remote client\n * @param sequenceNumber - Sequence Number of this write op\n * @param local - Did this write originate on this client\n */\n private processInboundWrite(\n key: string,\n value: T,\n refSeq: number,\n sequenceNumber: number,\n local: boolean,\n ): boolean {\n let data = this.data.get(key);\n // Atomic update if it's a new register or the write was not concurrent,\n // meaning our state was known to the remote client at the time of write\n const winner = data === undefined || refSeq >= data.atomic.sequenceNumber;\n if (winner) {\n const atomicUpdate = newLocalRegister<T>(\n sequenceNumber,\n value,\n );\n if (data === undefined) {\n data = {\n atomic: atomicUpdate,\n versions: [], // we'll update versions next, leave it empty for now\n };\n this.data.set(key, data);\n } else {\n data.atomic = atomicUpdate;\n }\n }\n else {\n assert(!!data, 0x06f /* \"data missing for non-atomic inbound update!\" */);\n }\n\n // Remove versions that were known to the remote client at the time of write\n while (data.versions.length > 0 && refSeq >= data.versions[0].sequenceNumber) {\n data.versions.shift();\n }\n\n const versionUpdate = newLocalRegister<T>(\n sequenceNumber,\n value,\n );\n\n // Asserts for data integrity\n if (!this.isAttached()) {\n assert(refSeq === 0 && sequenceNumber === 0,\n 0x070 /* \"sequence numbers are expected to be 0 when unattached\" */);\n }\n else if (data.versions.length > 0) {\n assert(sequenceNumber > data.versions[data.versions.length - 1].sequenceNumber,\n 0x071 /* \"Versions should naturally be ordered by sequenceNumber\" */);\n }\n\n // Push the new element.\n data.versions.push(versionUpdate);\n\n // Raise events at the end, to avoid reentrancy issues\n if (winner) {\n this.emit(\"atomicChanged\", key, value, local);\n }\n this.emit(\"versionChanged\", key, value, local);\n\n return winner;\n }\n\n private stringify(value: any, serializer: IFluidSerializer): string {\n return serializer.stringify(value, this.handle);\n }\n\n private parse(content: string, serializer: IFluidSerializer): any {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return serializer.parse(content);\n }\n\n protected applyStashedOp() {\n // empty implementation\n return () => { };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"consensusRegisterCollection.js","sourceRoot":"","sources":["../src/consensusRegisterCollection.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 { assert, bufferToString, unreachableCase } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n IChannelAttributes,\n IFluidDataStoreRuntime,\n IChannelStorageService,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { createSingleBlobSummary, IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { ConsensusRegisterCollectionFactory } from \"./consensusRegisterCollectionFactory\";\nimport { IConsensusRegisterCollection, ReadPolicy, IConsensusRegisterCollectionEvents } from \"./interfaces\";\n\ninterface ILocalData<T> {\n // Atomic version\n atomic: ILocalRegister<T>;\n\n // All concurrent versions awaiting consensus\n versions: ILocalRegister<T>[];\n}\n\ninterface ILocalRegister<T> {\n // Register value, wrapped for backwards compatibility with < 0.17\n value: {\n type: \"Plain\";\n value: T;\n };\n\n // The sequence number when last consensus was reached\n sequenceNumber: number;\n}\n\nconst newLocalRegister = <T>(sequenceNumber: number, value: T): ILocalRegister<T> => ({\n sequenceNumber,\n value: {\n type: \"Plain\",\n value,\n },\n});\n\n/**\n * An operation for consensus register collection\n */\ninterface IRegisterOperation {\n key: string;\n type: \"write\";\n serializedValue: string;\n\n // Message can be delivered with delay - resubmitted on reconnect.\n // As such, refSeq needs to reference seq # at the time op was created,\n // not when op was actually sent over wire (ISequencedDocumentMessage.referenceSequenceNumber),\n // as client can ingest ops in between.\n refSeq: number | undefined;\n}\n\n/**\n * IRegisterOperation format in versions \\< 0.17\n */\ninterface IRegisterOperationOld<T> {\n key: string;\n type: \"write\";\n value: {\n type: \"Plain\";\n value: T;\n };\n refSeq: number;\n}\n\n/** Incoming ops could match any of these types */\ntype IIncomingRegisterOperation<T> = IRegisterOperation | IRegisterOperationOld<T>;\n\n/** Distinguish between incoming op formats so we know which type it is */\nconst incomingOpMatchesCurrentFormat = (op): op is IRegisterOperation => \"serializedValue\" in op;\n\n/** The type of the resolve function to call after the local operation is ack'd */\ntype PendingResolve = (winner: boolean) => void;\n\nconst snapshotFileName = \"header\";\n\n/**\n * Implementation of a consensus register collection\n */\nexport class ConsensusRegisterCollection<T>\n extends SharedObject<IConsensusRegisterCollectionEvents> implements IConsensusRegisterCollection<T> {\n /**\n * Create a new consensus register collection\n *\n * @param runtime - data store runtime the new consensus register collection belongs to\n * @param id - optional name of the consensus register collection\n * @returns newly create consensus register collection (but not attached yet)\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n public static create<T>(runtime: IFluidDataStoreRuntime, id?: string) {\n return runtime.createChannel(id, ConsensusRegisterCollectionFactory.Type) as ConsensusRegisterCollection<T>;\n }\n\n /**\n * Get a factory for ConsensusRegisterCollection to register with the data store.\n *\n * @returns a factory that creates and load ConsensusRegisterCollection\n */\n public static getFactory() {\n return new ConsensusRegisterCollectionFactory();\n }\n\n private readonly data = new Map<string, ILocalData<T>>();\n\n /**\n * Constructs a new consensus register collection. If the object is non-local an id and service interfaces will\n * be provided\n */\n public constructor(\n id: string,\n runtime: IFluidDataStoreRuntime,\n attributes: IChannelAttributes,\n ) {\n super(id, runtime, attributes);\n }\n\n /**\n * Creates a new register or writes a new value.\n * Returns a promise that will resolve when the write is acked.\n *\n * @returns Promise<true> if write was non-concurrent\n */\n public async write(key: string, value: T): Promise<boolean> {\n const serializedValue = this.stringify(value, this.serializer);\n\n if (!this.isAttached()) {\n // JSON-roundtrip value for local writes to match the behavior of going through the wire\n this.processInboundWrite(key, this.parse(serializedValue, this.serializer), 0, 0, true);\n return true;\n }\n\n const message: IRegisterOperation = {\n key,\n type: \"write\",\n serializedValue,\n refSeq: this.runtime.deltaManager.lastSequenceNumber,\n };\n\n return this.newAckBasedPromise<boolean>((resolve) => {\n // Send the resolve function as the localOpMetadata. This will be provided back to us when the\n // op is ack'd.\n this.submitLocalMessage(message, resolve);\n // If we fail due to runtime being disposed, it's better to return false then unhandled exception.\n }).catch((error) => false);\n }\n\n /**\n * Returns the most recent local value of a register.\n * @param key - The key to read\n * @param readPolicy - The ReadPolicy to apply. Defaults to Atomic.\n */\n public read(key: string, readPolicy: ReadPolicy = ReadPolicy.Atomic): T | undefined {\n if (readPolicy === ReadPolicy.Atomic) {\n return this.readAtomic(key);\n }\n\n const versions = this.readVersions(key);\n\n if (versions !== undefined) {\n // We don't support deletion. So there should be at least one value.\n assert(versions.length > 0, 0x06c /* \"Value should be undefined or non-empty\" */);\n\n return versions[versions.length - 1];\n }\n }\n\n public readVersions(key: string): T[] | undefined {\n const data = this.data.get(key);\n return data?.versions.map((element: ILocalRegister<T>) => element.value.value);\n }\n\n public keys(): string[] {\n return [...this.data.keys()];\n }\n\n protected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n const dataObj: { [key: string]: ILocalData<T>; } = {};\n this.data.forEach((v, k) => { dataObj[k] = v; });\n\n return createSingleBlobSummary(snapshotFileName, this.stringify(dataObj, serializer));\n }\n\n /**\n * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n */\n protected async loadCore(storage: IChannelStorageService): Promise<void> {\n const blob = await storage.readBlob(snapshotFileName);\n const header = bufferToString(blob, \"utf8\");\n const dataObj = this.parse(header, this.serializer);\n\n for (const key of Object.keys(dataObj)) {\n assert(dataObj[key].atomic?.value.type !== \"Shared\",\n // eslint-disable-next-line max-len\n 0x06d /* \"SharedObjects contained in ConsensusRegisterCollection can no longer be deserialized as of 0.17\" */);\n\n this.data.set(key, dataObj[key]);\n }\n }\n\n protected onDisconnect() {}\n\n protected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n if (message.type === MessageType.Operation) {\n const op: IIncomingRegisterOperation<T> = message.contents;\n switch (op.type) {\n case \"write\": {\n // backward compatibility: File at rest written with runtime <= 0.13 do not have refSeq\n // when the refSeq property didn't exist\n if (op.refSeq === undefined) {\n op.refSeq = message.referenceSequenceNumber;\n }\n // Message can be delivered with delay - e.g. resubmitted on reconnect.\n // Use the refSeq from when the op was created, not when it was transmitted\n const refSeqWhenCreated = op.refSeq;\n assert(refSeqWhenCreated <= message.referenceSequenceNumber,\n 0x06e /* \"Message's reference sequence number < op's reference sequence number!\" */);\n\n const value = incomingOpMatchesCurrentFormat(op)\n ? this.parse(op.serializedValue, this.serializer) as T\n : op.value.value;\n const winner = this.processInboundWrite(\n op.key,\n value,\n refSeqWhenCreated,\n message.sequenceNumber,\n local);\n if (local) {\n // Resolve the pending promise for this operation now that we have received an ack for it.\n const resolve = localOpMetadata as PendingResolve;\n resolve(winner);\n }\n break;\n }\n default: unreachableCase(op.type);\n }\n }\n }\n\n private readAtomic(key: string): T | undefined {\n const data = this.data.get(key);\n return data?.atomic.value.value;\n }\n\n /**\n * Process an inbound write op\n * @param key - Key that was written to\n * @param value - Incoming value\n * @param refSeq - RefSeq at the time of write on the remote client\n * @param sequenceNumber - Sequence Number of this write op\n * @param local - Did this write originate on this client\n */\n private processInboundWrite(\n key: string,\n value: T,\n refSeq: number,\n sequenceNumber: number,\n local: boolean,\n ): boolean {\n let data = this.data.get(key);\n // Atomic update if it's a new register or the write was not concurrent,\n // meaning our state was known to the remote client at the time of write\n const winner = data === undefined || refSeq >= data.atomic.sequenceNumber;\n if (winner) {\n const atomicUpdate = newLocalRegister<T>(\n sequenceNumber,\n value,\n );\n if (data === undefined) {\n data = {\n atomic: atomicUpdate,\n versions: [], // we'll update versions next, leave it empty for now\n };\n this.data.set(key, data);\n } else {\n data.atomic = atomicUpdate;\n }\n } else {\n assert(!!data, 0x06f /* \"data missing for non-atomic inbound update!\" */);\n }\n\n // Remove versions that were known to the remote client at the time of write\n while (data.versions.length > 0 && refSeq >= data.versions[0].sequenceNumber) {\n data.versions.shift();\n }\n\n const versionUpdate = newLocalRegister<T>(\n sequenceNumber,\n value,\n );\n\n // Asserts for data integrity\n if (!this.isAttached()) {\n assert(refSeq === 0 && sequenceNumber === 0,\n 0x070 /* \"sequence numbers are expected to be 0 when unattached\" */);\n } else if (data.versions.length > 0) {\n assert(sequenceNumber > data.versions[data.versions.length - 1].sequenceNumber,\n 0x071 /* \"Versions should naturally be ordered by sequenceNumber\" */);\n }\n\n // Push the new element.\n data.versions.push(versionUpdate);\n\n // Raise events at the end, to avoid reentrancy issues\n if (winner) {\n this.emit(\"atomicChanged\", key, value, local);\n }\n this.emit(\"versionChanged\", key, value, local);\n\n return winner;\n }\n\n private stringify(value: any, serializer: IFluidSerializer): string {\n return serializer.stringify(value, this.handle);\n }\n\n private parse(content: string, serializer: IFluidSerializer): any {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return serializer.parse(content);\n }\n\n protected applyStashedOp() {\n // empty implementation\n return () => { };\n }\n}\n"]}
|
package/lib/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/register-collection";
|
|
8
|
-
export declare const pkgVersion = "0.59.
|
|
8
|
+
export declare const pkgVersion = "0.59.3000";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/lib/packageVersion.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,qCAAqC,CAAC;AAC7D,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/register-collection\";\nexport const pkgVersion = \"0.59.
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,qCAAqC,CAAC;AAC7D,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/register-collection\";\nexport const pkgVersion = \"0.59.3000\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/register-collection",
|
|
3
|
-
"version": "0.59.
|
|
3
|
+
"version": "0.59.3000",
|
|
4
4
|
"description": "Consensus Register",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -62,19 +62,20 @@
|
|
|
62
62
|
"dependencies": {
|
|
63
63
|
"@fluidframework/common-utils": "^0.32.1",
|
|
64
64
|
"@fluidframework/core-interfaces": "^0.43.1000",
|
|
65
|
-
"@fluidframework/datastore-definitions": "^0.59.
|
|
66
|
-
"@fluidframework/protocol-base": "^0.1036.
|
|
65
|
+
"@fluidframework/datastore-definitions": "^0.59.3000",
|
|
66
|
+
"@fluidframework/protocol-base": "^0.1036.3000",
|
|
67
67
|
"@fluidframework/protocol-definitions": "^0.1028.1000",
|
|
68
|
-
"@fluidframework/runtime-definitions": "^0.59.
|
|
69
|
-
"@fluidframework/shared-object-base": "^0.59.
|
|
68
|
+
"@fluidframework/runtime-definitions": "^0.59.3000",
|
|
69
|
+
"@fluidframework/shared-object-base": "^0.59.3000"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
|
-
"@fluid-internal/test-dds-utils": "^0.59.
|
|
72
|
+
"@fluid-internal/test-dds-utils": "^0.59.3000",
|
|
73
73
|
"@fluidframework/build-common": "^0.23.0",
|
|
74
|
-
"@fluidframework/
|
|
75
|
-
"@fluidframework/
|
|
76
|
-
"@fluidframework/
|
|
77
|
-
"@fluidframework/
|
|
74
|
+
"@fluidframework/build-tools": "^0.2.66793",
|
|
75
|
+
"@fluidframework/eslint-config-fluid": "^0.28.2000",
|
|
76
|
+
"@fluidframework/mocha-test-setup": "^0.59.3000",
|
|
77
|
+
"@fluidframework/register-collection-previous": "npm:@fluidframework/register-collection@0.59.2000",
|
|
78
|
+
"@fluidframework/test-runtime-utils": "^0.59.3000",
|
|
78
79
|
"@microsoft/api-extractor": "^7.22.2",
|
|
79
80
|
"@rushstack/eslint-config": "^2.5.1",
|
|
80
81
|
"@types/mocha": "^8.2.2",
|
|
@@ -97,11 +98,11 @@
|
|
|
97
98
|
"mocha": "^8.4.0",
|
|
98
99
|
"nyc": "^15.0.0",
|
|
99
100
|
"rimraf": "^2.6.2",
|
|
100
|
-
"typescript": "~4.
|
|
101
|
+
"typescript": "~4.5.5",
|
|
101
102
|
"typescript-formatter": "7.1.0"
|
|
102
103
|
},
|
|
103
104
|
"typeValidation": {
|
|
104
|
-
"version": "0.59.
|
|
105
|
+
"version": "0.59.3000",
|
|
105
106
|
"broken": {}
|
|
106
107
|
}
|
|
107
108
|
}
|
|
@@ -26,8 +26,8 @@ interface ILocalData<T> {
|
|
|
26
26
|
interface ILocalRegister<T> {
|
|
27
27
|
// Register value, wrapped for backwards compatibility with < 0.17
|
|
28
28
|
value: {
|
|
29
|
-
type: "Plain"
|
|
30
|
-
value: T
|
|
29
|
+
type: "Plain";
|
|
30
|
+
value: T;
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
// The sequence number when last consensus was reached
|
|
@@ -58,14 +58,14 @@ interface IRegisterOperation {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
/**
|
|
61
|
-
* IRegisterOperation format in versions
|
|
61
|
+
* IRegisterOperation format in versions \< 0.17
|
|
62
62
|
*/
|
|
63
63
|
interface IRegisterOperationOld<T> {
|
|
64
64
|
key: string;
|
|
65
65
|
type: "write";
|
|
66
66
|
value: {
|
|
67
|
-
type: "Plain"
|
|
68
|
-
value: T
|
|
67
|
+
type: "Plain";
|
|
68
|
+
value: T;
|
|
69
69
|
};
|
|
70
70
|
refSeq: number;
|
|
71
71
|
}
|
|
@@ -181,7 +181,7 @@ export class ConsensusRegisterCollection<T>
|
|
|
181
181
|
}
|
|
182
182
|
|
|
183
183
|
protected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {
|
|
184
|
-
const dataObj: { [key: string]: ILocalData<T
|
|
184
|
+
const dataObj: { [key: string]: ILocalData<T>; } = {};
|
|
185
185
|
this.data.forEach((v, k) => { dataObj[k] = v; });
|
|
186
186
|
|
|
187
187
|
return createSingleBlobSummary(snapshotFileName, this.stringify(dataObj, serializer));
|
|
@@ -281,8 +281,7 @@ export class ConsensusRegisterCollection<T>
|
|
|
281
281
|
} else {
|
|
282
282
|
data.atomic = atomicUpdate;
|
|
283
283
|
}
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
284
|
+
} else {
|
|
286
285
|
assert(!!data, 0x06f /* "data missing for non-atomic inbound update!" */);
|
|
287
286
|
}
|
|
288
287
|
|
|
@@ -300,8 +299,7 @@ export class ConsensusRegisterCollection<T>
|
|
|
300
299
|
if (!this.isAttached()) {
|
|
301
300
|
assert(refSeq === 0 && sequenceNumber === 0,
|
|
302
301
|
0x070 /* "sequence numbers are expected to be 0 when unattached" */);
|
|
303
|
-
}
|
|
304
|
-
else if (data.versions.length > 0) {
|
|
302
|
+
} else if (data.versions.length > 0) {
|
|
305
303
|
assert(sequenceNumber > data.versions[data.versions.length - 1].sequenceNumber,
|
|
306
304
|
0x071 /* "Versions should naturally be ordered by sequenceNumber" */);
|
|
307
305
|
}
|
package/src/packageVersion.ts
CHANGED