@fluidframework/merge-tree 2.0.0-internal.1.1.0 → 2.0.0-internal.1.2.0.93071

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.
@@ -52,7 +52,8 @@ export interface IJSONSegmentWithMergeInfo {
52
52
  client?: string;
53
53
  seq?: number;
54
54
  /**
55
- * @deprecated - use removedClientIds instead. this only exists for back-compat
55
+ * @deprecated Use {@link IJSONSegmentWithMergeInfo.removedClientIds} instead.
56
+ * This only exists for backwards compatability.
56
57
  */
57
58
  removedClient?: string;
58
59
  removedClientIds?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotChunks.d.ts","sourceRoot":"","sources":["../src/snapshotChunks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC;CAC5B;AAED,oBAAY,gBAAgB,GAAG,YAAY,GAAG,yBAAyB,CAAC;AAExE,MAAM,WAAW,oBAAqB,SAAQ,uBAAuB;IACjE,OAAO,EAAE,SAAS,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,uBAAuB,CAAC;CAC5C;AAED,MAAM,WAAW,4BAA4B;IACzC,EAAE,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,4BAA4B,EAAE,CAAC;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAiB,SAAQ,uBAAuB;IAC7D,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,cAAc,EAAE,uBAAuB,GAAG,SAAS,CAAC;CACvD;AAED;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACtC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,yBAAyB,GAAG,IAAI,IAAI,yBAAyB,CAE9G;AAED,wBAAgB,8BAA8B,CAC1C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,uBAAuB,EAC9B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,UAuCrB;AAED,wBAAgB,8BAA8B,CAC1C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,uBAAuB,EAC9B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,UAGrB;AAED,wBAAgB,eAAe,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,uBAAuB,EAC9B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,gBAAgB,CAmBtD"}
1
+ {"version":3,"file":"snapshotChunks.d.ts","sourceRoot":"","sources":["../src/snapshotChunks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC;CAC5B;AAED,oBAAY,gBAAgB,GAAG,YAAY,GAAG,yBAAyB,CAAC;AAExE,MAAM,WAAW,oBAAqB,SAAQ,uBAAuB;IACjE,OAAO,EAAE,SAAS,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,uBAAuB,CAAC;CAC5C;AAED,MAAM,WAAW,4BAA4B;IACzC,EAAE,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,4BAA4B,EAAE,CAAC;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAiB,SAAQ,uBAAuB;IAC7D,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,cAAc,EAAE,uBAAuB,GAAG,SAAS,CAAC;CACvD;AAED;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACtC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,yBAAyB,GAAG,IAAI,IAAI,yBAAyB,CAE9G;AAED,wBAAgB,8BAA8B,CAC1C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,uBAAuB,EAC9B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,UAuCrB;AAED,wBAAgB,8BAA8B,CAC1C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,uBAAuB,EAC9B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,UAGrB;AAED,wBAAgB,eAAe,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,uBAAuB,EAC9B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,gBAAgB,CAmBtD"}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotChunks.js","sourceRoot":"","sources":["../src/snapshotChunks.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\n /* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { IJSONSegment } from \"./ops\";\n\nexport interface VersionedMergeTreeChunk {\n version: undefined | \"1\";\n}\n\nexport type JsonSegmentSpecs = IJSONSegment | IJSONSegmentWithMergeInfo;\n\nexport interface MergeTreeChunkLegacy extends VersionedMergeTreeChunk {\n version: undefined;\n chunkStartSegmentIndex: number;\n chunkSegmentCount: number;\n chunkLengthChars: number;\n totalLengthChars?: number;\n totalSegmentCount?: number;\n chunkSequenceNumber?: number;\n chunkMinSequenceNumber?: number;\n segmentTexts: JsonSegmentSpecs[];\n headerMetadata?: MergeTreeHeaderMetadata;\n}\n\nexport interface MergeTreeHeaderChunkMetadata {\n id: string;\n}\n\nexport interface MergeTreeHeaderMetadata {\n totalLength: number;\n totalSegmentCount: number;\n orderedChunkMetadata: MergeTreeHeaderChunkMetadata[];\n sequenceNumber: number;\n minSequenceNumber: number;\n}\n\nexport interface MergeTreeChunkV1 extends VersionedMergeTreeChunk {\n version: \"1\";\n startIndex: number;\n segmentCount: number;\n length: number;\n segments: JsonSegmentSpecs[];\n headerMetadata: MergeTreeHeaderMetadata | undefined;\n}\n\n/**\n * Used during snapshotting to record the metadata required to merge segments above the MSN\n * to the raw output of `ISegment.toJSONObject()`. (Note that IJSONSegment may be a raw\n * string or array, which is why this interface wraps the original IJSONSegment instead of\n * extending it.)\n */\nexport interface IJSONSegmentWithMergeInfo {\n json: IJSONSegment;\n client?: string;\n seq?: number;\n /**\n * @deprecated - use removedClientIds instead. this only exists for back-compat\n */\n removedClient?: string;\n removedClientIds?: string[];\n removedSeq?: number;\n}\n\n/**\n * Returns true if the given 'spec' is an IJSONSegmentWithMergeInfo.\n */\nexport function hasMergeInfo(spec: IJSONSegment | IJSONSegmentWithMergeInfo): spec is IJSONSegmentWithMergeInfo {\n return !!spec && typeof spec === \"object\" && \"json\" in spec;\n}\n\nexport function serializeAsMinSupportedVersion(\n path: string,\n chunk: VersionedMergeTreeChunk,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer: IFluidSerializer,\n bind: IFluidHandle) {\n let targetChuck: MergeTreeChunkLegacy;\n\n if (chunk.version !== undefined) {\n logger.send({\n eventName: \"MergeTreeChunk:serializeAsMinSupportedVersion\",\n category: \"generic\",\n fromChunkVersion: chunk.version,\n toChunkVersion: undefined,\n });\n }\n\n switch (chunk.version) {\n case undefined:\n targetChuck = chunk as MergeTreeChunkLegacy;\n targetChuck.headerMetadata = buildHeaderMetadataForLegacyChunk(path, targetChuck, options);\n break;\n\n case \"1\":\n const chunkV1 = chunk as MergeTreeChunkV1;\n const headerMetadata = path === SnapshotLegacy.header ? chunkV1.headerMetadata : undefined;\n targetChuck = {\n version: undefined,\n chunkStartSegmentIndex: chunkV1.startIndex,\n chunkLengthChars: chunkV1.length,\n chunkSegmentCount: chunkV1.segmentCount,\n segmentTexts: chunkV1.segments,\n totalLengthChars: headerMetadata?.totalLength,\n totalSegmentCount: headerMetadata?.totalSegmentCount,\n chunkSequenceNumber: headerMetadata?.sequenceNumber,\n chunkMinSequenceNumber: headerMetadata?.minSequenceNumber,\n headerMetadata,\n };\n break;\n\n default:\n throw new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);\n }\n return serializer.stringify(targetChuck, bind);\n}\n\nexport function serializeAsMaxSupportedVersion(\n path: string,\n chunk: VersionedMergeTreeChunk,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer: IFluidSerializer,\n bind: IFluidHandle) {\n const targetChuck = toLatestVersion(path, chunk, logger, options);\n return serializer.stringify(targetChuck, bind);\n}\n\nexport function toLatestVersion(\n path: string,\n chunk: VersionedMergeTreeChunk,\n logger: ITelemetryLogger,\n options: PropertySet | undefined): MergeTreeChunkV1 {\n switch (chunk.version) {\n case undefined: {\n const chunkLegacy = chunk as MergeTreeChunkLegacy;\n return {\n version: \"1\",\n length: chunkLegacy.chunkLengthChars,\n segmentCount: chunkLegacy.chunkSegmentCount,\n headerMetadata: buildHeaderMetadataForLegacyChunk(path, chunkLegacy, options),\n segments: chunkLegacy.segmentTexts,\n startIndex: chunkLegacy.chunkStartSegmentIndex,\n };\n }\n case \"1\":\n return chunk as MergeTreeChunkV1;\n\n default:\n throw new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);\n }\n}\n\nfunction buildHeaderMetadataForLegacyChunk(\n path: string, chunk: MergeTreeChunkLegacy, options: PropertySet | undefined): MergeTreeHeaderMetadata | undefined {\n if (path === SnapshotLegacy.header) {\n if (chunk.headerMetadata !== undefined) {\n return chunk.headerMetadata;\n }\n const chunkIds: MergeTreeHeaderChunkMetadata[] = [{ id: SnapshotLegacy.header }];\n if (chunk.chunkLengthChars < chunk.totalLengthChars!) {\n chunkIds.push({ id: SnapshotLegacy.body });\n }\n return {\n orderedChunkMetadata: chunkIds,\n minSequenceNumber: chunk.chunkMinSequenceNumber!,\n sequenceNumber: chunk.chunkSequenceNumber!,\n totalLength: chunk.totalLengthChars!,\n totalSegmentCount: chunk.totalSegmentCount!,\n };\n }\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"snapshotChunks.js","sourceRoot":"","sources":["../src/snapshotChunks.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\n /* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { IJSONSegment } from \"./ops\";\n\nexport interface VersionedMergeTreeChunk {\n version: undefined | \"1\";\n}\n\nexport type JsonSegmentSpecs = IJSONSegment | IJSONSegmentWithMergeInfo;\n\nexport interface MergeTreeChunkLegacy extends VersionedMergeTreeChunk {\n version: undefined;\n chunkStartSegmentIndex: number;\n chunkSegmentCount: number;\n chunkLengthChars: number;\n totalLengthChars?: number;\n totalSegmentCount?: number;\n chunkSequenceNumber?: number;\n chunkMinSequenceNumber?: number;\n segmentTexts: JsonSegmentSpecs[];\n headerMetadata?: MergeTreeHeaderMetadata;\n}\n\nexport interface MergeTreeHeaderChunkMetadata {\n id: string;\n}\n\nexport interface MergeTreeHeaderMetadata {\n totalLength: number;\n totalSegmentCount: number;\n orderedChunkMetadata: MergeTreeHeaderChunkMetadata[];\n sequenceNumber: number;\n minSequenceNumber: number;\n}\n\nexport interface MergeTreeChunkV1 extends VersionedMergeTreeChunk {\n version: \"1\";\n startIndex: number;\n segmentCount: number;\n length: number;\n segments: JsonSegmentSpecs[];\n headerMetadata: MergeTreeHeaderMetadata | undefined;\n}\n\n/**\n * Used during snapshotting to record the metadata required to merge segments above the MSN\n * to the raw output of `ISegment.toJSONObject()`. (Note that IJSONSegment may be a raw\n * string or array, which is why this interface wraps the original IJSONSegment instead of\n * extending it.)\n */\nexport interface IJSONSegmentWithMergeInfo {\n json: IJSONSegment;\n client?: string;\n seq?: number;\n /**\n * @deprecated Use {@link IJSONSegmentWithMergeInfo.removedClientIds} instead.\n * This only exists for backwards compatability.\n */\n removedClient?: string;\n removedClientIds?: string[];\n removedSeq?: number;\n}\n\n/**\n * Returns true if the given 'spec' is an IJSONSegmentWithMergeInfo.\n */\nexport function hasMergeInfo(spec: IJSONSegment | IJSONSegmentWithMergeInfo): spec is IJSONSegmentWithMergeInfo {\n return !!spec && typeof spec === \"object\" && \"json\" in spec;\n}\n\nexport function serializeAsMinSupportedVersion(\n path: string,\n chunk: VersionedMergeTreeChunk,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer: IFluidSerializer,\n bind: IFluidHandle) {\n let targetChuck: MergeTreeChunkLegacy;\n\n if (chunk.version !== undefined) {\n logger.send({\n eventName: \"MergeTreeChunk:serializeAsMinSupportedVersion\",\n category: \"generic\",\n fromChunkVersion: chunk.version,\n toChunkVersion: undefined,\n });\n }\n\n switch (chunk.version) {\n case undefined:\n targetChuck = chunk as MergeTreeChunkLegacy;\n targetChuck.headerMetadata = buildHeaderMetadataForLegacyChunk(path, targetChuck, options);\n break;\n\n case \"1\":\n const chunkV1 = chunk as MergeTreeChunkV1;\n const headerMetadata = path === SnapshotLegacy.header ? chunkV1.headerMetadata : undefined;\n targetChuck = {\n version: undefined,\n chunkStartSegmentIndex: chunkV1.startIndex,\n chunkLengthChars: chunkV1.length,\n chunkSegmentCount: chunkV1.segmentCount,\n segmentTexts: chunkV1.segments,\n totalLengthChars: headerMetadata?.totalLength,\n totalSegmentCount: headerMetadata?.totalSegmentCount,\n chunkSequenceNumber: headerMetadata?.sequenceNumber,\n chunkMinSequenceNumber: headerMetadata?.minSequenceNumber,\n headerMetadata,\n };\n break;\n\n default:\n throw new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);\n }\n return serializer.stringify(targetChuck, bind);\n}\n\nexport function serializeAsMaxSupportedVersion(\n path: string,\n chunk: VersionedMergeTreeChunk,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer: IFluidSerializer,\n bind: IFluidHandle) {\n const targetChuck = toLatestVersion(path, chunk, logger, options);\n return serializer.stringify(targetChuck, bind);\n}\n\nexport function toLatestVersion(\n path: string,\n chunk: VersionedMergeTreeChunk,\n logger: ITelemetryLogger,\n options: PropertySet | undefined): MergeTreeChunkV1 {\n switch (chunk.version) {\n case undefined: {\n const chunkLegacy = chunk as MergeTreeChunkLegacy;\n return {\n version: \"1\",\n length: chunkLegacy.chunkLengthChars,\n segmentCount: chunkLegacy.chunkSegmentCount,\n headerMetadata: buildHeaderMetadataForLegacyChunk(path, chunkLegacy, options),\n segments: chunkLegacy.segmentTexts,\n startIndex: chunkLegacy.chunkStartSegmentIndex,\n };\n }\n case \"1\":\n return chunk as MergeTreeChunkV1;\n\n default:\n throw new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);\n }\n}\n\nfunction buildHeaderMetadataForLegacyChunk(\n path: string, chunk: MergeTreeChunkLegacy, options: PropertySet | undefined): MergeTreeHeaderMetadata | undefined {\n if (path === SnapshotLegacy.header) {\n if (chunk.headerMetadata !== undefined) {\n return chunk.headerMetadata;\n }\n const chunkIds: MergeTreeHeaderChunkMetadata[] = [{ id: SnapshotLegacy.header }];\n if (chunk.chunkLengthChars < chunk.totalLengthChars!) {\n chunkIds.push({ id: SnapshotLegacy.body });\n }\n return {\n orderedChunkMetadata: chunkIds,\n minSequenceNumber: chunk.chunkMinSequenceNumber!,\n sequenceNumber: chunk.chunkSequenceNumber!,\n totalLength: chunk.totalLengthChars!,\n totalSegmentCount: chunk.totalSegmentCount!,\n };\n }\n return undefined;\n}\n"]}
@@ -29,7 +29,7 @@ export declare class TextSegment extends BaseSegment {
29
29
  }
30
30
  export interface IMergeTreeTextHelper {
31
31
  /**
32
- * @deprecated - If consuming via sequence, use `getTextAndMarkers` exported from \@fluidframework/sequence.
32
+ * @deprecated If consuming via sequence, use `getTextAndMarkers` exported from `\@fluidframework/sequence`.
33
33
  * Otherwise, define your own accumulation model and use `Client.walkSegments`.
34
34
  */
35
35
  getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number): {
@@ -1 +1 @@
1
- {"version":3,"file":"textSegment.js","sourceRoot":"","sources":["../src/textSegment.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 { BaseSegment, ISegment, Marker } from \"./mergeTreeNodes\";\nimport { IJSONSegment } from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { LocalReferenceCollection } from \"./localReference\";\n\n// Maximum length of text segment to be considered to be merged with other segment.\n// Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n// The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n// The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n// Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary\n// representations). More measurements needs to be done, but it's very likely the right spot is somewhere between\n// 1K-2K mark. That said, we also break segments on newline and there are very few segments that are longer than 256\n// because of it. Must be an even number\nconst TextSegmentGranularity = 256;\n\nexport interface IJSONTextSegment extends IJSONSegment {\n text: string;\n}\n\nexport class TextSegment extends BaseSegment {\n public static readonly type = \"TextSegment\";\n\n public static is(segment: ISegment): segment is TextSegment {\n return segment.type === TextSegment.type;\n }\n\n public static make(text: string, props?: PropertySet) {\n const seg = new TextSegment(text);\n if (props) {\n seg.addProperties(props);\n }\n return seg;\n }\n\n public static fromJSONObject(spec: any) {\n if (typeof spec === \"string\") {\n return new TextSegment(spec);\n } else if (spec && typeof spec === \"object\" && \"text\" in spec) {\n const textSpec = spec as IJSONTextSegment;\n return TextSegment.make(textSpec.text, textSpec.props as PropertySet);\n }\n return undefined;\n }\n\n public readonly type = TextSegment.type;\n\n constructor(public text: string) {\n super();\n this.cachedLength = text.length;\n }\n\n public toJSONObject() {\n // To reduce snapshot/ops size, we serialize a TextSegment as a plain 'string' if it is\n // not annotated.\n return this.properties\n ? { text: this.text, props: this.properties }\n : this.text;\n }\n\n public clone(start = 0, end?: number) {\n const text = this.text.substring(start, end);\n const b = TextSegment.make(text, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment): boolean {\n return !this.text.endsWith(\"\\n\")\n && TextSegment.is(segment)\n && (this.cachedLength <= TextSegmentGranularity ||\n segment.cachedLength <= TextSegmentGranularity);\n }\n\n public toString() {\n return this.text;\n }\n\n public append(segment: ISegment) {\n if (TextSegment.is(segment)) {\n // Note: Must call 'appendLocalRefs' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.text += segment.text;\n this.cachedLength = this.text.length;\n } else {\n throw new Error(\"can only append text segment\");\n }\n }\n\n // TODO: retain removed text for undo\n // returns true if entire string removed\n public removeRange(start: number, end: number) {\n let remnantString = \"\";\n const len = this.text.length;\n if (start > 0) {\n remnantString += this.text.substring(0, start);\n }\n if (end < len) {\n remnantString += this.text.substring(end);\n }\n this.text = remnantString;\n this.cachedLength = remnantString.length;\n return (remnantString.length === 0);\n }\n\n protected createSplitSegmentAt(pos: number) {\n if (pos > 0) {\n const remainingText = this.text.substring(pos);\n this.text = this.text.substring(0, pos);\n this.cachedLength = this.text.length;\n const leafSegment = new TextSegment(remainingText);\n return leafSegment;\n }\n }\n}\n\nexport interface IMergeTreeTextHelper{\n /**\n * @deprecated - If consuming via sequence, use `getTextAndMarkers` exported from \\@fluidframework/sequence.\n * Otherwise, define your own accumulation model and use `Client.walkSegments`.\n */\n getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number): {\n parallelText: string[];\n parallelMarkers: Marker[]; };\n getText(refSeq: number, clientId: number, placeholder: string, start?: number, end?: number): string;\n}\n"]}
1
+ {"version":3,"file":"textSegment.js","sourceRoot":"","sources":["../src/textSegment.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 { BaseSegment, ISegment, Marker } from \"./mergeTreeNodes\";\nimport { IJSONSegment } from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { LocalReferenceCollection } from \"./localReference\";\n\n// Maximum length of text segment to be considered to be merged with other segment.\n// Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n// The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n// The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n// Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary\n// representations). More measurements needs to be done, but it's very likely the right spot is somewhere between\n// 1K-2K mark. That said, we also break segments on newline and there are very few segments that are longer than 256\n// because of it. Must be an even number\nconst TextSegmentGranularity = 256;\n\nexport interface IJSONTextSegment extends IJSONSegment {\n text: string;\n}\n\nexport class TextSegment extends BaseSegment {\n public static readonly type = \"TextSegment\";\n\n public static is(segment: ISegment): segment is TextSegment {\n return segment.type === TextSegment.type;\n }\n\n public static make(text: string, props?: PropertySet) {\n const seg = new TextSegment(text);\n if (props) {\n seg.addProperties(props);\n }\n return seg;\n }\n\n public static fromJSONObject(spec: any) {\n if (typeof spec === \"string\") {\n return new TextSegment(spec);\n } else if (spec && typeof spec === \"object\" && \"text\" in spec) {\n const textSpec = spec as IJSONTextSegment;\n return TextSegment.make(textSpec.text, textSpec.props as PropertySet);\n }\n return undefined;\n }\n\n public readonly type = TextSegment.type;\n\n constructor(public text: string) {\n super();\n this.cachedLength = text.length;\n }\n\n public toJSONObject() {\n // To reduce snapshot/ops size, we serialize a TextSegment as a plain 'string' if it is\n // not annotated.\n return this.properties\n ? { text: this.text, props: this.properties }\n : this.text;\n }\n\n public clone(start = 0, end?: number) {\n const text = this.text.substring(start, end);\n const b = TextSegment.make(text, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment): boolean {\n return !this.text.endsWith(\"\\n\")\n && TextSegment.is(segment)\n && (this.cachedLength <= TextSegmentGranularity ||\n segment.cachedLength <= TextSegmentGranularity);\n }\n\n public toString() {\n return this.text;\n }\n\n public append(segment: ISegment) {\n if (TextSegment.is(segment)) {\n // Note: Must call 'appendLocalRefs' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.text += segment.text;\n this.cachedLength = this.text.length;\n } else {\n throw new Error(\"can only append text segment\");\n }\n }\n\n // TODO: retain removed text for undo\n // returns true if entire string removed\n public removeRange(start: number, end: number) {\n let remnantString = \"\";\n const len = this.text.length;\n if (start > 0) {\n remnantString += this.text.substring(0, start);\n }\n if (end < len) {\n remnantString += this.text.substring(end);\n }\n this.text = remnantString;\n this.cachedLength = remnantString.length;\n return (remnantString.length === 0);\n }\n\n protected createSplitSegmentAt(pos: number) {\n if (pos > 0) {\n const remainingText = this.text.substring(pos);\n this.text = this.text.substring(0, pos);\n this.cachedLength = this.text.length;\n const leafSegment = new TextSegment(remainingText);\n return leafSegment;\n }\n }\n}\n\nexport interface IMergeTreeTextHelper{\n /**\n * @deprecated If consuming via sequence, use `getTextAndMarkers` exported from `\\@fluidframework/sequence`.\n * Otherwise, define your own accumulation model and use `Client.walkSegments`.\n */\n getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number): {\n parallelText: string[];\n parallelMarkers: Marker[]; };\n getText(refSeq: number, clientId: number, placeholder: string, start?: number, end?: number): string;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/merge-tree",
3
- "version": "2.0.0-internal.1.1.0",
3
+ "version": "2.0.0-internal.1.2.0.93071",
4
4
  "description": "Merge tree",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -63,24 +63,24 @@
63
63
  "dependencies": {
64
64
  "@fluidframework/common-definitions": "^0.20.1",
65
65
  "@fluidframework/common-utils": "^1.0.0",
66
- "@fluidframework/container-definitions": "^2.0.0-internal.1.1.0",
67
- "@fluidframework/container-utils": "^2.0.0-internal.1.1.0",
68
- "@fluidframework/core-interfaces": "^2.0.0-internal.1.1.0",
69
- "@fluidframework/datastore-definitions": "^2.0.0-internal.1.1.0",
66
+ "@fluidframework/container-definitions": "2.0.0-internal.1.2.0.93071",
67
+ "@fluidframework/container-utils": "2.0.0-internal.1.2.0.93071",
68
+ "@fluidframework/core-interfaces": "2.0.0-internal.1.2.0.93071",
69
+ "@fluidframework/datastore-definitions": "2.0.0-internal.1.2.0.93071",
70
70
  "@fluidframework/protocol-definitions": "^1.0.0",
71
- "@fluidframework/runtime-definitions": "^2.0.0-internal.1.1.0",
72
- "@fluidframework/runtime-utils": "^2.0.0-internal.1.1.0",
73
- "@fluidframework/shared-object-base": "^2.0.0-internal.1.1.0",
74
- "@fluidframework/telemetry-utils": "^2.0.0-internal.1.1.0"
71
+ "@fluidframework/runtime-definitions": "2.0.0-internal.1.2.0.93071",
72
+ "@fluidframework/runtime-utils": "2.0.0-internal.1.2.0.93071",
73
+ "@fluidframework/shared-object-base": "2.0.0-internal.1.2.0.93071",
74
+ "@fluidframework/telemetry-utils": "2.0.0-internal.1.2.0.93071"
75
75
  },
76
76
  "devDependencies": {
77
- "@fluid-internal/stochastic-test-utils": "^2.0.0-internal.1.1.0",
78
- "@fluidframework/build-common": "^0.24.0",
79
- "@fluidframework/build-tools": "^0.3.1000",
77
+ "@fluid-internal/stochastic-test-utils": "2.0.0-internal.1.2.0.93071",
78
+ "@fluidframework/build-common": "^1.0.0",
79
+ "@fluidframework/build-tools": "^0.4.4000",
80
80
  "@fluidframework/eslint-config-fluid": "^0.28.2000",
81
81
  "@fluidframework/merge-tree-previous": "npm:@fluidframework/merge-tree@^1.0.0",
82
- "@fluidframework/mocha-test-setup": "^2.0.0-internal.1.1.0",
83
- "@fluidframework/test-runtime-utils": "^2.0.0-internal.1.1.0",
82
+ "@fluidframework/mocha-test-setup": "2.0.0-internal.1.2.0.93071",
83
+ "@fluidframework/test-runtime-utils": "2.0.0-internal.1.2.0.93071",
84
84
  "@microsoft/api-extractor": "^7.22.2",
85
85
  "@rushstack/eslint-config": "^2.5.1",
86
86
  "@types/diff": "^3.5.1",
package/src/client.ts CHANGED
@@ -295,9 +295,17 @@ export class Client {
295
295
  * serializer which keeps track of all serialized handles.
296
296
  */
297
297
  public serializeGCData(handle: IFluidHandle, handleCollectingSerializer: IFluidSerializer): void {
298
+ let localInserts = 0;
299
+ let localRemoves = 0;
298
300
  this.mergeTree.walkAllSegments(
299
301
  this.mergeTree.root,
300
302
  (seg) => {
303
+ if (seg.seq === UnassignedSequenceNumber) {
304
+ localInserts++;
305
+ }
306
+ if (seg.removedSeq === UnassignedSequenceNumber) {
307
+ localRemoves++;
308
+ }
301
309
  // Only serialize segments that have not been removed.
302
310
  if (seg.removedSeq === undefined) {
303
311
  handleCollectingSerializer.stringify(
@@ -307,6 +315,10 @@ export class Client {
307
315
  return true;
308
316
  },
309
317
  );
318
+
319
+ if (localInserts > 0 || localRemoves > 0) {
320
+ this.logger.sendErrorEvent({ eventName: "LocalEditsInProcessGCData", localInserts, localRemoves });
321
+ }
310
322
  }
311
323
 
312
324
  public getCollabWindow(): CollaborationWindow {
package/src/mergeTree.ts CHANGED
@@ -1938,7 +1938,7 @@ export class MergeTree {
1938
1938
  seq: number,
1939
1939
  overwrite = false,
1940
1940
  opArgs: IMergeTreeDeltaOpArgs,
1941
- ) {
1941
+ ): void {
1942
1942
  let _overwrite = overwrite;
1943
1943
  this.ensureIntervalBoundary(start, refSeq, clientId);
1944
1944
  this.ensureIntervalBoundary(end, refSeq, clientId);
@@ -63,7 +63,8 @@ export interface IJSONSegmentWithMergeInfo {
63
63
  client?: string;
64
64
  seq?: number;
65
65
  /**
66
- * @deprecated - use removedClientIds instead. this only exists for back-compat
66
+ * @deprecated Use {@link IJSONSegmentWithMergeInfo.removedClientIds} instead.
67
+ * This only exists for backwards compatability.
67
68
  */
68
69
  removedClient?: string;
69
70
  removedClientIds?: string[];
@@ -122,7 +122,7 @@ export class TextSegment extends BaseSegment {
122
122
 
123
123
  export interface IMergeTreeTextHelper{
124
124
  /**
125
- * @deprecated - If consuming via sequence, use `getTextAndMarkers` exported from \@fluidframework/sequence.
125
+ * @deprecated If consuming via sequence, use `getTextAndMarkers` exported from `\@fluidframework/sequence`.
126
126
  * Otherwise, define your own accumulation model and use `Client.walkSegments`.
127
127
  */
128
128
  getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number): {