@fluidframework/merge-tree 0.54.3 → 0.55.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/client.d.ts +5 -3
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +4 -6
  4. package/dist/client.js.map +1 -1
  5. package/dist/collections.d.ts.map +1 -1
  6. package/dist/collections.js +1 -0
  7. package/dist/collections.js.map +1 -1
  8. package/dist/partialLengths.d.ts.map +1 -1
  9. package/dist/partialLengths.js +4 -2
  10. package/dist/partialLengths.js.map +1 -1
  11. package/dist/snapshotChunks.d.ts +2 -1
  12. package/dist/snapshotChunks.d.ts.map +1 -1
  13. package/dist/snapshotChunks.js.map +1 -1
  14. package/dist/snapshotLoader.d.ts +1 -1
  15. package/dist/snapshotLoader.d.ts.map +1 -1
  16. package/dist/snapshotLoader.js.map +1 -1
  17. package/dist/snapshotV1.d.ts +6 -5
  18. package/dist/snapshotV1.d.ts.map +1 -1
  19. package/dist/snapshotV1.js +12 -28
  20. package/dist/snapshotV1.js.map +1 -1
  21. package/dist/snapshotlegacy.d.ts +7 -5
  22. package/dist/snapshotlegacy.d.ts.map +1 -1
  23. package/dist/snapshotlegacy.js +8 -35
  24. package/dist/snapshotlegacy.js.map +1 -1
  25. package/lib/client.d.ts +5 -3
  26. package/lib/client.d.ts.map +1 -1
  27. package/lib/client.js +4 -6
  28. package/lib/client.js.map +1 -1
  29. package/lib/collections.d.ts.map +1 -1
  30. package/lib/collections.js +1 -0
  31. package/lib/collections.js.map +1 -1
  32. package/lib/partialLengths.d.ts.map +1 -1
  33. package/lib/partialLengths.js +4 -2
  34. package/lib/partialLengths.js.map +1 -1
  35. package/lib/snapshotChunks.d.ts +2 -1
  36. package/lib/snapshotChunks.d.ts.map +1 -1
  37. package/lib/snapshotChunks.js.map +1 -1
  38. package/lib/snapshotLoader.d.ts +1 -1
  39. package/lib/snapshotLoader.d.ts.map +1 -1
  40. package/lib/snapshotLoader.js.map +1 -1
  41. package/lib/snapshotV1.d.ts +6 -5
  42. package/lib/snapshotV1.d.ts.map +1 -1
  43. package/lib/snapshotV1.js +12 -28
  44. package/lib/snapshotV1.js.map +1 -1
  45. package/lib/snapshotlegacy.d.ts +7 -5
  46. package/lib/snapshotlegacy.d.ts.map +1 -1
  47. package/lib/snapshotlegacy.js +8 -35
  48. package/lib/snapshotlegacy.js.map +1 -1
  49. package/package.json +18 -14
  50. package/src/client.ts +9 -9
  51. package/src/collections.ts +1 -0
  52. package/src/partialLengths.ts +4 -2
  53. package/src/snapshotChunks.ts +2 -4
  54. package/src/snapshotLoader.ts +1 -1
  55. package/src/snapshotV1.ts +28 -50
  56. package/src/snapshotlegacy.ts +27 -52
