@fluidframework/runtime-utils 2.0.0-internal.3.0.0 → 2.0.0-internal.3.0.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.
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/summarizerNode/index.d.ts +1 -1
- package/dist/summarizerNode/index.d.ts.map +1 -1
- package/dist/summarizerNode/index.js.map +1 -1
- package/dist/summarizerNode/summarizerNode.d.ts +5 -6
- package/dist/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summarizerNode/summarizerNode.js +31 -14
- package/dist/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summarizerNode/summarizerNodeUtils.d.ts +14 -5
- package/dist/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summarizerNode/summarizerNodeWithGc.js +7 -5
- package/dist/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summaryUtils.d.ts +4 -0
- package/dist/summaryUtils.d.ts.map +1 -1
- package/dist/summaryUtils.js +9 -0
- package/dist/summaryUtils.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/summarizerNode/index.d.ts +1 -1
- package/lib/summarizerNode/index.d.ts.map +1 -1
- package/lib/summarizerNode/index.js.map +1 -1
- package/lib/summarizerNode/summarizerNode.d.ts +5 -6
- package/lib/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summarizerNode/summarizerNode.js +31 -14
- package/lib/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summarizerNode/summarizerNodeUtils.d.ts +14 -5
- package/lib/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summarizerNode/summarizerNodeWithGc.js +7 -5
- package/lib/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summaryUtils.d.ts +4 -0
- package/lib/summaryUtils.d.ts.map +1 -1
- package/lib/summaryUtils.js +9 -0
- package/lib/summaryUtils.js.map +1 -1
- package/package.json +22 -14
- package/src/index.ts +1 -0
- package/src/packageVersion.ts +1 -1
- package/src/summarizerNode/index.ts +5 -1
- package/src/summarizerNode/summarizerNode.ts +40 -15
- package/src/summarizerNode/summarizerNodeUtils.ts +15 -5
- package/src/summarizerNode/summarizerNodeWithGc.ts +7 -5
- package/src/summaryUtils.ts +14 -0
package/lib/summaryUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summaryUtils.js","sourceRoot":"","sources":["../src/summaryUtils.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 { TelemetryEventPropertyType } from \"@fluidframework/common-definitions\";\nimport {\n bufferToString,\n fromBase64ToUtf8,\n IsoBuffer,\n Uint8ArrayToString,\n unreachableCase,\n} from \"@fluidframework/common-utils\";\nimport { AttachmentTreeEntry, BlobTreeEntry, TreeTreeEntry } from \"@fluidframework/protocol-base\";\nimport {\n ITree,\n SummaryType,\n ISummaryTree,\n SummaryObject,\n ISummaryBlob,\n TreeEntry,\n ITreeEntry,\n ISnapshotTree,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n ISummaryStats,\n ISummarizeResult,\n ISummaryTreeWithStats,\n ITelemetryContext,\n} from \"@fluidframework/runtime-definitions\";\n\n/**\n * Combines summary stats by adding their totals together.\n * Returns empty stats if called without args.\n * @param stats - stats to merge\n */\nexport function mergeStats(...stats: ISummaryStats[]): ISummaryStats {\n const results = {\n treeNodeCount: 0,\n blobNodeCount: 0,\n handleNodeCount: 0,\n totalBlobSize: 0,\n unreferencedBlobSize: 0,\n };\n for (const stat of stats) {\n results.treeNodeCount += stat.treeNodeCount;\n results.blobNodeCount += stat.blobNodeCount;\n results.handleNodeCount += stat.handleNodeCount;\n results.totalBlobSize += stat.totalBlobSize;\n results.unreferencedBlobSize += stat.unreferencedBlobSize;\n }\n return results;\n}\n\nexport function utf8ByteLength(str: string): number {\n // returns the byte length of an utf8 string\n let s = str.length;\n for (let i = str.length - 1; i >= 0; i--) {\n const code = str.charCodeAt(i);\n if (code > 0x7f && code <= 0x7ff) {\n s++;\n } else if (code > 0x7ff && code <= 0xffff) {\n s += 2;\n }\n if (code >= 0xDC00 && code <= 0xDFFF) {\n i--; // trail surrogate\n }\n }\n return s;\n}\n\nexport function getBlobSize(content: ISummaryBlob[\"content\"]): number {\n return typeof content === \"string\" ? utf8ByteLength(content) : content.byteLength;\n}\n\nfunction calculateStatsCore(summaryObject: SummaryObject, stats: ISummaryStats): void {\n switch (summaryObject.type) {\n case SummaryType.Tree: {\n stats.treeNodeCount++;\n for (const value of Object.values(summaryObject.tree)) {\n calculateStatsCore(value, stats);\n }\n return;\n }\n case SummaryType.Handle: {\n stats.handleNodeCount++;\n return;\n }\n case SummaryType.Blob: {\n stats.blobNodeCount++;\n stats.totalBlobSize += getBlobSize(summaryObject.content);\n return;\n }\n default: return;\n }\n}\n\nexport function calculateStats(summary: SummaryObject): ISummaryStats {\n const stats = mergeStats();\n calculateStatsCore(summary, stats);\n return stats;\n}\n\nexport function addBlobToSummary(summary: ISummaryTreeWithStats, key: string, content: string | Uint8Array): void {\n const blob: ISummaryBlob = {\n type: SummaryType.Blob,\n content,\n };\n summary.summary.tree[key] = blob;\n summary.stats.blobNodeCount++;\n summary.stats.totalBlobSize += getBlobSize(content);\n}\n\nexport function addTreeToSummary(summary: ISummaryTreeWithStats, key: string, summarizeResult: ISummarizeResult): void {\n summary.summary.tree[key] = summarizeResult.summary;\n summary.stats = mergeStats(summary.stats, summarizeResult.stats);\n}\n\nexport function addSummarizeResultToSummary(\n summary: ISummaryTreeWithStats,\n key: string,\n summarizeResult: ISummarizeResult,\n): void {\n summary.summary.tree[key] = summarizeResult.summary;\n summary.stats = mergeStats(summary.stats, summarizeResult.stats);\n}\n\nexport class SummaryTreeBuilder implements ISummaryTreeWithStats {\n private attachmentCounter: number = 0;\n\n public get summary(): ISummaryTree {\n return {\n type: SummaryType.Tree,\n tree: { ...this.summaryTree },\n };\n }\n\n public get stats(): Readonly<ISummaryStats> {\n return { ...this.summaryStats };\n }\n\n constructor() {\n this.summaryStats = mergeStats();\n this.summaryStats.treeNodeCount++;\n }\n\n private readonly summaryTree: { [path: string]: SummaryObject; } = {};\n private summaryStats: ISummaryStats;\n\n public addBlob(key: string, content: string | Uint8Array): void {\n // Prevent cloning by directly referencing underlying private properties\n addBlobToSummary({\n summary: {\n type: SummaryType.Tree,\n tree: this.summaryTree,\n },\n stats: this.summaryStats,\n }, key, content);\n }\n\n public addHandle(\n key: string,\n handleType: SummaryType.Tree | SummaryType.Blob | SummaryType.Attachment,\n handle: string): void {\n this.summaryTree[key] = {\n type: SummaryType.Handle,\n handleType,\n handle,\n };\n this.summaryStats.handleNodeCount++;\n }\n\n public addWithStats(key: string, summarizeResult: ISummarizeResult): void {\n this.summaryTree[key] = summarizeResult.summary;\n this.summaryStats = mergeStats(this.summaryStats, summarizeResult.stats);\n }\n\n public addAttachment(id: string) {\n this.summaryTree[this.attachmentCounter++] = { id, type: SummaryType.Attachment };\n }\n\n public getSummaryTree(): ISummaryTreeWithStats {\n return { summary: this.summary, stats: this.stats };\n }\n}\n\n/**\n * Converts snapshot ITree to ISummaryTree format and tracks stats.\n * @param snapshot - snapshot in ITree format\n * @param fullTree - true to never use handles, even if id is specified\n */\nexport function convertToSummaryTreeWithStats(\n snapshot: ITree,\n fullTree: boolean = false,\n): ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n for (const entry of snapshot.entries) {\n switch (entry.type) {\n case TreeEntry.Blob: {\n const blob = entry.value;\n const content = blob.encoding === \"base64\"\n ? IsoBuffer.from(blob.contents, \"base64\")\n : blob.contents;\n builder.addBlob(entry.path, content);\n break;\n }\n\n case TreeEntry.Tree: {\n const subtree = convertToSummaryTree(\n entry.value,\n fullTree);\n builder.addWithStats(entry.path, subtree);\n\n break;\n }\n\n case TreeEntry.Attachment: {\n const id = entry.value.id;\n builder.addAttachment(id);\n\n break;\n }\n\n default:\n throw new Error(\"Unexpected TreeEntry type\");\n }\n }\n\n const summaryTree = builder.getSummaryTree();\n summaryTree.summary.unreferenced = snapshot.unreferenced;\n return summaryTree;\n}\n\n/**\n * Converts snapshot ITree to ISummaryTree format and tracks stats.\n * @param snapshot - snapshot in ITree format\n * @param fullTree - true to never use handles, even if id is specified\n */\nexport function convertToSummaryTree(\n snapshot: ITree,\n fullTree: boolean = false,\n): ISummarizeResult {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (snapshot.id && !fullTree) {\n const stats = mergeStats();\n stats.handleNodeCount++;\n return {\n summary: {\n handle: snapshot.id,\n handleType: SummaryType.Tree,\n type: SummaryType.Handle,\n },\n stats,\n };\n } else {\n return convertToSummaryTreeWithStats(snapshot, fullTree);\n }\n}\n\n/**\n * Converts ISnapshotTree to ISummaryTree format and tracks stats. This snapshot tree was\n * was taken by serialize api in detached container.\n * @param snapshot - snapshot in ISnapshotTree format\n */\nexport function convertSnapshotTreeToSummaryTree(\n snapshot: ISnapshotTree,\n): ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n for (const [path, id] of Object.entries(snapshot.blobs)) {\n let decoded: string | undefined;\n if ((snapshot as any).blobsContents !== undefined) {\n const content: ArrayBufferLike = (snapshot as any).blobsContents[id];\n if (content !== undefined) {\n decoded = bufferToString(content, \"utf-8\");\n }\n // 0.44 back-compat We still put contents in same blob for back-compat so need to add blob\n // only for blobPath -> blobId mapping and not for blobId -> blob value contents.\n } else if (snapshot.blobs[id] !== undefined) {\n decoded = fromBase64ToUtf8(snapshot.blobs[id]);\n }\n if (decoded !== undefined) {\n builder.addBlob(path, decoded);\n }\n }\n\n for (const [key, tree] of Object.entries(snapshot.trees)) {\n const subtree = convertSnapshotTreeToSummaryTree(tree);\n builder.addWithStats(key, subtree);\n }\n\n const summaryTree = builder.getSummaryTree();\n summaryTree.summary.unreferenced = snapshot.unreferenced;\n return summaryTree;\n}\n\n/**\n * Converts ISummaryTree to ITree format. This is needed for back-compat while we get rid of snapshot.\n * @param summaryTree - summary tree in ISummaryTree format\n */\nexport function convertSummaryTreeToITree(summaryTree: ISummaryTree): ITree {\n const entries: ITreeEntry[] = [];\n for (const [key, value] of Object.entries(summaryTree.tree)) {\n switch (value.type) {\n case SummaryType.Blob: {\n let parsedContent: string;\n let encoding: \"utf-8\" | \"base64\" = \"utf-8\";\n if (typeof value.content === \"string\") {\n parsedContent = value.content;\n } else {\n parsedContent = Uint8ArrayToString(value.content, \"base64\");\n encoding = \"base64\";\n }\n entries.push(new BlobTreeEntry(key, parsedContent, encoding));\n break;\n }\n\n case SummaryType.Tree: {\n entries.push(new TreeTreeEntry(key, convertSummaryTreeToITree(value)));\n break;\n }\n\n case SummaryType.Attachment: {\n entries.push(new AttachmentTreeEntry(key, value.id));\n break;\n }\n\n case SummaryType.Handle: {\n throw new Error(\"Should not have Handle type in summary tree\");\n }\n\n default:\n unreachableCase(value, \"Unexpected summary tree type\");\n }\n }\n return {\n entries,\n unreferenced: summaryTree.unreferenced,\n };\n}\n\nexport class TelemetryContext implements ITelemetryContext {\n private readonly telemetry = new Map<string, TelemetryEventPropertyType>();\n\n /**\n * {@inheritDoc @fluidframework/runtime-definitions#ITelemetryContext.set}\n */\n set(prefix: string, property: string, value: TelemetryEventPropertyType): void {\n this.telemetry.set(`${prefix}${property}`, value);\n }\n\n /**\n * {@inheritDoc @fluidframework/runtime-definitions#ITelemetryContext.get}\n */\n get(prefix: string, property: string): TelemetryEventPropertyType {\n return this.telemetry.get(`${prefix}${property}`);\n }\n\n /**\n * {@inheritDoc @fluidframework/runtime-definitions#ITelemetryContext.serialize}\n */\n serialize(): string {\n const jsonObject = {};\n this.telemetry.forEach((value, key) => {\n jsonObject[key] = value;\n });\n return JSON.stringify(jsonObject);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"summaryUtils.js","sourceRoot":"","sources":["../src/summaryUtils.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 { TelemetryEventPropertyType } from \"@fluidframework/common-definitions\";\nimport {\n bufferToString,\n fromBase64ToUtf8,\n IsoBuffer,\n Uint8ArrayToString,\n unreachableCase,\n} from \"@fluidframework/common-utils\";\nimport { AttachmentTreeEntry, BlobTreeEntry, TreeTreeEntry } from \"@fluidframework/protocol-base\";\nimport {\n ITree,\n SummaryType,\n ISummaryTree,\n SummaryObject,\n ISummaryBlob,\n TreeEntry,\n ITreeEntry,\n ISnapshotTree,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n ISummaryStats,\n ISummarizeResult,\n ISummaryTreeWithStats,\n ITelemetryContext,\n} from \"@fluidframework/runtime-definitions\";\n\n/**\n * Combines summary stats by adding their totals together.\n * Returns empty stats if called without args.\n * @param stats - stats to merge\n */\nexport function mergeStats(...stats: ISummaryStats[]): ISummaryStats {\n const results = {\n treeNodeCount: 0,\n blobNodeCount: 0,\n handleNodeCount: 0,\n totalBlobSize: 0,\n unreferencedBlobSize: 0,\n };\n for (const stat of stats) {\n results.treeNodeCount += stat.treeNodeCount;\n results.blobNodeCount += stat.blobNodeCount;\n results.handleNodeCount += stat.handleNodeCount;\n results.totalBlobSize += stat.totalBlobSize;\n results.unreferencedBlobSize += stat.unreferencedBlobSize;\n }\n return results;\n}\n\nexport function utf8ByteLength(str: string): number {\n // returns the byte length of an utf8 string\n let s = str.length;\n for (let i = str.length - 1; i >= 0; i--) {\n const code = str.charCodeAt(i);\n if (code > 0x7f && code <= 0x7ff) {\n s++;\n } else if (code > 0x7ff && code <= 0xffff) {\n s += 2;\n }\n if (code >= 0xDC00 && code <= 0xDFFF) {\n i--; // trail surrogate\n }\n }\n return s;\n}\n\nexport function getBlobSize(content: ISummaryBlob[\"content\"]): number {\n return typeof content === \"string\" ? utf8ByteLength(content) : content.byteLength;\n}\n\nfunction calculateStatsCore(summaryObject: SummaryObject, stats: ISummaryStats): void {\n switch (summaryObject.type) {\n case SummaryType.Tree: {\n stats.treeNodeCount++;\n for (const value of Object.values(summaryObject.tree)) {\n calculateStatsCore(value, stats);\n }\n return;\n }\n case SummaryType.Handle: {\n stats.handleNodeCount++;\n return;\n }\n case SummaryType.Blob: {\n stats.blobNodeCount++;\n stats.totalBlobSize += getBlobSize(summaryObject.content);\n return;\n }\n default: return;\n }\n}\n\nexport function calculateStats(summary: SummaryObject): ISummaryStats {\n const stats = mergeStats();\n calculateStatsCore(summary, stats);\n return stats;\n}\n\nexport function addBlobToSummary(summary: ISummaryTreeWithStats, key: string, content: string | Uint8Array): void {\n const blob: ISummaryBlob = {\n type: SummaryType.Blob,\n content,\n };\n summary.summary.tree[key] = blob;\n summary.stats.blobNodeCount++;\n summary.stats.totalBlobSize += getBlobSize(content);\n}\n\nexport function addTreeToSummary(summary: ISummaryTreeWithStats, key: string, summarizeResult: ISummarizeResult): void {\n summary.summary.tree[key] = summarizeResult.summary;\n summary.stats = mergeStats(summary.stats, summarizeResult.stats);\n}\n\nexport function addSummarizeResultToSummary(\n summary: ISummaryTreeWithStats,\n key: string,\n summarizeResult: ISummarizeResult,\n): void {\n summary.summary.tree[key] = summarizeResult.summary;\n summary.stats = mergeStats(summary.stats, summarizeResult.stats);\n}\n\nexport class SummaryTreeBuilder implements ISummaryTreeWithStats {\n private attachmentCounter: number = 0;\n\n public get summary(): ISummaryTree {\n return {\n type: SummaryType.Tree,\n tree: { ...this.summaryTree },\n };\n }\n\n public get stats(): Readonly<ISummaryStats> {\n return { ...this.summaryStats };\n }\n\n constructor() {\n this.summaryStats = mergeStats();\n this.summaryStats.treeNodeCount++;\n }\n\n private readonly summaryTree: { [path: string]: SummaryObject; } = {};\n private summaryStats: ISummaryStats;\n\n public addBlob(key: string, content: string | Uint8Array): void {\n // Prevent cloning by directly referencing underlying private properties\n addBlobToSummary({\n summary: {\n type: SummaryType.Tree,\n tree: this.summaryTree,\n },\n stats: this.summaryStats,\n }, key, content);\n }\n\n public addHandle(\n key: string,\n handleType: SummaryType.Tree | SummaryType.Blob | SummaryType.Attachment,\n handle: string): void {\n this.summaryTree[key] = {\n type: SummaryType.Handle,\n handleType,\n handle,\n };\n this.summaryStats.handleNodeCount++;\n }\n\n public addWithStats(key: string, summarizeResult: ISummarizeResult): void {\n this.summaryTree[key] = summarizeResult.summary;\n this.summaryStats = mergeStats(this.summaryStats, summarizeResult.stats);\n }\n\n public addAttachment(id: string) {\n this.summaryTree[this.attachmentCounter++] = { id, type: SummaryType.Attachment };\n }\n\n public getSummaryTree(): ISummaryTreeWithStats {\n return { summary: this.summary, stats: this.stats };\n }\n}\n\n/**\n * Converts snapshot ITree to ISummaryTree format and tracks stats.\n * @param snapshot - snapshot in ITree format\n * @param fullTree - true to never use handles, even if id is specified\n */\nexport function convertToSummaryTreeWithStats(\n snapshot: ITree,\n fullTree: boolean = false,\n): ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n for (const entry of snapshot.entries) {\n switch (entry.type) {\n case TreeEntry.Blob: {\n const blob = entry.value;\n const content = blob.encoding === \"base64\"\n ? IsoBuffer.from(blob.contents, \"base64\")\n : blob.contents;\n builder.addBlob(entry.path, content);\n break;\n }\n\n case TreeEntry.Tree: {\n const subtree = convertToSummaryTree(\n entry.value,\n fullTree);\n builder.addWithStats(entry.path, subtree);\n\n break;\n }\n\n case TreeEntry.Attachment: {\n const id = entry.value.id;\n builder.addAttachment(id);\n\n break;\n }\n\n default:\n throw new Error(\"Unexpected TreeEntry type\");\n }\n }\n\n const summaryTree = builder.getSummaryTree();\n summaryTree.summary.unreferenced = snapshot.unreferenced;\n return summaryTree;\n}\n\n/**\n * Converts snapshot ITree to ISummaryTree format and tracks stats.\n * @param snapshot - snapshot in ITree format\n * @param fullTree - true to never use handles, even if id is specified\n */\nexport function convertToSummaryTree(\n snapshot: ITree,\n fullTree: boolean = false,\n): ISummarizeResult {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (snapshot.id && !fullTree) {\n const stats = mergeStats();\n stats.handleNodeCount++;\n return {\n summary: {\n handle: snapshot.id,\n handleType: SummaryType.Tree,\n type: SummaryType.Handle,\n },\n stats,\n };\n } else {\n return convertToSummaryTreeWithStats(snapshot, fullTree);\n }\n}\n\n/**\n * Converts ISnapshotTree to ISummaryTree format and tracks stats. This snapshot tree was\n * was taken by serialize api in detached container.\n * @param snapshot - snapshot in ISnapshotTree format\n */\nexport function convertSnapshotTreeToSummaryTree(\n snapshot: ISnapshotTree,\n): ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n for (const [path, id] of Object.entries(snapshot.blobs)) {\n let decoded: string | undefined;\n if ((snapshot as any).blobsContents !== undefined) {\n const content: ArrayBufferLike = (snapshot as any).blobsContents[id];\n if (content !== undefined) {\n decoded = bufferToString(content, \"utf-8\");\n }\n // 0.44 back-compat We still put contents in same blob for back-compat so need to add blob\n // only for blobPath -> blobId mapping and not for blobId -> blob value contents.\n } else if (snapshot.blobs[id] !== undefined) {\n decoded = fromBase64ToUtf8(snapshot.blobs[id]);\n }\n if (decoded !== undefined) {\n builder.addBlob(path, decoded);\n }\n }\n\n for (const [key, tree] of Object.entries(snapshot.trees)) {\n const subtree = convertSnapshotTreeToSummaryTree(tree);\n builder.addWithStats(key, subtree);\n }\n\n const summaryTree = builder.getSummaryTree();\n summaryTree.summary.unreferenced = snapshot.unreferenced;\n return summaryTree;\n}\n\n/**\n * Converts ISummaryTree to ITree format. This is needed for back-compat while we get rid of snapshot.\n * @param summaryTree - summary tree in ISummaryTree format\n */\nexport function convertSummaryTreeToITree(summaryTree: ISummaryTree): ITree {\n const entries: ITreeEntry[] = [];\n for (const [key, value] of Object.entries(summaryTree.tree)) {\n switch (value.type) {\n case SummaryType.Blob: {\n let parsedContent: string;\n let encoding: \"utf-8\" | \"base64\" = \"utf-8\";\n if (typeof value.content === \"string\") {\n parsedContent = value.content;\n } else {\n parsedContent = Uint8ArrayToString(value.content, \"base64\");\n encoding = \"base64\";\n }\n entries.push(new BlobTreeEntry(key, parsedContent, encoding));\n break;\n }\n\n case SummaryType.Tree: {\n entries.push(new TreeTreeEntry(key, convertSummaryTreeToITree(value)));\n break;\n }\n\n case SummaryType.Attachment: {\n entries.push(new AttachmentTreeEntry(key, value.id));\n break;\n }\n\n case SummaryType.Handle: {\n throw new Error(\"Should not have Handle type in summary tree\");\n }\n\n default:\n unreachableCase(value, \"Unexpected summary tree type\");\n }\n }\n return {\n entries,\n unreferenced: summaryTree.unreferenced,\n };\n}\n\nexport class TelemetryContext implements ITelemetryContext {\n private readonly telemetry = new Map<string, TelemetryEventPropertyType>();\n\n /**\n * {@inheritDoc @fluidframework/runtime-definitions#ITelemetryContext.set}\n */\n set(prefix: string, property: string, value: TelemetryEventPropertyType): void {\n this.telemetry.set(`${prefix}${property}`, value);\n }\n\n /**\n * {@inheritDoc @fluidframework/runtime-definitions#ITelemetryContext.setAll}\n */\n setAll(\n prefix: string,\n property: string,\n values: Record<string, TelemetryEventPropertyType>,\n ): void {\n // Set the values individually so that they are logged as a flat list along with other properties.\n for (const key of Object.keys(values)) {\n this.set(prefix, `${property}_${key}`, values[key]);\n }\n }\n\n /**\n * {@inheritDoc @fluidframework/runtime-definitions#ITelemetryContext.get}\n */\n get(prefix: string, property: string): TelemetryEventPropertyType {\n return this.telemetry.get(`${prefix}${property}`);\n }\n\n /**\n * {@inheritDoc @fluidframework/runtime-definitions#ITelemetryContext.serialize}\n */\n serialize(): string {\n const jsonObject = {};\n this.telemetry.forEach((value, key) => {\n jsonObject[key] = value;\n });\n return JSON.stringify(jsonObject);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/runtime-utils",
|
|
3
|
-
"version": "2.0.0-internal.3.0.
|
|
3
|
+
"version": "2.0.0-internal.3.0.2",
|
|
4
4
|
"description": "Collection of utility functions for Fluid Runtime",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -64,23 +64,23 @@
|
|
|
64
64
|
"dependencies": {
|
|
65
65
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
66
66
|
"@fluidframework/common-utils": "^1.0.0",
|
|
67
|
-
"@fluidframework/container-definitions": ">=2.0.0-internal.3.0.
|
|
68
|
-
"@fluidframework/container-runtime-definitions": ">=2.0.0-internal.3.0.
|
|
69
|
-
"@fluidframework/core-interfaces": ">=2.0.0-internal.3.0.
|
|
70
|
-
"@fluidframework/datastore-definitions": ">=2.0.0-internal.3.0.
|
|
71
|
-
"@fluidframework/garbage-collector": ">=2.0.0-internal.3.0.
|
|
67
|
+
"@fluidframework/container-definitions": ">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0",
|
|
68
|
+
"@fluidframework/container-runtime-definitions": ">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0",
|
|
69
|
+
"@fluidframework/core-interfaces": ">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0",
|
|
70
|
+
"@fluidframework/datastore-definitions": ">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0",
|
|
71
|
+
"@fluidframework/garbage-collector": ">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0",
|
|
72
72
|
"@fluidframework/protocol-base": "^0.1038.2000",
|
|
73
73
|
"@fluidframework/protocol-definitions": "^1.1.0",
|
|
74
|
-
"@fluidframework/runtime-definitions": ">=2.0.0-internal.3.0.
|
|
75
|
-
"@fluidframework/telemetry-utils": ">=2.0.0-internal.3.0.
|
|
74
|
+
"@fluidframework/runtime-definitions": ">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0",
|
|
75
|
+
"@fluidframework/telemetry-utils": ">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
78
|
"@fluid-tools/build-cli": "^0.8.0",
|
|
79
79
|
"@fluidframework/build-common": "^1.1.0",
|
|
80
80
|
"@fluidframework/build-tools": "^0.8.0",
|
|
81
81
|
"@fluidframework/eslint-config-fluid": "^2.0.0",
|
|
82
|
-
"@fluidframework/mocha-test-setup": ">=2.0.0-internal.3.0.
|
|
83
|
-
"@fluidframework/runtime-utils-previous": "npm:@fluidframework/runtime-utils@2.0.0-internal.
|
|
82
|
+
"@fluidframework/mocha-test-setup": ">=2.0.0-internal.3.0.2 <2.0.0-internal.4.0.0",
|
|
83
|
+
"@fluidframework/runtime-utils-previous": "npm:@fluidframework/runtime-utils@2.0.0-internal.3.0.0",
|
|
84
84
|
"@microsoft/api-extractor": "^7.22.2",
|
|
85
85
|
"@rushstack/eslint-config": "^2.5.1",
|
|
86
86
|
"@types/mocha": "^9.1.1",
|
|
@@ -98,9 +98,17 @@
|
|
|
98
98
|
"typescript": "~4.5.5"
|
|
99
99
|
},
|
|
100
100
|
"typeValidation": {
|
|
101
|
-
"version": "2.0.0-internal.3.0.
|
|
102
|
-
"
|
|
103
|
-
"
|
|
104
|
-
"broken": {
|
|
101
|
+
"version": "2.0.0-internal.3.0.1",
|
|
102
|
+
"previousVersionStyle": "previousPatch",
|
|
103
|
+
"baselineRange": "2.0.0-internal.3.0.0",
|
|
104
|
+
"broken": {
|
|
105
|
+
"TypeAliasDeclaration_RefreshSummaryResult": {
|
|
106
|
+
"forwardCompat": false,
|
|
107
|
+
"backCompat": false
|
|
108
|
+
},
|
|
109
|
+
"ClassDeclaration_TelemetryContext": {
|
|
110
|
+
"forwardCompat": false
|
|
111
|
+
}
|
|
112
|
+
}
|
|
105
113
|
}
|
|
106
114
|
}
|
package/src/index.ts
CHANGED
package/src/packageVersion.ts
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
export {
|
|
6
|
+
export {
|
|
7
|
+
IFetchSnapshotResult,
|
|
8
|
+
ISummarizerNodeRootContract,
|
|
9
|
+
RefreshSummaryResult,
|
|
10
|
+
} from "./summarizerNodeUtils";
|
|
7
11
|
export { IRootSummarizerNode, createRootSummarizerNode } from "./summarizerNode";
|
|
8
12
|
export { IRootSummarizerNodeWithGC, createRootSummarizerNodeWithGC } from "./summarizerNodeWithGc";
|
|
@@ -26,6 +26,7 @@ import { ReadAndParseBlob } from "../utils";
|
|
|
26
26
|
import {
|
|
27
27
|
EscapedPath,
|
|
28
28
|
ICreateChildDetails,
|
|
29
|
+
IFetchSnapshotResult,
|
|
29
30
|
IInitialSummary,
|
|
30
31
|
ISummarizerNodeRootContract,
|
|
31
32
|
parseSummaryForSubtrees,
|
|
@@ -82,7 +83,7 @@ export class SummarizerNode implements IRootSummarizerNode {
|
|
|
82
83
|
trackState: boolean = true,
|
|
83
84
|
telemetryContext?: ITelemetryContext,
|
|
84
85
|
): Promise<ISummarizeResult> {
|
|
85
|
-
assert(this.
|
|
86
|
+
assert(this.isSummaryInProgress(), 0x1a1 /* "summarize should not be called when not tracking the summary" */);
|
|
86
87
|
assert(this.wipSummaryLogger !== undefined,
|
|
87
88
|
0x1a2 /* "wipSummaryLogger should have been set in startSummary or ctor" */);
|
|
88
89
|
|
|
@@ -202,12 +203,11 @@ export class SummarizerNode implements IRootSummarizerNode {
|
|
|
202
203
|
/**
|
|
203
204
|
* Refreshes the latest summary tracked by this node. If we have a pending summary for the given proposal handle,
|
|
204
205
|
* it becomes the latest summary. If the current summary is already ahead (e.g., loaded from a service summary),
|
|
205
|
-
* we skip the update. Otherwise, we
|
|
206
|
-
* summary based off of that.
|
|
206
|
+
* we skip the update. Otherwise, we fetch the latest snapshot and update latest summary based off of that.
|
|
207
207
|
*
|
|
208
208
|
* @returns A RefreshSummaryResult type which returns information based on the following three scenarios:
|
|
209
209
|
*
|
|
210
|
-
* 1. The latest summary was not
|
|
210
|
+
* 1. The latest summary was not updated.
|
|
211
211
|
*
|
|
212
212
|
* 2. The latest summary was updated and the summary corresponding to the params was being tracked.
|
|
213
213
|
*
|
|
@@ -217,16 +217,26 @@ export class SummarizerNode implements IRootSummarizerNode {
|
|
|
217
217
|
public async refreshLatestSummary(
|
|
218
218
|
proposalHandle: string | undefined,
|
|
219
219
|
summaryRefSeq: number,
|
|
220
|
-
|
|
220
|
+
fetchLatestSnapshot: () => Promise<IFetchSnapshotResult>,
|
|
221
221
|
readAndParseBlob: ReadAndParseBlob,
|
|
222
222
|
correlatedSummaryLogger: ITelemetryLogger,
|
|
223
223
|
): Promise<RefreshSummaryResult> {
|
|
224
|
+
this.defaultLogger.sendTelemetryEvent({
|
|
225
|
+
eventName: "refreshLatestSummary_start",
|
|
226
|
+
proposalHandle,
|
|
227
|
+
referenceSequenceNumber: this.referenceSequenceNumber,
|
|
228
|
+
summaryRefSeq,
|
|
229
|
+
});
|
|
230
|
+
|
|
224
231
|
if (proposalHandle !== undefined) {
|
|
225
232
|
const maybeSummaryNode = this.pendingSummaries.get(proposalHandle);
|
|
226
233
|
|
|
227
234
|
if (maybeSummaryNode !== undefined) {
|
|
228
|
-
this.refreshLatestSummaryFromPending(
|
|
229
|
-
|
|
235
|
+
this.refreshLatestSummaryFromPending(
|
|
236
|
+
proposalHandle,
|
|
237
|
+
maybeSummaryNode.referenceSequenceNumber,
|
|
238
|
+
);
|
|
239
|
+
return { latestSummaryUpdated: true, wasSummaryTracked: true, summaryRefSeq };
|
|
230
240
|
}
|
|
231
241
|
|
|
232
242
|
const props = {
|
|
@@ -241,21 +251,36 @@ export class SummarizerNode implements IRootSummarizerNode {
|
|
|
241
251
|
});
|
|
242
252
|
}
|
|
243
253
|
|
|
244
|
-
// If
|
|
254
|
+
// If the summary for which refresh is called is older than the latest tracked summary, ignore it.
|
|
245
255
|
if (this.referenceSequenceNumber >= summaryRefSeq) {
|
|
246
256
|
return { latestSummaryUpdated: false };
|
|
247
257
|
}
|
|
248
258
|
|
|
249
|
-
|
|
259
|
+
// Fetch the latest snapshot and refresh state from it. Note that we need to use the reference sequence number
|
|
260
|
+
// of the fetched snapshot and not the "summaryRefSeq" that was passed in.
|
|
261
|
+
const { snapshotTree, snapshotRefSeq: fetchedSnapshotRefSeq } = await fetchLatestSnapshot();
|
|
262
|
+
|
|
263
|
+
// Possible re-entrancy. We may have updated latest summary state while fetching the snapshot. If the fetched
|
|
264
|
+
// snapshot is older than the latest tracked summary, ignore it.
|
|
265
|
+
if (this.referenceSequenceNumber >= fetchedSnapshotRefSeq) {
|
|
266
|
+
return { latestSummaryUpdated: false };
|
|
267
|
+
}
|
|
268
|
+
|
|
250
269
|
await this.refreshLatestSummaryFromSnapshot(
|
|
251
|
-
|
|
270
|
+
fetchedSnapshotRefSeq,
|
|
252
271
|
snapshotTree,
|
|
253
272
|
undefined,
|
|
254
273
|
EscapedPath.create(""),
|
|
255
274
|
correlatedSummaryLogger,
|
|
256
275
|
readAndParseBlob,
|
|
257
276
|
);
|
|
258
|
-
|
|
277
|
+
|
|
278
|
+
return {
|
|
279
|
+
latestSummaryUpdated: true,
|
|
280
|
+
wasSummaryTracked: false,
|
|
281
|
+
snapshotTree,
|
|
282
|
+
summaryRefSeq: fetchedSnapshotRefSeq,
|
|
283
|
+
};
|
|
259
284
|
}
|
|
260
285
|
/**
|
|
261
286
|
* Called when we get an ack from the server for a summary we've just sent. Updates the reference state of this node
|
|
@@ -539,9 +564,9 @@ export class SummarizerNode implements IRootSummarizerNode {
|
|
|
539
564
|
* @param child - The child node whose state is to be updated.
|
|
540
565
|
*/
|
|
541
566
|
protected maybeUpdateChildState(child: SummarizerNode) {
|
|
542
|
-
// If
|
|
543
|
-
// child's
|
|
544
|
-
if (this.
|
|
567
|
+
// If a summary is in progress, this child was created after the summary started. So, we need to update the
|
|
568
|
+
// child's summary state as well.
|
|
569
|
+
if (this.isSummaryInProgress()) {
|
|
545
570
|
child.wipReferenceSequenceNumber = this.wipReferenceSequenceNumber;
|
|
546
571
|
}
|
|
547
572
|
// In case we have pending summaries on the parent, let's initialize it on the child.
|
|
@@ -564,7 +589,7 @@ export class SummarizerNode implements IRootSummarizerNode {
|
|
|
564
589
|
/**
|
|
565
590
|
* Tells whether summary tracking is in progress. True if "startSummary" API is called before summarize.
|
|
566
591
|
*/
|
|
567
|
-
|
|
592
|
+
public isSummaryInProgress(): boolean {
|
|
568
593
|
return this.wipReferenceSequenceNumber !== undefined;
|
|
569
594
|
}
|
|
570
595
|
}
|
|
@@ -13,26 +13,36 @@ import { channelsTreeName, ISummaryTreeWithStats } from "@fluidframework/runtime
|
|
|
13
13
|
import { ReadAndParseBlob } from "../utils";
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
* Return
|
|
16
|
+
* Return type of refreshSummaryAck function. There can be three different scenarios based on the passed params:
|
|
17
17
|
*
|
|
18
|
-
* 1. The latest summary was not
|
|
18
|
+
* 1. The latest summary was not updated.
|
|
19
19
|
*
|
|
20
20
|
* 2. The latest summary was updated and the summary corresponding to the params was tracked by this client.
|
|
21
21
|
*
|
|
22
22
|
* 3. The latest summary was updated but the summary corresponding to the params was not tracked. In this case, the
|
|
23
|
-
* latest
|
|
23
|
+
* latest snapshot is fetched and the latest summary state is updated based on it.
|
|
24
24
|
*/
|
|
25
25
|
export type RefreshSummaryResult = {
|
|
26
26
|
latestSummaryUpdated: false;
|
|
27
27
|
} | {
|
|
28
28
|
latestSummaryUpdated: true;
|
|
29
29
|
wasSummaryTracked: true;
|
|
30
|
+
summaryRefSeq: number;
|
|
30
31
|
} | {
|
|
31
32
|
latestSummaryUpdated: true;
|
|
32
33
|
wasSummaryTracked: false;
|
|
33
|
-
|
|
34
|
+
snapshotTree: ISnapshotTree;
|
|
35
|
+
summaryRefSeq: number;
|
|
34
36
|
};
|
|
35
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Result of snapshot fetch during refreshing latest summary state.
|
|
40
|
+
*/
|
|
41
|
+
export interface IFetchSnapshotResult {
|
|
42
|
+
snapshotTree: ISnapshotTree;
|
|
43
|
+
snapshotRefSeq: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
36
46
|
export interface ISummarizerNodeRootContract {
|
|
37
47
|
startSummary(referenceSequenceNumber: number, summaryLogger: ITelemetryLogger): void;
|
|
38
48
|
completeSummary(proposalHandle: string): void;
|
|
@@ -40,7 +50,7 @@ export interface ISummarizerNodeRootContract {
|
|
|
40
50
|
refreshLatestSummary(
|
|
41
51
|
proposalHandle: string | undefined,
|
|
42
52
|
summaryRefSeq: number,
|
|
43
|
-
|
|
53
|
+
fetchLatestSnapshot: () => Promise<IFetchSnapshotResult>,
|
|
44
54
|
readAndParseBlob: ReadAndParseBlob,
|
|
45
55
|
correlatedSummaryLogger: ITelemetryLogger,
|
|
46
56
|
): Promise<RefreshSummaryResult>;
|
|
@@ -157,9 +157,9 @@ export class SummarizerNodeWithGC extends SummarizerNode implements IRootSummari
|
|
|
157
157
|
trackState: boolean = true,
|
|
158
158
|
telemetryContext?: ITelemetryContext,
|
|
159
159
|
): Promise<ISummarizeResult> {
|
|
160
|
-
// If GC is not disabled and
|
|
160
|
+
// If GC is not disabled and a summary is in progress, GC should have run and updated the used routes for this
|
|
161
161
|
// summary by calling updateUsedRoutes which sets wipSerializedUsedRoutes.
|
|
162
|
-
if (!this.gcDisabled && this.
|
|
162
|
+
if (!this.gcDisabled && this.isSummaryInProgress()) {
|
|
163
163
|
assert(this.wipSerializedUsedRoutes !== undefined,
|
|
164
164
|
0x1b1 /* "wip used routes should be set if tracking a summary" */);
|
|
165
165
|
}
|
|
@@ -363,7 +363,9 @@ export class SummarizerNodeWithGC extends SummarizerNode implements IRootSummari
|
|
|
363
363
|
const gcDetailsMap = unpackChildNodesGCDetails(gcDetails);
|
|
364
364
|
const { childrenTree } = parseSummaryForSubtrees(snapshotTree);
|
|
365
365
|
gcDetailsMap.forEach((childGCDetails: IGarbageCollectionDetailsBase, childId: string) => {
|
|
366
|
-
childrenTree.trees[childId]
|
|
366
|
+
if (childrenTree.trees[childId] !== undefined) {
|
|
367
|
+
childrenTree.trees[childId].blobs[gcTreeKey] = JSON.stringify(childGCDetails);
|
|
368
|
+
}
|
|
367
369
|
});
|
|
368
370
|
}
|
|
369
371
|
|
|
@@ -449,9 +451,9 @@ export class SummarizerNodeWithGC extends SummarizerNode implements IRootSummari
|
|
|
449
451
|
// are in the same order.
|
|
450
452
|
this.usedRoutes = usedRoutes.sort();
|
|
451
453
|
|
|
452
|
-
// If GC is not disabled and
|
|
454
|
+
// If GC is not disabled and a summary is in progress, update the work-in-progress used routes so that it can
|
|
453
455
|
// be tracked for this summary.
|
|
454
|
-
if (!this.gcDisabled && this.
|
|
456
|
+
if (!this.gcDisabled && this.isSummaryInProgress()) {
|
|
455
457
|
this.wipSerializedUsedRoutes = JSON.stringify(this.usedRoutes);
|
|
456
458
|
}
|
|
457
459
|
}
|
package/src/summaryUtils.ts
CHANGED
|
@@ -348,6 +348,20 @@ export class TelemetryContext implements ITelemetryContext {
|
|
|
348
348
|
this.telemetry.set(`${prefix}${property}`, value);
|
|
349
349
|
}
|
|
350
350
|
|
|
351
|
+
/**
|
|
352
|
+
* {@inheritDoc @fluidframework/runtime-definitions#ITelemetryContext.setAll}
|
|
353
|
+
*/
|
|
354
|
+
setAll(
|
|
355
|
+
prefix: string,
|
|
356
|
+
property: string,
|
|
357
|
+
values: Record<string, TelemetryEventPropertyType>,
|
|
358
|
+
): void {
|
|
359
|
+
// Set the values individually so that they are logged as a flat list along with other properties.
|
|
360
|
+
for (const key of Object.keys(values)) {
|
|
361
|
+
this.set(prefix, `${property}_${key}`, values[key]);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
351
365
|
/**
|
|
352
366
|
* {@inheritDoc @fluidframework/runtime-definitions#ITelemetryContext.get}
|
|
353
367
|
*/
|