@fluidframework/odsp-driver 2.0.0-dev-rc.4.0.0.261659 → 2.0.0-dev-rc.5.0.0.263932
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/compactSnapshotParser.d.ts.map +1 -1
- package/dist/compactSnapshotParser.js +0 -5
- package/dist/compactSnapshotParser.js.map +1 -1
- package/dist/compactSnapshotWriter.d.ts.map +1 -1
- package/dist/compactSnapshotWriter.js +0 -3
- package/dist/compactSnapshotWriter.js.map +1 -1
- package/dist/fetchSnapshot.d.ts.map +1 -1
- package/dist/fetchSnapshot.js +22 -2
- package/dist/fetchSnapshot.js.map +1 -1
- package/dist/odspDelayLoadedDeltaStream.d.ts.map +1 -1
- package/dist/odspDelayLoadedDeltaStream.js +11 -2
- package/dist/odspDelayLoadedDeltaStream.js.map +1 -1
- package/dist/odspDocumentDeltaConnection.d.ts +1 -1
- package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
- package/dist/odspDocumentDeltaConnection.js +2 -1
- package/dist/odspDocumentDeltaConnection.js.map +1 -1
- package/dist/odspError.d.ts.map +1 -1
- package/dist/odspError.js +5 -1
- package/dist/odspError.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/lib/compactSnapshotParser.d.ts.map +1 -1
- package/lib/compactSnapshotParser.js +0 -5
- package/lib/compactSnapshotParser.js.map +1 -1
- package/lib/compactSnapshotWriter.d.ts.map +1 -1
- package/lib/compactSnapshotWriter.js +0 -3
- package/lib/compactSnapshotWriter.js.map +1 -1
- package/lib/fetchSnapshot.d.ts.map +1 -1
- package/lib/fetchSnapshot.js +22 -2
- package/lib/fetchSnapshot.js.map +1 -1
- package/lib/odspDelayLoadedDeltaStream.d.ts.map +1 -1
- package/lib/odspDelayLoadedDeltaStream.js +11 -2
- package/lib/odspDelayLoadedDeltaStream.js.map +1 -1
- package/lib/odspDocumentDeltaConnection.d.ts +1 -1
- package/lib/odspDocumentDeltaConnection.d.ts.map +1 -1
- package/lib/odspDocumentDeltaConnection.js +2 -1
- package/lib/odspDocumentDeltaConnection.js.map +1 -1
- package/lib/odspError.d.ts.map +1 -1
- package/lib/odspError.js +5 -1
- package/lib/odspError.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/tsdoc-metadata.json +1 -1
- package/package.json +14 -14
- package/src/compactSnapshotParser.ts +0 -9
- package/src/compactSnapshotWriter.ts +0 -4
- package/src/fetchSnapshot.ts +48 -20
- package/src/odspDelayLoadedDeltaStream.ts +14 -3
- package/src/odspDocumentDeltaConnection.ts +7 -3
- package/src/odspError.ts +5 -1
- package/src/packageVersion.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compactSnapshotParser.d.ts","sourceRoot":"","sources":["../src/compactSnapshotParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAC;AAExE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAgB/E,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAC5C,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AAExC;;;;GAIG;AACH,MAAM,WAAW,0BAA2B,SAAQ,SAAS;IAC5D,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"compactSnapshotParser.d.ts","sourceRoot":"","sources":["../src/compactSnapshotParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAC;AAExE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAgB/E,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAC5C,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AAExC;;;;GAIG;AACH,MAAM,WAAW,0BAA2B,SAAQ,SAAS;IAC5D,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAqND;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC3C,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,mBAAmB,GACzB,0BAA0B,CA2C5B"}
|
|
@@ -153,11 +153,6 @@ function readTreeSection(node) {
|
|
|
153
153
|
const groupId = (0, zipItDataRepresentationUtils_js_1.getStringInstance)(records.groupId, "groupId should be a string");
|
|
154
154
|
snapshotTree.groupId = groupId;
|
|
155
155
|
}
|
|
156
|
-
if (records.omitted !== undefined) {
|
|
157
|
-
(0, zipItDataRepresentationUtils_js_1.assertBoolInstance)(records.omitted, "omitted should be a boolean");
|
|
158
|
-
(0, internal_1.assert)(!records.omitted || snapshotTree.groupId !== undefined, 0x8df /* GroupId absent but omitted is true */);
|
|
159
|
-
snapshotTree.omitted = records.omitted;
|
|
160
|
-
}
|
|
161
156
|
const path = (0, zipItDataRepresentationUtils_js_1.getStringInstance)(records.name, "Path name should be string");
|
|
162
157
|
if (records.value !== undefined) {
|
|
163
158
|
snapshotTree.blobs[path] = (0, zipItDataRepresentationUtils_js_1.getStringInstance)(records.value, "Blob value should be string");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compactSnapshotParser.js","sourceRoot":"","sources":["../src/compactSnapshotParser.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { ISnapshot } from \"@fluidframework/driver-definitions/internal\";\nimport { ISequencedDocumentMessage, ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { ReadBuffer } from \"./ReadBufferUtils.js\";\nimport { measure } from \"./odspUtils.js\";\nimport {\n\tNodeCore,\n\tNodeTypes,\n\tTreeBuilder,\n\tassertBlobCoreInstance,\n\tassertBoolInstance,\n\tassertNodeCoreInstance,\n\tassertNumberInstance,\n\tgetNodeProps,\n\tgetStringInstance,\n} from \"./zipItDataRepresentationUtils.js\";\n\nexport const snapshotMinReadVersion = \"1.0\";\nexport const currentReadVersion = \"1.0\";\n\n/**\n * The parsing is significantly faster if the position of props is well known instead of dynamic. So these variables\n * represents how many times slower parsing path is executed. This will be then logged into telemetry.\n * @internal\n */\nexport interface ISnapshotContentsWithProps extends ISnapshot {\n\ttelemetryProps: Record<string, number>;\n}\n\n/**\n * Recreates blobs section of the tree.\n * @param node - tree node to read blob section from\n */\nfunction readBlobSection(node: NodeTypes): {\n\tblobContents: Map<string, ArrayBuffer>;\n\tslowBlobStructureCount: number;\n} {\n\tassertNodeCoreInstance(node, \"TreeBlobs should be of type NodeCore\");\n\tlet slowBlobStructureCount = 0;\n\tconst blobContents: Map<string, ArrayBuffer> = new Map();\n\tfor (const blob of node) {\n\t\tassertNodeCoreInstance(blob, \"blob should be node\");\n\n\t\t/**\n\t\t * Perf optimization - the most common cases!\n\t\t * This is essentially unrolling code below for faster processing\n\t\t * It speeds up tree parsing by 2-3x times!\n\t\t */\n\t\tif (\n\t\t\tblob.length === 4 &&\n\t\t\tblob.getMaybeString(0) === \"id\" &&\n\t\t\tblob.getMaybeString(2) === \"data\"\n\t\t) {\n\t\t\t// \"id\": <node name>\n\t\t\t// \"data\": <blob>\n\t\t\tblobContents.set(blob.getString(1), blob.getBlob(3).arrayBuffer);\n\t\t} else {\n\t\t\t/**\n\t\t\t * More generalized workflow\n\t\t\t */\n\t\t\tslowBlobStructureCount += 1;\n\t\t\tconst records = getNodeProps(blob);\n\t\t\tassertBlobCoreInstance(records.data, \"data should be of BlobCore type\");\n\t\t\tconst id = getStringInstance(records.id, \"blob id should be string\");\n\t\t\tblobContents.set(id, records.data.arrayBuffer);\n\t\t}\n\t}\n\treturn { blobContents, slowBlobStructureCount };\n}\n\n/**\n * Recreates ops section of the tree.\n * @param node - tree node to read ops section from\n */\nfunction readOpsSection(node: NodeTypes): ISequencedDocumentMessage[] {\n\tassertNodeCoreInstance(node, \"Deltas should be of type NodeCore\");\n\tconst ops: ISequencedDocumentMessage[] = [];\n\tconst records = getNodeProps(node);\n\tassertNumberInstance(records.firstSequenceNumber, \"Seq number should be a number\");\n\tassertNodeCoreInstance(records.deltas, \"Deltas should be a Node\");\n\tfor (let i = 0; i < records.deltas.length; ++i) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tops.push(JSON.parse(records.deltas.getString(i)));\n\t}\n\t// Due to a bug at service side, in an edge case service was serializing deltas even\n\t// when there are no ops. So just make the code resilient to that bug. Service has also\n\t// fixed that bug.\n\tassert(\n\t\tops.length === 0 || records.firstSequenceNumber.valueOf() === ops[0].sequenceNumber,\n\t\t0x280 /* \"Validate first op seq number\" */,\n\t);\n\treturn ops;\n}\n\n/**\n * Recreates snapshot tree out of tree representation.\n * @param node - tree node to de-serialize from\n */\nfunction readTreeSection(node: NodeCore): {\n\tsnapshotTree: ISnapshotTree;\n\tslowTreeStructureCount: number;\n} {\n\tlet slowTreeStructureCount = 0;\n\tconst trees: Record<string, ISnapshotTree> = {};\n\tconst snapshotTree: ISnapshotTree = {\n\t\tblobs: {},\n\t\ttrees,\n\t};\n\tfor (const treeNode of node) {\n\t\tassertNodeCoreInstance(treeNode, \"tree nodes should be nodes\");\n\n\t\t/**\n\t\t * Perf optimization - the most common cases!\n\t\t * This is essentially unrolling code below for faster processing\n\t\t * It speeds up tree parsing by 2-3x times!\n\t\t */\n\t\tconst length = treeNode.length;\n\t\tif (length > 0 && treeNode.getMaybeString(0) === \"name\") {\n\t\t\tswitch (length) {\n\t\t\t\tcase 2: {\n\t\t\t\t\t// empty tree case\n\t\t\t\t\t// \"name\": <node name>\n\t\t\t\t\ttrees[treeNode.getString(1)] = { blobs: {}, trees: {} };\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcase 4: {\n\t\t\t\t\tconst content = treeNode.getMaybeString(2);\n\t\t\t\t\t// \"name\": <node name>\n\t\t\t\t\t// \"children\": <blob id>\n\t\t\t\t\tif (content === \"children\") {\n\t\t\t\t\t\tconst result = readTreeSection(treeNode.getNode(3));\n\t\t\t\t\t\ttrees[treeNode.getString(1)] = result.snapshotTree;\n\t\t\t\t\t\tslowTreeStructureCount += result.slowTreeStructureCount;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// \"name\": <node name>\n\t\t\t\t\t// \"value\": <blob id>\n\t\t\t\t\tif (content === \"value\") {\n\t\t\t\t\t\tsnapshotTree.blobs[treeNode.getString(1)] = treeNode.getString(3);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 6: {\n\t\t\t\t\t// \"name\": <node name>\n\t\t\t\t\t// \"nodeType\": 3\n\t\t\t\t\t// \"value\": <blob id>\n\t\t\t\t\tif (\n\t\t\t\t\t\ttreeNode.getMaybeString(2) === \"nodeType\" &&\n\t\t\t\t\t\ttreeNode.getMaybeString(4) === \"value\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tsnapshotTree.blobs[treeNode.getString(1)] = treeNode.getString(5);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// \"name\": <node name>\n\t\t\t\t\t// \"unreferenced\": true\n\t\t\t\t\t// \"children\": <blob id>\n\t\t\t\t\tif (\n\t\t\t\t\t\ttreeNode.getMaybeString(2) === \"unreferenced\" &&\n\t\t\t\t\t\ttreeNode.getMaybeString(4) === \"children\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst result = readTreeSection(treeNode.getNode(5));\n\t\t\t\t\t\ttrees[treeNode.getString(1)] = result.snapshotTree;\n\t\t\t\t\t\tslowTreeStructureCount += result.slowTreeStructureCount;\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\ttreeNode.getBool(3),\n\t\t\t\t\t\t\t0x3db /* Unreferenced if present should be true */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsnapshotTree.unreferenced = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * More generalized workflow\n\t\t */\n\t\tslowTreeStructureCount += 1;\n\t\tconst records = getNodeProps(treeNode);\n\n\t\tif (records.unreferenced !== undefined) {\n\t\t\tassertBoolInstance(records.unreferenced, \"Unreferenced flag should be bool\");\n\t\t\tassert(records.unreferenced, 0x281 /* \"Unreferenced if present should be true\" */);\n\t\t\tsnapshotTree.unreferenced = true;\n\t\t}\n\n\t\tif (records.groupId !== undefined) {\n\t\t\tconst groupId = getStringInstance(records.groupId, \"groupId should be a string\");\n\t\t\tsnapshotTree.groupId = groupId;\n\t\t}\n\n\t\tif (records.omitted !== undefined) {\n\t\t\tassertBoolInstance(records.omitted, \"omitted should be a boolean\");\n\t\t\tassert(\n\t\t\t\t!records.omitted || snapshotTree.groupId !== undefined,\n\t\t\t\t0x8df /* GroupId absent but omitted is true */,\n\t\t\t);\n\t\t\tsnapshotTree.omitted = records.omitted;\n\t\t}\n\n\t\tconst path = getStringInstance(records.name, \"Path name should be string\");\n\t\tif (records.value !== undefined) {\n\t\t\tsnapshotTree.blobs[path] = getStringInstance(\n\t\t\t\trecords.value,\n\t\t\t\t\"Blob value should be string\",\n\t\t\t);\n\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t} else if (records.children !== undefined) {\n\t\t\tassertNodeCoreInstance(records.children, \"Trees should be of type NodeCore\");\n\t\t\tconst result = readTreeSection(records.children);\n\t\t\ttrees[path] = result.snapshotTree;\n\t\t\tslowTreeStructureCount += result.slowTreeStructureCount;\n\t\t} else {\n\t\t\ttrees[path] = { blobs: {}, trees: {} };\n\t\t}\n\t}\n\treturn { snapshotTree, slowTreeStructureCount };\n}\n\n/**\n * Recreates snapshot tree out of tree representation.\n * @param node - tree node to de-serialize from\n */\nfunction readSnapshotSection(node: NodeTypes): {\n\tsequenceNumber: number;\n\tsnapshotTree: ISnapshotTree;\n\tslowTreeStructureCount: number;\n} {\n\tassertNodeCoreInstance(node, \"Snapshot should be of type NodeCore\");\n\tconst records = getNodeProps(node);\n\n\tassertNodeCoreInstance(records.treeNodes, \"TreeNodes should be of type NodeCore\");\n\tassertNumberInstance(records.sequenceNumber, \"sequenceNumber should be of type number\");\n\tconst { snapshotTree, slowTreeStructureCount } = readTreeSection(records.treeNodes);\n\tsnapshotTree.id = getStringInstance(records.id, \"snapshotId should be string\");\n\tconst sequenceNumber = records.sequenceNumber.valueOf();\n\treturn {\n\t\tsequenceNumber,\n\t\tsnapshotTree,\n\t\tslowTreeStructureCount,\n\t};\n}\n\n/**\n * Converts snapshot from binary compact representation to tree/blobs/ops.\n * @param buffer - Compact snapshot to be parsed into tree/blobs/ops.\n * @returns Tree, blobs and ops from the snapshot.\n * @internal\n */\nexport function parseCompactSnapshotResponse(\n\tbuffer: Uint8Array,\n\tlogger: ITelemetryLoggerExt,\n): ISnapshotContentsWithProps {\n\tconst { builder, telemetryProps } = TreeBuilder.load(new ReadBuffer(buffer), logger);\n\tassert(builder.length === 1, 0x219 /* \"1 root should be there\" */);\n\tconst root = builder.getNode(0);\n\n\tconst records = getNodeProps(root);\n\n\tconst mrv = getStringInstance(records.mrv, \"minReadVersion should be string\");\n\tconst cv = getStringInstance(records.cv, \"createVersion should be string\");\n\tif (records.lsn !== undefined) {\n\t\tassertNumberInstance(records.lsn, \"lsn should be a number\");\n\t}\n\n\tassert(\n\t\tNumber.parseFloat(snapshotMinReadVersion) >= Number.parseFloat(mrv),\n\t\t0x20f /* \"Driver min read version should >= to server minReadVersion\" */,\n\t);\n\tassert(\n\t\tNumber.parseFloat(cv) >= Number.parseFloat(snapshotMinReadVersion),\n\t\t0x210 /* \"Snapshot should be created with minReadVersion or above\" */,\n\t);\n\tassert(\n\t\tcurrentReadVersion === cv,\n\t\t0x2c2 /* \"Create Version should be equal to currentReadVersion\" */,\n\t);\n\n\tconst [snapshot, durationSnapshotTree] = measure(() => readSnapshotSection(records.snapshot));\n\tconst [blobContents, durationBlobs] = measure(() => readBlobSection(records.blobs));\n\n\treturn {\n\t\t...snapshot,\n\t\tblobContents: blobContents.blobContents,\n\t\tops: records.deltas === undefined ? [] : readOpsSection(records.deltas),\n\t\tlatestSequenceNumber: records.lsn,\n\t\tsnapshotFormatV: 1,\n\t\ttelemetryProps: {\n\t\t\t...telemetryProps,\n\t\t\tdurationSnapshotTree,\n\t\t\tdurationBlobs,\n\t\t\tslowTreeStructureCount: snapshot.slowTreeStructureCount,\n\t\t\tslowBlobStructureCount: blobContents.slowBlobStructureCount,\n\t\t},\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"compactSnapshotParser.js","sourceRoot":"","sources":["../src/compactSnapshotParser.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { ISnapshot } from \"@fluidframework/driver-definitions/internal\";\nimport { ISequencedDocumentMessage, ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { ReadBuffer } from \"./ReadBufferUtils.js\";\nimport { measure } from \"./odspUtils.js\";\nimport {\n\tNodeCore,\n\tNodeTypes,\n\tTreeBuilder,\n\tassertBlobCoreInstance,\n\tassertBoolInstance,\n\tassertNodeCoreInstance,\n\tassertNumberInstance,\n\tgetNodeProps,\n\tgetStringInstance,\n} from \"./zipItDataRepresentationUtils.js\";\n\nexport const snapshotMinReadVersion = \"1.0\";\nexport const currentReadVersion = \"1.0\";\n\n/**\n * The parsing is significantly faster if the position of props is well known instead of dynamic. So these variables\n * represents how many times slower parsing path is executed. This will be then logged into telemetry.\n * @internal\n */\nexport interface ISnapshotContentsWithProps extends ISnapshot {\n\ttelemetryProps: Record<string, number>;\n}\n\n/**\n * Recreates blobs section of the tree.\n * @param node - tree node to read blob section from\n */\nfunction readBlobSection(node: NodeTypes): {\n\tblobContents: Map<string, ArrayBuffer>;\n\tslowBlobStructureCount: number;\n} {\n\tassertNodeCoreInstance(node, \"TreeBlobs should be of type NodeCore\");\n\tlet slowBlobStructureCount = 0;\n\tconst blobContents: Map<string, ArrayBuffer> = new Map();\n\tfor (const blob of node) {\n\t\tassertNodeCoreInstance(blob, \"blob should be node\");\n\n\t\t/**\n\t\t * Perf optimization - the most common cases!\n\t\t * This is essentially unrolling code below for faster processing\n\t\t * It speeds up tree parsing by 2-3x times!\n\t\t */\n\t\tif (\n\t\t\tblob.length === 4 &&\n\t\t\tblob.getMaybeString(0) === \"id\" &&\n\t\t\tblob.getMaybeString(2) === \"data\"\n\t\t) {\n\t\t\t// \"id\": <node name>\n\t\t\t// \"data\": <blob>\n\t\t\tblobContents.set(blob.getString(1), blob.getBlob(3).arrayBuffer);\n\t\t} else {\n\t\t\t/**\n\t\t\t * More generalized workflow\n\t\t\t */\n\t\t\tslowBlobStructureCount += 1;\n\t\t\tconst records = getNodeProps(blob);\n\t\t\tassertBlobCoreInstance(records.data, \"data should be of BlobCore type\");\n\t\t\tconst id = getStringInstance(records.id, \"blob id should be string\");\n\t\t\tblobContents.set(id, records.data.arrayBuffer);\n\t\t}\n\t}\n\treturn { blobContents, slowBlobStructureCount };\n}\n\n/**\n * Recreates ops section of the tree.\n * @param node - tree node to read ops section from\n */\nfunction readOpsSection(node: NodeTypes): ISequencedDocumentMessage[] {\n\tassertNodeCoreInstance(node, \"Deltas should be of type NodeCore\");\n\tconst ops: ISequencedDocumentMessage[] = [];\n\tconst records = getNodeProps(node);\n\tassertNumberInstance(records.firstSequenceNumber, \"Seq number should be a number\");\n\tassertNodeCoreInstance(records.deltas, \"Deltas should be a Node\");\n\tfor (let i = 0; i < records.deltas.length; ++i) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tops.push(JSON.parse(records.deltas.getString(i)));\n\t}\n\t// Due to a bug at service side, in an edge case service was serializing deltas even\n\t// when there are no ops. So just make the code resilient to that bug. Service has also\n\t// fixed that bug.\n\tassert(\n\t\tops.length === 0 || records.firstSequenceNumber.valueOf() === ops[0].sequenceNumber,\n\t\t0x280 /* \"Validate first op seq number\" */,\n\t);\n\treturn ops;\n}\n\n/**\n * Recreates snapshot tree out of tree representation.\n * @param node - tree node to de-serialize from\n */\nfunction readTreeSection(node: NodeCore): {\n\tsnapshotTree: ISnapshotTree;\n\tslowTreeStructureCount: number;\n} {\n\tlet slowTreeStructureCount = 0;\n\tconst trees: Record<string, ISnapshotTree> = {};\n\tconst snapshotTree: ISnapshotTree = {\n\t\tblobs: {},\n\t\ttrees,\n\t};\n\tfor (const treeNode of node) {\n\t\tassertNodeCoreInstance(treeNode, \"tree nodes should be nodes\");\n\n\t\t/**\n\t\t * Perf optimization - the most common cases!\n\t\t * This is essentially unrolling code below for faster processing\n\t\t * It speeds up tree parsing by 2-3x times!\n\t\t */\n\t\tconst length = treeNode.length;\n\t\tif (length > 0 && treeNode.getMaybeString(0) === \"name\") {\n\t\t\tswitch (length) {\n\t\t\t\tcase 2: {\n\t\t\t\t\t// empty tree case\n\t\t\t\t\t// \"name\": <node name>\n\t\t\t\t\ttrees[treeNode.getString(1)] = { blobs: {}, trees: {} };\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcase 4: {\n\t\t\t\t\tconst content = treeNode.getMaybeString(2);\n\t\t\t\t\t// \"name\": <node name>\n\t\t\t\t\t// \"children\": <blob id>\n\t\t\t\t\tif (content === \"children\") {\n\t\t\t\t\t\tconst result = readTreeSection(treeNode.getNode(3));\n\t\t\t\t\t\ttrees[treeNode.getString(1)] = result.snapshotTree;\n\t\t\t\t\t\tslowTreeStructureCount += result.slowTreeStructureCount;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// \"name\": <node name>\n\t\t\t\t\t// \"value\": <blob id>\n\t\t\t\t\tif (content === \"value\") {\n\t\t\t\t\t\tsnapshotTree.blobs[treeNode.getString(1)] = treeNode.getString(3);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 6: {\n\t\t\t\t\t// \"name\": <node name>\n\t\t\t\t\t// \"nodeType\": 3\n\t\t\t\t\t// \"value\": <blob id>\n\t\t\t\t\tif (\n\t\t\t\t\t\ttreeNode.getMaybeString(2) === \"nodeType\" &&\n\t\t\t\t\t\ttreeNode.getMaybeString(4) === \"value\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tsnapshotTree.blobs[treeNode.getString(1)] = treeNode.getString(5);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// \"name\": <node name>\n\t\t\t\t\t// \"unreferenced\": true\n\t\t\t\t\t// \"children\": <blob id>\n\t\t\t\t\tif (\n\t\t\t\t\t\ttreeNode.getMaybeString(2) === \"unreferenced\" &&\n\t\t\t\t\t\ttreeNode.getMaybeString(4) === \"children\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst result = readTreeSection(treeNode.getNode(5));\n\t\t\t\t\t\ttrees[treeNode.getString(1)] = result.snapshotTree;\n\t\t\t\t\t\tslowTreeStructureCount += result.slowTreeStructureCount;\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\ttreeNode.getBool(3),\n\t\t\t\t\t\t\t0x3db /* Unreferenced if present should be true */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsnapshotTree.unreferenced = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * More generalized workflow\n\t\t */\n\t\tslowTreeStructureCount += 1;\n\t\tconst records = getNodeProps(treeNode);\n\n\t\tif (records.unreferenced !== undefined) {\n\t\t\tassertBoolInstance(records.unreferenced, \"Unreferenced flag should be bool\");\n\t\t\tassert(records.unreferenced, 0x281 /* \"Unreferenced if present should be true\" */);\n\t\t\tsnapshotTree.unreferenced = true;\n\t\t}\n\n\t\tif (records.groupId !== undefined) {\n\t\t\tconst groupId = getStringInstance(records.groupId, \"groupId should be a string\");\n\t\t\tsnapshotTree.groupId = groupId;\n\t\t}\n\n\t\tconst path = getStringInstance(records.name, \"Path name should be string\");\n\t\tif (records.value !== undefined) {\n\t\t\tsnapshotTree.blobs[path] = getStringInstance(\n\t\t\t\trecords.value,\n\t\t\t\t\"Blob value should be string\",\n\t\t\t);\n\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t} else if (records.children !== undefined) {\n\t\t\tassertNodeCoreInstance(records.children, \"Trees should be of type NodeCore\");\n\t\t\tconst result = readTreeSection(records.children);\n\t\t\ttrees[path] = result.snapshotTree;\n\t\t\tslowTreeStructureCount += result.slowTreeStructureCount;\n\t\t} else {\n\t\t\ttrees[path] = { blobs: {}, trees: {} };\n\t\t}\n\t}\n\treturn { snapshotTree, slowTreeStructureCount };\n}\n\n/**\n * Recreates snapshot tree out of tree representation.\n * @param node - tree node to de-serialize from\n */\nfunction readSnapshotSection(node: NodeTypes): {\n\tsequenceNumber: number;\n\tsnapshotTree: ISnapshotTree;\n\tslowTreeStructureCount: number;\n} {\n\tassertNodeCoreInstance(node, \"Snapshot should be of type NodeCore\");\n\tconst records = getNodeProps(node);\n\n\tassertNodeCoreInstance(records.treeNodes, \"TreeNodes should be of type NodeCore\");\n\tassertNumberInstance(records.sequenceNumber, \"sequenceNumber should be of type number\");\n\tconst { snapshotTree, slowTreeStructureCount } = readTreeSection(records.treeNodes);\n\tsnapshotTree.id = getStringInstance(records.id, \"snapshotId should be string\");\n\tconst sequenceNumber = records.sequenceNumber.valueOf();\n\treturn {\n\t\tsequenceNumber,\n\t\tsnapshotTree,\n\t\tslowTreeStructureCount,\n\t};\n}\n\n/**\n * Converts snapshot from binary compact representation to tree/blobs/ops.\n * @param buffer - Compact snapshot to be parsed into tree/blobs/ops.\n * @returns Tree, blobs and ops from the snapshot.\n * @internal\n */\nexport function parseCompactSnapshotResponse(\n\tbuffer: Uint8Array,\n\tlogger: ITelemetryLoggerExt,\n): ISnapshotContentsWithProps {\n\tconst { builder, telemetryProps } = TreeBuilder.load(new ReadBuffer(buffer), logger);\n\tassert(builder.length === 1, 0x219 /* \"1 root should be there\" */);\n\tconst root = builder.getNode(0);\n\n\tconst records = getNodeProps(root);\n\n\tconst mrv = getStringInstance(records.mrv, \"minReadVersion should be string\");\n\tconst cv = getStringInstance(records.cv, \"createVersion should be string\");\n\tif (records.lsn !== undefined) {\n\t\tassertNumberInstance(records.lsn, \"lsn should be a number\");\n\t}\n\n\tassert(\n\t\tNumber.parseFloat(snapshotMinReadVersion) >= Number.parseFloat(mrv),\n\t\t0x20f /* \"Driver min read version should >= to server minReadVersion\" */,\n\t);\n\tassert(\n\t\tNumber.parseFloat(cv) >= Number.parseFloat(snapshotMinReadVersion),\n\t\t0x210 /* \"Snapshot should be created with minReadVersion or above\" */,\n\t);\n\tassert(\n\t\tcurrentReadVersion === cv,\n\t\t0x2c2 /* \"Create Version should be equal to currentReadVersion\" */,\n\t);\n\n\tconst [snapshot, durationSnapshotTree] = measure(() => readSnapshotSection(records.snapshot));\n\tconst [blobContents, durationBlobs] = measure(() => readBlobSection(records.blobs));\n\n\treturn {\n\t\t...snapshot,\n\t\tblobContents: blobContents.blobContents,\n\t\tops: records.deltas === undefined ? [] : readOpsSection(records.deltas),\n\t\tlatestSequenceNumber: records.lsn,\n\t\tsnapshotFormatV: 1,\n\t\ttelemetryProps: {\n\t\t\t...telemetryProps,\n\t\t\tdurationSnapshotTree,\n\t\t\tdurationBlobs,\n\t\t\tslowTreeStructureCount: snapshot.slowTreeStructureCount,\n\t\t\tslowBlobStructureCount: blobContents.slowBlobStructureCount,\n\t\t},\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compactSnapshotWriter.d.ts","sourceRoot":"","sources":["../src/compactSnapshotWriter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"compactSnapshotWriter.d.ts","sourceRoot":"","sources":["../src/compactSnapshotWriter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAC;AA0IxE;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,SAAS,GAAG,UAAU,CA4BhF"}
|
|
@@ -69,9 +69,6 @@ function writeTreeSectionCore(treesNode, snapshotTree) {
|
|
|
69
69
|
if (snapshotTree.groupId !== undefined) {
|
|
70
70
|
(0, zipItDataRepresentationUtils_js_1.addDictionaryStringProperty)(treeNode, "groupId", snapshotTree.groupId);
|
|
71
71
|
}
|
|
72
|
-
if (snapshotTree.omitted !== undefined) {
|
|
73
|
-
(0, zipItDataRepresentationUtils_js_1.addBoolProperty)(treeNode, "omitted", snapshotTree.omitted);
|
|
74
|
-
}
|
|
75
72
|
}
|
|
76
73
|
if (snapshotTree.blobs) {
|
|
77
74
|
for (const [path, id] of Object.entries(snapshotTree.blobs)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compactSnapshotWriter.js","sourceRoot":"","sources":["../src/compactSnapshotWriter.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 { stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { ISnapshot } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tIBlob,\n\tISequencedDocumentMessage,\n\tISnapshotTree,\n} from \"@fluidframework/protocol-definitions\";\n\nimport { TreeBuilderSerializer } from \"./WriteBufferUtils.js\";\nimport { snapshotMinReadVersion } from \"./compactSnapshotParser.js\";\nimport {\n\tNodeCore,\n\taddBoolProperty,\n\taddDictionaryStringProperty,\n\taddNumberProperty,\n\taddStringProperty,\n} from \"./zipItDataRepresentationUtils.js\";\n\n/**\n * Writes header section of the snapshot.\n * @param node - snapshot node to serialize to\n * @param latestSequenceNumber - latest seq number of the container.\n */\nfunction writeSnapshotProps(node: NodeCore, latestSequenceNumber: number): void {\n\taddStringProperty(node, \"mrv\", snapshotMinReadVersion);\n\taddStringProperty(node, \"cv\", snapshotMinReadVersion);\n\taddNumberProperty(node, \"lsn\", latestSequenceNumber);\n}\n\n/**\n * Represents blobs in the tree.\n * @param snapshotNode - node to serialize to.\n * @param blobs - blobs that is being serialized\n */\nfunction writeBlobsSection(snapshotNode: NodeCore, blobs: Map<string, IBlob | ArrayBuffer>): void {\n\tsnapshotNode.addDictionaryString(\"blobs\");\n\tconst blobsNode = snapshotNode.addNode(\"list\");\n\tfor (const [storageBlobId, blob] of blobs) {\n\t\tconst blobNode = blobsNode.addNode();\n\t\taddDictionaryStringProperty(blobNode, \"id\", storageBlobId);\n\t\tblobNode.addString(\"data\");\n\t\tif (blob instanceof ArrayBuffer) {\n\t\t\tblobNode.addBlob(new Uint8Array(blob));\n\t\t} else {\n\t\t\tblobNode.addBlob(\n\t\t\t\tnew Uint8Array(stringToBuffer(blob.contents, blob.encoding ?? \"utf8\")),\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Represents and serializes tree part of the snapshot\n * @param snapshotNode - tree node to serialize to\n * @param snapshotTree - snapshot tree that is being serialized\n */\nfunction writeTreeSection(snapshotNode: NodeCore, snapshotTree: ISnapshotTree): void {\n\tsnapshotNode.addDictionaryString(\"treeNodes\");\n\tconst treesNode = snapshotNode.addNode(\"list\");\n\twriteTreeSectionCore(treesNode, snapshotTree);\n}\n\nfunction writeTreeSectionCore(treesNode: NodeCore, snapshotTree: ISnapshotTree): void {\n\tfor (const [path, value] of Object.entries(snapshotTree.trees)) {\n\t\tconst treeNode = treesNode.addNode();\n\t\t// Many leaf nodes in the tree have same names like \"content\", \"body\", \"header\"\n\t\t// We could be smarter here and not use dictionary where we are sure reuse is unlikely, but\n\t\t// it does not feel like it's worth it.\n\t\taddDictionaryStringProperty(treeNode, \"name\", path);\n\t\tif (snapshotTree.unreferenced) {\n\t\t\taddBoolProperty(treeNode, \"unreferenced\", snapshotTree.unreferenced);\n\t\t}\n\t\t// Only write children prop if either blobs or trees are present.\n\t\tif (Object.keys(value.blobs).length > 0 || Object.keys(value.trees).length > 0) {\n\t\t\ttreeNode.addDictionaryString(\"children\");\n\t\t\tconst childNode = treeNode.addNode(\"list\");\n\t\t\twriteTreeSectionCore(childNode, value);\n\t\t}\n\t\tif (snapshotTree.groupId !== undefined) {\n\t\t\taddDictionaryStringProperty(treeNode, \"groupId\", snapshotTree.groupId);\n\t\t}\n\n\t\tif (snapshotTree.omitted !== undefined) {\n\t\t\taddBoolProperty(treeNode, \"omitted\", snapshotTree.omitted);\n\t\t}\n\t}\n\n\tif (snapshotTree.blobs) {\n\t\tfor (const [path, id] of Object.entries(snapshotTree.blobs)) {\n\t\t\tconst blobNode = treesNode.addNode();\n\t\t\taddDictionaryStringProperty(blobNode, \"name\", path);\n\t\t\taddDictionaryStringProperty(blobNode, \"value\", id);\n\t\t}\n\t}\n}\n\n/**\n * Represents (serializes) snapshot tree as generalizes tree\n * @param rootNode - tree node to serialize to\n * @param snapshotTree - snapshot tree that is being serialized\n * @param blobs - blobs mapping of the snapshot\n * @param snapshotSequenceNumber - seq number at which snapshot is taken\n */\nfunction writeSnapshotSection(\n\trootNode: NodeCore,\n\tsnapshotTree: ISnapshotTree,\n\tsnapshotSequenceNumber: number,\n): void {\n\trootNode.addDictionaryString(\"snapshot\");\n\tconst snapshotNode = rootNode.addNode();\n\n\tconst snapshotId = snapshotTree.id;\n\tassert(snapshotId !== undefined, 0x21b /* \"Snapshot id should be provided\" */);\n\taddStringProperty(snapshotNode, \"id\", snapshotId);\n\taddStringProperty(snapshotNode, \"message\", `Snapshot@${snapshotSequenceNumber}`);\n\taddNumberProperty(snapshotNode, \"sequenceNumber\", snapshotSequenceNumber);\n\n\t// Add Trees\n\twriteTreeSection(snapshotNode, snapshotTree);\n}\n\n/**\n * Represents ops in the tree.\n * @param rootNode - node to serialize to.\n * @param ops - ops that is being serialized\n */\nfunction writeOpsSection(rootNode: NodeCore, ops: ISequencedDocumentMessage[]): void {\n\tlet firstSequenceNumber: number | undefined;\n\tif (ops.length > 0) {\n\t\tfirstSequenceNumber = ops[0].sequenceNumber;\n\t}\n\tif (firstSequenceNumber !== undefined) {\n\t\trootNode.addDictionaryString(\"deltas\");\n\t\tconst opsNode = rootNode.addNode();\n\t\taddNumberProperty(opsNode, \"firstSequenceNumber\", firstSequenceNumber);\n\t\topsNode.addDictionaryString(\"deltas\");\n\t\tconst deltaNode = opsNode.addNode(\"list\");\n\t\tfor (const op of ops) {\n\t\t\tdeltaNode.addString(JSON.stringify(op));\n\t\t}\n\t}\n}\n\n/**\n * Converts trees/blobs/ops to binary compact representation.\n * @param snapshotContents - snapshot tree contents to serialize\n * @returns ReadBuffer - binary representation of the data.\n */\nexport function convertToCompactSnapshot(snapshotContents: ISnapshot): Uint8Array {\n\tconst builder = new TreeBuilderSerializer();\n\t// Create the root node.\n\tconst rootNode = builder.addNode();\n\tassert(\n\t\tsnapshotContents.sequenceNumber !== undefined,\n\t\t0x21c /* \"Seq number should be provided\" */,\n\t);\n\n\tlet latestSequenceNumber = snapshotContents.latestSequenceNumber;\n\tif (latestSequenceNumber === undefined) {\n\t\tlatestSequenceNumber =\n\t\t\tsnapshotContents.ops.length > 0\n\t\t\t\t? snapshotContents.ops[snapshotContents.ops.length - 1].sequenceNumber\n\t\t\t\t: snapshotContents.sequenceNumber;\n\t}\n\n\twriteSnapshotProps(rootNode, latestSequenceNumber);\n\n\twriteSnapshotSection(rootNode, snapshotContents.snapshotTree, snapshotContents.sequenceNumber);\n\n\t// Add Blobs\n\twriteBlobsSection(rootNode, snapshotContents.blobContents);\n\n\t// Then write the ops node.\n\twriteOpsSection(rootNode, snapshotContents.ops);\n\n\treturn builder.serialize();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"compactSnapshotWriter.js","sourceRoot":"","sources":["../src/compactSnapshotWriter.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 { stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { ISnapshot } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tIBlob,\n\tISequencedDocumentMessage,\n\tISnapshotTree,\n} from \"@fluidframework/protocol-definitions\";\n\nimport { TreeBuilderSerializer } from \"./WriteBufferUtils.js\";\nimport { snapshotMinReadVersion } from \"./compactSnapshotParser.js\";\nimport {\n\tNodeCore,\n\taddBoolProperty,\n\taddDictionaryStringProperty,\n\taddNumberProperty,\n\taddStringProperty,\n} from \"./zipItDataRepresentationUtils.js\";\n\n/**\n * Writes header section of the snapshot.\n * @param node - snapshot node to serialize to\n * @param latestSequenceNumber - latest seq number of the container.\n */\nfunction writeSnapshotProps(node: NodeCore, latestSequenceNumber: number): void {\n\taddStringProperty(node, \"mrv\", snapshotMinReadVersion);\n\taddStringProperty(node, \"cv\", snapshotMinReadVersion);\n\taddNumberProperty(node, \"lsn\", latestSequenceNumber);\n}\n\n/**\n * Represents blobs in the tree.\n * @param snapshotNode - node to serialize to.\n * @param blobs - blobs that is being serialized\n */\nfunction writeBlobsSection(snapshotNode: NodeCore, blobs: Map<string, IBlob | ArrayBuffer>): void {\n\tsnapshotNode.addDictionaryString(\"blobs\");\n\tconst blobsNode = snapshotNode.addNode(\"list\");\n\tfor (const [storageBlobId, blob] of blobs) {\n\t\tconst blobNode = blobsNode.addNode();\n\t\taddDictionaryStringProperty(blobNode, \"id\", storageBlobId);\n\t\tblobNode.addString(\"data\");\n\t\tif (blob instanceof ArrayBuffer) {\n\t\t\tblobNode.addBlob(new Uint8Array(blob));\n\t\t} else {\n\t\t\tblobNode.addBlob(\n\t\t\t\tnew Uint8Array(stringToBuffer(blob.contents, blob.encoding ?? \"utf8\")),\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Represents and serializes tree part of the snapshot\n * @param snapshotNode - tree node to serialize to\n * @param snapshotTree - snapshot tree that is being serialized\n */\nfunction writeTreeSection(snapshotNode: NodeCore, snapshotTree: ISnapshotTree): void {\n\tsnapshotNode.addDictionaryString(\"treeNodes\");\n\tconst treesNode = snapshotNode.addNode(\"list\");\n\twriteTreeSectionCore(treesNode, snapshotTree);\n}\n\nfunction writeTreeSectionCore(treesNode: NodeCore, snapshotTree: ISnapshotTree): void {\n\tfor (const [path, value] of Object.entries(snapshotTree.trees)) {\n\t\tconst treeNode = treesNode.addNode();\n\t\t// Many leaf nodes in the tree have same names like \"content\", \"body\", \"header\"\n\t\t// We could be smarter here and not use dictionary where we are sure reuse is unlikely, but\n\t\t// it does not feel like it's worth it.\n\t\taddDictionaryStringProperty(treeNode, \"name\", path);\n\t\tif (snapshotTree.unreferenced) {\n\t\t\taddBoolProperty(treeNode, \"unreferenced\", snapshotTree.unreferenced);\n\t\t}\n\t\t// Only write children prop if either blobs or trees are present.\n\t\tif (Object.keys(value.blobs).length > 0 || Object.keys(value.trees).length > 0) {\n\t\t\ttreeNode.addDictionaryString(\"children\");\n\t\t\tconst childNode = treeNode.addNode(\"list\");\n\t\t\twriteTreeSectionCore(childNode, value);\n\t\t}\n\t\tif (snapshotTree.groupId !== undefined) {\n\t\t\taddDictionaryStringProperty(treeNode, \"groupId\", snapshotTree.groupId);\n\t\t}\n\t}\n\n\tif (snapshotTree.blobs) {\n\t\tfor (const [path, id] of Object.entries(snapshotTree.blobs)) {\n\t\t\tconst blobNode = treesNode.addNode();\n\t\t\taddDictionaryStringProperty(blobNode, \"name\", path);\n\t\t\taddDictionaryStringProperty(blobNode, \"value\", id);\n\t\t}\n\t}\n}\n\n/**\n * Represents (serializes) snapshot tree as generalizes tree\n * @param rootNode - tree node to serialize to\n * @param snapshotTree - snapshot tree that is being serialized\n * @param blobs - blobs mapping of the snapshot\n * @param snapshotSequenceNumber - seq number at which snapshot is taken\n */\nfunction writeSnapshotSection(\n\trootNode: NodeCore,\n\tsnapshotTree: ISnapshotTree,\n\tsnapshotSequenceNumber: number,\n): void {\n\trootNode.addDictionaryString(\"snapshot\");\n\tconst snapshotNode = rootNode.addNode();\n\n\tconst snapshotId = snapshotTree.id;\n\tassert(snapshotId !== undefined, 0x21b /* \"Snapshot id should be provided\" */);\n\taddStringProperty(snapshotNode, \"id\", snapshotId);\n\taddStringProperty(snapshotNode, \"message\", `Snapshot@${snapshotSequenceNumber}`);\n\taddNumberProperty(snapshotNode, \"sequenceNumber\", snapshotSequenceNumber);\n\n\t// Add Trees\n\twriteTreeSection(snapshotNode, snapshotTree);\n}\n\n/**\n * Represents ops in the tree.\n * @param rootNode - node to serialize to.\n * @param ops - ops that is being serialized\n */\nfunction writeOpsSection(rootNode: NodeCore, ops: ISequencedDocumentMessage[]): void {\n\tlet firstSequenceNumber: number | undefined;\n\tif (ops.length > 0) {\n\t\tfirstSequenceNumber = ops[0].sequenceNumber;\n\t}\n\tif (firstSequenceNumber !== undefined) {\n\t\trootNode.addDictionaryString(\"deltas\");\n\t\tconst opsNode = rootNode.addNode();\n\t\taddNumberProperty(opsNode, \"firstSequenceNumber\", firstSequenceNumber);\n\t\topsNode.addDictionaryString(\"deltas\");\n\t\tconst deltaNode = opsNode.addNode(\"list\");\n\t\tfor (const op of ops) {\n\t\t\tdeltaNode.addString(JSON.stringify(op));\n\t\t}\n\t}\n}\n\n/**\n * Converts trees/blobs/ops to binary compact representation.\n * @param snapshotContents - snapshot tree contents to serialize\n * @returns ReadBuffer - binary representation of the data.\n */\nexport function convertToCompactSnapshot(snapshotContents: ISnapshot): Uint8Array {\n\tconst builder = new TreeBuilderSerializer();\n\t// Create the root node.\n\tconst rootNode = builder.addNode();\n\tassert(\n\t\tsnapshotContents.sequenceNumber !== undefined,\n\t\t0x21c /* \"Seq number should be provided\" */,\n\t);\n\n\tlet latestSequenceNumber = snapshotContents.latestSequenceNumber;\n\tif (latestSequenceNumber === undefined) {\n\t\tlatestSequenceNumber =\n\t\t\tsnapshotContents.ops.length > 0\n\t\t\t\t? snapshotContents.ops[snapshotContents.ops.length - 1].sequenceNumber\n\t\t\t\t: snapshotContents.sequenceNumber;\n\t}\n\n\twriteSnapshotProps(rootNode, latestSequenceNumber);\n\n\twriteSnapshotSection(rootNode, snapshotContents.snapshotTree, snapshotContents.sequenceNumber);\n\n\t// Add Blobs\n\twriteBlobsSection(rootNode, snapshotContents.blobContents);\n\n\t// Then write the ops node.\n\twriteOpsSection(rootNode, snapshotContents.ops);\n\n\treturn builder.serialize();\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchSnapshot.d.ts","sourceRoot":"","sources":["../src/fetchSnapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAC;AAUxE,OAAO,EAEN,gBAAgB,EAChB,gBAAgB,EAChB,+BAA+B,EAE/B,MAAM,kDAAkD,CAAC;AAE1D,OAAO,EACN,mBAAmB,EAKnB,MAAM,0CAA0C,CAAC;AAQlD,OAAO,EACN,aAAa,EAEb,wBAAwB,EAExB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIjD,OAAO,EACN,aAAa,EASb,MAAM,gBAAgB,CAAC;AAGxB;;;GAGG;AACH,oBAAY,yBAAyB;IACpC,IAAI,IAAI;IACR,MAAM,IAAI;IACV,aAAa,IAAI;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAClC,WAAW,EAAE,MAAM,EAEnB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,OAAO,EAC1B,sCAAsC,EAAE,OAAO,EAC/C,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,EAAE,CACnB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAA;CAAE,KAC1C,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAClC,OAAO,CAAC,SAAS,CAAC,CAsBpB;AAED,wBAAsB,uBAAuB,CAC5C,eAAe,EAAE,gBAAgB,EACjC,mBAAmB,EAAE,+BAA+B,EACpD,eAAe,EAAE,gBAAgB,GAAG,SAAS,EAC7C,sCAAsC,EAAE,OAAO,EAC/C,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,EAAE,CACnB,oBAAoB,EAAE,gBAAgB,EACtC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EAAE,GAAG,SAAS,EACrC,eAAe,EAAE,gBAAgB,GAAG,SAAS,EAC7C,UAAU,CAAC,EAAE,eAAe,KACxB,OAAO,CAAC,kCAAkC,CAAC,EAChD,UAAU,EAAE,CAAC,cAAc,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,EACvE,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAClC,eAAe,EAAE,MAAM,EAAE,GAAG,SAAS,EACrC,oBAAoB,CAAC,EAAE,OAAO,GAC5B,OAAO,CAAC,SAAS,CAAC,CAgFpB;
|
|
1
|
+
{"version":3,"file":"fetchSnapshot.d.ts","sourceRoot":"","sources":["../src/fetchSnapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAC;AAUxE,OAAO,EAEN,gBAAgB,EAChB,gBAAgB,EAChB,+BAA+B,EAE/B,MAAM,kDAAkD,CAAC;AAE1D,OAAO,EACN,mBAAmB,EAKnB,MAAM,0CAA0C,CAAC;AAQlD,OAAO,EACN,aAAa,EAEb,wBAAwB,EAExB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIjD,OAAO,EACN,aAAa,EASb,MAAM,gBAAgB,CAAC;AAGxB;;;GAGG;AACH,oBAAY,yBAAyB;IACpC,IAAI,IAAI;IACR,MAAM,IAAI;IACV,aAAa,IAAI;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAClC,WAAW,EAAE,MAAM,EAEnB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,OAAO,EAC1B,sCAAsC,EAAE,OAAO,EAC/C,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,EAAE,CACnB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAA;CAAE,KAC1C,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAClC,OAAO,CAAC,SAAS,CAAC,CAsBpB;AAED,wBAAsB,uBAAuB,CAC5C,eAAe,EAAE,gBAAgB,EACjC,mBAAmB,EAAE,+BAA+B,EACpD,eAAe,EAAE,gBAAgB,GAAG,SAAS,EAC7C,sCAAsC,EAAE,OAAO,EAC/C,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,EAAE,CACnB,oBAAoB,EAAE,gBAAgB,EACtC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EAAE,GAAG,SAAS,EACrC,eAAe,EAAE,gBAAgB,GAAG,SAAS,EAC7C,UAAU,CAAC,EAAE,eAAe,KACxB,OAAO,CAAC,kCAAkC,CAAC,EAChD,UAAU,EAAE,CAAC,cAAc,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,EACvE,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAClC,eAAe,EAAE,MAAM,EAAE,GAAG,SAAS,EACrC,oBAAoB,CAAC,EAAE,OAAO,GAC5B,OAAO,CAAC,SAAS,CAAC,CAgFpB;AA6XD,MAAM,WAAW,kCAAkC;IAClD,YAAY,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CAC5C;AAsCD,UAAU,UAAU;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,GAAG,UAAU,GAAG;IAAE,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAY3F;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CASnE;AAiBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CACrC,eAAe,EAAE,gBAAgB,EACjC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EAAE,GAAG,SAAS,EACrC,eAAe,EAAE,gBAAgB,GAAG,SAAS,EAC7C,uBAAuB,CAAC,EAAE,yBAAyB,EACnD,UAAU,CAAC,EAAE,eAAe,EAC5B,YAAY,CAAC,EAAE,YAAY,EAC3B,YAAY,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,kCAAkC,CAAC,CAgE7C"}
|
package/dist/fetchSnapshot.js
CHANGED
|
@@ -206,7 +206,17 @@ async function fetchLatestSnapshotCore(odspResolvedUrl, storageTokenFetcher, sna
|
|
|
206
206
|
switch (contentTypeToRead) {
|
|
207
207
|
case "application/json": {
|
|
208
208
|
let text;
|
|
209
|
-
[text, receiveContentTime] = await (0, odspUtils_js_1.measureP)(async () => odspResponse.content
|
|
209
|
+
[text, receiveContentTime] = await (0, odspUtils_js_1.measureP)(async () => odspResponse.content
|
|
210
|
+
.text()
|
|
211
|
+
.then((res) => {
|
|
212
|
+
if (res.length === 0) {
|
|
213
|
+
(0, internal_4.throwOdspNetworkError)("Response from browser is empty", internal_4.fetchIncorrectResponse, odspResponse.content, // response
|
|
214
|
+
undefined, // response text
|
|
215
|
+
propsToLog);
|
|
216
|
+
}
|
|
217
|
+
return res;
|
|
218
|
+
})
|
|
219
|
+
.catch((error) =>
|
|
210
220
|
// Parsing can fail and message could contain full request URI, including
|
|
211
221
|
// tokens, etc. So do not log error object itself.
|
|
212
222
|
(0, internal_4.throwOdspNetworkError)("Error while parsing fetch response", internal_4.fetchIncorrectResponse, odspResponse.content, // response
|
|
@@ -228,7 +238,17 @@ async function fetchLatestSnapshotCore(odspResolvedUrl, storageTokenFetcher, sna
|
|
|
228
238
|
}
|
|
229
239
|
case "application/ms-fluid": {
|
|
230
240
|
let content;
|
|
231
|
-
[content, receiveContentTime] = await (0, odspUtils_js_1.measureP)(async () => odspResponse.content
|
|
241
|
+
[content, receiveContentTime] = await (0, odspUtils_js_1.measureP)(async () => odspResponse.content
|
|
242
|
+
.arrayBuffer()
|
|
243
|
+
.then((res) => {
|
|
244
|
+
if (res.byteLength === 0) {
|
|
245
|
+
(0, internal_4.throwOdspNetworkError)("Response from browser is empty", internal_4.fetchIncorrectResponse, odspResponse.content, // response
|
|
246
|
+
undefined, // response text
|
|
247
|
+
propsToLog);
|
|
248
|
+
}
|
|
249
|
+
return res;
|
|
250
|
+
})
|
|
251
|
+
.catch((error) =>
|
|
232
252
|
// Parsing can fail and message could contain full request URI, including
|
|
233
253
|
// tokens, etc. So do not log error object itself.
|
|
234
254
|
(0, internal_4.throwOdspNetworkError)("Error while parsing fetch response", internal_4.fetchIncorrectResponse, odspResponse.content, // response
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchSnapshot.js","sourceRoot":"","sources":["../src/fetchSnapshot.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 { fromUtf8ToBase64 } from \"@fluid-internal/client-utils\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { getW3CData } from \"@fluidframework/driver-base/internal\";\nimport { ISnapshot } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tDriverErrorTelemetryProps,\n\tNonRetryableError,\n\tisRuntimeMessage,\n} from \"@fluidframework/driver-utils/internal\";\nimport {\n\tfetchIncorrectResponse,\n\tthrowOdspNetworkError,\n} from \"@fluidframework/odsp-doclib-utils/internal\";\nimport {\n\ttype IOdspError,\n\tIOdspResolvedUrl,\n\tISnapshotOptions,\n\tInstrumentedStorageTokenFetcher,\n\tOdspErrorTypes,\n} from \"@fluidframework/odsp-driver-definitions/internal\";\nimport { ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport {\n\tITelemetryLoggerExt,\n\tPerformanceEvent,\n\tisFluidError,\n\tloggerToMonitoringContext,\n\twrapError,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport {\n\tISnapshotContentsWithProps,\n\tcurrentReadVersion,\n\tparseCompactSnapshotResponse,\n} from \"./compactSnapshotParser.js\";\nimport {\n\tIOdspSnapshot,\n\tISnapshotCachedEntry2,\n\tIVersionedValueWithEpoch,\n\tpersistedCacheValueVersion,\n} from \"./contracts.js\";\nimport { EpochTracker } from \"./epochTracker.js\";\nimport { getQueryString } from \"./getQueryString.js\";\nimport { getUrlAndHeadersWithAuth } from \"./getUrlAndHeadersWithAuth.js\";\nimport { convertOdspSnapshotToSnapshotTreeAndBlobs } from \"./odspSnapshotParser.js\";\nimport {\n\tIOdspResponse,\n\tfetchAndParseAsJSONHelper,\n\tfetchHelper,\n\tgetWithRetryForTokenRefresh,\n\tgetWithRetryForTokenRefreshRepeat,\n\tisSnapshotFetchForLoadingGroup,\n\tmeasure,\n\tmeasureP,\n\tuseLegacyFlowWithoutGroupsForSnapshotFetch,\n} from \"./odspUtils.js\";\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * Enum to support different types of snapshot formats.\n * @alpha\n */\nexport enum SnapshotFormatSupportType {\n\tJson = 0,\n\tBinary = 1,\n\tJsonAndBinary = 2,\n}\n\n/**\n * Fetches a snapshot from the server with a given version id.\n * @param snapshotUrl - snapshot url from where the odsp snapshot will be fetched\n * @param token - token used for authorization in the request\n * @param storageFetchWrapper - Implementation of the get/post methods used to fetch the snapshot\n * @param versionId - id of specific snapshot to be fetched\n * @param fetchFullSnapshot - whether we want to fetch full snapshot(with blobs)\n * @param forceAccessTokenViaAuthorizationHeader - whether to force passing given token via authorization header\n * @returns A promise of the snapshot and the status code of the response\n */\nexport async function fetchSnapshot(\n\tsnapshotUrl: string,\n\t// eslint-disable-next-line @rushstack/no-new-null\n\ttoken: string,\n\tversionId: string,\n\tfetchFullSnapshot: boolean,\n\tforceAccessTokenViaAuthorizationHeader: boolean,\n\tlogger: ITelemetryLoggerExt,\n\tsnapshotDownloader: (\n\t\turl: string,\n\t\tfetchOptions: { [index: string]: RequestInit },\n\t) => Promise<IOdspResponse<unknown>>,\n): Promise<ISnapshot> {\n\tconst path = `/trees/${versionId}`;\n\tlet queryParams: ISnapshotOptions = {};\n\n\tif (fetchFullSnapshot) {\n\t\tqueryParams = versionId === \"latest\" ? { deltas: 1, blobs: 2 } : { blobs: 2 };\n\t}\n\n\tconst queryString = getQueryString(queryParams);\n\tconst { url, headers } = getUrlAndHeadersWithAuth(\n\t\t`${snapshotUrl}${path}${queryString}`,\n\t\ttoken,\n\t\tforceAccessTokenViaAuthorizationHeader,\n\t);\n\tconst response = (await PerformanceEvent.timedExecAsync(\n\t\tlogger,\n\t\t{\n\t\t\teventName: \"fetchSnapshot\",\n\t\t},\n\t\tasync () => snapshotDownloader(url, { headers }),\n\t)) as IOdspResponse<IOdspSnapshot>;\n\treturn convertOdspSnapshotToSnapshotTreeAndBlobs(response.content);\n}\n\nexport async function fetchSnapshotWithRedeem(\n\todspResolvedUrl: IOdspResolvedUrl,\n\tstorageTokenFetcher: InstrumentedStorageTokenFetcher,\n\tsnapshotOptions: ISnapshotOptions | undefined,\n\tforceAccessTokenViaAuthorizationHeader: boolean,\n\tlogger: ITelemetryLoggerExt,\n\tsnapshotDownloader: (\n\t\tfinalOdspResolvedUrl: IOdspResolvedUrl,\n\t\tstorageToken: string,\n\t\tloadingGroupIds: string[] | undefined,\n\t\tsnapshotOptions: ISnapshotOptions | undefined,\n\t\tcontroller?: AbortController,\n\t) => Promise<ISnapshotRequestAndResponseOptions>,\n\tputInCache: (valueWithEpoch: IVersionedValueWithEpoch) => Promise<void>,\n\tremoveEntries: () => Promise<void>,\n\tloadingGroupIds: string[] | undefined,\n\tenableRedeemFallback?: boolean,\n): Promise<ISnapshot> {\n\t// back-compat: This block to be removed with #8784 when we only consume/consider odsp resolvers that are >= 0.51\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\tconst sharingLinkToRedeem = (odspResolvedUrl as any).sharingLinkToRedeem;\n\tif (sharingLinkToRedeem) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\todspResolvedUrl.shareLinkInfo = { ...odspResolvedUrl.shareLinkInfo, sharingLinkToRedeem };\n\t}\n\n\treturn fetchLatestSnapshotCore(\n\t\todspResolvedUrl,\n\t\tstorageTokenFetcher,\n\t\tsnapshotOptions,\n\t\tlogger,\n\t\tsnapshotDownloader,\n\t\tputInCache,\n\t\tloadingGroupIds,\n\t\tenableRedeemFallback,\n\t)\n\t\t.catch(async (error) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tif (enableRedeemFallback && isRedeemSharingLinkError(odspResolvedUrl, error)) {\n\t\t\t\t// Execute the redeem fallback\n\n\t\t\t\tawait redeemSharingLink(\n\t\t\t\t\todspResolvedUrl,\n\t\t\t\t\tstorageTokenFetcher,\n\t\t\t\t\tlogger,\n\t\t\t\t\tforceAccessTokenViaAuthorizationHeader,\n\t\t\t\t);\n\t\t\t\tconst odspResolvedUrlWithoutShareLink: IOdspResolvedUrl = {\n\t\t\t\t\t...odspResolvedUrl,\n\t\t\t\t\tshareLinkInfo: {\n\t\t\t\t\t\t...odspResolvedUrl.shareLinkInfo,\n\t\t\t\t\t\tsharingLinkToRedeem: undefined,\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\t// Log initial failure only if redeem succeeded - it points out to some bug somewhere\n\t\t\t\t// If redeem failed, that most likely means user has no permissions to access a file,\n\t\t\t\t// and thus it's not worth it logging extra errors - same error will be logged by end-to-end\n\t\t\t\t// flow (container open) based on a failure above.\n\t\t\t\tlogger.sendTelemetryEvent(\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"RedeemFallback\",\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\terrorType: error.errorType,\n\t\t\t\t\t},\n\t\t\t\t\terror,\n\t\t\t\t);\n\n\t\t\t\treturn fetchLatestSnapshotCore(\n\t\t\t\t\todspResolvedUrlWithoutShareLink,\n\t\t\t\t\tstorageTokenFetcher,\n\t\t\t\t\tsnapshotOptions,\n\t\t\t\t\tlogger,\n\t\t\t\t\tsnapshotDownloader,\n\t\t\t\t\tputInCache,\n\t\t\t\t\tloadingGroupIds,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t})\n\t\t.catch(async (error) => {\n\t\t\t// Clear the cache on 401/403/404 on snapshot fetch from network because this means either the user doesn't\n\t\t\t// have permissions for the file or it was deleted. So, if we do not clear cache, we will continue fetching\n\t\t\t// snapshot from cache in the future.\n\t\t\tif (\n\t\t\t\t(typeof error === \"object\" &&\n\t\t\t\t\terror !== null &&\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\terror.errorType === OdspErrorTypes.authorizationError) ||\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\terror.errorType === OdspErrorTypes.fileNotFoundOrAccessDeniedError\n\t\t\t) {\n\t\t\t\tawait removeEntries();\n\t\t\t}\n\t\t\tthrow error;\n\t\t});\n}\n\nasync function redeemSharingLink(\n\todspResolvedUrl: IOdspResolvedUrl,\n\tstorageTokenFetcher: InstrumentedStorageTokenFetcher,\n\tlogger: ITelemetryLoggerExt,\n\tforceAccessTokenViaAuthorizationHeader: boolean,\n): Promise<void> {\n\tawait PerformanceEvent.timedExecAsync(\n\t\tlogger,\n\t\t{\n\t\t\teventName: \"RedeemShareLink\",\n\t\t},\n\t\tasync () => {\n\t\t\tassert(\n\t\t\t\t!!odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem,\n\t\t\t\t0x1ed /* \"Share link should be present\" */,\n\t\t\t);\n\n\t\t\tconst encodedShareUrl = getEncodedShareUrl(\n\t\t\t\todspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem,\n\t\t\t);\n\n\t\t\tlet redeemUrl: string | undefined;\n\t\t\tasync function callSharesAPI(baseUrl: string): Promise<void> {\n\t\t\t\tawait getWithRetryForTokenRefresh(async (tokenFetchOptions) => {\n\t\t\t\t\tconst storageToken = await storageTokenFetcher(\n\t\t\t\t\t\ttokenFetchOptions,\n\t\t\t\t\t\t\"RedeemShareLink\",\n\t\t\t\t\t);\n\t\t\t\t\tredeemUrl = `${baseUrl}/_api/v2.0/shares/${encodedShareUrl}`;\n\t\t\t\t\tconst { url, headers } = getUrlAndHeadersWithAuth(\n\t\t\t\t\t\tredeemUrl,\n\t\t\t\t\t\tstorageToken,\n\t\t\t\t\t\tforceAccessTokenViaAuthorizationHeader,\n\t\t\t\t\t);\n\t\t\t\t\theaders.prefer = \"redeemSharingLink\";\n\t\t\t\t\tawait fetchAndParseAsJSONHelper(url, { headers });\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst disableUsingTenantDomain = loggerToMonitoringContext(logger).config.getBoolean(\n\t\t\t\t\"Fluid.Driver.Odsp.DisableUsingTenantDomainForSharesApi\",\n\t\t\t);\n\t\t\t// There is an issue where if we use the siteUrl in /shares, then the allowed length of url is just a few hundred characters(300-400)\n\t\t\t// and we fail to do the redeem. But if we use the tenant domain in the url, then the allowed length becomes 2048. So, first\n\t\t\t// construct the url for /shares using tenant domain but to be on safer side, fallback to using the siteUrl. We get tenant domain\n\t\t\t// by getting origin of the siteUrl.\n\t\t\tif (!disableUsingTenantDomain) {\n\t\t\t\ttry {\n\t\t\t\t\tawait callSharesAPI(new URL(odspResolvedUrl.siteUrl).origin);\n\t\t\t\t\treturn;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.sendTelemetryEvent(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"ShareLinkRedeemFailedWithTenantDomain\",\n\t\t\t\t\t\t\tdetails: JSON.stringify({\n\t\t\t\t\t\t\t\tlength: redeemUrl?.length,\n\t\t\t\t\t\t\t\tshareLinkUrlLength:\n\t\t\t\t\t\t\t\t\todspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem.length,\n\t\t\t\t\t\t\t\tqueryParamsLength: new URL(\n\t\t\t\t\t\t\t\t\todspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem,\n\t\t\t\t\t\t\t\t).search.length,\n\t\t\t\t\t\t\t\tuseHeaders: forceAccessTokenViaAuthorizationHeader,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait callSharesAPI(odspResolvedUrl.siteUrl);\n\t\t},\n\t);\n}\n\nasync function fetchLatestSnapshotCore(\n\todspResolvedUrl: IOdspResolvedUrl,\n\tstorageTokenFetcher: InstrumentedStorageTokenFetcher,\n\tsnapshotOptions: ISnapshotOptions | undefined,\n\tlogger: ITelemetryLoggerExt,\n\tsnapshotDownloader: (\n\t\tfinalOdspResolvedUrl: IOdspResolvedUrl,\n\t\tstorageToken: string,\n\t\tloadingGroupIds: string[] | undefined,\n\t\tsnapshotOptions: ISnapshotOptions | undefined,\n\t\tcontroller?: AbortController,\n\t) => Promise<ISnapshotRequestAndResponseOptions>,\n\tputInCache: (valueWithEpoch: IVersionedValueWithEpoch) => Promise<void>,\n\tloadingGroupIds: string[] | undefined,\n\tenableRedeemFallback?: boolean,\n): Promise<ISnapshot> {\n\treturn getWithRetryForTokenRefresh(async (tokenFetchOptions) => {\n\t\tconst fetchSnapshotForLoadingGroup = isSnapshotFetchForLoadingGroup(loadingGroupIds);\n\t\tconst eventName = fetchSnapshotForLoadingGroup ? \"TreesLatestForGroup\" : \"TreesLatest\";\n\t\tconst storageToken = await storageTokenFetcher(tokenFetchOptions, eventName, true);\n\n\t\tconst perfEvent = {\n\t\t\teventName,\n\t\t\tattempts: tokenFetchOptions.refresh ? 2 : 1,\n\t\t\tshareLinkPresent: odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem !== undefined,\n\t\t\tisSummarizer: odspResolvedUrl.summarizer,\n\t\t\tredeemFallbackEnabled: enableRedeemFallback,\n\t\t};\n\t\tif (snapshotOptions !== undefined) {\n\t\t\tfor (const [key, value] of Object.entries(snapshotOptions)) {\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\tperfEvent[`snapshotOption_${key}`] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// This event measures only successful cases of getLatest call (no tokens, no retries).\n\t\treturn PerformanceEvent.timedExecAsync(logger, perfEvent, async (event) => {\n\t\t\tlet controller: AbortController | undefined;\n\t\t\tlet fetchTimeout: ReturnType<typeof setTimeout> | undefined;\n\t\t\tif (snapshotOptions?.timeout !== undefined) {\n\t\t\t\tcontroller = new AbortController();\n\t\t\t\tfetchTimeout = setTimeout(() => controller!.abort(), snapshotOptions.timeout);\n\t\t\t}\n\n\t\t\tconst [response, fetchTime] = await measureP(async () =>\n\t\t\t\tsnapshotDownloader(\n\t\t\t\t\todspResolvedUrl,\n\t\t\t\t\tstorageToken,\n\t\t\t\t\tloadingGroupIds,\n\t\t\t\t\tsnapshotOptions,\n\t\t\t\t\tcontroller,\n\t\t\t\t),\n\t\t\t).finally(() => {\n\t\t\t\t// Clear the fetchTimeout once the response is fetched.\n\t\t\t\tif (fetchTimeout !== undefined) {\n\t\t\t\t\tclearTimeout(fetchTimeout);\n\t\t\t\t\tfetchTimeout = undefined;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst odspResponse = response.odspResponse;\n\t\t\tconst contentType = odspResponse.headers.get(\"content-type\");\n\n\t\t\tconst propsToLog: DriverErrorTelemetryProps = {\n\t\t\t\t...odspResponse.propsToLog,\n\t\t\t\tcontentType,\n\t\t\t\taccept: response.requestHeaders.accept,\n\t\t\t\tdriverVersion: pkgVersion,\n\t\t\t};\n\n\t\t\tlet parsedSnapshotContents: IOdspResponse<ISnapshotContentsWithProps> | undefined;\n\t\t\tlet contentTypeToRead: string | undefined;\n\t\t\tif (contentType?.includes(\"application/ms-fluid\")) {\n\t\t\t\tcontentTypeToRead = \"application/ms-fluid\";\n\t\t\t} else if (contentType?.includes(\"application/json\")) {\n\t\t\t\tcontentTypeToRead = \"application/json\";\n\t\t\t}\n\n\t\t\tlet parseTime: number;\n\t\t\tlet receiveContentTime: number;\n\t\t\ttry {\n\t\t\t\tswitch (contentTypeToRead) {\n\t\t\t\t\tcase \"application/json\": {\n\t\t\t\t\t\tlet text: string;\n\t\t\t\t\t\t[text, receiveContentTime] = await measureP(async () =>\n\t\t\t\t\t\t\todspResponse.content.text().catch((error) =>\n\t\t\t\t\t\t\t\t// Parsing can fail and message could contain full request URI, including\n\t\t\t\t\t\t\t\t// tokens, etc. So do not log error object itself.\n\t\t\t\t\t\t\t\tthrowOdspNetworkError(\n\t\t\t\t\t\t\t\t\t\"Error while parsing fetch response\",\n\t\t\t\t\t\t\t\t\tfetchIncorrectResponse,\n\t\t\t\t\t\t\t\t\todspResponse.content, // response\n\t\t\t\t\t\t\t\t\tundefined, // response text\n\t\t\t\t\t\t\t\t\tpropsToLog,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpropsToLog.bodySize = text.length;\n\t\t\t\t\t\tlet content: IOdspSnapshot;\n\t\t\t\t\t\t[content, parseTime] = measure(() => JSON.parse(text) as IOdspSnapshot);\n\t\t\t\t\t\tvalidateBlobsAndTrees(content);\n\t\t\t\t\t\tconst snapshotContents: ISnapshot =\n\t\t\t\t\t\t\tconvertOdspSnapshotToSnapshotTreeAndBlobs(content);\n\t\t\t\t\t\tparsedSnapshotContents = {\n\t\t\t\t\t\t\t...odspResponse,\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t...snapshotContents,\n\t\t\t\t\t\t\t\ttelemetryProps: {},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"application/ms-fluid\": {\n\t\t\t\t\t\tlet content: ArrayBuffer;\n\t\t\t\t\t\t[content, receiveContentTime] = await measureP(async () =>\n\t\t\t\t\t\t\todspResponse.content.arrayBuffer().catch((error) =>\n\t\t\t\t\t\t\t\t// Parsing can fail and message could contain full request URI, including\n\t\t\t\t\t\t\t\t// tokens, etc. So do not log error object itself.\n\t\t\t\t\t\t\t\tthrowOdspNetworkError(\n\t\t\t\t\t\t\t\t\t\"Error while parsing fetch response\",\n\t\t\t\t\t\t\t\t\tfetchIncorrectResponse,\n\t\t\t\t\t\t\t\t\todspResponse.content, // response\n\t\t\t\t\t\t\t\t\tundefined, // response text\n\t\t\t\t\t\t\t\t\tpropsToLog,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpropsToLog.bodySize = content.byteLength;\n\t\t\t\t\t\tlet snapshotContents: ISnapshotContentsWithProps;\n\t\t\t\t\t\t[snapshotContents, parseTime] = measure(() =>\n\t\t\t\t\t\t\tparseCompactSnapshotResponse(new Uint8Array(content), logger),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tsnapshotContents.snapshotTree.trees === undefined ||\n\t\t\t\t\t\t\tsnapshotContents.snapshotTree.blobs === undefined\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthrow new NonRetryableError(\n\t\t\t\t\t\t\t\t\"Returned odsp snapshot is malformed. No trees or blobs!\",\n\t\t\t\t\t\t\t\tOdspErrorTypes.incorrectServerResponse,\n\t\t\t\t\t\t\t\tpropsToLog,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst props = snapshotContents.telemetryProps;\n\t\t\t\t\t\tconst slowTreeParseCodePaths = props.slowTreeStructureCount ?? 0;\n\t\t\t\t\t\tconst slowBlobParseCodePaths = props.slowBlobStructureCount ?? 0;\n\t\t\t\t\t\tif (slowTreeParseCodePaths > 10 || slowBlobParseCodePaths > 10) {\n\t\t\t\t\t\t\tlogger.sendErrorEvent({\n\t\t\t\t\t\t\t\teventName: \"SlowSnapshotParseCodePaths\",\n\t\t\t\t\t\t\t\tslowTreeStructureCount: slowTreeParseCodePaths,\n\t\t\t\t\t\t\t\tslowBlobStructureCount: slowBlobParseCodePaths,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparsedSnapshotContents = { ...odspResponse, content: snapshotContents };\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tthrow new NonRetryableError(\n\t\t\t\t\t\t\t\"Unknown snapshot content type\",\n\t\t\t\t\t\t\tOdspErrorTypes.incorrectServerResponse,\n\t\t\t\t\t\t\tpropsToLog,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (isFluidError(error)) {\n\t\t\t\t\terror.addTelemetryProperties(propsToLog);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tconst enhancedError = wrapError(\n\t\t\t\t\terror,\n\t\t\t\t\t(errorMessage) =>\n\t\t\t\t\t\tnew NonRetryableError(\n\t\t\t\t\t\t\t`Error parsing snapshot response: ${errorMessage}`,\n\t\t\t\t\t\t\tOdspErrorTypes.genericError,\n\t\t\t\t\t\t\tpropsToLog,\n\t\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tthrow enhancedError;\n\t\t\t}\n\n\t\t\tassert(parsedSnapshotContents !== undefined, 0x312 /* snapshot should be parsed */);\n\t\t\tconst snapshot = parsedSnapshotContents.content;\n\n\t\t\t// There are some scenarios in ODSP where we cannot cache, trees/latest will explicitly tell us when we\n\t\t\t// cannot cache using an HTTP response header. Only cache snapshot if it is not for a loading group.\n\t\t\tconst canCache =\n\t\t\t\todspResponse.headers.get(\"disablebrowsercachingofusercontent\") !== \"true\" &&\n\t\t\t\t!fetchSnapshotForLoadingGroup;\n\t\t\tconst sequenceNumber: number = snapshot.sequenceNumber ?? 0;\n\t\t\tconst seqNumberFromOps =\n\t\t\t\tsnapshot.ops && snapshot.ops.length > 0\n\t\t\t\t\t? snapshot.ops[0].sequenceNumber - 1\n\t\t\t\t\t: undefined;\n\n\t\t\tif (\n\t\t\t\t!Number.isInteger(sequenceNumber) ||\n\t\t\t\t(seqNumberFromOps !== undefined && seqNumberFromOps !== sequenceNumber)\n\t\t\t) {\n\t\t\t\tlogger.sendErrorEvent({\n\t\t\t\t\teventName: \"fetchSnapshotError\",\n\t\t\t\t\tsequenceNumber,\n\t\t\t\t\tseqNumberFromOps,\n\t\t\t\t});\n\t\t\t\tsnapshot.sequenceNumber = undefined;\n\t\t\t} else if (canCache) {\n\t\t\t\tconst fluidEpoch = odspResponse.headers.get(\"x-fluid-epoch\");\n\t\t\t\tassert(\n\t\t\t\t\tfluidEpoch !== undefined,\n\t\t\t\t\t0x1e6 /* \"Epoch should be present in response\" */,\n\t\t\t\t);\n\t\t\t\tconst value: ISnapshotCachedEntry2 = {\n\t\t\t\t\t...snapshot,\n\t\t\t\t\tcacheEntryTime: Date.now(),\n\t\t\t\t};\n\t\t\t\tconst valueWithEpoch: IVersionedValueWithEpoch = {\n\t\t\t\t\tvalue,\n\t\t\t\t\tfluidEpoch,\n\t\t\t\t\tversion: persistedCacheValueVersion,\n\t\t\t\t};\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\t\t\tputInCache(valueWithEpoch);\n\t\t\t}\n\n\t\t\tevent.end({\n\t\t\t\t// trees, leafTrees, blobNodes, encodedBlobsSize,\n\t\t\t\t// blobNodes - blobs tells us (roughly) how many blobs are deduped by service.\n\t\t\t\t...getTreeStats(snapshot),\n\t\t\t\tblobs: snapshot.blobContents?.size ?? 0,\n\t\t\t\tsequenceNumber,\n\t\t\t\tops: snapshot.ops?.length ?? 0,\n\t\t\t\tfetchSnapshotForLoadingGroup,\n\t\t\t\tuseLegacyFlowWithoutGroups:\n\t\t\t\t\tuseLegacyFlowWithoutGroupsForSnapshotFetch(loadingGroupIds),\n\t\t\t\tuserOps: snapshot.ops?.filter((op) => isRuntimeMessage(op)).length ?? 0,\n\t\t\t\t// Measures time to make fetch call. Should be similar to\n\t\t\t\t// fetchStartToResponseEndTime - receiveContentTime, i.e. it looks like it's time till first byte /\n\t\t\t\t// end of response headers\n\t\t\t\tfetchTime,\n\t\t\t\t// time it takes client to parse payload. Same payload as in \"SnapshotParse\" event, here for\n\t\t\t\t// easier analyzes.\n\t\t\t\tparseTime,\n\t\t\t\t// Time it takes to receive content (text of buffer) from Response object.\n\t\t\t\t// This time likely is very closely correlated with networkTime, i.e. time it takes to receive\n\t\t\t\t// actual content (starting measuring from first bite / end of response header)\n\t\t\t\treceiveContentTime,\n\t\t\t\t...getW3CData(response.requestUrl, \"fetch\"),\n\t\t\t\t// Sharing link telemetry regarding sharing link redeem status and performance. Ex: FRL; dur=100,\n\t\t\t\t// Azure Fluid Relay service; desc=S, FRP; desc=False. Here, FRL is the duration taken for redeem,\n\t\t\t\t// Azure Fluid Relay service is the redeem status (S means success), and FRP is a flag to indicate\n\t\t\t\t// if the permission has changed.\n\t\t\t\tsltelemetry: odspResponse.headers.get(\"x-fluid-sltelemetry\"),\n\t\t\t\t// All other props\n\t\t\t\t...propsToLog,\n\t\t\t\t// Various perf counters and measures collected by binary parsing code:\n\t\t\t\t// slowTreeStructureCount, slowBlobStructureCount, durationStructure, durationStrings,\n\t\t\t\t// durationSnapshotTree, durationBlobs, etc.\n\t\t\t\t...parsedSnapshotContents.content.telemetryProps,\n\t\t\t});\n\t\t\treturn snapshot;\n\t\t}).catch((error) => {\n\t\t\t// We hit these errors in stress tests, under load\n\t\t\t// It's useful to try one more time in such case.\n\t\t\tif (\n\t\t\t\ttypeof error === \"object\" &&\n\t\t\t\terror !== null &&\n\t\t\t\t((error as Partial<IOdspError>).errorType === OdspErrorTypes.fetchFailure ||\n\t\t\t\t\t(error as Partial<IOdspError>).errorType === OdspErrorTypes.fetchTimeout)\n\t\t\t) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\terror[getWithRetryForTokenRefreshRepeat] = true;\n\t\t\t}\n\t\t\tthrow error;\n\t\t});\n\t});\n}\n\nexport interface ISnapshotRequestAndResponseOptions {\n\todspResponse: IOdspResponse<Response>;\n\trequestUrl: string;\n\trequestHeaders: { [index: string]: string };\n}\n\nfunction getFormBodyAndHeaders(\n\todspResolvedUrl: IOdspResolvedUrl,\n\tstorageToken: string,\n\theaders?: { [index: string]: string },\n): {\n\tbody: string;\n\theaders: {\n\t\t[index: string]: string;\n\t};\n} {\n\tconst formBoundary = uuid();\n\tconst formParams: string[] = [];\n\tformParams.push(\n\t\t`--${formBoundary}`,\n\t\t`Authorization: Bearer ${storageToken}`,\n\t\t`X-HTTP-Method-Override: GET`,\n\t);\n\n\tif (headers !== undefined) {\n\t\tfor (const [key, value] of Object.entries(headers)) {\n\t\t\tif (value !== undefined) {\n\t\t\t\tformParams.push(`${key}: ${value}`);\n\t\t\t}\n\t\t}\n\t}\n\tif (odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem) {\n\t\tformParams.push(`sl: ${odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem}`);\n\t}\n\tformParams.push(`_post: 1`, `\\r\\n--${formBoundary}--`);\n\tconst postBody = formParams.join(\"\\r\\n\");\n\tconst header: { [index: string]: string } = {\n\t\t\"Content-Type\": `multipart/form-data;boundary=${formBoundary}`,\n\t};\n\treturn { body: postBody, headers: header };\n}\n\ninterface ITreeStats {\n\ttrees: number;\n\tleafTrees: number;\n\tblobNodes: number;\n}\n\nexport function getTreeStats(snapshot: ISnapshot): ITreeStats & { encodedBlobsSize: number } {\n\tconst stats: ITreeStats = {\n\t\ttrees: 0,\n\t\tleafTrees: 0,\n\t\tblobNodes: 0,\n\t};\n\tgetTreeStatsCore(snapshot.snapshotTree, stats);\n\tlet encodedBlobsSize = 0;\n\tfor (const [_, blobContent] of snapshot.blobContents) {\n\t\tencodedBlobsSize += blobContent.byteLength;\n\t}\n\treturn { ...stats, encodedBlobsSize };\n}\n\nexport function validateBlobsAndTrees(snapshot: IOdspSnapshot): void {\n\tassert(\n\t\tsnapshot.trees !== undefined,\n\t\t0x200 /* \"Returned odsp snapshot is malformed. No trees!\" */,\n\t);\n\tassert(\n\t\tsnapshot.blobs !== undefined,\n\t\t0x201 /* \"Returned odsp snapshot is malformed. No blobs!\" */,\n\t);\n}\n\nfunction getTreeStatsCore(snapshotTree: ISnapshotTree, stats: ITreeStats): void {\n\tstats.blobNodes += Object.entries(snapshotTree.blobs).length;\n\tstats.trees++;\n\n\tconst entries = Object.entries(snapshotTree.trees);\n\tif (entries.length === 0) {\n\t\tstats.leafTrees++;\n\t} else {\n\t\tfor (const [_, tree] of entries) {\n\t\t\tstats.trees++;\n\t\t\tgetTreeStatsCore(tree, stats);\n\t\t}\n\t}\n}\n\n/**\n * This function fetches the snapshot and parse it according to what is mentioned in response headers.\n * @param odspResolvedUrl - resolved odsp url.\n * @param storageToken - token to do the auth for network request.\n * @param snapshotOptions - Options used to specify how and what to fetch in the snapshot.\n * @param loadingGroupIds - loadingGroupIds for which snapshot needs to be downloaded. Note:\n * 1.) If undefined, then legacy trees latest call will be used where no groupId query param would be specified.\n * 2.) If [] is passed, then snapshot with all ungrouped data will be fetched.\n * 3.) If any groupId is specified like [\"g1\"], then snapshot for g1 group will be fetched.\n * @param snapshotFormatFetchType - Snapshot format to fetch.\n * @param controller - abort controller if caller needs to abort the network call.\n * @param epochTracker - epoch tracker used to add/validate epoch in the network call.\n * @returns fetched snapshot.\n */\nexport async function downloadSnapshot(\n\todspResolvedUrl: IOdspResolvedUrl,\n\tstorageToken: string,\n\tloadingGroupIds: string[] | undefined,\n\tsnapshotOptions: ISnapshotOptions | undefined,\n\tsnapshotFormatFetchType?: SnapshotFormatSupportType,\n\tcontroller?: AbortController,\n\tepochTracker?: EpochTracker,\n\tscenarioName?: string,\n): Promise<ISnapshotRequestAndResponseOptions> {\n\t// back-compat: This block to be removed with #8784 when we only consume/consider odsp resolvers that are >= 0.51\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\tconst sharingLinkToRedeem = (odspResolvedUrl as any).sharingLinkToRedeem;\n\tif (sharingLinkToRedeem) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\todspResolvedUrl.shareLinkInfo = { ...odspResolvedUrl.shareLinkInfo, sharingLinkToRedeem };\n\t}\n\n\tconst snapshotUrl = odspResolvedUrl.endpoints.snapshotStorageUrl;\n\n\tconst queryParams: Record<string, unknown> = { ump: 1 };\n\tif (snapshotOptions !== undefined) {\n\t\tfor (const [key, value] of Object.entries(snapshotOptions)) {\n\t\t\t// Exclude \"timeout\" from query string\n\t\t\tif (value !== undefined && key !== \"timeout\") {\n\t\t\t\tqueryParams[key] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (loadingGroupIds !== undefined) {\n\t\tqueryParams.groupId = loadingGroupIds.join(\",\");\n\t}\n\n\tconst queryString = getQueryString(queryParams);\n\tconst url = `${snapshotUrl}/trees/latest${queryString}`;\n\t// The location of file can move on Spo in which case server returns 308(Permanent Redirect) error.\n\t// Adding below header will make VROOM API return 404 instead of 308 and browser can intercept it.\n\t// This error thrown by server will contain the new redirect location. Look at the 404 error parsing\n\t// for further reference here: \\packages\\utils\\odsp-doclib-utils\\src\\odspErrorUtils.ts\n\tconst header = { prefer: \"manualredirect\" };\n\tconst { body, headers } = getFormBodyAndHeaders(odspResolvedUrl, storageToken, header);\n\tconst fetchOptions = {\n\t\tbody,\n\t\theaders,\n\t\tsignal: controller?.signal,\n\t\tmethod: \"POST\",\n\t};\n\t// Decide what snapshot format to fetch as per the feature gate.\n\tswitch (snapshotFormatFetchType) {\n\t\tcase SnapshotFormatSupportType.Binary: {\n\t\t\theaders.accept = `application/ms-fluid; v=${currentReadVersion}`;\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\t// By default ask both versions and let the server decide the format.\n\t\t\theaders.accept = `application/json, application/ms-fluid; v=${currentReadVersion}`;\n\t\t}\n\t}\n\n\tconst odspResponse = await (epochTracker?.fetch(\n\t\turl,\n\t\tfetchOptions,\n\t\t\"treesLatest\",\n\t\ttrue,\n\t\tscenarioName,\n\t) ?? fetchHelper(url, fetchOptions));\n\n\treturn {\n\t\todspResponse,\n\t\trequestHeaders: headers,\n\t\trequestUrl: url,\n\t};\n}\n\nfunction isRedeemSharingLinkError(\n\todspResolvedUrl: IOdspResolvedUrl,\n\terror: Partial<IOdspError>,\n): boolean {\n\tif (\n\t\todspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem !== undefined &&\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t(error.errorType === OdspErrorTypes.authorizationError ||\n\t\t\terror.errorType === OdspErrorTypes.fileNotFoundOrAccessDeniedError)\n\t) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction getEncodedShareUrl(url: string): string {\n\t/**\n\t * Encode the url to accepted format by Sharepoint\n\t * https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/shares_get\n\t */\n\tlet encodedUrl = fromUtf8ToBase64(encodeURI(url));\n\tencodedUrl = encodedUrl.replace(/=+$/g, \"\").replace(/\\//g, \"_\").replace(/\\+/g, \"-\");\n\tencodedUrl = \"u!\".concat(encodedUrl);\n\treturn encodedUrl;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fetchSnapshot.js","sourceRoot":"","sources":["../src/fetchSnapshot.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 { fromUtf8ToBase64 } from \"@fluid-internal/client-utils\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { getW3CData } from \"@fluidframework/driver-base/internal\";\nimport { ISnapshot } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tDriverErrorTelemetryProps,\n\tNonRetryableError,\n\tisRuntimeMessage,\n} from \"@fluidframework/driver-utils/internal\";\nimport {\n\tfetchIncorrectResponse,\n\tthrowOdspNetworkError,\n} from \"@fluidframework/odsp-doclib-utils/internal\";\nimport {\n\ttype IOdspError,\n\tIOdspResolvedUrl,\n\tISnapshotOptions,\n\tInstrumentedStorageTokenFetcher,\n\tOdspErrorTypes,\n} from \"@fluidframework/odsp-driver-definitions/internal\";\nimport { ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport {\n\tITelemetryLoggerExt,\n\tPerformanceEvent,\n\tisFluidError,\n\tloggerToMonitoringContext,\n\twrapError,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport {\n\tISnapshotContentsWithProps,\n\tcurrentReadVersion,\n\tparseCompactSnapshotResponse,\n} from \"./compactSnapshotParser.js\";\nimport {\n\tIOdspSnapshot,\n\tISnapshotCachedEntry2,\n\tIVersionedValueWithEpoch,\n\tpersistedCacheValueVersion,\n} from \"./contracts.js\";\nimport { EpochTracker } from \"./epochTracker.js\";\nimport { getQueryString } from \"./getQueryString.js\";\nimport { getUrlAndHeadersWithAuth } from \"./getUrlAndHeadersWithAuth.js\";\nimport { convertOdspSnapshotToSnapshotTreeAndBlobs } from \"./odspSnapshotParser.js\";\nimport {\n\tIOdspResponse,\n\tfetchAndParseAsJSONHelper,\n\tfetchHelper,\n\tgetWithRetryForTokenRefresh,\n\tgetWithRetryForTokenRefreshRepeat,\n\tisSnapshotFetchForLoadingGroup,\n\tmeasure,\n\tmeasureP,\n\tuseLegacyFlowWithoutGroupsForSnapshotFetch,\n} from \"./odspUtils.js\";\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * Enum to support different types of snapshot formats.\n * @alpha\n */\nexport enum SnapshotFormatSupportType {\n\tJson = 0,\n\tBinary = 1,\n\tJsonAndBinary = 2,\n}\n\n/**\n * Fetches a snapshot from the server with a given version id.\n * @param snapshotUrl - snapshot url from where the odsp snapshot will be fetched\n * @param token - token used for authorization in the request\n * @param storageFetchWrapper - Implementation of the get/post methods used to fetch the snapshot\n * @param versionId - id of specific snapshot to be fetched\n * @param fetchFullSnapshot - whether we want to fetch full snapshot(with blobs)\n * @param forceAccessTokenViaAuthorizationHeader - whether to force passing given token via authorization header\n * @returns A promise of the snapshot and the status code of the response\n */\nexport async function fetchSnapshot(\n\tsnapshotUrl: string,\n\t// eslint-disable-next-line @rushstack/no-new-null\n\ttoken: string,\n\tversionId: string,\n\tfetchFullSnapshot: boolean,\n\tforceAccessTokenViaAuthorizationHeader: boolean,\n\tlogger: ITelemetryLoggerExt,\n\tsnapshotDownloader: (\n\t\turl: string,\n\t\tfetchOptions: { [index: string]: RequestInit },\n\t) => Promise<IOdspResponse<unknown>>,\n): Promise<ISnapshot> {\n\tconst path = `/trees/${versionId}`;\n\tlet queryParams: ISnapshotOptions = {};\n\n\tif (fetchFullSnapshot) {\n\t\tqueryParams = versionId === \"latest\" ? { deltas: 1, blobs: 2 } : { blobs: 2 };\n\t}\n\n\tconst queryString = getQueryString(queryParams);\n\tconst { url, headers } = getUrlAndHeadersWithAuth(\n\t\t`${snapshotUrl}${path}${queryString}`,\n\t\ttoken,\n\t\tforceAccessTokenViaAuthorizationHeader,\n\t);\n\tconst response = (await PerformanceEvent.timedExecAsync(\n\t\tlogger,\n\t\t{\n\t\t\teventName: \"fetchSnapshot\",\n\t\t},\n\t\tasync () => snapshotDownloader(url, { headers }),\n\t)) as IOdspResponse<IOdspSnapshot>;\n\treturn convertOdspSnapshotToSnapshotTreeAndBlobs(response.content);\n}\n\nexport async function fetchSnapshotWithRedeem(\n\todspResolvedUrl: IOdspResolvedUrl,\n\tstorageTokenFetcher: InstrumentedStorageTokenFetcher,\n\tsnapshotOptions: ISnapshotOptions | undefined,\n\tforceAccessTokenViaAuthorizationHeader: boolean,\n\tlogger: ITelemetryLoggerExt,\n\tsnapshotDownloader: (\n\t\tfinalOdspResolvedUrl: IOdspResolvedUrl,\n\t\tstorageToken: string,\n\t\tloadingGroupIds: string[] | undefined,\n\t\tsnapshotOptions: ISnapshotOptions | undefined,\n\t\tcontroller?: AbortController,\n\t) => Promise<ISnapshotRequestAndResponseOptions>,\n\tputInCache: (valueWithEpoch: IVersionedValueWithEpoch) => Promise<void>,\n\tremoveEntries: () => Promise<void>,\n\tloadingGroupIds: string[] | undefined,\n\tenableRedeemFallback?: boolean,\n): Promise<ISnapshot> {\n\t// back-compat: This block to be removed with #8784 when we only consume/consider odsp resolvers that are >= 0.51\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\tconst sharingLinkToRedeem = (odspResolvedUrl as any).sharingLinkToRedeem;\n\tif (sharingLinkToRedeem) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\todspResolvedUrl.shareLinkInfo = { ...odspResolvedUrl.shareLinkInfo, sharingLinkToRedeem };\n\t}\n\n\treturn fetchLatestSnapshotCore(\n\t\todspResolvedUrl,\n\t\tstorageTokenFetcher,\n\t\tsnapshotOptions,\n\t\tlogger,\n\t\tsnapshotDownloader,\n\t\tputInCache,\n\t\tloadingGroupIds,\n\t\tenableRedeemFallback,\n\t)\n\t\t.catch(async (error) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tif (enableRedeemFallback && isRedeemSharingLinkError(odspResolvedUrl, error)) {\n\t\t\t\t// Execute the redeem fallback\n\n\t\t\t\tawait redeemSharingLink(\n\t\t\t\t\todspResolvedUrl,\n\t\t\t\t\tstorageTokenFetcher,\n\t\t\t\t\tlogger,\n\t\t\t\t\tforceAccessTokenViaAuthorizationHeader,\n\t\t\t\t);\n\t\t\t\tconst odspResolvedUrlWithoutShareLink: IOdspResolvedUrl = {\n\t\t\t\t\t...odspResolvedUrl,\n\t\t\t\t\tshareLinkInfo: {\n\t\t\t\t\t\t...odspResolvedUrl.shareLinkInfo,\n\t\t\t\t\t\tsharingLinkToRedeem: undefined,\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\t// Log initial failure only if redeem succeeded - it points out to some bug somewhere\n\t\t\t\t// If redeem failed, that most likely means user has no permissions to access a file,\n\t\t\t\t// and thus it's not worth it logging extra errors - same error will be logged by end-to-end\n\t\t\t\t// flow (container open) based on a failure above.\n\t\t\t\tlogger.sendTelemetryEvent(\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"RedeemFallback\",\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\terrorType: error.errorType,\n\t\t\t\t\t},\n\t\t\t\t\terror,\n\t\t\t\t);\n\n\t\t\t\treturn fetchLatestSnapshotCore(\n\t\t\t\t\todspResolvedUrlWithoutShareLink,\n\t\t\t\t\tstorageTokenFetcher,\n\t\t\t\t\tsnapshotOptions,\n\t\t\t\t\tlogger,\n\t\t\t\t\tsnapshotDownloader,\n\t\t\t\t\tputInCache,\n\t\t\t\t\tloadingGroupIds,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t})\n\t\t.catch(async (error) => {\n\t\t\t// Clear the cache on 401/403/404 on snapshot fetch from network because this means either the user doesn't\n\t\t\t// have permissions for the file or it was deleted. So, if we do not clear cache, we will continue fetching\n\t\t\t// snapshot from cache in the future.\n\t\t\tif (\n\t\t\t\t(typeof error === \"object\" &&\n\t\t\t\t\terror !== null &&\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\terror.errorType === OdspErrorTypes.authorizationError) ||\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\terror.errorType === OdspErrorTypes.fileNotFoundOrAccessDeniedError\n\t\t\t) {\n\t\t\t\tawait removeEntries();\n\t\t\t}\n\t\t\tthrow error;\n\t\t});\n}\n\nasync function redeemSharingLink(\n\todspResolvedUrl: IOdspResolvedUrl,\n\tstorageTokenFetcher: InstrumentedStorageTokenFetcher,\n\tlogger: ITelemetryLoggerExt,\n\tforceAccessTokenViaAuthorizationHeader: boolean,\n): Promise<void> {\n\tawait PerformanceEvent.timedExecAsync(\n\t\tlogger,\n\t\t{\n\t\t\teventName: \"RedeemShareLink\",\n\t\t},\n\t\tasync () => {\n\t\t\tassert(\n\t\t\t\t!!odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem,\n\t\t\t\t0x1ed /* \"Share link should be present\" */,\n\t\t\t);\n\n\t\t\tconst encodedShareUrl = getEncodedShareUrl(\n\t\t\t\todspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem,\n\t\t\t);\n\n\t\t\tlet redeemUrl: string | undefined;\n\t\t\tasync function callSharesAPI(baseUrl: string): Promise<void> {\n\t\t\t\tawait getWithRetryForTokenRefresh(async (tokenFetchOptions) => {\n\t\t\t\t\tconst storageToken = await storageTokenFetcher(\n\t\t\t\t\t\ttokenFetchOptions,\n\t\t\t\t\t\t\"RedeemShareLink\",\n\t\t\t\t\t);\n\t\t\t\t\tredeemUrl = `${baseUrl}/_api/v2.0/shares/${encodedShareUrl}`;\n\t\t\t\t\tconst { url, headers } = getUrlAndHeadersWithAuth(\n\t\t\t\t\t\tredeemUrl,\n\t\t\t\t\t\tstorageToken,\n\t\t\t\t\t\tforceAccessTokenViaAuthorizationHeader,\n\t\t\t\t\t);\n\t\t\t\t\theaders.prefer = \"redeemSharingLink\";\n\t\t\t\t\tawait fetchAndParseAsJSONHelper(url, { headers });\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst disableUsingTenantDomain = loggerToMonitoringContext(logger).config.getBoolean(\n\t\t\t\t\"Fluid.Driver.Odsp.DisableUsingTenantDomainForSharesApi\",\n\t\t\t);\n\t\t\t// There is an issue where if we use the siteUrl in /shares, then the allowed length of url is just a few hundred characters(300-400)\n\t\t\t// and we fail to do the redeem. But if we use the tenant domain in the url, then the allowed length becomes 2048. So, first\n\t\t\t// construct the url for /shares using tenant domain but to be on safer side, fallback to using the siteUrl. We get tenant domain\n\t\t\t// by getting origin of the siteUrl.\n\t\t\tif (!disableUsingTenantDomain) {\n\t\t\t\ttry {\n\t\t\t\t\tawait callSharesAPI(new URL(odspResolvedUrl.siteUrl).origin);\n\t\t\t\t\treturn;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.sendTelemetryEvent(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"ShareLinkRedeemFailedWithTenantDomain\",\n\t\t\t\t\t\t\tdetails: JSON.stringify({\n\t\t\t\t\t\t\t\tlength: redeemUrl?.length,\n\t\t\t\t\t\t\t\tshareLinkUrlLength:\n\t\t\t\t\t\t\t\t\todspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem.length,\n\t\t\t\t\t\t\t\tqueryParamsLength: new URL(\n\t\t\t\t\t\t\t\t\todspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem,\n\t\t\t\t\t\t\t\t).search.length,\n\t\t\t\t\t\t\t\tuseHeaders: forceAccessTokenViaAuthorizationHeader,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait callSharesAPI(odspResolvedUrl.siteUrl);\n\t\t},\n\t);\n}\n\nasync function fetchLatestSnapshotCore(\n\todspResolvedUrl: IOdspResolvedUrl,\n\tstorageTokenFetcher: InstrumentedStorageTokenFetcher,\n\tsnapshotOptions: ISnapshotOptions | undefined,\n\tlogger: ITelemetryLoggerExt,\n\tsnapshotDownloader: (\n\t\tfinalOdspResolvedUrl: IOdspResolvedUrl,\n\t\tstorageToken: string,\n\t\tloadingGroupIds: string[] | undefined,\n\t\tsnapshotOptions: ISnapshotOptions | undefined,\n\t\tcontroller?: AbortController,\n\t) => Promise<ISnapshotRequestAndResponseOptions>,\n\tputInCache: (valueWithEpoch: IVersionedValueWithEpoch) => Promise<void>,\n\tloadingGroupIds: string[] | undefined,\n\tenableRedeemFallback?: boolean,\n): Promise<ISnapshot> {\n\treturn getWithRetryForTokenRefresh(async (tokenFetchOptions) => {\n\t\tconst fetchSnapshotForLoadingGroup = isSnapshotFetchForLoadingGroup(loadingGroupIds);\n\t\tconst eventName = fetchSnapshotForLoadingGroup ? \"TreesLatestForGroup\" : \"TreesLatest\";\n\t\tconst storageToken = await storageTokenFetcher(tokenFetchOptions, eventName, true);\n\n\t\tconst perfEvent = {\n\t\t\teventName,\n\t\t\tattempts: tokenFetchOptions.refresh ? 2 : 1,\n\t\t\tshareLinkPresent: odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem !== undefined,\n\t\t\tisSummarizer: odspResolvedUrl.summarizer,\n\t\t\tredeemFallbackEnabled: enableRedeemFallback,\n\t\t};\n\t\tif (snapshotOptions !== undefined) {\n\t\t\tfor (const [key, value] of Object.entries(snapshotOptions)) {\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\tperfEvent[`snapshotOption_${key}`] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// This event measures only successful cases of getLatest call (no tokens, no retries).\n\t\treturn PerformanceEvent.timedExecAsync(logger, perfEvent, async (event) => {\n\t\t\tlet controller: AbortController | undefined;\n\t\t\tlet fetchTimeout: ReturnType<typeof setTimeout> | undefined;\n\t\t\tif (snapshotOptions?.timeout !== undefined) {\n\t\t\t\tcontroller = new AbortController();\n\t\t\t\tfetchTimeout = setTimeout(() => controller!.abort(), snapshotOptions.timeout);\n\t\t\t}\n\n\t\t\tconst [response, fetchTime] = await measureP(async () =>\n\t\t\t\tsnapshotDownloader(\n\t\t\t\t\todspResolvedUrl,\n\t\t\t\t\tstorageToken,\n\t\t\t\t\tloadingGroupIds,\n\t\t\t\t\tsnapshotOptions,\n\t\t\t\t\tcontroller,\n\t\t\t\t),\n\t\t\t).finally(() => {\n\t\t\t\t// Clear the fetchTimeout once the response is fetched.\n\t\t\t\tif (fetchTimeout !== undefined) {\n\t\t\t\t\tclearTimeout(fetchTimeout);\n\t\t\t\t\tfetchTimeout = undefined;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst odspResponse = response.odspResponse;\n\t\t\tconst contentType = odspResponse.headers.get(\"content-type\");\n\n\t\t\tconst propsToLog: DriverErrorTelemetryProps = {\n\t\t\t\t...odspResponse.propsToLog,\n\t\t\t\tcontentType,\n\t\t\t\taccept: response.requestHeaders.accept,\n\t\t\t\tdriverVersion: pkgVersion,\n\t\t\t};\n\n\t\t\tlet parsedSnapshotContents: IOdspResponse<ISnapshotContentsWithProps> | undefined;\n\t\t\tlet contentTypeToRead: string | undefined;\n\t\t\tif (contentType?.includes(\"application/ms-fluid\")) {\n\t\t\t\tcontentTypeToRead = \"application/ms-fluid\";\n\t\t\t} else if (contentType?.includes(\"application/json\")) {\n\t\t\t\tcontentTypeToRead = \"application/json\";\n\t\t\t}\n\n\t\t\tlet parseTime: number;\n\t\t\tlet receiveContentTime: number;\n\t\t\ttry {\n\t\t\t\tswitch (contentTypeToRead) {\n\t\t\t\t\tcase \"application/json\": {\n\t\t\t\t\t\tlet text: string;\n\t\t\t\t\t\t[text, receiveContentTime] = await measureP(async () =>\n\t\t\t\t\t\t\todspResponse.content\n\t\t\t\t\t\t\t\t.text()\n\t\t\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\t\t\tif (res.length === 0) {\n\t\t\t\t\t\t\t\t\t\tthrowOdspNetworkError(\n\t\t\t\t\t\t\t\t\t\t\t\"Response from browser is empty\",\n\t\t\t\t\t\t\t\t\t\t\tfetchIncorrectResponse,\n\t\t\t\t\t\t\t\t\t\t\todspResponse.content, // response\n\t\t\t\t\t\t\t\t\t\t\tundefined, // response text\n\t\t\t\t\t\t\t\t\t\t\tpropsToLog,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn res;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch((error) =>\n\t\t\t\t\t\t\t\t\t// Parsing can fail and message could contain full request URI, including\n\t\t\t\t\t\t\t\t\t// tokens, etc. So do not log error object itself.\n\t\t\t\t\t\t\t\t\tthrowOdspNetworkError(\n\t\t\t\t\t\t\t\t\t\t\"Error while parsing fetch response\",\n\t\t\t\t\t\t\t\t\t\tfetchIncorrectResponse,\n\t\t\t\t\t\t\t\t\t\todspResponse.content, // response\n\t\t\t\t\t\t\t\t\t\tundefined, // response text\n\t\t\t\t\t\t\t\t\t\tpropsToLog,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpropsToLog.bodySize = text.length;\n\t\t\t\t\t\tlet content: IOdspSnapshot;\n\t\t\t\t\t\t[content, parseTime] = measure(() => JSON.parse(text) as IOdspSnapshot);\n\t\t\t\t\t\tvalidateBlobsAndTrees(content);\n\t\t\t\t\t\tconst snapshotContents: ISnapshot =\n\t\t\t\t\t\t\tconvertOdspSnapshotToSnapshotTreeAndBlobs(content);\n\t\t\t\t\t\tparsedSnapshotContents = {\n\t\t\t\t\t\t\t...odspResponse,\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t...snapshotContents,\n\t\t\t\t\t\t\t\ttelemetryProps: {},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"application/ms-fluid\": {\n\t\t\t\t\t\tlet content: ArrayBuffer;\n\t\t\t\t\t\t[content, receiveContentTime] = await measureP(async () =>\n\t\t\t\t\t\t\todspResponse.content\n\t\t\t\t\t\t\t\t.arrayBuffer()\n\t\t\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\t\t\tif (res.byteLength === 0) {\n\t\t\t\t\t\t\t\t\t\tthrowOdspNetworkError(\n\t\t\t\t\t\t\t\t\t\t\t\"Response from browser is empty\",\n\t\t\t\t\t\t\t\t\t\t\tfetchIncorrectResponse,\n\t\t\t\t\t\t\t\t\t\t\todspResponse.content, // response\n\t\t\t\t\t\t\t\t\t\t\tundefined, // response text\n\t\t\t\t\t\t\t\t\t\t\tpropsToLog,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn res;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch((error) =>\n\t\t\t\t\t\t\t\t\t// Parsing can fail and message could contain full request URI, including\n\t\t\t\t\t\t\t\t\t// tokens, etc. So do not log error object itself.\n\t\t\t\t\t\t\t\t\tthrowOdspNetworkError(\n\t\t\t\t\t\t\t\t\t\t\"Error while parsing fetch response\",\n\t\t\t\t\t\t\t\t\t\tfetchIncorrectResponse,\n\t\t\t\t\t\t\t\t\t\todspResponse.content, // response\n\t\t\t\t\t\t\t\t\t\tundefined, // response text\n\t\t\t\t\t\t\t\t\t\tpropsToLog,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpropsToLog.bodySize = content.byteLength;\n\t\t\t\t\t\tlet snapshotContents: ISnapshotContentsWithProps;\n\t\t\t\t\t\t[snapshotContents, parseTime] = measure(() =>\n\t\t\t\t\t\t\tparseCompactSnapshotResponse(new Uint8Array(content), logger),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tsnapshotContents.snapshotTree.trees === undefined ||\n\t\t\t\t\t\t\tsnapshotContents.snapshotTree.blobs === undefined\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthrow new NonRetryableError(\n\t\t\t\t\t\t\t\t\"Returned odsp snapshot is malformed. No trees or blobs!\",\n\t\t\t\t\t\t\t\tOdspErrorTypes.incorrectServerResponse,\n\t\t\t\t\t\t\t\tpropsToLog,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst props = snapshotContents.telemetryProps;\n\t\t\t\t\t\tconst slowTreeParseCodePaths = props.slowTreeStructureCount ?? 0;\n\t\t\t\t\t\tconst slowBlobParseCodePaths = props.slowBlobStructureCount ?? 0;\n\t\t\t\t\t\tif (slowTreeParseCodePaths > 10 || slowBlobParseCodePaths > 10) {\n\t\t\t\t\t\t\tlogger.sendErrorEvent({\n\t\t\t\t\t\t\t\teventName: \"SlowSnapshotParseCodePaths\",\n\t\t\t\t\t\t\t\tslowTreeStructureCount: slowTreeParseCodePaths,\n\t\t\t\t\t\t\t\tslowBlobStructureCount: slowBlobParseCodePaths,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparsedSnapshotContents = { ...odspResponse, content: snapshotContents };\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tthrow new NonRetryableError(\n\t\t\t\t\t\t\t\"Unknown snapshot content type\",\n\t\t\t\t\t\t\tOdspErrorTypes.incorrectServerResponse,\n\t\t\t\t\t\t\tpropsToLog,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (isFluidError(error)) {\n\t\t\t\t\terror.addTelemetryProperties(propsToLog);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tconst enhancedError = wrapError(\n\t\t\t\t\terror,\n\t\t\t\t\t(errorMessage) =>\n\t\t\t\t\t\tnew NonRetryableError(\n\t\t\t\t\t\t\t`Error parsing snapshot response: ${errorMessage}`,\n\t\t\t\t\t\t\tOdspErrorTypes.genericError,\n\t\t\t\t\t\t\tpropsToLog,\n\t\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tthrow enhancedError;\n\t\t\t}\n\n\t\t\tassert(parsedSnapshotContents !== undefined, 0x312 /* snapshot should be parsed */);\n\t\t\tconst snapshot = parsedSnapshotContents.content;\n\n\t\t\t// There are some scenarios in ODSP where we cannot cache, trees/latest will explicitly tell us when we\n\t\t\t// cannot cache using an HTTP response header. Only cache snapshot if it is not for a loading group.\n\t\t\tconst canCache =\n\t\t\t\todspResponse.headers.get(\"disablebrowsercachingofusercontent\") !== \"true\" &&\n\t\t\t\t!fetchSnapshotForLoadingGroup;\n\t\t\tconst sequenceNumber: number = snapshot.sequenceNumber ?? 0;\n\t\t\tconst seqNumberFromOps =\n\t\t\t\tsnapshot.ops && snapshot.ops.length > 0\n\t\t\t\t\t? snapshot.ops[0].sequenceNumber - 1\n\t\t\t\t\t: undefined;\n\n\t\t\tif (\n\t\t\t\t!Number.isInteger(sequenceNumber) ||\n\t\t\t\t(seqNumberFromOps !== undefined && seqNumberFromOps !== sequenceNumber)\n\t\t\t) {\n\t\t\t\tlogger.sendErrorEvent({\n\t\t\t\t\teventName: \"fetchSnapshotError\",\n\t\t\t\t\tsequenceNumber,\n\t\t\t\t\tseqNumberFromOps,\n\t\t\t\t});\n\t\t\t\tsnapshot.sequenceNumber = undefined;\n\t\t\t} else if (canCache) {\n\t\t\t\tconst fluidEpoch = odspResponse.headers.get(\"x-fluid-epoch\");\n\t\t\t\tassert(\n\t\t\t\t\tfluidEpoch !== undefined,\n\t\t\t\t\t0x1e6 /* \"Epoch should be present in response\" */,\n\t\t\t\t);\n\t\t\t\tconst value: ISnapshotCachedEntry2 = {\n\t\t\t\t\t...snapshot,\n\t\t\t\t\tcacheEntryTime: Date.now(),\n\t\t\t\t};\n\t\t\t\tconst valueWithEpoch: IVersionedValueWithEpoch = {\n\t\t\t\t\tvalue,\n\t\t\t\t\tfluidEpoch,\n\t\t\t\t\tversion: persistedCacheValueVersion,\n\t\t\t\t};\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\t\t\tputInCache(valueWithEpoch);\n\t\t\t}\n\n\t\t\tevent.end({\n\t\t\t\t// trees, leafTrees, blobNodes, encodedBlobsSize,\n\t\t\t\t// blobNodes - blobs tells us (roughly) how many blobs are deduped by service.\n\t\t\t\t...getTreeStats(snapshot),\n\t\t\t\tblobs: snapshot.blobContents?.size ?? 0,\n\t\t\t\tsequenceNumber,\n\t\t\t\tops: snapshot.ops?.length ?? 0,\n\t\t\t\tfetchSnapshotForLoadingGroup,\n\t\t\t\tuseLegacyFlowWithoutGroups:\n\t\t\t\t\tuseLegacyFlowWithoutGroupsForSnapshotFetch(loadingGroupIds),\n\t\t\t\tuserOps: snapshot.ops?.filter((op) => isRuntimeMessage(op)).length ?? 0,\n\t\t\t\t// Measures time to make fetch call. Should be similar to\n\t\t\t\t// fetchStartToResponseEndTime - receiveContentTime, i.e. it looks like it's time till first byte /\n\t\t\t\t// end of response headers\n\t\t\t\tfetchTime,\n\t\t\t\t// time it takes client to parse payload. Same payload as in \"SnapshotParse\" event, here for\n\t\t\t\t// easier analyzes.\n\t\t\t\tparseTime,\n\t\t\t\t// Time it takes to receive content (text of buffer) from Response object.\n\t\t\t\t// This time likely is very closely correlated with networkTime, i.e. time it takes to receive\n\t\t\t\t// actual content (starting measuring from first bite / end of response header)\n\t\t\t\treceiveContentTime,\n\t\t\t\t...getW3CData(response.requestUrl, \"fetch\"),\n\t\t\t\t// Sharing link telemetry regarding sharing link redeem status and performance. Ex: FRL; dur=100,\n\t\t\t\t// Azure Fluid Relay service; desc=S, FRP; desc=False. Here, FRL is the duration taken for redeem,\n\t\t\t\t// Azure Fluid Relay service is the redeem status (S means success), and FRP is a flag to indicate\n\t\t\t\t// if the permission has changed.\n\t\t\t\tsltelemetry: odspResponse.headers.get(\"x-fluid-sltelemetry\"),\n\t\t\t\t// All other props\n\t\t\t\t...propsToLog,\n\t\t\t\t// Various perf counters and measures collected by binary parsing code:\n\t\t\t\t// slowTreeStructureCount, slowBlobStructureCount, durationStructure, durationStrings,\n\t\t\t\t// durationSnapshotTree, durationBlobs, etc.\n\t\t\t\t...parsedSnapshotContents.content.telemetryProps,\n\t\t\t});\n\t\t\treturn snapshot;\n\t\t}).catch((error) => {\n\t\t\t// We hit these errors in stress tests, under load\n\t\t\t// It's useful to try one more time in such case.\n\t\t\tif (\n\t\t\t\ttypeof error === \"object\" &&\n\t\t\t\terror !== null &&\n\t\t\t\t((error as Partial<IOdspError>).errorType === OdspErrorTypes.fetchFailure ||\n\t\t\t\t\t(error as Partial<IOdspError>).errorType === OdspErrorTypes.fetchTimeout)\n\t\t\t) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\terror[getWithRetryForTokenRefreshRepeat] = true;\n\t\t\t}\n\t\t\tthrow error;\n\t\t});\n\t});\n}\n\nexport interface ISnapshotRequestAndResponseOptions {\n\todspResponse: IOdspResponse<Response>;\n\trequestUrl: string;\n\trequestHeaders: { [index: string]: string };\n}\n\nfunction getFormBodyAndHeaders(\n\todspResolvedUrl: IOdspResolvedUrl,\n\tstorageToken: string,\n\theaders?: { [index: string]: string },\n): {\n\tbody: string;\n\theaders: {\n\t\t[index: string]: string;\n\t};\n} {\n\tconst formBoundary = uuid();\n\tconst formParams: string[] = [];\n\tformParams.push(\n\t\t`--${formBoundary}`,\n\t\t`Authorization: Bearer ${storageToken}`,\n\t\t`X-HTTP-Method-Override: GET`,\n\t);\n\n\tif (headers !== undefined) {\n\t\tfor (const [key, value] of Object.entries(headers)) {\n\t\t\tif (value !== undefined) {\n\t\t\t\tformParams.push(`${key}: ${value}`);\n\t\t\t}\n\t\t}\n\t}\n\tif (odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem) {\n\t\tformParams.push(`sl: ${odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem}`);\n\t}\n\tformParams.push(`_post: 1`, `\\r\\n--${formBoundary}--`);\n\tconst postBody = formParams.join(\"\\r\\n\");\n\tconst header: { [index: string]: string } = {\n\t\t\"Content-Type\": `multipart/form-data;boundary=${formBoundary}`,\n\t};\n\treturn { body: postBody, headers: header };\n}\n\ninterface ITreeStats {\n\ttrees: number;\n\tleafTrees: number;\n\tblobNodes: number;\n}\n\nexport function getTreeStats(snapshot: ISnapshot): ITreeStats & { encodedBlobsSize: number } {\n\tconst stats: ITreeStats = {\n\t\ttrees: 0,\n\t\tleafTrees: 0,\n\t\tblobNodes: 0,\n\t};\n\tgetTreeStatsCore(snapshot.snapshotTree, stats);\n\tlet encodedBlobsSize = 0;\n\tfor (const [_, blobContent] of snapshot.blobContents) {\n\t\tencodedBlobsSize += blobContent.byteLength;\n\t}\n\treturn { ...stats, encodedBlobsSize };\n}\n\nexport function validateBlobsAndTrees(snapshot: IOdspSnapshot): void {\n\tassert(\n\t\tsnapshot.trees !== undefined,\n\t\t0x200 /* \"Returned odsp snapshot is malformed. No trees!\" */,\n\t);\n\tassert(\n\t\tsnapshot.blobs !== undefined,\n\t\t0x201 /* \"Returned odsp snapshot is malformed. No blobs!\" */,\n\t);\n}\n\nfunction getTreeStatsCore(snapshotTree: ISnapshotTree, stats: ITreeStats): void {\n\tstats.blobNodes += Object.entries(snapshotTree.blobs).length;\n\tstats.trees++;\n\n\tconst entries = Object.entries(snapshotTree.trees);\n\tif (entries.length === 0) {\n\t\tstats.leafTrees++;\n\t} else {\n\t\tfor (const [_, tree] of entries) {\n\t\t\tstats.trees++;\n\t\t\tgetTreeStatsCore(tree, stats);\n\t\t}\n\t}\n}\n\n/**\n * This function fetches the snapshot and parse it according to what is mentioned in response headers.\n * @param odspResolvedUrl - resolved odsp url.\n * @param storageToken - token to do the auth for network request.\n * @param snapshotOptions - Options used to specify how and what to fetch in the snapshot.\n * @param loadingGroupIds - loadingGroupIds for which snapshot needs to be downloaded. Note:\n * 1.) If undefined, then legacy trees latest call will be used where no groupId query param would be specified.\n * 2.) If [] is passed, then snapshot with all ungrouped data will be fetched.\n * 3.) If any groupId is specified like [\"g1\"], then snapshot for g1 group will be fetched.\n * @param snapshotFormatFetchType - Snapshot format to fetch.\n * @param controller - abort controller if caller needs to abort the network call.\n * @param epochTracker - epoch tracker used to add/validate epoch in the network call.\n * @returns fetched snapshot.\n */\nexport async function downloadSnapshot(\n\todspResolvedUrl: IOdspResolvedUrl,\n\tstorageToken: string,\n\tloadingGroupIds: string[] | undefined,\n\tsnapshotOptions: ISnapshotOptions | undefined,\n\tsnapshotFormatFetchType?: SnapshotFormatSupportType,\n\tcontroller?: AbortController,\n\tepochTracker?: EpochTracker,\n\tscenarioName?: string,\n): Promise<ISnapshotRequestAndResponseOptions> {\n\t// back-compat: This block to be removed with #8784 when we only consume/consider odsp resolvers that are >= 0.51\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\tconst sharingLinkToRedeem = (odspResolvedUrl as any).sharingLinkToRedeem;\n\tif (sharingLinkToRedeem) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\todspResolvedUrl.shareLinkInfo = { ...odspResolvedUrl.shareLinkInfo, sharingLinkToRedeem };\n\t}\n\n\tconst snapshotUrl = odspResolvedUrl.endpoints.snapshotStorageUrl;\n\n\tconst queryParams: Record<string, unknown> = { ump: 1 };\n\tif (snapshotOptions !== undefined) {\n\t\tfor (const [key, value] of Object.entries(snapshotOptions)) {\n\t\t\t// Exclude \"timeout\" from query string\n\t\t\tif (value !== undefined && key !== \"timeout\") {\n\t\t\t\tqueryParams[key] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (loadingGroupIds !== undefined) {\n\t\tqueryParams.groupId = loadingGroupIds.join(\",\");\n\t}\n\n\tconst queryString = getQueryString(queryParams);\n\tconst url = `${snapshotUrl}/trees/latest${queryString}`;\n\t// The location of file can move on Spo in which case server returns 308(Permanent Redirect) error.\n\t// Adding below header will make VROOM API return 404 instead of 308 and browser can intercept it.\n\t// This error thrown by server will contain the new redirect location. Look at the 404 error parsing\n\t// for further reference here: \\packages\\utils\\odsp-doclib-utils\\src\\odspErrorUtils.ts\n\tconst header = { prefer: \"manualredirect\" };\n\tconst { body, headers } = getFormBodyAndHeaders(odspResolvedUrl, storageToken, header);\n\tconst fetchOptions = {\n\t\tbody,\n\t\theaders,\n\t\tsignal: controller?.signal,\n\t\tmethod: \"POST\",\n\t};\n\t// Decide what snapshot format to fetch as per the feature gate.\n\tswitch (snapshotFormatFetchType) {\n\t\tcase SnapshotFormatSupportType.Binary: {\n\t\t\theaders.accept = `application/ms-fluid; v=${currentReadVersion}`;\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\t// By default ask both versions and let the server decide the format.\n\t\t\theaders.accept = `application/json, application/ms-fluid; v=${currentReadVersion}`;\n\t\t}\n\t}\n\n\tconst odspResponse = await (epochTracker?.fetch(\n\t\turl,\n\t\tfetchOptions,\n\t\t\"treesLatest\",\n\t\ttrue,\n\t\tscenarioName,\n\t) ?? fetchHelper(url, fetchOptions));\n\n\treturn {\n\t\todspResponse,\n\t\trequestHeaders: headers,\n\t\trequestUrl: url,\n\t};\n}\n\nfunction isRedeemSharingLinkError(\n\todspResolvedUrl: IOdspResolvedUrl,\n\terror: Partial<IOdspError>,\n): boolean {\n\tif (\n\t\todspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem !== undefined &&\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t(error.errorType === OdspErrorTypes.authorizationError ||\n\t\t\terror.errorType === OdspErrorTypes.fileNotFoundOrAccessDeniedError)\n\t) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction getEncodedShareUrl(url: string): string {\n\t/**\n\t * Encode the url to accepted format by Sharepoint\n\t * https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/shares_get\n\t */\n\tlet encodedUrl = fromUtf8ToBase64(encodeURI(url));\n\tencodedUrl = encodedUrl.replace(/=+$/g, \"\").replace(/\\//g, \"_\").replace(/\\+/g, \"-\");\n\tencodedUrl = \"u!\".concat(encodedUrl);\n\treturn encodedUrl;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odspDelayLoadedDeltaStream.d.ts","sourceRoot":"","sources":["../src/odspDelayLoadedDeltaStream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EACN,wBAAwB,EACxB,wBAAwB,EACxB,YAAY,
|
|
1
|
+
{"version":3,"file":"odspDelayLoadedDeltaStream.d.ts","sourceRoot":"","sources":["../src/odspDelayLoadedDeltaStream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EACN,wBAAwB,EACxB,wBAAwB,EACxB,YAAY,EAEZ,MAAM,6CAA6C,CAAC;AAMrD,OAAO,EACN,iBAAiB,EAEjB,gBAAgB,EAEhB,+BAA+B,EAE/B,iBAAiB,EACjB,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EACN,OAAO,EACP,yBAAyB,EAEzB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAEN,iBAAiB,EAEjB,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAS/E;;;GAGG;AACH,qBAAa,0BAA0B;aAgCrB,eAAe,EAAE,gBAAgB;IAC1C,QAAQ,EAAE,wBAAwB;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAGlC,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IA1C3C,OAAO,CAAC,uBAAuB,CAA4C;IAE3E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,iBAAiB,CAAC,CAA8B;IAExD,OAAO,CAAC,+BAA+B,CAAqB;IAM5D,OAAO,CAAC,oBAAoB,CAAc;IAE1C;;;;;;;;;;;;;;OAcG;gBAEc,eAAe,EAAE,gBAAgB,EAC1C,QAAQ,EAAE,wBAAwB,EACxB,eAAe,EAAE,+BAA+B,EAChD,iBAAiB,EAC/B,CAAC,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,GACxD,SAAS,EACK,EAAE,EAAE,iBAAiB,EACrB,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,iBAAiB,EAC7B,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,CAAC,GAAG,EAAE,yBAAyB,EAAE,KAAK,IAAI,EACvD,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,EACjE,wBAAwB,CAAC,oBAAQ;IAKnD,IAAW,WAAW,IAAI,YAAY,CAErC;IAED,IAAW,sBAAsB,IAAI,2BAA2B,GAAG,SAAS,CAE3E;IAED,IAAW,8BAA8B,IAAI,MAAM,GAAG,SAAS,CAE9D;IAED;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;;;OAIG;IACU,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAkHrF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAoB5B;IAEF,OAAO,CAAC,qBAAqB;YAOf,0BAA0B;YAyC1B,WAAW;YAgEX,eAAe;IAkG7B,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,gCAAgC;IAQxC;;;;;;;;OAQG;YACW,qBAAqB;IAgC5B,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI;CAKrC"}
|
|
@@ -159,8 +159,17 @@ class OdspDelayLoadedDeltaStream {
|
|
|
159
159
|
return connection;
|
|
160
160
|
}
|
|
161
161
|
catch (error) {
|
|
162
|
-
|
|
163
|
-
|
|
162
|
+
// Remove join session information from cache only if it is an error is from socket event connect_document_error.
|
|
163
|
+
// Otherwise keep it in cache so that this session can be re-used after disconnection.
|
|
164
|
+
// Also keeping an undefined check here to account for any unknown code path that is unable to stamp the value as in that case also
|
|
165
|
+
// it is safer to clear join session cache and start over.
|
|
166
|
+
if (error &&
|
|
167
|
+
typeof error === "object" &&
|
|
168
|
+
(error.scenarioName === "connect_document_error" ||
|
|
169
|
+
error.scenarioName === undefined)) {
|
|
170
|
+
this.clearJoinSessionTimer();
|
|
171
|
+
this.cache.sessionJoinCache.remove(this.joinSessionKey);
|
|
172
|
+
}
|
|
164
173
|
const normalizedError = this.annotateConnectionError(error, "createDeltaConnection", !requestWebsocketTokenFromJoinSession);
|
|
165
174
|
if (typeof error === "object" && error !== null) {
|
|
166
175
|
normalizedError.addTelemetryProperties({
|