@@ -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 {\n IFluidSerializer,\n IFluidHandle,\n} from \"@fluidframework/core-interfaces\";\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 removedClient?: 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 = buildHeaderMetadataForLegecyChunk(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: buildHeaderMetadataForLegecyChunk(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 buildHeaderMetadataForLegecyChunk(\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 removedClient?: 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 = buildHeaderMetadataForLegecyChunk(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: buildHeaderMetadataForLegecyChunk(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 buildHeaderMetadataForLegecyChunk(\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"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IFluidSerializer } from "@fluidframework/core-interfaces";
5
+ import { IFluidSerializer } from "@fluidframework/shared-object-base";
6
6
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
7
7
  import { IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions";
8
8
  import { ITelemetryLogger } from "@fluidframework/common-definitions";
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotLoader.d.ts","sourceRoot":"","sources":["../src/snapshotLoader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAY,SAAS,EAAE,MAAM,aAAa,CAAC;AAUlD,qBAAa,cAAc;IAInB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAP/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;gBAGrB,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACrC,MAAM,EAAE,gBAAgB,EACP,UAAU,EAAE,gBAAgB;IAIpC,UAAU,CACnB,QAAQ,EAAE,sBAAsB,GACjC,OAAO,CAAC;QAAE,WAAW,EAAE,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAA;KAAE,CAAC;YAkBnD,qBAAqB;IA2BnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAgC5B;IAEF,OAAO,CAAC,UAAU;YAoCJ,QAAQ;IAoEtB;;;;;OAKG;YACW,cAAc;CAG/B"}
1
+ {"version":3,"file":"snapshotLoader.d.ts","sourceRoot":"","sources":["../src/snapshotLoader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAY,SAAS,EAAE,MAAM,aAAa,CAAC;AAUlD,qBAAa,cAAc;IAInB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAP/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;gBAGrB,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACrC,MAAM,EAAE,gBAAgB,EACP,UAAU,EAAE,gBAAgB;IAIpC,UAAU,CACnB,QAAQ,EAAE,sBAAsB,GACjC,OAAO,CAAC;QAAE,WAAW,EAAE,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAA;KAAE,CAAC;YAkBnD,qBAAqB;IA2BnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAgC5B;IAEF,OAAO,CAAC,UAAU;YAoCJ,QAAQ;IAoEtB;;;;;OAKG;YACW,cAAc;CAG/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotLoader.js","sourceRoot":"","sources":["../src/snapshotLoader.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 { assert, bufferToString } from \"@fluidframework/common-utils\";\nimport { IFluidSerializer } from \"@fluidframework/core-interfaces\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { Client } from \"./client\";\nimport { NonCollabClient, UniversalSequenceNumber } from \"./constants\";\nimport { ISegment, MergeTree } from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport {\n IJSONSegmentWithMergeInfo,\n hasMergeInfo,\n MergeTreeChunkV1,\n} from \"./snapshotChunks\";\nimport { SnapshotV1 } from \"./snapshotV1\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\n\nexport class SnapshotLoader {\n private readonly logger: ITelemetryLogger;\n\n constructor(\n private readonly runtime: IFluidDataStoreRuntime,\n private readonly client: Client,\n private readonly mergeTree: MergeTree,\n logger: ITelemetryLogger,\n private readonly serializer: IFluidSerializer) {\n this.logger = ChildLogger.create(logger, \"SnapshotLoader\");\n }\n\n public async initialize(\n services: IChannelStorageService,\n ): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n const headerLoadedP =\n services.readBlob(SnapshotLegacy.header).then((header) => {\n assert(!!header, 0x05f /* \"Missing blob header on legacy snapshot!\" */);\n return this.loadHeader(bufferToString(header,\"utf8\"));\n });\n\n const catchupOpsP =\n this.loadBodyAndCatchupOps(headerLoadedP, services);\n\n catchupOpsP.catch(\n (err)=>this.logger.sendErrorEvent({ eventName: \"CatchupOpsLoadFailure\" },err));\n\n await headerLoadedP;\n\n return { catchupOpsP };\n }\n\n private async loadBodyAndCatchupOps(\n headerChunkP: Promise<MergeTreeChunkV1>,\n services: IChannelStorageService,\n ): Promise<ISequencedDocumentMessage[]> {\n const blobsP = services.list(\"\");\n const headerChunk = await headerChunkP;\n\n // TODO we shouldn't need to wait on the body being complete to finish initialization.\n // To fully support this we need to be able to process inbound ops for pending segments.\n await this.loadBody(headerChunk, services);\n\n const blobs = await blobsP;\n if (blobs.length === headerChunk.headerMetadata!.orderedChunkMetadata.length + 1) {\n headerChunk.headerMetadata!.orderedChunkMetadata.forEach(\n (md) => blobs.splice(blobs.indexOf(md.id), 1));\n assert(blobs.length === 1, 0x060 /* `There should be only one blob with catch up ops: ${blobs.length}` */);\n\n // TODO: The 'Snapshot.catchupOps' tree entry is purely for backwards compatibility.\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n\n return this.loadCatchupOps(services.readBlob(blobs[0]));\n } else if (blobs.length !== headerChunk.headerMetadata!.orderedChunkMetadata.length) {\n throw new Error(\"Unexpected blobs in snapshot\");\n }\n return [];\n }\n\n private readonly specToSegment = (spec: IJSONSegment | IJSONSegmentWithMergeInfo) => {\n let seg: ISegment;\n\n if (hasMergeInfo(spec)) {\n seg = this.client.specToSegment(spec.json);\n\n // `specToSegment()` initializes `seg` with the LocalClientId. Overwrite this with\n // the `spec` client (if specified). Otherwise overwrite with `NonCollabClient`.\n seg.clientId = spec.client !== undefined\n ? this.client.getOrAddShortClientId(spec.client)\n : NonCollabClient;\n\n seg.seq = spec.seq !== undefined\n ? spec.seq\n : UniversalSequenceNumber;\n\n if (spec.removedSeq !== undefined) {\n seg.removedSeq = spec.removedSeq;\n }\n if (spec.removedClient !== undefined) {\n seg.removedClientId = this.client.getOrAddShortClientId(spec.removedClient);\n }\n } else {\n seg = this.client.specToSegment(spec);\n seg.seq = UniversalSequenceNumber;\n\n // `specToSegment()` initializes `seg` with the LocalClientId. We must overwrite this with\n // `NonCollabClient`.\n seg.clientId = NonCollabClient;\n }\n\n return seg;\n };\n\n private loadHeader(header: string): MergeTreeChunkV1 {\n const chunk = SnapshotV1.processChunk(\n SnapshotLegacy.header,\n header,\n this.logger,\n this.mergeTree.options,\n this.serializer);\n const segs = chunk.segments.map(this.specToSegment);\n this.mergeTree.reloadFromSegments(segs);\n\n if (chunk.headerMetadata === undefined) {\n throw new Error(\"header metadata not available\");\n }\n // If we load a detached container from snapshot, then we don't supply a default clientId\n // because we don't want to start collaboration.\n if (this.runtime.attachState !== AttachState.Detached) {\n // specify a default client id, \"snapshot\" here as we\n // should enter collaboration/op sending mode if we load\n // a snapshot in any case (summary or attach message)\n // once we get a client id this will be called with that\n // clientId in the connected event\n this.client.startOrUpdateCollaboration(\n this.runtime.clientId ?? \"snapshot\",\n\n // TODO: Make 'minSeq' non-optional once the new snapshot format becomes the default?\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n /* minSeq: */ chunk.headerMetadata.minSequenceNumber !== undefined\n ? chunk.headerMetadata.minSequenceNumber\n : chunk.headerMetadata.sequenceNumber,\n /* currentSeq: */ chunk.headerMetadata.sequenceNumber,\n );\n }\n\n return chunk;\n }\n\n private async loadBody(chunk1: MergeTreeChunkV1, services: IChannelStorageService): Promise<void> {\n assert(\n chunk1.length <= chunk1.headerMetadata!.totalLength,\n 0x061 /* \"Mismatch in totalLength\" */);\n\n assert(\n chunk1.segmentCount <= chunk1.headerMetadata!.totalSegmentCount,\n 0x062 /* \"Mismatch in totalSegmentCount\" */);\n\n if (chunk1.segmentCount === chunk1.headerMetadata!.totalSegmentCount) {\n return;\n }\n const segs: ISegment[] = [];\n let lengthSofar = chunk1.length;\n for (let chunkIndex = 1; chunkIndex < chunk1.headerMetadata!.orderedChunkMetadata.length; chunkIndex++) {\n const chunk = await SnapshotV1.loadChunk(\n services,\n chunk1.headerMetadata!.orderedChunkMetadata[chunkIndex].id,\n this.logger,\n this.mergeTree.options,\n this.serializer);\n lengthSofar += chunk.length;\n // Deserialize each chunk segment and append it to the end of the MergeTree.\n segs.push(...chunk.segments.map(this.specToSegment));\n }\n assert(\n lengthSofar === chunk1.headerMetadata!.totalLength,\n 0x063 /* \"Mismatch in totalLength\" */);\n\n assert(\n chunk1.segmentCount + segs.length === chunk1.headerMetadata!.totalSegmentCount,\n 0x064 /* \"Mismatch in totalSegmentCount\" */);\n\n // Helper to insert segments at the end of the MergeTree.\n const mergeTree = this.mergeTree;\n const append = (segments: ISegment[], cli: number, seq: number) => {\n mergeTree.insertSegments(\n mergeTree.root.cachedLength,\n segments,\n /* refSeq: */ UniversalSequenceNumber,\n cli,\n seq,\n undefined);\n };\n\n // Helpers to batch-insert segments that are below the min seq\n const batch: ISegment[] = [];\n const flushBatch = () => {\n if (batch.length > 0) { append(batch, NonCollabClient, UniversalSequenceNumber); }\n };\n\n for (const seg of segs) {\n const cli = seg.clientId;\n const seq = seg.seq;\n\n // If the segment can be batch inserted, add it to the 'batch' array. Otherwise, flush\n // any batched segments and then insert the current segment individually.\n if (cli === NonCollabClient && seq === UniversalSequenceNumber) {\n batch.push(seg);\n } else {\n flushBatch();\n append([seg], cli, seq!);\n }\n }\n\n flushBatch();\n }\n\n /**\n * If loading from a snapshot, get the catchup messages.\n * @param rawMessages - The messages in original encoding\n * @returns The decoded messages, but handles aren't parsed. Matches the format that will be passed in\n * SharedObject.processCore.\n */\n private async loadCatchupOps(rawMessages: Promise<ArrayBufferLike>): Promise<ISequencedDocumentMessage[]> {\n return JSON.parse(bufferToString(await rawMessages, \"utf8\")) as ISequencedDocumentMessage[];\n }\n}\n"]}
1
+ {"version":3,"file":"snapshotLoader.js","sourceRoot":"","sources":["../src/snapshotLoader.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6DAA6D;AAE7D,+DAAsE;AAEtE,qEAA8D;AAI9D,iFAAoE;AAEpE,2CAAuE;AAGvE,qDAI0B;AAC1B,6CAA0C;AAC1C,qDAAkD;AAElD,MAAa,cAAc;IAGvB,YACqB,OAA+B,EAC/B,MAAc,EACd,SAAoB,EACrC,MAAwB,EACP,UAA4B;QAJ5B,YAAO,GAAP,OAAO,CAAwB;QAC/B,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAAW;QAEpB,eAAU,GAAV,UAAU,CAAkB;QAmDhC,kBAAa,GAAG,CAAC,IAA8C,EAAE,EAAE;YAChF,IAAI,GAAa,CAAC;YAElB,IAAI,6BAAY,CAAC,IAAI,CAAC,EAAE;gBACpB,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE3C,mFAAmF;gBACnF,iFAAiF;gBACjF,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS;oBACpC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC;oBAChD,CAAC,CAAC,2BAAe,CAAC;gBAEtB,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS;oBAC5B,CAAC,CAAC,IAAI,CAAC,GAAG;oBACV,CAAC,CAAC,mCAAuB,CAAC;gBAE9B,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;oBAC/B,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;iBACpC;gBACD,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;oBAClC,GAAG,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBAC/E;aACJ;iBAAM;gBACH,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACtC,GAAG,CAAC,GAAG,GAAG,mCAAuB,CAAC;gBAElC,2FAA2F;gBAC3F,qBAAqB;gBACrB,GAAG,CAAC,QAAQ,GAAG,2BAAe,CAAC;aAClC;YAED,OAAO,GAAG,CAAC;QACf,CAAC,CAAC;QAlFE,IAAI,CAAC,MAAM,GAAG,6BAAW,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC/D,CAAC;IAEM,KAAK,CAAC,UAAU,CACnB,QAAgC;QAEhC,MAAM,aAAa,GACf,QAAQ,CAAC,QAAQ,CAAC,+BAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACrD,qBAAM,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC,UAAU,CAAC,6BAAc,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEP,MAAM,WAAW,GACb,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAExD,WAAW,CAAC,KAAK,CACb,CAAC,GAAG,EAAC,EAAE,CAAA,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,uBAAuB,EAAE,EAAC,GAAG,CAAC,CAAC,CAAC;QAEnF,MAAM,aAAa,CAAC;QAEpB,OAAO,EAAE,WAAW,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAC/B,YAAuC,EACvC,QAAgC;QAEhC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC;QAEvC,sFAAsF;QACtF,wFAAwF;QACxF,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE3C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,cAAe,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9E,WAAW,CAAC,cAAe,CAAC,oBAAoB,CAAC,OAAO,CACpD,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACnD,qBAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,KAAK,CAAC,wEAAwE,CAAC,CAAC;YAE3G,oFAAoF;YACpF,oEAAoE;YAEpE,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3D;aAAM,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,cAAe,CAAC,oBAAoB,CAAC,MAAM,EAAE;YACjF,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;SACnD;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAoCO,UAAU,CAAC,MAAc;;QAC7B,MAAM,KAAK,GAAG,uBAAU,CAAC,YAAY,CACjC,+BAAc,CAAC,MAAM,EACrB,MAAM,EACN,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,CAAC,OAAO,EACtB,IAAI,CAAC,UAAU,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE;YACpC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QACD,yFAAyF;QACzF,gDAAgD;QAChD,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,mCAAW,CAAC,QAAQ,EAAE;YACnD,qDAAqD;YACrD,wDAAwD;YACxD,qDAAqD;YACrD,wDAAwD;YACxD,kCAAkC;YAClC,IAAI,CAAC,MAAM,CAAC,0BAA0B,OAClC,IAAI,CAAC,OAAO,CAAC,QAAQ,mCAAI,UAAU;YAEnC,qFAAqF;YACrF,oEAAoE;YACpE,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,iBAAiB,KAAK,SAAS;gBAC9D,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,iBAAiB;gBACxC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc;YACzC,iBAAiB,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CACxD,CAAC;SACL;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,MAAwB,EAAE,QAAgC;QAC7E,qBAAM,CACF,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,cAAe,CAAC,WAAW,EACnD,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAE3C,qBAAM,CACF,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,cAAe,CAAC,iBAAiB,EAC/D,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,cAAe,CAAC,iBAAiB,EAAE;YAClE,OAAO;SACV;QACD,MAAM,IAAI,GAAe,EAAE,CAAC;QAC5B,IAAI,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAChC,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,cAAe,CAAC,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;YACpG,MAAM,KAAK,GAAG,MAAM,uBAAU,CAAC,SAAS,CACpC,QAAQ,EACR,MAAM,CAAC,cAAe,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,EAAE,EAC1D,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,CAAC,OAAO,EACtB,IAAI,CAAC,UAAU,CAAC,CAAC;YACrB,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;YAC5B,4EAA4E;YAC5E,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;SACxD;QACD,qBAAM,CACF,WAAW,KAAK,MAAM,CAAC,cAAe,CAAC,WAAW,EAClD,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAE3C,qBAAM,CACF,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,cAAe,CAAC,iBAAiB,EAC9E,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAEjD,yDAAyD;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,MAAM,GAAG,CAAC,QAAoB,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE;YAC9D,SAAS,CAAC,cAAc,CACpB,SAAS,CAAC,IAAI,CAAC,YAAY,EAC3B,QAAQ;YACR,aAAa,CAAC,mCAAuB,EACrC,GAAG,EACH,GAAG,EACH,SAAS,CAAC,CAAC;QACnB,CAAC,CAAC;QAEF,8DAA8D;QAC9D,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,GAAG,EAAE;YACpB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBAAE,MAAM,CAAC,KAAK,EAAE,2BAAe,EAAE,mCAAuB,CAAC,CAAC;aAAE;QACtF,CAAC,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACpB,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;YAEpB,uFAAuF;YACvF,yEAAyE;YACzE,IAAI,GAAG,KAAK,2BAAe,IAAI,GAAG,KAAK,mCAAuB,EAAE;gBAC5D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aACnB;iBAAM;gBACH,UAAU,EAAE,CAAC;gBACb,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAI,CAAC,CAAC;aAC5B;SACJ;QAED,UAAU,EAAE,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,cAAc,CAAC,WAAqC;QAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,6BAAc,CAAC,MAAM,WAAW,EAAE,MAAM,CAAC,CAAgC,CAAC;IAChG,CAAC;CACJ;AA9MD,wCA8MC","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 { assert, bufferToString } from \"@fluidframework/common-utils\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { Client } from \"./client\";\nimport { NonCollabClient, UniversalSequenceNumber } from \"./constants\";\nimport { ISegment, MergeTree } from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport {\n IJSONSegmentWithMergeInfo,\n hasMergeInfo,\n MergeTreeChunkV1,\n} from \"./snapshotChunks\";\nimport { SnapshotV1 } from \"./snapshotV1\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\n\nexport class SnapshotLoader {\n private readonly logger: ITelemetryLogger;\n\n constructor(\n private readonly runtime: IFluidDataStoreRuntime,\n private readonly client: Client,\n private readonly mergeTree: MergeTree,\n logger: ITelemetryLogger,\n private readonly serializer: IFluidSerializer) {\n this.logger = ChildLogger.create(logger, \"SnapshotLoader\");\n }\n\n public async initialize(\n services: IChannelStorageService,\n ): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n const headerLoadedP =\n services.readBlob(SnapshotLegacy.header).then((header) => {\n assert(!!header, 0x05f /* \"Missing blob header on legacy snapshot!\" */);\n return this.loadHeader(bufferToString(header,\"utf8\"));\n });\n\n const catchupOpsP =\n this.loadBodyAndCatchupOps(headerLoadedP, services);\n\n catchupOpsP.catch(\n (err)=>this.logger.sendErrorEvent({ eventName: \"CatchupOpsLoadFailure\" },err));\n\n await headerLoadedP;\n\n return { catchupOpsP };\n }\n\n private async loadBodyAndCatchupOps(\n headerChunkP: Promise<MergeTreeChunkV1>,\n services: IChannelStorageService,\n ): Promise<ISequencedDocumentMessage[]> {\n const blobsP = services.list(\"\");\n const headerChunk = await headerChunkP;\n\n // TODO we shouldn't need to wait on the body being complete to finish initialization.\n // To fully support this we need to be able to process inbound ops for pending segments.\n await this.loadBody(headerChunk, services);\n\n const blobs = await blobsP;\n if (blobs.length === headerChunk.headerMetadata!.orderedChunkMetadata.length + 1) {\n headerChunk.headerMetadata!.orderedChunkMetadata.forEach(\n (md) => blobs.splice(blobs.indexOf(md.id), 1));\n assert(blobs.length === 1, 0x060 /* `There should be only one blob with catch up ops: ${blobs.length}` */);\n\n // TODO: The 'Snapshot.catchupOps' tree entry is purely for backwards compatibility.\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n\n return this.loadCatchupOps(services.readBlob(blobs[0]));\n } else if (blobs.length !== headerChunk.headerMetadata!.orderedChunkMetadata.length) {\n throw new Error(\"Unexpected blobs in snapshot\");\n }\n return [];\n }\n\n private readonly specToSegment = (spec: IJSONSegment | IJSONSegmentWithMergeInfo) => {\n let seg: ISegment;\n\n if (hasMergeInfo(spec)) {\n seg = this.client.specToSegment(spec.json);\n\n // `specToSegment()` initializes `seg` with the LocalClientId. Overwrite this with\n // the `spec` client (if specified). Otherwise overwrite with `NonCollabClient`.\n seg.clientId = spec.client !== undefined\n ? this.client.getOrAddShortClientId(spec.client)\n : NonCollabClient;\n\n seg.seq = spec.seq !== undefined\n ? spec.seq\n : UniversalSequenceNumber;\n\n if (spec.removedSeq !== undefined) {\n seg.removedSeq = spec.removedSeq;\n }\n if (spec.removedClient !== undefined) {\n seg.removedClientId = this.client.getOrAddShortClientId(spec.removedClient);\n }\n } else {\n seg = this.client.specToSegment(spec);\n seg.seq = UniversalSequenceNumber;\n\n // `specToSegment()` initializes `seg` with the LocalClientId. We must overwrite this with\n // `NonCollabClient`.\n seg.clientId = NonCollabClient;\n }\n\n return seg;\n };\n\n private loadHeader(header: string): MergeTreeChunkV1 {\n const chunk = SnapshotV1.processChunk(\n SnapshotLegacy.header,\n header,\n this.logger,\n this.mergeTree.options,\n this.serializer);\n const segs = chunk.segments.map(this.specToSegment);\n this.mergeTree.reloadFromSegments(segs);\n\n if (chunk.headerMetadata === undefined) {\n throw new Error(\"header metadata not available\");\n }\n // If we load a detached container from snapshot, then we don't supply a default clientId\n // because we don't want to start collaboration.\n if (this.runtime.attachState !== AttachState.Detached) {\n // specify a default client id, \"snapshot\" here as we\n // should enter collaboration/op sending mode if we load\n // a snapshot in any case (summary or attach message)\n // once we get a client id this will be called with that\n // clientId in the connected event\n this.client.startOrUpdateCollaboration(\n this.runtime.clientId ?? \"snapshot\",\n\n // TODO: Make 'minSeq' non-optional once the new snapshot format becomes the default?\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n /* minSeq: */ chunk.headerMetadata.minSequenceNumber !== undefined\n ? chunk.headerMetadata.minSequenceNumber\n : chunk.headerMetadata.sequenceNumber,\n /* currentSeq: */ chunk.headerMetadata.sequenceNumber,\n );\n }\n\n return chunk;\n }\n\n private async loadBody(chunk1: MergeTreeChunkV1, services: IChannelStorageService): Promise<void> {\n assert(\n chunk1.length <= chunk1.headerMetadata!.totalLength,\n 0x061 /* \"Mismatch in totalLength\" */);\n\n assert(\n chunk1.segmentCount <= chunk1.headerMetadata!.totalSegmentCount,\n 0x062 /* \"Mismatch in totalSegmentCount\" */);\n\n if (chunk1.segmentCount === chunk1.headerMetadata!.totalSegmentCount) {\n return;\n }\n const segs: ISegment[] = [];\n let lengthSofar = chunk1.length;\n for (let chunkIndex = 1; chunkIndex < chunk1.headerMetadata!.orderedChunkMetadata.length; chunkIndex++) {\n const chunk = await SnapshotV1.loadChunk(\n services,\n chunk1.headerMetadata!.orderedChunkMetadata[chunkIndex].id,\n this.logger,\n this.mergeTree.options,\n this.serializer);\n lengthSofar += chunk.length;\n // Deserialize each chunk segment and append it to the end of the MergeTree.\n segs.push(...chunk.segments.map(this.specToSegment));\n }\n assert(\n lengthSofar === chunk1.headerMetadata!.totalLength,\n 0x063 /* \"Mismatch in totalLength\" */);\n\n assert(\n chunk1.segmentCount + segs.length === chunk1.headerMetadata!.totalSegmentCount,\n 0x064 /* \"Mismatch in totalSegmentCount\" */);\n\n // Helper to insert segments at the end of the MergeTree.\n const mergeTree = this.mergeTree;\n const append = (segments: ISegment[], cli: number, seq: number) => {\n mergeTree.insertSegments(\n mergeTree.root.cachedLength,\n segments,\n /* refSeq: */ UniversalSequenceNumber,\n cli,\n seq,\n undefined);\n };\n\n // Helpers to batch-insert segments that are below the min seq\n const batch: ISegment[] = [];\n const flushBatch = () => {\n if (batch.length > 0) { append(batch, NonCollabClient, UniversalSequenceNumber); }\n };\n\n for (const seg of segs) {\n const cli = seg.clientId;\n const seq = seg.seq;\n\n // If the segment can be batch inserted, add it to the 'batch' array. Otherwise, flush\n // any batched segments and then insert the current segment individually.\n if (cli === NonCollabClient && seq === UniversalSequenceNumber) {\n batch.push(seg);\n } else {\n flushBatch();\n append([seg], cli, seq!);\n }\n }\n\n flushBatch();\n }\n\n /**\n * If loading from a snapshot, get the catchup messages.\n * @param rawMessages - The messages in original encoding\n * @returns The decoded messages, but handles aren't parsed. Matches the format that will be passed in\n * SharedObject.processCore.\n */\n private async loadCatchupOps(rawMessages: Promise<ArrayBufferLike>): Promise<ISequencedDocumentMessage[]> {\n return JSON.parse(bufferToString(await rawMessages, \"utf8\")) as ISequencedDocumentMessage[];\n }\n}\n"]}
@@ -3,9 +3,10 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { ITelemetryLogger } from "@fluidframework/common-definitions";
6
- import { IFluidHandle, IFluidSerializer } from "@fluidframework/core-interfaces";
7
- import { ITree } from "@fluidframework/protocol-definitions";
6
+ import { IFluidHandle } from "@fluidframework/core-interfaces";
7
+ import { IFluidSerializer } from "@fluidframework/shared-object-base";
8
8
  import { IChannelStorageService } from "@fluidframework/datastore-definitions";
9
+ import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
9
10
  import { MergeTree } from "./mergeTree";
10
11
  import { PropertySet } from "./properties";
11
12
  import { JsonSegmentSpecs, MergeTreeChunkV1 } from "./snapshotChunks";
@@ -22,10 +23,10 @@ export declare class SnapshotV1 {
22
23
  constructor(mergeTree: MergeTree, logger: ITelemetryLogger, filename?: string | undefined, onCompletion?: (() => void) | undefined);
23
24
  private getSeqLengthSegs;
24
25
  /**
25
- * Emits the snapshot to an ITree. If provided the optional IFluidSerializer will be used when serializing
26
- * the summary data rather than JSON.stringify.
26
+ * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when
27
+ * serializing the summary data rather than JSON.stringify.
27
28
  */
28
- emit(serializer: IFluidSerializer, bind: IFluidHandle): ITree;
29
+ emit(serializer: IFluidSerializer, bind: IFluidHandle): ISummaryTreeWithStats;
29
30
  extractSync(): JsonSegmentSpecs[];
30
31
  static loadChunk(storage: IChannelStorageService, path: string, logger: ITelemetryLogger, options: PropertySet | undefined, serializer?: IFluidSerializer): Promise<MergeTreeChunkV1>;
31
32
  static processChunk(path: string, chunk: string, logger: ITelemetryLogger, options: PropertySet | undefined, serializer?: IFluidSerializer): MergeTreeChunkV1;
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotV1.d.ts","sourceRoot":"","sources":["../src/snapshotV1.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EACH,YAAY,EACZ,gBAAgB,EACnB,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EAEH,KAAK,EAGR,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAE/E,OAAO,EAEH,SAAS,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAEH,WAAW,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAEH,gBAAgB,EAEhB,gBAAgB,EAGnB,MAAM,kBAAkB,CAAC;AAG1B,qBAAa,UAAU;IAgBR,SAAS,EAAE,SAAS;IAEpB,QAAQ,CAAC;IACT,YAAY,CAAC,SAAQ,IAAI;IAZpC,gBAAuB,SAAS,EAAE,MAAM,CAAS;IAEjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGxB,SAAS,EAAE,SAAS,EAC3B,MAAM,EAAE,gBAAgB,EACjB,QAAQ,CAAC,oBAAQ,EACjB,YAAY,CAAC,SAAQ,IAAI,aAAA;IAkBpC,OAAO,CAAC,gBAAgB;IAwBxB;;;OAGG;IACH,IAAI,CACA,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,GACnB,KAAK;IAgER,WAAW;WA+FS,SAAS,CACzB,OAAO,EAAE,sBAAsB,EAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;WAMd,YAAY,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC9B,gBAAgB;CAItB"}
1
+ {"version":3,"file":"snapshotV1.d.ts","sourceRoot":"","sources":["../src/snapshotV1.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,OAAO,EAEH,SAAS,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAEH,WAAW,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAEH,gBAAgB,EAEhB,gBAAgB,EAGnB,MAAM,kBAAkB,CAAC;AAG1B,qBAAa,UAAU;IAgBR,SAAS,EAAE,SAAS;IAEpB,QAAQ,CAAC;IACT,YAAY,CAAC,SAAQ,IAAI;IAZpC,gBAAuB,SAAS,EAAE,MAAM,CAAS;IAEjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGxB,SAAS,EAAE,SAAS,EAC3B,MAAM,EAAE,gBAAgB,EACjB,QAAQ,CAAC,oBAAQ,EACjB,YAAY,CAAC,SAAQ,IAAI,aAAA;IAkBpC,OAAO,CAAC,gBAAgB;IAwBxB;;;OAGG;IACH,IAAI,CACA,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,GACnB,qBAAqB;IAgDxB,WAAW;WA+FS,SAAS,CACzB,OAAO,EAAE,sBAAsB,EAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;WAMd,YAAY,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC9B,gBAAgB;CAItB"}
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.SnapshotV1 = void 0;
8
8
  const common_utils_1 = require("@fluidframework/common-utils");
9
9
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
10
- const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
10
+ const runtime_utils_1 = require("@fluidframework/runtime-utils");
11
11
  const constants_1 = require("./constants");
12
12
  const properties_1 = require("./properties");
13
13
  const snapshotChunks_1 = require("./snapshotChunks");
@@ -51,8 +51,8 @@ class SnapshotV1 {
51
51
  };
52
52
  }
53
53
  /**
54
- * Emits the snapshot to an ITree. If provided the optional IFluidSerializer will be used when serializing
55
- * the summary data rather than JSON.stringify.
54
+ * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when
55
+ * serializing the summary data rather than JSON.stringify.
56
56
  */
57
57
  emit(serializer, bind) {
58
58
  const chunks = [];
@@ -69,34 +69,18 @@ class SnapshotV1 {
69
69
  const headerChunk = chunks.shift();
70
70
  headerChunk.headerMetadata = this.header;
71
71
  headerChunk.headerMetadata.orderedChunkMetadata = [{ id: snapshotlegacy_1.SnapshotLegacy.header }];
72
- const entries = chunks.map((chunk, index) => {
72
+ const blobs = [];
73
+ chunks.forEach((chunk, index) => {
73
74
  const id = `${snapshotlegacy_1.SnapshotLegacy.body}_${index}`;
74
75
  this.header.orderedChunkMetadata.push({ id });
75
- return {
76
- mode: protocol_definitions_1.FileMode.File,
77
- path: id,
78
- type: protocol_definitions_1.TreeEntry.Blob,
79
- value: {
80
- contents: snapshotChunks_1.serializeAsMaxSupportedVersion(id, chunk, this.logger, this.mergeTree.options, serializer, bind),
81
- encoding: "utf-8",
82
- },
83
- };
76
+ blobs.push([id, snapshotChunks_1.serializeAsMaxSupportedVersion(id, chunk, this.logger, this.mergeTree.options, serializer, bind)]);
84
77
  });
85
- const tree = {
86
- entries: [
87
- {
88
- mode: protocol_definitions_1.FileMode.File,
89
- path: snapshotlegacy_1.SnapshotLegacy.header,
90
- type: protocol_definitions_1.TreeEntry.Blob,
91
- value: {
92
- contents: snapshotChunks_1.serializeAsMaxSupportedVersion(snapshotlegacy_1.SnapshotLegacy.header, headerChunk, this.logger, this.mergeTree.options, serializer, bind),
93
- encoding: "utf-8",
94
- },
95
- },
96
- ...entries,
97
- ],
98
- };
99
- return tree;
78
+ const builder = new runtime_utils_1.SummaryTreeBuilder();
79
+ builder.addBlob(snapshotlegacy_1.SnapshotLegacy.header, snapshotChunks_1.serializeAsMaxSupportedVersion(snapshotlegacy_1.SnapshotLegacy.header, headerChunk, this.logger, this.mergeTree.options, serializer, bind));
80
+ blobs.forEach((value) => {
81
+ builder.addBlob(value[0], value[1]);
82
+ });
83
+ return builder.getSummaryTree();
100
84
  }
101
85
  extractSync() {
102
86
  const mergeTree = this.mergeTree;
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotV1.js","sourceRoot":"","sources":["../src/snapshotV1.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n IFluidHandle,\n IFluidSerializer,\n} from \"@fluidframework/core-interfaces\";\nimport { assert, bufferToString } from \"@fluidframework/common-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport {\n FileMode,\n ITree,\n TreeEntry,\n ITreeEntry,\n} from \"@fluidframework/protocol-definitions\";\nimport { IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport {\n ISegment,\n MergeTree,\n} from \"./mergeTree\";\nimport {\n matchProperties,\n PropertySet,\n} from \"./properties\";\nimport {\n IJSONSegmentWithMergeInfo,\n JsonSegmentSpecs,\n MergeTreeHeaderMetadata,\n MergeTreeChunkV1,\n toLatestVersion,\n serializeAsMaxSupportedVersion,\n} from \"./snapshotChunks\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\n\nexport class SnapshotV1 {\n // Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content\n // Please note that this number has no direct relationship to anything other than size of raw text (characters).\n // As we produce json for the blob (and then send over the wire compressed), this number\n // is really hard to correlate with any actual metric that matters (like bytes over the wire).\n // For test with small number of chunks it would be closer to blob size,\n // for very chunky text, blob size can easily be 4x-8x of that number.\n public static readonly chunkSize: number = 10000;\n\n private readonly header: MergeTreeHeaderMetadata;\n private readonly segments: JsonSegmentSpecs[];\n private readonly segmentLengths: number[];\n private readonly logger: ITelemetryLogger;\n private readonly chunkSize: number;\n\n constructor(\n public mergeTree: MergeTree,\n logger: ITelemetryLogger,\n public filename?: string,\n public onCompletion?: () => void,\n ) {\n this.logger = ChildLogger.create(logger, \"Snapshot\");\n this.chunkSize = mergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotV1.chunkSize;\n\n const { currentSeq, minSeq } = mergeTree.getCollabWindow();\n this.header = {\n minSequenceNumber: minSeq,\n sequenceNumber: currentSeq,\n orderedChunkMetadata: [],\n totalLength: 0,\n totalSegmentCount: 0,\n };\n\n this.segments = [];\n this.segmentLengths = [];\n }\n\n private getSeqLengthSegs(\n allSegments: JsonSegmentSpecs[],\n allLengths: number[],\n approxSequenceLength: number,\n startIndex = 0): MergeTreeChunkV1 {\n const segments: JsonSegmentSpecs[] = [];\n let length = 0;\n let segmentCount = 0;\n while ((length < approxSequenceLength) && ((startIndex + segmentCount) < allSegments.length)) {\n const pseg = allSegments[startIndex + segmentCount];\n segments.push(pseg);\n length += allLengths[startIndex + segmentCount];\n segmentCount++;\n }\n return {\n version: \"1\",\n segmentCount,\n length,\n segments,\n startIndex,\n headerMetadata: undefined,\n };\n }\n\n /**\n * Emits the snapshot to an ITree. If provided the optional IFluidSerializer will be used when serializing\n * the summary data rather than JSON.stringify.\n */\n emit(\n serializer: IFluidSerializer,\n bind: IFluidHandle,\n ): ITree {\n const chunks: MergeTreeChunkV1[] = [];\n this.header.totalSegmentCount = 0;\n this.header.totalLength = 0;\n do {\n const chunk = this.getSeqLengthSegs(\n this.segments,\n this.segmentLengths,\n this.chunkSize,\n this.header.totalSegmentCount);\n chunks.push(chunk);\n this.header.totalSegmentCount += chunk.segmentCount;\n this.header.totalLength += chunk.length;\n } while (this.header.totalSegmentCount < this.segments.length);\n\n // The do while loop should have added at least one chunk\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const headerChunk = chunks.shift()!;\n headerChunk.headerMetadata = this.header;\n headerChunk.headerMetadata.orderedChunkMetadata = [{ id: SnapshotLegacy.header }];\n const entries: ITreeEntry[] = chunks.map<ITreeEntry>((chunk, index) => {\n const id = `${SnapshotLegacy.body}_${index}`;\n this.header.orderedChunkMetadata.push({ id });\n return {\n mode: FileMode.File,\n path: id,\n type: TreeEntry.Blob,\n value: {\n contents: serializeAsMaxSupportedVersion(\n id,\n chunk,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind),\n encoding: \"utf-8\",\n },\n };\n });\n\n const tree: ITree = {\n entries: [\n {\n mode: FileMode.File,\n path: SnapshotLegacy.header,\n type: TreeEntry.Blob,\n value: {\n contents: serializeAsMaxSupportedVersion(\n SnapshotLegacy.header,\n headerChunk,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind),\n encoding: \"utf-8\",\n },\n },\n ...entries,\n ],\n };\n\n return tree;\n }\n\n extractSync() {\n const mergeTree = this.mergeTree;\n const minSeq = this.header.minSequenceNumber;\n\n // Helper to add the given `MergeTreeChunkV0SegmentSpec` to the snapshot.\n const pushSegRaw = (json: JsonSegmentSpecs, length: number) => {\n this.segments.push(json);\n this.segmentLengths.push(length);\n };\n\n // Helper to serialize the given `segment` and add it to the snapshot (if a segment is provided).\n const pushSeg = (segment?: ISegment) => {\n if (segment) { pushSegRaw(segment.toJSONObject(), segment.cachedLength); }\n };\n\n let prev: ISegment | undefined;\n const extractSegment = (segment: ISegment) => {\n // Elide segments that do not need to be included in the snapshot. A segment may be elided if\n // either condition is true:\n // a) The segment has not yet been ACKed. We do not need to snapshot unACKed segments because\n // there is a pending insert op that will deliver the segment on reconnection.\n // b) The segment was removed at or below the MSN. Pending ops can no longer reference this\n // segment, and therefore we can discard it.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (segment.seq === UnassignedSequenceNumber || segment.removedSeq! <= minSeq) {\n return true;\n }\n\n // Next determine if the snapshot needs to preserve information required for merging the segment\n // (seq, client, etc.) This information is only needed if the segment is above the MSN (and doesn't\n // have a pending remove.)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((segment.seq! <= minSeq) // Segment is below the MSN, and...\n && (segment.removedSeq === undefined // .. Segment has not been removed, or...\n || segment.removedSeq === UnassignedSequenceNumber) // .. Removal op to be delivered on reconnect\n ) {\n // This segment is below the MSN, which means that future ops will not reference it. Attempt to\n // coalesce the new segment with the previous (if any).\n if (!prev) {\n // We do not have a previous candidate for coalescing. Make the current segment the new candidate.\n prev = segment;\n } else if (prev.canAppend(segment) && matchProperties(prev.properties, segment.properties)) {\n // We have a compatible pair. Replace `prev` with the coalesced segment. Clone to avoid\n // modifying the segment instances currently in the MergeTree.\n prev = prev.clone();\n prev.append(segment.clone());\n } else {\n // The segment pair could not be coalesced. Record the `prev` segment in the snapshot\n // and make the current segment the new candidate for coalescing.\n pushSeg(prev);\n prev = segment;\n }\n } else {\n // This segment needs to preserve it's metadata as it may be referenced by future ops. It's ineligible\n // for coalescing, so emit the 'prev' segment now (if any).\n pushSeg(prev);\n prev = undefined;\n\n const raw: IJSONSegmentWithMergeInfo = { json: segment.toJSONObject() };\n // If the segment insertion is above the MSN, record the insertion merge info.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (segment.seq! > minSeq) {\n raw.seq = segment.seq;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n raw.client = mergeTree.getLongClientId!(segment.clientId);\n }\n // We have already dispensed with removed segments below the MSN and removed segments with unassigned\n // sequence numbers. Any remaining removal info should be preserved.\n if (segment.removedSeq !== undefined) {\n assert(segment.removedSeq !== UnassignedSequenceNumber && segment.removedSeq > minSeq,\n 0x065 /* \"On removal info preservation, segment has invalid removed sequence number!\" */);\n raw.removedSeq = segment.removedSeq;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n raw.removedClient = mergeTree.getLongClientId!(segment.removedClientId!);\n }\n\n // Sanity check that we are preserving either the seq < minSeq or a removed segment's info.\n assert(raw.seq !== undefined && raw.client !== undefined\n || raw.removedSeq !== undefined && raw.removedClient !== undefined,\n 0x066 /* \"Corrupted preservation of segment metadata!\" */);\n\n // Record the segment with it's required metadata.\n pushSegRaw(raw, segment.cachedLength);\n }\n return true;\n };\n\n mergeTree.walkAllSegments(mergeTree.root, extractSegment, this);\n\n // If the last segment in the walk was coalescable, push it now.\n pushSeg(prev);\n\n return this.segments;\n }\n\n public static async loadChunk(\n storage: IChannelStorageService,\n path: string,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer?: IFluidSerializer,\n ): Promise<MergeTreeChunkV1> {\n const blob = await storage.readBlob(path);\n const chunkAsString = bufferToString(blob, \"utf8\");\n return SnapshotV1.processChunk(path, chunkAsString, logger, options, serializer);\n }\n\n public static processChunk(\n path: string,\n chunk: string,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer?: IFluidSerializer,\n ): MergeTreeChunkV1 {\n const chunkObj = serializer ? serializer.parse(chunk) : JSON.parse(chunk);\n return toLatestVersion(path, chunkObj, logger, options);\n }\n}\n"]}
1
+ {"version":3,"file":"snapshotV1.js","sourceRoot":"","sources":["../src/snapshotV1.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { assert, bufferToString } from \"@fluidframework/common-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport {\n ISegment,\n MergeTree,\n} from \"./mergeTree\";\nimport {\n matchProperties,\n PropertySet,\n} from \"./properties\";\nimport {\n IJSONSegmentWithMergeInfo,\n JsonSegmentSpecs,\n MergeTreeHeaderMetadata,\n MergeTreeChunkV1,\n toLatestVersion,\n serializeAsMaxSupportedVersion,\n} from \"./snapshotChunks\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\n\nexport class SnapshotV1 {\n // Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content\n // Please note that this number has no direct relationship to anything other than size of raw text (characters).\n // As we produce json for the blob (and then send over the wire compressed), this number\n // is really hard to correlate with any actual metric that matters (like bytes over the wire).\n // For test with small number of chunks it would be closer to blob size,\n // for very chunky text, blob size can easily be 4x-8x of that number.\n public static readonly chunkSize: number = 10000;\n\n private readonly header: MergeTreeHeaderMetadata;\n private readonly segments: JsonSegmentSpecs[];\n private readonly segmentLengths: number[];\n private readonly logger: ITelemetryLogger;\n private readonly chunkSize: number;\n\n constructor(\n public mergeTree: MergeTree,\n logger: ITelemetryLogger,\n public filename?: string,\n public onCompletion?: () => void,\n ) {\n this.logger = ChildLogger.create(logger, \"Snapshot\");\n this.chunkSize = mergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotV1.chunkSize;\n\n const { currentSeq, minSeq } = mergeTree.getCollabWindow();\n this.header = {\n minSequenceNumber: minSeq,\n sequenceNumber: currentSeq,\n orderedChunkMetadata: [],\n totalLength: 0,\n totalSegmentCount: 0,\n };\n\n this.segments = [];\n this.segmentLengths = [];\n }\n\n private getSeqLengthSegs(\n allSegments: JsonSegmentSpecs[],\n allLengths: number[],\n approxSequenceLength: number,\n startIndex = 0): MergeTreeChunkV1 {\n const segments: JsonSegmentSpecs[] = [];\n let length = 0;\n let segmentCount = 0;\n while ((length < approxSequenceLength) && ((startIndex + segmentCount) < allSegments.length)) {\n const pseg = allSegments[startIndex + segmentCount];\n segments.push(pseg);\n length += allLengths[startIndex + segmentCount];\n segmentCount++;\n }\n return {\n version: \"1\",\n segmentCount,\n length,\n segments,\n startIndex,\n headerMetadata: undefined,\n };\n }\n\n /**\n * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when\n * serializing the summary data rather than JSON.stringify.\n */\n emit(\n serializer: IFluidSerializer,\n bind: IFluidHandle,\n ): ISummaryTreeWithStats {\n const chunks: MergeTreeChunkV1[] = [];\n this.header.totalSegmentCount = 0;\n this.header.totalLength = 0;\n do {\n const chunk = this.getSeqLengthSegs(\n this.segments,\n this.segmentLengths,\n this.chunkSize,\n this.header.totalSegmentCount);\n chunks.push(chunk);\n this.header.totalSegmentCount += chunk.segmentCount;\n this.header.totalLength += chunk.length;\n } while (this.header.totalSegmentCount < this.segments.length);\n\n // The do while loop should have added at least one chunk\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const headerChunk = chunks.shift()!;\n headerChunk.headerMetadata = this.header;\n headerChunk.headerMetadata.orderedChunkMetadata = [{ id: SnapshotLegacy.header }];\n const blobs: [key: string, content: string][] = [];\n chunks.forEach((chunk, index) => {\n const id = `${SnapshotLegacy.body}_${index}`;\n this.header.orderedChunkMetadata.push({ id });\n blobs.push([id, serializeAsMaxSupportedVersion(\n id,\n chunk,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind)]);\n });\n\n const builder = new SummaryTreeBuilder();\n builder.addBlob(SnapshotLegacy.header, serializeAsMaxSupportedVersion(\n SnapshotLegacy.header,\n headerChunk,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind));\n blobs.forEach((value) => {\n builder.addBlob(value[0], value[1]);\n });\n\n return builder.getSummaryTree();\n }\n\n extractSync() {\n const mergeTree = this.mergeTree;\n const minSeq = this.header.minSequenceNumber;\n\n // Helper to add the given `MergeTreeChunkV0SegmentSpec` to the snapshot.\n const pushSegRaw = (json: JsonSegmentSpecs, length: number) => {\n this.segments.push(json);\n this.segmentLengths.push(length);\n };\n\n // Helper to serialize the given `segment` and add it to the snapshot (if a segment is provided).\n const pushSeg = (segment?: ISegment) => {\n if (segment) { pushSegRaw(segment.toJSONObject(), segment.cachedLength); }\n };\n\n let prev: ISegment | undefined;\n const extractSegment = (segment: ISegment) => {\n // Elide segments that do not need to be included in the snapshot. A segment may be elided if\n // either condition is true:\n // a) The segment has not yet been ACKed. We do not need to snapshot unACKed segments because\n // there is a pending insert op that will deliver the segment on reconnection.\n // b) The segment was removed at or below the MSN. Pending ops can no longer reference this\n // segment, and therefore we can discard it.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (segment.seq === UnassignedSequenceNumber || segment.removedSeq! <= minSeq) {\n return true;\n }\n\n // Next determine if the snapshot needs to preserve information required for merging the segment\n // (seq, client, etc.) This information is only needed if the segment is above the MSN (and doesn't\n // have a pending remove.)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((segment.seq! <= minSeq) // Segment is below the MSN, and...\n && (segment.removedSeq === undefined // .. Segment has not been removed, or...\n || segment.removedSeq === UnassignedSequenceNumber) // .. Removal op to be delivered on reconnect\n ) {\n // This segment is below the MSN, which means that future ops will not reference it. Attempt to\n // coalesce the new segment with the previous (if any).\n if (!prev) {\n // We do not have a previous candidate for coalescing. Make the current segment the new candidate.\n prev = segment;\n } else if (prev.canAppend(segment) && matchProperties(prev.properties, segment.properties)) {\n // We have a compatible pair. Replace `prev` with the coalesced segment. Clone to avoid\n // modifying the segment instances currently in the MergeTree.\n prev = prev.clone();\n prev.append(segment.clone());\n } else {\n // The segment pair could not be coalesced. Record the `prev` segment in the snapshot\n // and make the current segment the new candidate for coalescing.\n pushSeg(prev);\n prev = segment;\n }\n } else {\n // This segment needs to preserve it's metadata as it may be referenced by future ops. It's ineligible\n // for coalescing, so emit the 'prev' segment now (if any).\n pushSeg(prev);\n prev = undefined;\n\n const raw: IJSONSegmentWithMergeInfo = { json: segment.toJSONObject() };\n // If the segment insertion is above the MSN, record the insertion merge info.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (segment.seq! > minSeq) {\n raw.seq = segment.seq;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n raw.client = mergeTree.getLongClientId!(segment.clientId);\n }\n // We have already dispensed with removed segments below the MSN and removed segments with unassigned\n // sequence numbers. Any remaining removal info should be preserved.\n if (segment.removedSeq !== undefined) {\n assert(segment.removedSeq !== UnassignedSequenceNumber && segment.removedSeq > minSeq,\n 0x065 /* \"On removal info preservation, segment has invalid removed sequence number!\" */);\n raw.removedSeq = segment.removedSeq;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n raw.removedClient = mergeTree.getLongClientId!(segment.removedClientId!);\n }\n\n // Sanity check that we are preserving either the seq < minSeq or a removed segment's info.\n assert(raw.seq !== undefined && raw.client !== undefined\n || raw.removedSeq !== undefined && raw.removedClient !== undefined,\n 0x066 /* \"Corrupted preservation of segment metadata!\" */);\n\n // Record the segment with it's required metadata.\n pushSegRaw(raw, segment.cachedLength);\n }\n return true;\n };\n\n mergeTree.walkAllSegments(mergeTree.root, extractSegment, this);\n\n // If the last segment in the walk was coalescable, push it now.\n pushSeg(prev);\n\n return this.segments;\n }\n\n public static async loadChunk(\n storage: IChannelStorageService,\n path: string,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer?: IFluidSerializer,\n ): Promise<MergeTreeChunkV1> {\n const blob = await storage.readBlob(path);\n const chunkAsString = bufferToString(blob, \"utf8\");\n return SnapshotV1.processChunk(path, chunkAsString, logger, options, serializer);\n }\n\n public static processChunk(\n path: string,\n chunk: string,\n logger: ITelemetryLogger,\n options: PropertySet | undefined,\n serializer?: IFluidSerializer,\n ): MergeTreeChunkV1 {\n const chunkObj = serializer ? serializer.parse(chunk) : JSON.parse(chunk);\n return toLatestVersion(path, chunkObj, logger, options);\n }\n}\n"]}
@@ -3,8 +3,10 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { ITelemetryLogger } from "@fluidframework/common-definitions";
6
- import { IFluidHandle, IFluidSerializer } from "@fluidframework/core-interfaces";
7
- import { ISequencedDocumentMessage, ITree } from "@fluidframework/protocol-definitions";
6
+ import { IFluidHandle } from "@fluidframework/core-interfaces";
7
+ import { IFluidSerializer } from "@fluidframework/shared-object-base";
8
+ import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
9
+ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
8
10
  import { MergeTree } from "./mergeTree";
9
11
  import { IJSONSegment } from "./ops";
10
12
  export declare class SnapshotLegacy {
@@ -24,10 +26,10 @@ export declare class SnapshotLegacy {
24
26
  constructor(mergeTree: MergeTree, logger: ITelemetryLogger, filename?: string | undefined, onCompletion?: (() => void) | undefined);
25
27
  private getSeqLengthSegs;
26
28
  /**
27
- * Emits the snapshot to an ITree. If provided the optional IFluidSerializer will be used when serializing
28
- * the summary data rather than JSON.stringify.
29
+ * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when
30
+ * serializing the summary data rather than JSON.stringify.
29
31
  */
30
- emit(catchUpMsgs: ISequencedDocumentMessage[], serializer: IFluidSerializer, bind: IFluidHandle): ITree;
32
+ emit(catchUpMsgs: ISequencedDocumentMessage[], serializer: IFluidSerializer, bind: IFluidHandle): ISummaryTreeWithStats;
31
33
  extractSync(): IJSONSegment[];
32
34
  }
33
35
  //# sourceMappingURL=snapshotlegacy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotlegacy.d.ts","sourceRoot":"","sources":["../src/snapshotlegacy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EACH,YAAY,EACZ,gBAAgB,EACnB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAY,yBAAyB,EAAE,KAAK,EAAa,MAAM,sCAAsC,CAAC;AAE7G,OAAO,EAEH,SAAS,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAkBrC,qBAAa,cAAc;IAoBJ,SAAS,EAAE,SAAS;IAAmC,QAAQ,CAAC;IACxE,YAAY,CAAC,SAAQ,IAAI;IApBpC,gBAAuB,MAAM,YAAY;IACzC,gBAAuB,IAAI,UAAU;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAQlD,gBAAuB,gBAAgB,EAAE,MAAM,CAAS;IAExD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEhB,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAS,QAAQ,CAAC,oBAAQ,EAChF,YAAY,CAAC,SAAQ,IAAI,aAAA;IAKpC,OAAO,CAAC,gBAAgB;IA0BxB;;;OAGG;IACH,IAAI,CACA,WAAW,EAAE,yBAAyB,EAAE,EACxC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,GACnB,KAAK;IAqER,WAAW;CAgEd"}
1
+ {"version":3,"file":"snapshotlegacy.d.ts","sourceRoot":"","sources":["../src/snapshotlegacy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAGjF,OAAO,EAEH,SAAS,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAkBrC,qBAAa,cAAc;IAoBJ,SAAS,EAAE,SAAS;IAAmC,QAAQ,CAAC;IACxE,YAAY,CAAC,SAAQ,IAAI;IApBpC,gBAAuB,MAAM,YAAY;IACzC,gBAAuB,IAAI,UAAU;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAQlD,gBAAuB,gBAAgB,EAAE,MAAM,CAAS;IAExD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEhB,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAS,QAAQ,CAAC,oBAAQ,EAChF,YAAY,CAAC,SAAQ,IAAI,aAAA;IAKpC,OAAO,CAAC,gBAAgB;IA0BxB;;;OAGG;IACH,IAAI,CACA,WAAW,EAAE,yBAAyB,EAAE,EACxC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,GACnB,qBAAqB;IA4CxB,WAAW;CAgEd"}
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.SnapshotLegacy = void 0;
8
8
  const common_utils_1 = require("@fluidframework/common-utils");
9
9
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
10
- const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
10
+ const runtime_utils_1 = require("@fluidframework/runtime-utils");
11
11
  const constants_1 = require("./constants");
12
12
  const properties_1 = require("./properties");
13
13
  const snapshotChunks_1 = require("./snapshotChunks");
@@ -42,55 +42,28 @@ class SnapshotLegacy {
42
42
  };
43
43
  }
44
44
  /**
45
- * Emits the snapshot to an ITree. If provided the optional IFluidSerializer will be used when serializing
46
- * the summary data rather than JSON.stringify.
45
+ * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when
46
+ * serializing the summary data rather than JSON.stringify.
47
47
  */
48
48
  emit(catchUpMsgs, serializer, bind) {
49
49
  var _a, _b;
50
50
  const chunk1 = this.getSeqLengthSegs(this.segments, this.segmentLengths, this.chunkSize);
51
51
  let length = chunk1.chunkLengthChars;
52
52
  let segments = chunk1.chunkSegmentCount;
53
- const tree = {
54
- entries: [
55
- {
56
- mode: protocol_definitions_1.FileMode.File,
57
- path: SnapshotLegacy.header,
58
- type: protocol_definitions_1.TreeEntry.Blob,
59
- value: {
60
- contents: snapshotChunks_1.serializeAsMinSupportedVersion(SnapshotLegacy.header, chunk1, this.logger, this.mergeTree.options, serializer, bind),
61
- encoding: "utf-8",
62
- },
63
- },
64
- ],
65
- };
53
+ const builder = new runtime_utils_1.SummaryTreeBuilder();
54
+ builder.addBlob(SnapshotLegacy.header, snapshotChunks_1.serializeAsMinSupportedVersion(SnapshotLegacy.header, chunk1, this.logger, this.mergeTree.options, serializer, bind));
66
55
  if (chunk1.chunkSegmentCount < chunk1.totalSegmentCount) {
67
56
  const chunk2 = this.getSeqLengthSegs(this.segments, this.segmentLengths, this.header.segmentsTotalLength, chunk1.chunkSegmentCount);
68
57
  length += chunk2.chunkLengthChars;
69
58
  segments += chunk2.chunkSegmentCount;
70
- tree.entries.push({
71
- mode: protocol_definitions_1.FileMode.File,
72
- path: SnapshotLegacy.body,
73
- type: protocol_definitions_1.TreeEntry.Blob,
74
- value: {
75
- contents: snapshotChunks_1.serializeAsMinSupportedVersion(SnapshotLegacy.body, chunk2, this.logger, this.mergeTree.options, serializer, bind),
76
- encoding: "utf-8",
77
- },
78
- });
59
+ builder.addBlob(SnapshotLegacy.body, snapshotChunks_1.serializeAsMinSupportedVersion(SnapshotLegacy.body, chunk2, this.logger, this.mergeTree.options, serializer, bind));
79
60
  }
80
61
  common_utils_1.assert(length === this.header.segmentsTotalLength, 0x05d /* "emit: mismatch in segmentsTotalLength" */);
81
62
  common_utils_1.assert(segments === chunk1.totalSegmentCount, 0x05e /* "emit: mismatch in totalSegmentCount" */);
82
63
  if (catchUpMsgs !== undefined && catchUpMsgs.length > 0) {
83
- tree.entries.push({
84
- mode: protocol_definitions_1.FileMode.File,
85
- path: (_b = (_a = this.mergeTree.options) === null || _a === void 0 ? void 0 : _a.catchUpBlobName) !== null && _b !== void 0 ? _b : SnapshotLegacy.catchupOps,
86
- type: protocol_definitions_1.TreeEntry.Blob,
87
- value: {
88
- contents: serializer ? serializer.stringify(catchUpMsgs, bind) : JSON.stringify(catchUpMsgs),
89
- encoding: "utf-8",
90
- },
91
- });
64
+ builder.addBlob((_b = (_a = this.mergeTree.options) === null || _a === void 0 ? void 0 : _a.catchUpBlobName) !== null && _b !== void 0 ? _b : SnapshotLegacy.catchupOps, serializer ? serializer.stringify(catchUpMsgs, bind) : JSON.stringify(catchUpMsgs));
92
65
  }
93
- return tree;
66
+ return builder.getSummaryTree();
94
67
  }
95
68
  extractSync() {
96
69
  const collabWindow = this.mergeTree.getCollabWindow();
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotlegacy.js","sourceRoot":"","sources":["../src/snapshotlegacy.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport {\n IFluidHandle,\n IFluidSerializer,\n} from \"@fluidframework/core-interfaces\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { FileMode, ISequencedDocumentMessage, ITree, TreeEntry } from \"@fluidframework/protocol-definitions\";\nimport { NonCollabClient, UnassignedSequenceNumber } from \"./constants\";\nimport {\n ISegment,\n MergeTree,\n} from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport { matchProperties } from \"./properties\";\nimport {\n MergeTreeChunkLegacy,\n serializeAsMinSupportedVersion,\n} from \"./snapshotChunks\";\n\ninterface SnapshotHeader {\n chunkCount?: number;\n segmentsTotalLength: number;\n indexOffset?: number;\n segmentsOffset?: number;\n seq: number;\n // TODO: Make 'minSeq' non-optional once the new snapshot format becomes the default?\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n minSeq?: number;\n}\n\nexport class SnapshotLegacy {\n public static readonly header = \"header\";\n public static readonly body = \"body\";\n private static readonly catchupOps = \"catchupOps\";\n\n // Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content\n // Please note that this number has no direct relationship to anything other than size of raw text (characters).\n // As we produce json for the blob (and then send over the wire compressed), this number\n // is really hard to correlate with any actual metric that matters (like bytes over the wire).\n // For test with small number of chunks it would be closer to blob size,\n // for very chunky text, blob size can easily be 4x-8x of that number.\n public static readonly sizeOfFirstChunk: number = 10000;\n\n private header: SnapshotHeader | undefined;\n private seq: number | undefined;\n private segments: IJSONSegment[] | undefined;\n private segmentLengths: number[] | undefined;\n private readonly logger: ITelemetryLogger;\n private readonly chunkSize: number;\n\n constructor(public mergeTree: MergeTree, logger: ITelemetryLogger, public filename?: string,\n public onCompletion?: () => void) {\n this.logger = ChildLogger.create(logger, \"Snapshot\");\n this.chunkSize = mergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotLegacy.sizeOfFirstChunk;\n }\n\n private getSeqLengthSegs(\n allSegments: IJSONSegment[],\n allLengths: number[],\n approxSequenceLength: number,\n startIndex = 0): MergeTreeChunkLegacy {\n const segs: IJSONSegment[] = [];\n let sequenceLength = 0;\n let segCount = 0;\n while ((sequenceLength < approxSequenceLength) && ((startIndex + segCount) < allSegments.length)) {\n const pseg = allSegments[startIndex + segCount];\n segs.push(pseg);\n sequenceLength += allLengths[startIndex + segCount];\n segCount++;\n }\n return {\n version: undefined,\n chunkStartSegmentIndex: startIndex,\n chunkSegmentCount: segCount,\n chunkLengthChars: sequenceLength,\n totalLengthChars: this.header!.segmentsTotalLength,\n totalSegmentCount: allSegments.length,\n chunkSequenceNumber: this.header!.seq,\n segmentTexts: segs,\n };\n }\n\n /**\n * Emits the snapshot to an ITree. If provided the optional IFluidSerializer will be used when serializing\n * the summary data rather than JSON.stringify.\n */\n emit(\n catchUpMsgs: ISequencedDocumentMessage[],\n serializer: IFluidSerializer,\n bind: IFluidHandle,\n ): ITree {\n const chunk1 = this.getSeqLengthSegs(this.segments!, this.segmentLengths!, this.chunkSize);\n let length: number = chunk1.chunkLengthChars;\n let segments: number = chunk1.chunkSegmentCount;\n const tree: ITree = {\n entries: [\n {\n mode: FileMode.File,\n path: SnapshotLegacy.header,\n type: TreeEntry.Blob,\n value: {\n contents: serializeAsMinSupportedVersion(\n SnapshotLegacy.header,\n chunk1,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind),\n encoding: \"utf-8\",\n },\n },\n ],\n };\n\n if (chunk1.chunkSegmentCount < chunk1.totalSegmentCount!) {\n const chunk2 = this.getSeqLengthSegs(this.segments!, this.segmentLengths!,\n this.header!.segmentsTotalLength, chunk1.chunkSegmentCount);\n length += chunk2.chunkLengthChars;\n segments += chunk2.chunkSegmentCount;\n tree.entries.push({\n mode: FileMode.File,\n path: SnapshotLegacy.body,\n type: TreeEntry.Blob,\n value: {\n contents: serializeAsMinSupportedVersion(\n SnapshotLegacy.body,\n chunk2,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind),\n encoding: \"utf-8\",\n },\n });\n }\n\n assert(\n length === this.header!.segmentsTotalLength,\n 0x05d /* \"emit: mismatch in segmentsTotalLength\" */);\n\n assert(\n segments === chunk1.totalSegmentCount,\n 0x05e /* \"emit: mismatch in totalSegmentCount\" */);\n\n if(catchUpMsgs !== undefined && catchUpMsgs.length > 0) {\n tree.entries.push({\n mode: FileMode.File,\n path: this.mergeTree.options?.catchUpBlobName ?? SnapshotLegacy.catchupOps,\n type: TreeEntry.Blob,\n value: {\n contents: serializer ? serializer.stringify(catchUpMsgs, bind) : JSON.stringify(catchUpMsgs),\n encoding: \"utf-8\",\n },\n });\n }\n\n return tree;\n }\n\n extractSync() {\n const collabWindow = this.mergeTree.getCollabWindow();\n this.seq = collabWindow.minSeq;\n this.header = {\n segmentsTotalLength: this.mergeTree.getLength(this.mergeTree.collabWindow.minSeq,\n NonCollabClient),\n seq: this.mergeTree.collabWindow.minSeq,\n };\n\n const segs: ISegment[] = [];\n let prev: ISegment | undefined;\n const extractSegment =\n // eslint-disable-next-line max-len\n (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number | undefined, end: number | undefined) => {\n // eslint-disable-next-line eqeqeq\n if ((segment.seq != UnassignedSequenceNumber) && (segment.seq! <= this.seq!) &&\n // eslint-disable-next-line eqeqeq\n ((segment.removedSeq === undefined) || (segment.removedSeq == UnassignedSequenceNumber) ||\n (segment.removedSeq > this.seq!))) {\n if (prev && prev.canAppend(segment)\n && matchProperties(prev.properties, segment.properties)\n ) {\n prev = prev.clone();\n prev.append(segment.clone());\n } else {\n if (prev) {\n segs.push(prev);\n }\n prev = segment;\n }\n }\n return true;\n };\n\n this.mergeTree.map({ leaf: extractSegment }, this.seq, NonCollabClient, undefined);\n if (prev) {\n segs.push(prev);\n }\n\n this.segments = [];\n this.segmentLengths = [];\n let totalLength: number = 0;\n segs.map((segment) => {\n totalLength += segment.cachedLength;\n this.segments!.push(segment.toJSONObject());\n this.segmentLengths!.push(segment.cachedLength);\n });\n\n // We observed this.header.segmentsTotalLength < totalLength to happen in some cases\n // When this condition happens, we might not write out all segments in getSeqLengthSegs()\n // when writing out \"body\". Issue #1995 tracks following up on the core of the problem.\n // In the meantime, this code makes sure we will write out all segments properly\n // eslint-disable-next-line eqeqeq\n if (this.header.segmentsTotalLength != totalLength) {\n this.logger.sendErrorEvent({\n eventName: \"SegmentsTotalLengthMismatch\",\n totalLength,\n segmentsTotalLength: this.header.segmentsTotalLength,\n });\n this.header.segmentsTotalLength = totalLength;\n }\n\n return this.segments;\n }\n}\n"]}
1
+ {"version":3,"file":"snapshotlegacy.js","sourceRoot":"","sources":["../src/snapshotlegacy.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAKH,+DAAsD;AAItD,qEAA8D;AAE9D,iEAAmE;AACnE,2CAAwE;AAMxE,6CAA+C;AAC/C,qDAG0B;AAa1B,MAAa,cAAc;IAoBvB,YAAmB,SAAoB,EAAE,MAAwB,EAAS,QAAiB,EAChF,YAAyB;;QADjB,cAAS,GAAT,SAAS,CAAW;QAAmC,aAAQ,GAAR,QAAQ,CAAS;QAChF,iBAAY,GAAZ,YAAY,CAAa;QAChC,IAAI,CAAC,MAAM,GAAG,6BAAW,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,eAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,OAAO,0CAAE,0BAA0B,mCAAI,cAAc,CAAC,gBAAgB,CAAC;IACvG,CAAC;IAEO,gBAAgB,CACpB,WAA2B,EAC3B,UAAoB,EACpB,oBAA4B,EAC5B,UAAU,GAAG,CAAC;QACd,MAAM,IAAI,GAAmB,EAAE,CAAC;QAChC,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,OAAO,CAAC,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE;YAC9F,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,cAAc,IAAI,UAAU,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;YACpD,QAAQ,EAAE,CAAC;SACd;QACD,OAAO;YACH,OAAO,EAAE,SAAS;YAClB,sBAAsB,EAAE,UAAU;YAClC,iBAAiB,EAAE,QAAQ;YAC3B,gBAAgB,EAAE,cAAc;YAChC,gBAAgB,EAAE,IAAI,CAAC,MAAO,CAAC,mBAAmB;YAClD,iBAAiB,EAAE,WAAW,CAAC,MAAM;YACrC,mBAAmB,EAAE,IAAI,CAAC,MAAO,CAAC,GAAG;YACrC,YAAY,EAAE,IAAI;SACrB,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,IAAI,CACA,WAAwC,EACxC,UAA4B,EAC5B,IAAkB;;QAElB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAS,EAAE,IAAI,CAAC,cAAe,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3F,IAAI,MAAM,GAAW,MAAM,CAAC,gBAAgB,CAAC;QAC7C,IAAI,QAAQ,GAAW,MAAM,CAAC,iBAAiB,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,kCAAkB,EAAE,CAAC;QACzC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,+CAA8B,CACjE,cAAc,CAAC,MAAM,EACrB,MAAM,EACN,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,CAAC,OAAO,EACtB,UAAU,EACV,IAAI,CAAC,CAAC,CAAC;QAEX,IAAI,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAkB,EAAE;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAS,EAAE,IAAI,CAAC,cAAe,EACrE,IAAI,CAAC,MAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAChE,MAAM,IAAI,MAAM,CAAC,gBAAgB,CAAC;YAClC,QAAQ,IAAI,MAAM,CAAC,iBAAiB,CAAC;YACrC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,+CAA8B,CAC/D,cAAc,CAAC,IAAI,EACnB,MAAM,EACN,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,CAAC,OAAO,EACtB,UAAU,EACV,IAAI,CAAC,CAAC,CAAC;SACd;QAED,qBAAM,CACF,MAAM,KAAK,IAAI,CAAC,MAAO,CAAC,mBAAmB,EAC3C,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAEzD,qBAAM,CACF,QAAQ,KAAK,MAAM,CAAC,iBAAiB,EACrC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAEvD,IAAG,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YACpD,OAAO,CAAC,OAAO,aACX,IAAI,CAAC,SAAS,CAAC,OAAO,0CAAE,eAAe,mCAAI,cAAc,CAAC,UAAU,EACpE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;SAC3F;QAED,OAAO,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAED,WAAW;QACP,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QACtD,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG;YACV,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAC5E,2BAAe,CAAC;YACpB,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM;SAC1C,CAAC;QAEF,MAAM,IAAI,GAAe,EAAE,CAAC;QAC5B,IAAI,IAA0B,CAAC;QAC/B,MAAM,cAAc;QAChB,mCAAmC;QACnC,CAAC,OAAiB,EAAE,GAAW,EAAE,MAAc,EAAE,QAAgB,EAAE,KAAyB,EAAE,GAAuB,EAAE,EAAE;YACrH,kCAAkC;YAClC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,oCAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAI,IAAI,IAAI,CAAC,GAAI,CAAC;gBACxE,kCAAkC;gBAClC,CAAC,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,oCAAwB,CAAC;oBACnF,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAI,CAAC,CAAC,EAAE;gBACvC,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;uBAC5B,4BAAe,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,EACzD;oBACE,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;oBACpB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;iBAChC;qBAAM;oBACH,IAAI,IAAI,EAAE;wBACN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACnB;oBACD,IAAI,GAAG,OAAO,CAAC;iBAClB;aACJ;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QAEN,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,2BAAe,EAAE,SAAS,CAAC,CAAC;QACnF,IAAI,IAAI,EAAE;YACN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACnB;QAED,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,WAAW,GAAW,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACjB,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC;YACpC,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,cAAe,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,oFAAoF;QACpF,yFAAyF;QACzF,uFAAuF;QACvF,gFAAgF;QAChF,kCAAkC;QAClC,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,WAAW,EAAE;YAChD,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;gBACvB,SAAS,EAAE,6BAA6B;gBACxC,WAAW;gBACX,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB;aACvD,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,mBAAmB,GAAG,WAAW,CAAC;SACjD;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;;AAvKL,wCAwKC;AAvK0B,qBAAM,GAAG,QAAQ,CAAC;AAClB,mBAAI,GAAG,MAAM,CAAC;AACb,yBAAU,GAAG,YAAY,CAAC;AAElD,2GAA2G;AAC3G,gHAAgH;AAChH,wFAAwF;AACxF,8FAA8F;AAC9F,wEAAwE;AACxE,sEAAsE;AAC/C,+BAAgB,GAAW,KAAK,CAAC","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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { NonCollabClient, UnassignedSequenceNumber } from \"./constants\";\nimport {\n ISegment,\n MergeTree,\n} from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport { matchProperties } from \"./properties\";\nimport {\n MergeTreeChunkLegacy,\n serializeAsMinSupportedVersion,\n} from \"./snapshotChunks\";\n\ninterface SnapshotHeader {\n chunkCount?: number;\n segmentsTotalLength: number;\n indexOffset?: number;\n segmentsOffset?: number;\n seq: number;\n // TODO: Make 'minSeq' non-optional once the new snapshot format becomes the default?\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n minSeq?: number;\n}\n\nexport class SnapshotLegacy {\n public static readonly header = \"header\";\n public static readonly body = \"body\";\n private static readonly catchupOps = \"catchupOps\";\n\n // Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content\n // Please note that this number has no direct relationship to anything other than size of raw text (characters).\n // As we produce json for the blob (and then send over the wire compressed), this number\n // is really hard to correlate with any actual metric that matters (like bytes over the wire).\n // For test with small number of chunks it would be closer to blob size,\n // for very chunky text, blob size can easily be 4x-8x of that number.\n public static readonly sizeOfFirstChunk: number = 10000;\n\n private header: SnapshotHeader | undefined;\n private seq: number | undefined;\n private segments: IJSONSegment[] | undefined;\n private segmentLengths: number[] | undefined;\n private readonly logger: ITelemetryLogger;\n private readonly chunkSize: number;\n\n constructor(public mergeTree: MergeTree, logger: ITelemetryLogger, public filename?: string,\n public onCompletion?: () => void) {\n this.logger = ChildLogger.create(logger, \"Snapshot\");\n this.chunkSize = mergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotLegacy.sizeOfFirstChunk;\n }\n\n private getSeqLengthSegs(\n allSegments: IJSONSegment[],\n allLengths: number[],\n approxSequenceLength: number,\n startIndex = 0): MergeTreeChunkLegacy {\n const segs: IJSONSegment[] = [];\n let sequenceLength = 0;\n let segCount = 0;\n while ((sequenceLength < approxSequenceLength) && ((startIndex + segCount) < allSegments.length)) {\n const pseg = allSegments[startIndex + segCount];\n segs.push(pseg);\n sequenceLength += allLengths[startIndex + segCount];\n segCount++;\n }\n return {\n version: undefined,\n chunkStartSegmentIndex: startIndex,\n chunkSegmentCount: segCount,\n chunkLengthChars: sequenceLength,\n totalLengthChars: this.header!.segmentsTotalLength,\n totalSegmentCount: allSegments.length,\n chunkSequenceNumber: this.header!.seq,\n segmentTexts: segs,\n };\n }\n\n /**\n * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when\n * serializing the summary data rather than JSON.stringify.\n */\n emit(\n catchUpMsgs: ISequencedDocumentMessage[],\n serializer: IFluidSerializer,\n bind: IFluidHandle,\n ): ISummaryTreeWithStats {\n const chunk1 = this.getSeqLengthSegs(this.segments!, this.segmentLengths!, this.chunkSize);\n let length: number = chunk1.chunkLengthChars;\n let segments: number = chunk1.chunkSegmentCount;\n const builder = new SummaryTreeBuilder();\n builder.addBlob(SnapshotLegacy.header, serializeAsMinSupportedVersion(\n SnapshotLegacy.header,\n chunk1,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind));\n\n if (chunk1.chunkSegmentCount < chunk1.totalSegmentCount!) {\n const chunk2 = this.getSeqLengthSegs(this.segments!, this.segmentLengths!,\n this.header!.segmentsTotalLength, chunk1.chunkSegmentCount);\n length += chunk2.chunkLengthChars;\n segments += chunk2.chunkSegmentCount;\n builder.addBlob(SnapshotLegacy.body, serializeAsMinSupportedVersion(\n SnapshotLegacy.body,\n chunk2,\n this.logger,\n this.mergeTree.options,\n serializer,\n bind));\n }\n\n assert(\n length === this.header!.segmentsTotalLength,\n 0x05d /* \"emit: mismatch in segmentsTotalLength\" */);\n\n assert(\n segments === chunk1.totalSegmentCount,\n 0x05e /* \"emit: mismatch in totalSegmentCount\" */);\n\n if(catchUpMsgs !== undefined && catchUpMsgs.length > 0) {\n builder.addBlob(\n this.mergeTree.options?.catchUpBlobName ?? SnapshotLegacy.catchupOps,\n serializer ? serializer.stringify(catchUpMsgs, bind) : JSON.stringify(catchUpMsgs));\n }\n\n return builder.getSummaryTree();\n }\n\n extractSync() {\n const collabWindow = this.mergeTree.getCollabWindow();\n this.seq = collabWindow.minSeq;\n this.header = {\n segmentsTotalLength: this.mergeTree.getLength(this.mergeTree.collabWindow.minSeq,\n NonCollabClient),\n seq: this.mergeTree.collabWindow.minSeq,\n };\n\n const segs: ISegment[] = [];\n let prev: ISegment | undefined;\n const extractSegment =\n // eslint-disable-next-line max-len\n (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number | undefined, end: number | undefined) => {\n // eslint-disable-next-line eqeqeq\n if ((segment.seq != UnassignedSequenceNumber) && (segment.seq! <= this.seq!) &&\n // eslint-disable-next-line eqeqeq\n ((segment.removedSeq === undefined) || (segment.removedSeq == UnassignedSequenceNumber) ||\n (segment.removedSeq > this.seq!))) {\n if (prev && prev.canAppend(segment)\n && matchProperties(prev.properties, segment.properties)\n ) {\n prev = prev.clone();\n prev.append(segment.clone());\n } else {\n if (prev) {\n segs.push(prev);\n }\n prev = segment;\n }\n }\n return true;\n };\n\n this.mergeTree.map({ leaf: extractSegment }, this.seq, NonCollabClient, undefined);\n if (prev) {\n segs.push(prev);\n }\n\n this.segments = [];\n this.segmentLengths = [];\n let totalLength: number = 0;\n segs.map((segment) => {\n totalLength += segment.cachedLength;\n this.segments!.push(segment.toJSONObject());\n this.segmentLengths!.push(segment.cachedLength);\n });\n\n // We observed this.header.segmentsTotalLength < totalLength to happen in some cases\n // When this condition happens, we might not write out all segments in getSeqLengthSegs()\n // when writing out \"body\". Issue #1995 tracks following up on the core of the problem.\n // In the meantime, this code makes sure we will write out all segments properly\n // eslint-disable-next-line eqeqeq\n if (this.header.segmentsTotalLength != totalLength) {\n this.logger.sendErrorEvent({\n eventName: \"SegmentsTotalLengthMismatch\",\n totalLength,\n segmentsTotalLength: this.header.segmentsTotalLength,\n });\n this.header.segmentsTotalLength = totalLength;\n }\n\n return this.segments;\n }\n}\n"]}
package/lib/client.d.ts CHANGED
@@ -2,9 +2,11 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IFluidHandle, IFluidSerializer } from "@fluidframework/core-interfaces";
6
- import { ISequencedDocumentMessage, ITree } from "@fluidframework/protocol-definitions";
5
+ import { IFluidHandle } from "@fluidframework/core-interfaces";
6
+ import { IFluidSerializer } from "@fluidframework/shared-object-base";
7
+ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
7
8
  import { IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions";
9
+ import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
8
10
  import { ITelemetryLogger } from "@fluidframework/common-definitions";
9
11
  import { LocalReference } from "./localReference";
10
12
  import { CollaborationWindow, ISegment, ISegmentAction, Marker, MergeTree, RangeStackMap, SegmentGroup } from "./mergeTree";
@@ -184,7 +186,7 @@ export declare class Client {
184
186
  */
185
187
  regeneratePendingOp(resetOp: IMergeTreeOp, segmentGroup: SegmentGroup | SegmentGroup[]): IMergeTreeOp;
186
188
  createTextHelper(): MergeTreeTextHelper;
187
- snapshot(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer, catchUpMsgs: ISequencedDocumentMessage[]): ITree;
189
+ summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer, catchUpMsgs: ISequencedDocumentMessage[]): ISummaryTreeWithStats;
188
190
  load(runtime: IFluidDataStoreRuntime, storage: IChannelStorageService, serializer: IFluidSerializer): Promise<{
189
191
  catchupOpsP: Promise<ISequencedDocumentMessage[]>;
190
192
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.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,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAMtE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACH,mBAAmB,EAInB,QAAQ,EACR,cAAc,EACd,MAAM,EACN,SAAS,EACT,aAAa,EACb,YAAY,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAQlE,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,qBAAqB,EAErB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EAEpB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAGH,4BAA4B,EAC5B,iBAAiB,EACpB,MAAM,SAAS,CAAC;AAEjB,qBAAa,MAAM;aAkCK,aAAa,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,QAAQ;aAC/C,MAAM,EAAE,gBAAgB;IAlCrC,UAAU,UAAS;IACnB,uBAAuB,UAAS;IAChC,UAAU,UAAS;IACnB,SAAS,SAAK;IACd,SAAS,SAAK;IACd,QAAQ,SAAK;IACb,eAAe,SAAK;IACpB,WAAW,SAAK;IAChB,QAAQ,SAAK;IACb,aAAa,SAAK;IAClB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAExC,IAAI,sBAAsB,IAAI,sBAAsB,GAAG,SAAS,CAAkD;IAClH,IAAI,sBAAsB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,SAAS,EAEtE;IAED,IAAI,4BAA4B,IAAI,4BAA4B,GAAG,SAAS,CAE3E;IAED,IAAI,4BAA4B,CAAC,QAAQ,EAAE,4BAA4B,GAAG,SAAS,EAElF;IAED,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAExC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoD;IACpF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAgB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqC;gBAIlD,aAAa,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,QAAQ,EAC/C,MAAM,EAAE,gBAAgB,EACxC,OAAO,CAAC,EAAE,WAAW;IAMzB;;;;;;OAMG;IACI,wBAAwB,CAAC,KAAK,GAAE,MAAU;IAcjD;;;;;;OAMG;IACI,6BAA6B,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,WAAW,EAClB,iBAAiB,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,qBAAqB,GAAG,SAAS;IAmB9E;;;;;;OAMG;IACI,cAAc,CACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,YAAY,GAAG,qBAAqB,GAAG,SAAS;IAUjE;;;;;;;OAOG;IACI,kBAAkB,CACrB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,YAAY,GAAG,SAAS,GAAG,qBAAqB,GAAG,SAAS;IAa7E;;;;;OAKG;IACI,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IASlD;;;OAGG;IACI,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,mBAAmB,GAAG,SAAS;IAW1F;;;OAGG;IACI,8BAA8B,CACjC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,QAAQ,GAClB,mBAAmB,GAAG,SAAS;IAiC3B,YAAY,CAAC,WAAW,EAAE,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,EACjE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAChG,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,EAC7D,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAYhF;;;;OAIG;IACI,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,0BAA0B,EAAE,gBAAgB,GAAG,IAAI;IAezF,eAAe,IAAI,mBAAmB;IAI7C;;;;OAIG;IACI,WAAW,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM;IAOtC,iBAAiB,CAAC,IAAI,EAAE,cAAc;IAItC,oBAAoB,CAAC,IAAI,EAAE,cAAc;IAIhD;;;;OAIG;IACI,kBAAkB,CAAC,WAAW,EAAE,iBAAiB;IAIjD,eAAe,CAAC,EAAE,EAAE,MAAM;IAIjC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IA8B5B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAqCrB;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IA8BxB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAgEvB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,iBAAiB;IAyCzB,iBAAiB;IAOjB,qBAAqB,CAAC,YAAY,EAAE,MAAM;IAM1C,gBAAgB,CAAC,YAAY,EAAE,MAAM;IAGrC,eAAe,CAAC,aAAa,EAAE,MAAM;IAQrC,eAAe,CAAC,YAAY,EAAE,MAAM;IAKpC;;;;;;;;OAQG;IACI,yBAAyB,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;IAkCpE,OAAO,CAAC,sBAAsB;IA8D9B,OAAO,CAAC,aAAa;IA6Bd,QAAQ,CAAC,GAAG,EAAE,yBAAyB;IAoBvC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAUhD;;;;;;;OAOG;IACI,2BAA2B,CAC9B,oBAAoB,EAAE,MAAM,EAC5B,kBAAkB,EAAE,MAAM,EAC1B,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQ/C;;;;;OAKG;IACI,mBAAmB,CACtB,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,YAAY,GAAG,YAAY,EAAE,GAC5C,YAAY;IA6BR,gBAAgB;IAIhB,SAAS,CACZ,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,gBAAgB,EAC5B,WAAW,EAAE,yBAAyB,EAAE,GACzC,qBAAqB;IA+BX,IAAI,CACb,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,gBAAgB,GAC7B,OAAO,CAAC;QAAE,WAAW,EAAE,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAA;KAAE,CAAC;IAMjE,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,aAAa;IAIvE,OAAO,CAAC,sBAAsB;IAS9B,gBAAgB,CAAC,OAAO,EAAE,kBAAkB;IAqB5C,uBAAuB,CAAC,EAAE,EAAE,qBAAqB,EAAE,GAAG,EAAE,yBAAyB;IASjF,YAAY,CAAC,MAAM,EAAE,MAAM;IAe3B,oBAAoB,CAAC,CAAC,SAAS,QAAQ,EAAE,GAAG,EAAE,MAAM;;;;IAKpD,uBAAuB,CAAC,GAAG,EAAE,MAAM;IAenC,yBAAyB,CAAC,GAAG,EAAE,MAAM;;;;IAkBrC,aAAa;IAGb,WAAW;IAIX,SAAS;IAET,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,SAAI,EAAE,UAAU,SAAI;IAsBvF,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,UAAO;;;;CAIjE"}
package/lib/client.js CHANGED
@@ -638,20 +638,18 @@ export class Client {
638
638
  createTextHelper() {
639
639
  return new MergeTreeTextHelper(this.mergeTree);
640
640
  }
641
- // TODO: Remove `catchUpMsgs` once new snapshot format is adopted as default.
642
- // (See https://github.com/microsoft/FluidFramework/issues/84)
643
- snapshot(runtime, handle, serializer, catchUpMsgs) {
641
+ summarize(runtime, handle, serializer, catchUpMsgs) {
644
642
  var _a;
645
643
  const deltaManager = runtime.deltaManager;
646
644
  const minSeq = deltaManager.minimumSequenceNumber;
647
645
  // Catch up to latest MSN, if we have not had a chance to do it.
648
646
  // Required for case where FluidDataStoreRuntime.attachChannel()
649
- // generates snapshot right after loading data store.
647
+ // generates summary right after loading data store.
650
648
  this.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);
651
- // One of the snapshots (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!
649
+ // One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!
652
650
  // Not sure why - need to catch it sooner
653
651
  assert(this.getCollabWindow().minSeq === minSeq, 0x03e /* "minSeq mismatch between collab window and delta manager!" */);
654
- // TODO: Remove options flag once new snapshot format is adopted as default.
652
+ // Must continue to support legacy
655
653
  // (See https://github.com/microsoft/FluidFramework/issues/84)
656
654
  if (((_a = this.mergeTree.options) === null || _a === void 0 ? void 0 : _a.newMergeTreeSnapshotFormat) === true) {
657
655
  assert(catchUpMsgs === undefined || catchUpMsgs.length === 0, 0x03f /* "New format should not emit catchup ops" */);