@fluidframework/odsp-driver 0.52.1 → 0.54.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/createFile.d.ts.map +1 -1
- package/dist/createFile.js +5 -4
- package/dist/createFile.js.map +1 -1
- package/dist/epochTracker.d.ts +2 -1
- package/dist/epochTracker.d.ts.map +1 -1
- package/dist/epochTracker.js +50 -21
- package/dist/epochTracker.js.map +1 -1
- package/dist/fetchSnapshot.d.ts.map +1 -1
- package/dist/fetchSnapshot.js +15 -14
- package/dist/fetchSnapshot.js.map +1 -1
- package/dist/getFileLink.js +3 -3
- package/dist/getFileLink.js.map +1 -1
- package/dist/odspDeltaStorageService.d.ts +3 -3
- package/dist/odspDeltaStorageService.d.ts.map +1 -1
- package/dist/odspDeltaStorageService.js +7 -4
- package/dist/odspDeltaStorageService.js.map +1 -1
- package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
- package/dist/odspDocumentDeltaConnection.js +2 -0
- package/dist/odspDocumentDeltaConnection.js.map +1 -1
- package/dist/odspDocumentService.d.ts +1 -1
- package/dist/odspDocumentService.d.ts.map +1 -1
- package/dist/odspDocumentService.js +13 -25
- package/dist/odspDocumentService.js.map +1 -1
- package/dist/odspDocumentStorageManager.d.ts.map +1 -1
- package/dist/odspDocumentStorageManager.js +29 -26
- package/dist/odspDocumentStorageManager.js.map +1 -1
- package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
- package/dist/odspDriverUrlResolverForShareLink.js +4 -3
- package/dist/odspDriverUrlResolverForShareLink.js.map +1 -1
- package/dist/odspError.d.ts.map +1 -1
- package/dist/odspError.js +3 -1
- package/dist/odspError.js.map +1 -1
- package/dist/odspSummaryUploadManager.d.ts +1 -1
- package/dist/odspSummaryUploadManager.d.ts.map +1 -1
- package/dist/odspSummaryUploadManager.js +7 -20
- package/dist/odspSummaryUploadManager.js.map +1 -1
- package/dist/odspUtils.d.ts.map +1 -1
- package/dist/odspUtils.js +31 -22
- package/dist/odspUtils.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/vroom.d.ts.map +1 -1
- package/dist/vroom.js +4 -1
- package/dist/vroom.js.map +1 -1
- package/dist/zipItDataRepresentationUtils.d.ts.map +1 -1
- package/dist/zipItDataRepresentationUtils.js +3 -3
- package/dist/zipItDataRepresentationUtils.js.map +1 -1
- package/lib/createFile.d.ts.map +1 -1
- package/lib/createFile.js +6 -5
- package/lib/createFile.js.map +1 -1
- package/lib/epochTracker.d.ts +2 -1
- package/lib/epochTracker.d.ts.map +1 -1
- package/lib/epochTracker.js +50 -21
- package/lib/epochTracker.js.map +1 -1
- package/lib/fetchSnapshot.d.ts.map +1 -1
- package/lib/fetchSnapshot.js +15 -14
- package/lib/fetchSnapshot.js.map +1 -1
- package/lib/getFileLink.js +4 -4
- package/lib/getFileLink.js.map +1 -1
- package/lib/odspDeltaStorageService.d.ts +3 -3
- package/lib/odspDeltaStorageService.d.ts.map +1 -1
- package/lib/odspDeltaStorageService.js +7 -4
- package/lib/odspDeltaStorageService.js.map +1 -1
- package/lib/odspDocumentDeltaConnection.d.ts.map +1 -1
- package/lib/odspDocumentDeltaConnection.js +2 -0
- package/lib/odspDocumentDeltaConnection.js.map +1 -1
- package/lib/odspDocumentService.d.ts +1 -1
- package/lib/odspDocumentService.d.ts.map +1 -1
- package/lib/odspDocumentService.js +15 -27
- package/lib/odspDocumentService.js.map +1 -1
- package/lib/odspDocumentStorageManager.d.ts.map +1 -1
- package/lib/odspDocumentStorageManager.js +31 -28
- package/lib/odspDocumentStorageManager.js.map +1 -1
- package/lib/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
- package/lib/odspDriverUrlResolverForShareLink.js +5 -4
- package/lib/odspDriverUrlResolverForShareLink.js.map +1 -1
- package/lib/odspError.d.ts.map +1 -1
- package/lib/odspError.js +3 -1
- package/lib/odspError.js.map +1 -1
- package/lib/odspSummaryUploadManager.d.ts +1 -1
- package/lib/odspSummaryUploadManager.d.ts.map +1 -1
- package/lib/odspSummaryUploadManager.js +8 -21
- package/lib/odspSummaryUploadManager.js.map +1 -1
- package/lib/odspUtils.d.ts.map +1 -1
- package/lib/odspUtils.js +33 -24
- package/lib/odspUtils.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/vroom.d.ts.map +1 -1
- package/lib/vroom.js +4 -1
- package/lib/vroom.js.map +1 -1
- package/lib/zipItDataRepresentationUtils.d.ts.map +1 -1
- package/lib/zipItDataRepresentationUtils.js +3 -3
- package/lib/zipItDataRepresentationUtils.js.map +1 -1
- package/package.json +8 -8
- package/src/createFile.ts +13 -9
- package/src/epochTracker.ts +50 -20
- package/src/fetchSnapshot.ts +15 -8
- package/src/getFileLink.ts +10 -4
- package/src/odspDeltaStorageService.ts +10 -3
- package/src/odspDocumentDeltaConnection.ts +2 -0
- package/src/odspDocumentService.ts +27 -29
- package/src/odspDocumentStorageManager.ts +48 -28
- package/src/odspDriverUrlResolverForShareLink.ts +8 -3
- package/src/odspError.ts +5 -1
- package/src/odspSummaryUploadManager.ts +7 -22
- package/src/odspUtils.ts +43 -34
- package/src/packageVersion.ts +1 -1
- package/src/vroom.ts +6 -1
- package/src/zipItDataRepresentationUtils.ts +4 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zipItDataRepresentationUtils.js","sourceRoot":"","sources":["../src/zipItDataRepresentationUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * Data representation which is followed(zipIt Protocol) here is described in this document:\n * https://microsoft.sharepoint-df.com/:w:/t/ODSPFileStore/ER06b64K_XdDjEyAKl-UT60BJiId39SCVkYSyo_2pvH9gQ?e=KYQ0c5\n*/\n\nimport { assert, IsoBuffer, Uint8ArrayToArrayBuffer, Uint8ArrayToString } from \"@fluidframework/common-utils\";\nimport { createOdspNetworkError, fetchIncorrectResponse } from \"@fluidframework/odsp-doclib-utils\";\nimport { ReadBuffer } from \"./ReadBufferUtils\";\n\n// eslint-disable-next-line max-len\n// https://onedrive.visualstudio.com/SharePoint%20Online/_git/SPO?path=/cobalt/Base/Property/BinaryEncodedPropertyReader.cs&version=GBmaster&_a=contents\n/**\n * Control codes used by tree serialization / decentralization code. Same as on server. These can be found on\n * filestore code on server too at above link.\n */\nexport enum MarkerCodes {\n BoolTrue = 11, // value = true\n BoolFalse = 12, // value = false\n\n StringEmpty = 13, // value = \"\"\n String8Length = 14, // unsigned-8-bit little-endian length, follows by UTF-8 bytes of length\n String16Length = 15, // unsigned-16-bit little-endian length, follows by UTF-8 bytes of length\n String32Length = 16, // unsigned-32-bit little-endian length, follows by UTF-8 bytes of length\n\n ConstString8Id = 17, // unsigned-8-bit little-endian const string id follows\n ConstString16Id = 18, // unsigned-16-bit little-endian const string id follows\n ConstString32Id = 19, // unsigned-32-bit little-endian const string id follows\n ConstStringDeclare = 20, // Code for declaring a const string with size <= 1 byte\n ConstStringDeclareBig = 21, // Code for declaring a const string with size > 1 byte. It is represented in 4 bytes.\n\n Int0 = 1, // value = 0\n UInt8 = 3, // unsigned-8-bit little-endian follows\n UInt16 = 5, // unsigned-16-bit little-endian follows\n UInt32 = 7, // unsigned-32-bit little-endian follows\n UInt64 = 9, // unsigned-64-bit little-endian follows\n Int8 = 2, // signed-8-bit little-endian follows\n Int16 = 4, // signed-16-bit little-endian follows\n Int32 = 6, // signed-32-bit little-endian follows\n Int64 = 8, // signed-64-bit little-endian follows\n\n BinaryEmpty = 32, // value = byte[]\n BinarySingle8 = 33, // unsigned-8-bit little-endian length, follows by bytes of length\n BinarySingle16 = 34, // unsigned-16-bit little-endian length, follows by bytes of length\n BinarySingle32 = 35, // unsigned-32-bit little-endian length, follows by bytes of length\n BinarySingle64 = 36, // unsigned-64-bit little-endian length, follows by bytes of length\n}\n\n/**\n * Control codes used by tree serialization / decentralization code. They mark the start of sections.\n */\nexport enum MarkerCodesStart {\n \"list\" = 49,\n \"set\" = 51,\n}\n\n/**\n * Control codes used by tree serialization / decentralization code. They mark the end of sections.\n */\nexport enum MarkerCodesEnd {\n \"list\" = 50,\n \"set\" = 52,\n}\n\n/**\n * This contains mapping of Marker Codes to number of bytes in which the corresponding data\n * will be stored.\n*/\nexport const codeToBytesMap = {\n // Integer code to bytes\n 1: 0,\n 2: 1,\n 3: 1,\n 4: 2,\n 5: 2,\n 6: 4,\n 7: 4,\n 8: 8,\n 9: 8,\n\n // String code to Bytes\n 13: 0,\n 14: 1,\n 15: 2,\n 16: 4,\n\n 17: 1,\n 18: 2,\n 19: 4,\n\n 20: 1,\n 21: 4,\n\n // Binary code to bytes\n 32: 0,\n 33: 1,\n 34: 2,\n 35: 4,\n 36: 8,\n};\n\nexport function getValueSafely(map: {[index: number]: number}, key: number) {\n const val = map[key];\n assert(val !== undefined, 0x287 /* `key= ${key} must exist in the map` */);\n return val;\n}\n\nexport function getAndValidateNodeProps(node: NodeCore, props: string[], enforceAllProps = true) {\n const propSet = new Set(props);\n const res: Record<string, NodeTypes> = {};\n for (const [keyNode, valueNode] of node.iteratePairs()) {\n assertBlobCoreInstance(keyNode, \"keynode should be a blob\");\n const keyStr = keyNode.toString();\n if (propSet.has(keyStr)) {\n propSet.delete(keyStr);\n res[keyStr] = valueNode;\n }\n }\n if (enforceAllProps) {\n assert(propSet.size === 0, 0x288 /* `All properties should exist, Not found: ${[...propSet.keys()]}` */);\n }\n return res;\n}\n\nexport function iteratePairs<T>(it: IterableIterator<T>) {\n const res: IterableIterator<[T, T]> = {\n next: () => {\n const a = it.next();\n if (a.done) {\n return { value: undefined, done: true };\n }\n const b = it.next();\n assert(b.done !== true, 0x22b /* \"Should be a pair\" */);\n return { value: [a.value, b.value], done: b.done };\n },\n [Symbol.iterator]: () => { return res; },\n };\n return res;\n}\n\n/**\n * Helper function that returns iterator from an object\n * @param obj - object that supports iteration\n */\nexport function iterate<T>(obj: {[Symbol.iterator]: () => IterableIterator<T>}) {\n return obj[Symbol.iterator]();\n}\n\n/**\n * Base class to represent binary blob element.\n * Binary blob is one of three types supported as a leaf node of a tree.\n * Note: concrete implementations (derived classes) are not exposed from this module\n */\nexport abstract class BlobCore {\n public abstract get buffer(): Uint8Array;\n public get arrayBuffer(): ArrayBufferLike {\n return Uint8ArrayToArrayBuffer(this.buffer);\n }\n\n /**\n * Represents a blob.\n * @param constString - Whether it contains const string declaration.\n * @param useUtf8Code - Represents if the utf8 string marker code should be used when representing.\n */\n constructor(public readonly constString: boolean, public readonly useUtf8Code: boolean = false) {}\n\n public toString() {\n return Uint8ArrayToString(this.buffer, \"utf-8\");\n }\n}\n\n/**\n * \"deep copy\" blob, holds to binary data passed in\n * It is called deep copy as a counter-part to BlobShallowCopy, which\n * is a reference to underlying binary stream (ReadBuffer).\n*/\nclass BlobDeepCopy extends BlobCore {\n /**\n * Represents a deep copy of the blob.\n * @param data - Data array of the blob\n * @param constString - Whether it contains const string declaration.\n * @param useUtf8Code - Represents if the utf8 string marker code should be used when representing.\n */\n constructor(protected readonly data: Uint8Array, constString: boolean, useUtf8Code: boolean = false) {\n super(constString, useUtf8Code);\n }\n\n public get buffer() {\n return this.data;\n }\n\n public static read(buffer: ReadBuffer, lengthLen: number, constString: boolean): BlobCore {\n const length = buffer.read(lengthLen);\n const data = new Uint8Array(length);\n for (let counter = 0; counter < length; counter++) {\n data[counter] = buffer.read();\n }\n return new BlobDeepCopy(data, constString);\n }\n}\n\n/**\n * Shallow copy blob, keeps a reference to portion of ReadBuffer\n * it was constructed from. It takes much less memory compared to BlobDeepCopy\n */\n export class BlobShallowCopy extends BlobCore {\n /**\n * Represents a shallow copy of the blob. It is not a separate blob, just reference to original blobs.\n * @param data - Data array of the blob\n * @param start - Start point of the blob in the buffer.\n * @param end - End point of the blob in the buffer.\n * @param constString - Whether it contains const string declaration.\n */\n constructor(\n protected data: ReadBuffer,\n protected start: number,\n protected end: number,\n constString: boolean,\n ) {\n super(constString);\n }\n\n public get buffer() {\n return this.data.buffer.subarray(this.start, this.end);\n }\n\n public static read(buffer: ReadBuffer, lengthLen: number, constString: boolean): BlobCore {\n const length = buffer.read(lengthLen);\n const pos = buffer.pos;\n buffer.skip(length);\n return new BlobShallowCopy(buffer, pos, pos + length, constString);\n }\n}\n\nexport const addStringProperty = (node: NodeCore, a: string, b: string, encodeValAsConstString: boolean = false) =>\n { node.addString(a, true); node.addString(b, encodeValAsConstString); };\nexport const addNumberProperty = (node: NodeCore, a: string, b: number) =>\n { node.addString(a, true); node.addNumber(b); };\nexport const addBoolProperty = (node: NodeCore, a: string, b: boolean) =>\n { node.addString(a, true); node.addBool(b); };\n\n/**\n * Three leaf types supported by tree:\n * 1. Node (sub-tree)\n * 2. binary blob\n * 3. integer\n * 4. boolean\n */\nexport type NodeTypes = NodeCore | BlobCore | number | boolean;\n\nexport type NodeCoreTypes = \"list\" | \"set\";\n\n/**\n * Node - node in the tree (non-leaf element of the tree)\n */\nexport class NodeCore {\n // It is an array of nodes.\n private readonly children: NodeTypes[] = [];\n public get nodes() {\n return this.children;\n }\n\n constructor(public type: NodeCoreTypes = \"set\") {}\n\n public [Symbol.iterator]() {\n return this.children[Symbol.iterator]();\n }\n\n public iteratePairs() {\n assert((this.length % 2) === 0, 0x22c /* \"reading pairs\" */);\n return iteratePairs(iterate(this));\n }\n\n public get length() { return this.children.length; }\n\n public get(index: number) { return this.children[index]; }\n\n public getString(index: number): string {\n const node = this.children[index];\n assertBlobCoreInstance(node, \"getString should return stringblob\");\n return node.toString();\n }\n\n public getBlob(index: number): BlobCore {\n const node = this.children[index];\n assertBlobCoreInstance(node, \"getBlob should return a blob\");\n return node;\n }\n\n public getNode(index: number): NodeCore\n {\n const node = this.children[index];\n assertNodeCoreInstance(node, \"getNode should return a node\");\n return node;\n }\n\n public getNumber(index: number): number\n {\n const node = this.children[index];\n assertNumberInstance(node, \"getNumber should return a number\");\n return node;\n }\n\n public getBool(index: number): boolean {\n const node = this.children[index];\n assertBoolInstance(node, \"getBool should return a boolean\");\n return node;\n }\n\n public addNode(type?: NodeCoreTypes): NodeCore {\n const node = new NodeCore(type);\n this.children.push(node);\n return node;\n }\n\n public addBlob(blob: Uint8Array, constString: boolean, useUtf8Code: boolean = false) {\n this.children.push(new BlobDeepCopy(blob, constString, useUtf8Code));\n }\n\n public addString(payload: string, constString: boolean) {\n this.addBlob(IsoBuffer.from(payload, \"utf-8\"), constString, true);\n }\n\n public addNumber(payload: number | undefined) {\n assert(Number.isInteger(payload), 0x231 /* \"Number should be an integer\" */);\n assert(payload !== undefined && payload >= 0, 0x232 /* \"Payload should not be negative\" */);\n this.children.push(payload);\n }\n\n public addBool(payload: boolean) {\n this.children.push(payload);\n }\n\n /**\n * Load and parse the buffer into a tree.\n * @param buffer - buffer to read from.\n */\n protected load(buffer: ReadBuffer, dictionary: BlobCore[]) {\n for (;!buffer.eof;) {\n let childValue: NodeTypes | undefined;\n const code = buffer.read();\n switch (code) {\n case MarkerCodesStart.list:\n case MarkerCodesStart.set: {\n childValue = new NodeCore(code === MarkerCodesStart.set ? \"set\" : \"list\");\n this.children.push(childValue);\n childValue.load(buffer, dictionary);\n break;\n }\n case MarkerCodes.ConstStringDeclare:\n case MarkerCodes.ConstStringDeclareBig:\n {\n const stringId = buffer.read(getValueSafely(codeToBytesMap, code));\n const constString = BlobShallowCopy.read(buffer, getValueSafely(codeToBytesMap, code), true);\n dictionary[stringId] = constString;\n break;\n }\n case MarkerCodes.ConstString8Id:\n case MarkerCodes.ConstString16Id:\n case MarkerCodes.ConstString32Id:\n {\n const stringId = buffer.read(getValueSafely(codeToBytesMap, code));\n childValue = dictionary[stringId];\n this.children.push(childValue);\n break;\n }\n case MarkerCodes.StringEmpty:\n case MarkerCodes.String8Length:\n case MarkerCodes.String16Length:\n case MarkerCodes.String32Length:\n case MarkerCodes.BinaryEmpty:\n case MarkerCodes.BinarySingle8:\n case MarkerCodes.BinarySingle16:\n case MarkerCodes.BinarySingle32:\n case MarkerCodes.BinarySingle64:\n {\n childValue = BlobShallowCopy.read(buffer, getValueSafely(codeToBytesMap, code), false);\n this.children.push(childValue);\n break;\n }\n // If integer is 0.\n case MarkerCodes.Int0:\n {\n childValue = 0;\n this.children.push(childValue);\n break;\n }\n case MarkerCodes.UInt8:\n case MarkerCodes.UInt16:\n case MarkerCodes.UInt32:\n case MarkerCodes.UInt64:\n case MarkerCodes.Int8:\n case MarkerCodes.Int16:\n case MarkerCodes.Int32:\n case MarkerCodes.Int64:\n {\n childValue = buffer.read(getValueSafely(codeToBytesMap, code));\n this.children.push(childValue);\n break;\n }\n case MarkerCodes.BoolTrue:\n this.children.push(true);\n break;\n case MarkerCodes.BoolFalse:\n this.children.push(false);\n break;\n case MarkerCodesEnd.list:\n case MarkerCodesEnd.set:\n return;\n default:\n throw new Error(`Invalid code: ${code}`);\n }\n }\n }\n}\n\n /**\n * TreeBuilder - Root of the tree.\n * Provides loading and serialization capabilities.\n */\nexport class TreeBuilder extends NodeCore {\n static load(buffer: ReadBuffer): TreeBuilder {\n const builder = new TreeBuilder();\n const dictionary = new Array<BlobCore>();\n builder.load(buffer, dictionary);\n assert(buffer.eof, 0x233 /* \"Unexpected data at the end of buffer\" */);\n return builder;\n }\n}\n\nexport function assertBlobCoreInstance(\n node: NodeTypes,\n message: string,\n): asserts node is BlobCore {\n if (node instanceof BlobCore) {\n return;\n }\n throwBufferParseException(node, \"BlobCore\", message);\n}\n\nexport function assertNodeCoreInstance(\n node: NodeTypes,\n message: string,\n): asserts node is NodeCore {\n if (node instanceof NodeCore) {\n return;\n }\n throwBufferParseException(node, \"NodeCore\", message);\n}\n\nexport function assertNumberInstance(\n node: NodeTypes,\n message: string,\n): asserts node is number {\n if (typeof node === \"number\") {\n return;\n }\n throwBufferParseException(node, \"Number\", message);\n}\n\nexport function assertBoolInstance(\n node: NodeTypes,\n message: string,\n): asserts node is boolean {\n if (typeof node === \"boolean\") {\n return;\n }\n throwBufferParseException(node, \"Boolean\", message);\n}\n\nfunction throwBufferParseException(\n node: NodeTypes,\n expectedNodeType: NodeType,\n message: string,\n): never {\n const error = createOdspNetworkError(\n \"bufferParsingException\",\n message,\n fetchIncorrectResponse,\n undefined,\n undefined,\n undefined,\n {\n nodeType: getNodeType(node),\n expectedNodeType,\n });\n throw error;\n}\n\nfunction getNodeType(value: NodeTypes): NodeType {\n if (typeof value === \"number\") {\n return \"Number\";\n } else if(value instanceof BlobCore) {\n return \"BlobCore\";\n } else if (value instanceof NodeCore) {\n return \"NodeCore\";\n } else if (typeof value === \"boolean\") {\n return \"Boolean\";\n }\n return \"UnknownType\";\n}\n\ntype NodeType = \"Number\" | \"BlobCore\" | \"NodeCore\" | \"Boolean\" | \"UnknownType\";\n"]}
|
|
1
|
+
{"version":3,"file":"zipItDataRepresentationUtils.js","sourceRoot":"","sources":["../src/zipItDataRepresentationUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * Data representation which is followed(zipIt Protocol) here is described in this document:\n * https://microsoft.sharepoint-df.com/:w:/t/ODSPFileStore/ER06b64K_XdDjEyAKl-UT60BJiId39SCVkYSyo_2pvH9gQ?e=KYQ0c5\n*/\n\nimport { assert, IsoBuffer, Uint8ArrayToArrayBuffer, Uint8ArrayToString } from \"@fluidframework/common-utils\";\nimport { NonRetryableError } from \"@fluidframework/driver-utils\";\nimport { DriverErrorType } from \"@fluidframework/driver-definitions\";\nimport { ReadBuffer } from \"./ReadBufferUtils\";\n\n// eslint-disable-next-line max-len\n// https://onedrive.visualstudio.com/SharePoint%20Online/_git/SPO?path=/cobalt/Base/Property/BinaryEncodedPropertyReader.cs&version=GBmaster&_a=contents\n/**\n * Control codes used by tree serialization / decentralization code. Same as on server. These can be found on\n * filestore code on server too at above link.\n */\nexport enum MarkerCodes {\n BoolTrue = 11, // value = true\n BoolFalse = 12, // value = false\n\n StringEmpty = 13, // value = \"\"\n String8Length = 14, // unsigned-8-bit little-endian length, follows by UTF-8 bytes of length\n String16Length = 15, // unsigned-16-bit little-endian length, follows by UTF-8 bytes of length\n String32Length = 16, // unsigned-32-bit little-endian length, follows by UTF-8 bytes of length\n\n ConstString8Id = 17, // unsigned-8-bit little-endian const string id follows\n ConstString16Id = 18, // unsigned-16-bit little-endian const string id follows\n ConstString32Id = 19, // unsigned-32-bit little-endian const string id follows\n ConstStringDeclare = 20, // Code for declaring a const string with size <= 1 byte\n ConstStringDeclareBig = 21, // Code for declaring a const string with size > 1 byte. It is represented in 4 bytes.\n\n Int0 = 1, // value = 0\n UInt8 = 3, // unsigned-8-bit little-endian follows\n UInt16 = 5, // unsigned-16-bit little-endian follows\n UInt32 = 7, // unsigned-32-bit little-endian follows\n UInt64 = 9, // unsigned-64-bit little-endian follows\n Int8 = 2, // signed-8-bit little-endian follows\n Int16 = 4, // signed-16-bit little-endian follows\n Int32 = 6, // signed-32-bit little-endian follows\n Int64 = 8, // signed-64-bit little-endian follows\n\n BinaryEmpty = 32, // value = byte[]\n BinarySingle8 = 33, // unsigned-8-bit little-endian length, follows by bytes of length\n BinarySingle16 = 34, // unsigned-16-bit little-endian length, follows by bytes of length\n BinarySingle32 = 35, // unsigned-32-bit little-endian length, follows by bytes of length\n BinarySingle64 = 36, // unsigned-64-bit little-endian length, follows by bytes of length\n}\n\n/**\n * Control codes used by tree serialization / decentralization code. They mark the start of sections.\n */\nexport enum MarkerCodesStart {\n \"list\" = 49,\n \"set\" = 51,\n}\n\n/**\n * Control codes used by tree serialization / decentralization code. They mark the end of sections.\n */\nexport enum MarkerCodesEnd {\n \"list\" = 50,\n \"set\" = 52,\n}\n\n/**\n * This contains mapping of Marker Codes to number of bytes in which the corresponding data\n * will be stored.\n*/\nexport const codeToBytesMap = {\n // Integer code to bytes\n 1: 0,\n 2: 1,\n 3: 1,\n 4: 2,\n 5: 2,\n 6: 4,\n 7: 4,\n 8: 8,\n 9: 8,\n\n // String code to Bytes\n 13: 0,\n 14: 1,\n 15: 2,\n 16: 4,\n\n 17: 1,\n 18: 2,\n 19: 4,\n\n 20: 1,\n 21: 4,\n\n // Binary code to bytes\n 32: 0,\n 33: 1,\n 34: 2,\n 35: 4,\n 36: 8,\n};\n\nexport function getValueSafely(map: {[index: number]: number}, key: number) {\n const val = map[key];\n assert(val !== undefined, 0x287 /* `key= ${key} must exist in the map` */);\n return val;\n}\n\nexport function getAndValidateNodeProps(node: NodeCore, props: string[], enforceAllProps = true) {\n const propSet = new Set(props);\n const res: Record<string, NodeTypes> = {};\n for (const [keyNode, valueNode] of node.iteratePairs()) {\n assertBlobCoreInstance(keyNode, \"keynode should be a blob\");\n const keyStr = keyNode.toString();\n if (propSet.has(keyStr)) {\n propSet.delete(keyStr);\n res[keyStr] = valueNode;\n }\n }\n if (enforceAllProps) {\n assert(propSet.size === 0, 0x288 /* `All properties should exist, Not found: ${[...propSet.keys()]}` */);\n }\n return res;\n}\n\nexport function iteratePairs<T>(it: IterableIterator<T>) {\n const res: IterableIterator<[T, T]> = {\n next: () => {\n const a = it.next();\n if (a.done) {\n return { value: undefined, done: true };\n }\n const b = it.next();\n assert(b.done !== true, 0x22b /* \"Should be a pair\" */);\n return { value: [a.value, b.value], done: b.done };\n },\n [Symbol.iterator]: () => { return res; },\n };\n return res;\n}\n\n/**\n * Helper function that returns iterator from an object\n * @param obj - object that supports iteration\n */\nexport function iterate<T>(obj: {[Symbol.iterator]: () => IterableIterator<T>}) {\n return obj[Symbol.iterator]();\n}\n\n/**\n * Base class to represent binary blob element.\n * Binary blob is one of three types supported as a leaf node of a tree.\n * Note: concrete implementations (derived classes) are not exposed from this module\n */\nexport abstract class BlobCore {\n public abstract get buffer(): Uint8Array;\n public get arrayBuffer(): ArrayBufferLike {\n return Uint8ArrayToArrayBuffer(this.buffer);\n }\n\n /**\n * Represents a blob.\n * @param constString - Whether it contains const string declaration.\n * @param useUtf8Code - Represents if the utf8 string marker code should be used when representing.\n */\n constructor(public readonly constString: boolean, public readonly useUtf8Code: boolean = false) {}\n\n public toString() {\n return Uint8ArrayToString(this.buffer, \"utf-8\");\n }\n}\n\n/**\n * \"deep copy\" blob, holds to binary data passed in\n * It is called deep copy as a counter-part to BlobShallowCopy, which\n * is a reference to underlying binary stream (ReadBuffer).\n*/\nclass BlobDeepCopy extends BlobCore {\n /**\n * Represents a deep copy of the blob.\n * @param data - Data array of the blob\n * @param constString - Whether it contains const string declaration.\n * @param useUtf8Code - Represents if the utf8 string marker code should be used when representing.\n */\n constructor(protected readonly data: Uint8Array, constString: boolean, useUtf8Code: boolean = false) {\n super(constString, useUtf8Code);\n }\n\n public get buffer() {\n return this.data;\n }\n\n public static read(buffer: ReadBuffer, lengthLen: number, constString: boolean): BlobCore {\n const length = buffer.read(lengthLen);\n const data = new Uint8Array(length);\n for (let counter = 0; counter < length; counter++) {\n data[counter] = buffer.read();\n }\n return new BlobDeepCopy(data, constString);\n }\n}\n\n/**\n * Shallow copy blob, keeps a reference to portion of ReadBuffer\n * it was constructed from. It takes much less memory compared to BlobDeepCopy\n */\n export class BlobShallowCopy extends BlobCore {\n /**\n * Represents a shallow copy of the blob. It is not a separate blob, just reference to original blobs.\n * @param data - Data array of the blob\n * @param start - Start point of the blob in the buffer.\n * @param end - End point of the blob in the buffer.\n * @param constString - Whether it contains const string declaration.\n */\n constructor(\n protected data: ReadBuffer,\n protected start: number,\n protected end: number,\n constString: boolean,\n ) {\n super(constString);\n }\n\n public get buffer() {\n return this.data.buffer.subarray(this.start, this.end);\n }\n\n public static read(buffer: ReadBuffer, lengthLen: number, constString: boolean): BlobCore {\n const length = buffer.read(lengthLen);\n const pos = buffer.pos;\n buffer.skip(length);\n return new BlobShallowCopy(buffer, pos, pos + length, constString);\n }\n}\n\nexport const addStringProperty = (node: NodeCore, a: string, b: string, encodeValAsConstString: boolean = false) =>\n { node.addString(a, true); node.addString(b, encodeValAsConstString); };\nexport const addNumberProperty = (node: NodeCore, a: string, b: number) =>\n { node.addString(a, true); node.addNumber(b); };\nexport const addBoolProperty = (node: NodeCore, a: string, b: boolean) =>\n { node.addString(a, true); node.addBool(b); };\n\n/**\n * Three leaf types supported by tree:\n * 1. Node (sub-tree)\n * 2. binary blob\n * 3. integer\n * 4. boolean\n */\nexport type NodeTypes = NodeCore | BlobCore | number | boolean;\n\nexport type NodeCoreTypes = \"list\" | \"set\";\n\n/**\n * Node - node in the tree (non-leaf element of the tree)\n */\nexport class NodeCore {\n // It is an array of nodes.\n private readonly children: NodeTypes[] = [];\n public get nodes() {\n return this.children;\n }\n\n constructor(public type: NodeCoreTypes = \"set\") {}\n\n public [Symbol.iterator]() {\n return this.children[Symbol.iterator]();\n }\n\n public iteratePairs() {\n assert((this.length % 2) === 0, 0x22c /* \"reading pairs\" */);\n return iteratePairs(iterate(this));\n }\n\n public get length() { return this.children.length; }\n\n public get(index: number) { return this.children[index]; }\n\n public getString(index: number): string {\n const node = this.children[index];\n assertBlobCoreInstance(node, \"getString should return stringblob\");\n return node.toString();\n }\n\n public getBlob(index: number): BlobCore {\n const node = this.children[index];\n assertBlobCoreInstance(node, \"getBlob should return a blob\");\n return node;\n }\n\n public getNode(index: number): NodeCore\n {\n const node = this.children[index];\n assertNodeCoreInstance(node, \"getNode should return a node\");\n return node;\n }\n\n public getNumber(index: number): number\n {\n const node = this.children[index];\n assertNumberInstance(node, \"getNumber should return a number\");\n return node;\n }\n\n public getBool(index: number): boolean {\n const node = this.children[index];\n assertBoolInstance(node, \"getBool should return a boolean\");\n return node;\n }\n\n public addNode(type?: NodeCoreTypes): NodeCore {\n const node = new NodeCore(type);\n this.children.push(node);\n return node;\n }\n\n public addBlob(blob: Uint8Array, constString: boolean, useUtf8Code: boolean = false) {\n this.children.push(new BlobDeepCopy(blob, constString, useUtf8Code));\n }\n\n public addString(payload: string, constString: boolean) {\n this.addBlob(IsoBuffer.from(payload, \"utf-8\"), constString, true);\n }\n\n public addNumber(payload: number | undefined) {\n assert(Number.isInteger(payload), 0x231 /* \"Number should be an integer\" */);\n assert(payload !== undefined && payload >= 0, 0x232 /* \"Payload should not be negative\" */);\n this.children.push(payload);\n }\n\n public addBool(payload: boolean) {\n this.children.push(payload);\n }\n\n /**\n * Load and parse the buffer into a tree.\n * @param buffer - buffer to read from.\n */\n protected load(buffer: ReadBuffer, dictionary: BlobCore[]) {\n for (;!buffer.eof;) {\n let childValue: NodeTypes | undefined;\n const code = buffer.read();\n switch (code) {\n case MarkerCodesStart.list:\n case MarkerCodesStart.set: {\n childValue = new NodeCore(code === MarkerCodesStart.set ? \"set\" : \"list\");\n this.children.push(childValue);\n childValue.load(buffer, dictionary);\n break;\n }\n case MarkerCodes.ConstStringDeclare:\n case MarkerCodes.ConstStringDeclareBig:\n {\n const stringId = buffer.read(getValueSafely(codeToBytesMap, code));\n const constString = BlobShallowCopy.read(buffer, getValueSafely(codeToBytesMap, code), true);\n dictionary[stringId] = constString;\n break;\n }\n case MarkerCodes.ConstString8Id:\n case MarkerCodes.ConstString16Id:\n case MarkerCodes.ConstString32Id:\n {\n const stringId = buffer.read(getValueSafely(codeToBytesMap, code));\n childValue = dictionary[stringId];\n this.children.push(childValue);\n break;\n }\n case MarkerCodes.StringEmpty:\n case MarkerCodes.String8Length:\n case MarkerCodes.String16Length:\n case MarkerCodes.String32Length:\n case MarkerCodes.BinaryEmpty:\n case MarkerCodes.BinarySingle8:\n case MarkerCodes.BinarySingle16:\n case MarkerCodes.BinarySingle32:\n case MarkerCodes.BinarySingle64:\n {\n childValue = BlobShallowCopy.read(buffer, getValueSafely(codeToBytesMap, code), false);\n this.children.push(childValue);\n break;\n }\n // If integer is 0.\n case MarkerCodes.Int0:\n {\n childValue = 0;\n this.children.push(childValue);\n break;\n }\n case MarkerCodes.UInt8:\n case MarkerCodes.UInt16:\n case MarkerCodes.UInt32:\n case MarkerCodes.UInt64:\n case MarkerCodes.Int8:\n case MarkerCodes.Int16:\n case MarkerCodes.Int32:\n case MarkerCodes.Int64:\n {\n childValue = buffer.read(getValueSafely(codeToBytesMap, code));\n this.children.push(childValue);\n break;\n }\n case MarkerCodes.BoolTrue:\n this.children.push(true);\n break;\n case MarkerCodes.BoolFalse:\n this.children.push(false);\n break;\n case MarkerCodesEnd.list:\n case MarkerCodesEnd.set:\n return;\n default:\n throw new Error(`Invalid code: ${code}`);\n }\n }\n }\n}\n\n /**\n * TreeBuilder - Root of the tree.\n * Provides loading and serialization capabilities.\n */\nexport class TreeBuilder extends NodeCore {\n static load(buffer: ReadBuffer): TreeBuilder {\n const builder = new TreeBuilder();\n const dictionary = new Array<BlobCore>();\n builder.load(buffer, dictionary);\n assert(buffer.eof, 0x233 /* \"Unexpected data at the end of buffer\" */);\n return builder;\n }\n}\n\nexport function assertBlobCoreInstance(\n node: NodeTypes,\n message: string,\n): asserts node is BlobCore {\n if (node instanceof BlobCore) {\n return;\n }\n throwBufferParseException(node, \"BlobCore\", message);\n}\n\nexport function assertNodeCoreInstance(\n node: NodeTypes,\n message: string,\n): asserts node is NodeCore {\n if (node instanceof NodeCore) {\n return;\n }\n throwBufferParseException(node, \"NodeCore\", message);\n}\n\nexport function assertNumberInstance(\n node: NodeTypes,\n message: string,\n): asserts node is number {\n if (typeof node === \"number\") {\n return;\n }\n throwBufferParseException(node, \"Number\", message);\n}\n\nexport function assertBoolInstance(\n node: NodeTypes,\n message: string,\n): asserts node is boolean {\n if (typeof node === \"boolean\") {\n return;\n }\n throwBufferParseException(node, \"Boolean\", message);\n}\n\nfunction throwBufferParseException(\n node: NodeTypes,\n expectedNodeType: NodeType,\n message: string,\n): never {\n throw new NonRetryableError(\n \"bufferParsingException\",\n message,\n DriverErrorType.incorrectServerResponse,\n {\n nodeType: getNodeType(node),\n expectedNodeType,\n });\n}\n\nfunction getNodeType(value: NodeTypes): NodeType {\n if (typeof value === \"number\") {\n return \"Number\";\n } else if(value instanceof BlobCore) {\n return \"BlobCore\";\n } else if (value instanceof NodeCore) {\n return \"NodeCore\";\n } else if (typeof value === \"boolean\") {\n return \"Boolean\";\n }\n return \"UnknownType\";\n}\n\ntype NodeType = \"Number\" | \"BlobCore\" | \"NodeCore\" | \"Boolean\" | \"UnknownType\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/odsp-driver",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.54.0",
|
|
4
4
|
"description": "Socket storage implementation for SPO and ODC",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": "https://github.com/microsoft/FluidFramework",
|
|
@@ -58,15 +58,15 @@
|
|
|
58
58
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
59
59
|
"@fluidframework/common-utils": "^0.32.1",
|
|
60
60
|
"@fluidframework/core-interfaces": "^0.41.0",
|
|
61
|
-
"@fluidframework/driver-base": "^0.
|
|
62
|
-
"@fluidframework/driver-definitions": "^0.
|
|
63
|
-
"@fluidframework/driver-utils": "^0.
|
|
61
|
+
"@fluidframework/driver-base": "^0.54.0",
|
|
62
|
+
"@fluidframework/driver-definitions": "^0.43.0",
|
|
63
|
+
"@fluidframework/driver-utils": "^0.54.0",
|
|
64
64
|
"@fluidframework/gitresources": "^0.1034.0",
|
|
65
|
-
"@fluidframework/odsp-doclib-utils": "^0.
|
|
66
|
-
"@fluidframework/odsp-driver-definitions": "^0.
|
|
65
|
+
"@fluidframework/odsp-doclib-utils": "^0.54.0",
|
|
66
|
+
"@fluidframework/odsp-driver-definitions": "^0.54.0",
|
|
67
67
|
"@fluidframework/protocol-base": "^0.1034.0",
|
|
68
68
|
"@fluidframework/protocol-definitions": "^0.1026.0",
|
|
69
|
-
"@fluidframework/telemetry-utils": "^0.
|
|
69
|
+
"@fluidframework/telemetry-utils": "^0.54.0",
|
|
70
70
|
"abort-controller": "^3.0.0",
|
|
71
71
|
"node-fetch": "^2.6.1",
|
|
72
72
|
"socket.io-client": "^2.4.0",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"devDependencies": {
|
|
76
76
|
"@fluidframework/build-common": "^0.23.0",
|
|
77
77
|
"@fluidframework/eslint-config-fluid": "^0.24.0",
|
|
78
|
-
"@fluidframework/mocha-test-setup": "^0.
|
|
78
|
+
"@fluidframework/mocha-test-setup": "^0.54.0",
|
|
79
79
|
"@microsoft/api-extractor": "^7.16.1",
|
|
80
80
|
"@types/mocha": "^8.2.2",
|
|
81
81
|
"@types/node-fetch": "^2.5.10",
|
package/src/createFile.ts
CHANGED
|
@@ -4,12 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { assert, Uint8ArrayToString } from "@fluidframework/common-utils";
|
|
7
|
-
import { getDocAttributesFromProtocolSummary } from "@fluidframework/driver-utils";
|
|
8
|
-
import {
|
|
9
|
-
fetchIncorrectResponse,
|
|
10
|
-
invalidFileNameStatusCode,
|
|
11
|
-
throwOdspNetworkError,
|
|
12
|
-
} from "@fluidframework/odsp-doclib-utils";
|
|
7
|
+
import { getDocAttributesFromProtocolSummary, NonRetryableError } from "@fluidframework/driver-utils";
|
|
13
8
|
import { getGitType } from "@fluidframework/protocol-base";
|
|
14
9
|
import { SummaryType, ISummaryTree, ISummaryBlob } from "@fluidframework/protocol-definitions";
|
|
15
10
|
import { ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
@@ -18,7 +13,9 @@ import {
|
|
|
18
13
|
IFileEntry,
|
|
19
14
|
InstrumentedStorageTokenFetcher,
|
|
20
15
|
IOdspResolvedUrl,
|
|
16
|
+
OdspErrorType,
|
|
21
17
|
} from "@fluidframework/odsp-driver-definitions";
|
|
18
|
+
import { DriverErrorType } from "@fluidframework/driver-definitions";
|
|
22
19
|
import {
|
|
23
20
|
IOdspSummaryTree,
|
|
24
21
|
OdspSummaryTreeValue,
|
|
@@ -61,7 +58,8 @@ export async function createNewFluidFile(
|
|
|
61
58
|
): Promise<IOdspResolvedUrl> {
|
|
62
59
|
// Check for valid filename before the request to create file is actually made.
|
|
63
60
|
if (isInvalidFileName(newFileInfo.filename)) {
|
|
64
|
-
|
|
61
|
+
throw new NonRetryableError(
|
|
62
|
+
"createNewInvalidFilename", "Invalid filename", OdspErrorType.invalidFileNameError);
|
|
65
63
|
}
|
|
66
64
|
|
|
67
65
|
let itemId: string;
|
|
@@ -144,7 +142,10 @@ export async function createNewEmptyFluidFile(
|
|
|
144
142
|
|
|
145
143
|
const content = fetchResponse.content;
|
|
146
144
|
if (!content || !content.id) {
|
|
147
|
-
|
|
145
|
+
throw new NonRetryableError(
|
|
146
|
+
"createEmptyFileNoItemId",
|
|
147
|
+
"ODSP CreateFile call returned no item ID",
|
|
148
|
+
DriverErrorType.incorrectServerResponse);
|
|
148
149
|
}
|
|
149
150
|
event.end({
|
|
150
151
|
headers: Object.keys(headers).length !== 0 ? true : undefined,
|
|
@@ -199,7 +200,10 @@ export async function createNewFluidFileFromSummary(
|
|
|
199
200
|
|
|
200
201
|
const content = fetchResponse.content;
|
|
201
202
|
if (!content || !content.itemId) {
|
|
202
|
-
|
|
203
|
+
throw new NonRetryableError(
|
|
204
|
+
"createFileNoItemId",
|
|
205
|
+
"ODSP CreateFile call returned no item ID",
|
|
206
|
+
DriverErrorType.incorrectServerResponse);
|
|
203
207
|
}
|
|
204
208
|
event.end({
|
|
205
209
|
headers: Object.keys(headers).length !== 0 ? true : undefined,
|
package/src/epochTracker.ts
CHANGED
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
import { v4 as uuid } from "uuid";
|
|
7
7
|
import { assert, Deferred } from "@fluidframework/common-utils";
|
|
8
8
|
import { ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
9
|
-
import {
|
|
10
|
-
import { ThrottlingError, RateLimiter } from "@fluidframework/driver-utils";
|
|
9
|
+
import { ThrottlingError, RateLimiter, NonRetryableError } from "@fluidframework/driver-utils";
|
|
11
10
|
import { IConnected } from "@fluidframework/protocol-definitions";
|
|
12
11
|
import {
|
|
13
12
|
snapshotKey,
|
|
@@ -34,6 +33,8 @@ export type FetchTypeInternal = FetchType | "cache";
|
|
|
34
33
|
|
|
35
34
|
export const Odsp409Error = "Odsp409Error";
|
|
36
35
|
|
|
36
|
+
export const defaultCacheExpiryTimeoutMs: number = 2 * 24 * 60 * 60 * 1000;
|
|
37
|
+
|
|
37
38
|
/**
|
|
38
39
|
* This class is a wrapper around fetch calls. It adds epoch to the request made so that the
|
|
39
40
|
* server can match it with its epoch value in order to match the version.
|
|
@@ -75,16 +76,37 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
75
76
|
entry: IEntry,
|
|
76
77
|
): Promise<any> {
|
|
77
78
|
try {
|
|
79
|
+
// Return undefined so that the ops/snapshots are grabbed from the server instead of the cache
|
|
78
80
|
const value: IVersionedValueWithEpoch = await this.cache.get(this.fileEntryFromEntry(entry));
|
|
81
|
+
// Version mismatch between what the runtime expects and what it recieved.
|
|
82
|
+
// The cached value should not be used
|
|
79
83
|
if (value === undefined || value.version !== persistedCacheValueVersion) {
|
|
80
84
|
return undefined;
|
|
81
85
|
}
|
|
82
86
|
assert(value.fluidEpoch !== undefined, 0x1dc /* "all entries have to have epoch" */);
|
|
83
87
|
if (this._fluidEpoch === undefined) {
|
|
84
88
|
this.setEpoch(value.fluidEpoch, true, "cache");
|
|
89
|
+
// Epoch mismatch, the cached value is considerably different from what the current state of
|
|
90
|
+
// the runtime and should not be used
|
|
85
91
|
} else if (this._fluidEpoch !== value.fluidEpoch) {
|
|
86
92
|
return undefined;
|
|
87
93
|
}
|
|
94
|
+
// Expire the cached snapshot if it's older than the defaultCacheExpiryTimeoutMs and immediately
|
|
95
|
+
// expire all old caches that do not have cacheEntryTime
|
|
96
|
+
if (entry.type === snapshotKey) {
|
|
97
|
+
const cacheTime = value.value?.cacheEntryTime;
|
|
98
|
+
const currentTime = Date.now();
|
|
99
|
+
if (cacheTime === undefined || currentTime - cacheTime >= defaultCacheExpiryTimeoutMs) {
|
|
100
|
+
this.logger.sendTelemetryEvent(
|
|
101
|
+
{
|
|
102
|
+
eventName: "odspVersionsCacheExpired",
|
|
103
|
+
duration: currentTime - cacheTime,
|
|
104
|
+
maxCacheAgeMs: defaultCacheExpiryTimeoutMs,
|
|
105
|
+
});
|
|
106
|
+
await this.removeEntries();
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
88
110
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
89
111
|
return value.value;
|
|
90
112
|
} catch (error) {
|
|
@@ -95,6 +117,11 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
95
117
|
|
|
96
118
|
public async put(entry: IEntry, value: any) {
|
|
97
119
|
assert(this._fluidEpoch !== undefined, 0x1dd /* "no epoch" */);
|
|
120
|
+
// For snapshots, the value should have the cacheEntryTime. This will be used to expire snapshots older
|
|
121
|
+
// than the defaultCacheExpiryTimeoutMs.
|
|
122
|
+
if (entry.type === snapshotKey) {
|
|
123
|
+
value.cacheEntryTime = value.cacheEntryTime ?? Date.now();
|
|
124
|
+
}
|
|
98
125
|
const data: IVersionedValueWithEpoch = {
|
|
99
126
|
value,
|
|
100
127
|
version: persistedCacheValueVersion,
|
|
@@ -143,9 +170,9 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
143
170
|
fetchType: FetchType,
|
|
144
171
|
addInBody: boolean = false,
|
|
145
172
|
): Promise<IOdspResponse<T>> {
|
|
146
|
-
const
|
|
173
|
+
const clientCorrelationId = this.formatClientCorrelationId();
|
|
147
174
|
// Add epoch in fetch request.
|
|
148
|
-
this.addEpochInRequest(fetchOptions, addInBody,
|
|
175
|
+
this.addEpochInRequest(fetchOptions, addInBody, clientCorrelationId);
|
|
149
176
|
let epochFromResponse: string | undefined;
|
|
150
177
|
return this.rateLimiter.schedule(
|
|
151
178
|
async () => fetchAndParseAsJSONHelper<T>(url, fetchOptions),
|
|
@@ -154,7 +181,7 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
154
181
|
this.validateEpochFromResponse(epochFromResponse, fetchType);
|
|
155
182
|
response.commonSpoHeaders = {
|
|
156
183
|
...response.commonSpoHeaders,
|
|
157
|
-
"X-RequestStats":
|
|
184
|
+
"X-RequestStats": clientCorrelationId,
|
|
158
185
|
};
|
|
159
186
|
return response;
|
|
160
187
|
}).catch(async (error) => {
|
|
@@ -166,7 +193,7 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
166
193
|
await this.checkForEpochError(error, epochFromResponse, fetchType);
|
|
167
194
|
throw error;
|
|
168
195
|
}).catch((error) => {
|
|
169
|
-
const fluidError = normalizeError(error, {props: {
|
|
196
|
+
const fluidError = normalizeError(error, { props: { XRequestStatsHeader: clientCorrelationId }});
|
|
170
197
|
throw fluidError;
|
|
171
198
|
});
|
|
172
199
|
}
|
|
@@ -184,9 +211,9 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
184
211
|
fetchType: FetchType,
|
|
185
212
|
addInBody: boolean = false,
|
|
186
213
|
) {
|
|
187
|
-
const
|
|
214
|
+
const clientCorrelationId = this.formatClientCorrelationId();
|
|
188
215
|
// Add epoch in fetch request.
|
|
189
|
-
this.addEpochInRequest(fetchOptions, addInBody,
|
|
216
|
+
this.addEpochInRequest(fetchOptions, addInBody, clientCorrelationId);
|
|
190
217
|
let epochFromResponse: string | undefined;
|
|
191
218
|
return this.rateLimiter.schedule(
|
|
192
219
|
async () => fetchArray(url, fetchOptions),
|
|
@@ -195,7 +222,7 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
195
222
|
this.validateEpochFromResponse(epochFromResponse, fetchType);
|
|
196
223
|
response.commonSpoHeaders = {
|
|
197
224
|
...response.commonSpoHeaders,
|
|
198
|
-
"X-RequestStats":
|
|
225
|
+
"X-RequestStats": clientCorrelationId,
|
|
199
226
|
};
|
|
200
227
|
return response;
|
|
201
228
|
}).catch(async (error) => {
|
|
@@ -207,7 +234,7 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
207
234
|
await this.checkForEpochError(error, epochFromResponse, fetchType);
|
|
208
235
|
throw error;
|
|
209
236
|
}).catch((error) => {
|
|
210
|
-
const fluidError = normalizeError(error, {props: {
|
|
237
|
+
const fluidError = normalizeError(error, { props: { XRequestStatsHeader: clientCorrelationId }});
|
|
211
238
|
throw fluidError;
|
|
212
239
|
});
|
|
213
240
|
}
|
|
@@ -215,11 +242,11 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
215
242
|
private addEpochInRequest(
|
|
216
243
|
fetchOptions: RequestInit,
|
|
217
244
|
addInBody: boolean,
|
|
218
|
-
|
|
245
|
+
clientCorrelationId: string,
|
|
219
246
|
) {
|
|
220
247
|
if (addInBody) {
|
|
221
248
|
const headers: {[key: string]: string} = {};
|
|
222
|
-
headers["X-RequestStats"] =
|
|
249
|
+
headers["X-RequestStats"] = clientCorrelationId;
|
|
223
250
|
if (this.fluidEpoch !== undefined) {
|
|
224
251
|
headers["x-fluid-epoch"] = this.fluidEpoch;
|
|
225
252
|
}
|
|
@@ -232,7 +259,7 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
232
259
|
assert(fetchOptions.headers !== undefined, 0x282 /* "Headers should be present now" */);
|
|
233
260
|
fetchOptions.headers[key] = val;
|
|
234
261
|
};
|
|
235
|
-
addHeader("X-RequestStats",
|
|
262
|
+
addHeader("X-RequestStats", clientCorrelationId);
|
|
236
263
|
if (this.fluidEpoch !== undefined) {
|
|
237
264
|
addHeader("x-fluid-epoch", this.fluidEpoch);
|
|
238
265
|
}
|
|
@@ -257,7 +284,7 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
257
284
|
fetchOptions.body = formParams.join("\r\n");
|
|
258
285
|
}
|
|
259
286
|
|
|
260
|
-
private
|
|
287
|
+
private formatClientCorrelationId() {
|
|
261
288
|
return `driverId=${this.driverId}, RequestNumber=${this.networkCallNumber++}`;
|
|
262
289
|
}
|
|
263
290
|
|
|
@@ -266,7 +293,10 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
266
293
|
fetchType: FetchTypeInternal,
|
|
267
294
|
fromCache: boolean = false,
|
|
268
295
|
) {
|
|
269
|
-
this.checkForEpochErrorCore(epochFromResponse);
|
|
296
|
+
const error = this.checkForEpochErrorCore(epochFromResponse);
|
|
297
|
+
if (error !== undefined) {
|
|
298
|
+
throw error;
|
|
299
|
+
}
|
|
270
300
|
if (epochFromResponse !== undefined) {
|
|
271
301
|
if (this._fluidEpoch === undefined) {
|
|
272
302
|
this.setEpoch(epochFromResponse, fromCache, fetchType);
|
|
@@ -281,10 +311,8 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
281
311
|
fromCache: boolean = false,
|
|
282
312
|
) {
|
|
283
313
|
if (isFluidError(error) && error.errorType === DriverErrorType.fileOverwrittenInStorage) {
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
this.checkForEpochErrorCore(epochFromResponse);
|
|
287
|
-
} catch (epochError) {
|
|
314
|
+
const epochError = this.checkForEpochErrorCore(epochFromResponse);
|
|
315
|
+
if (epochError !== undefined) {
|
|
288
316
|
assert(isFluidError(epochError),
|
|
289
317
|
0x21f /* "epochError expected to be thrown by throwOdspNetworkError and of known type" */);
|
|
290
318
|
epochError.addTelemetryProperties({
|
|
@@ -309,7 +337,9 @@ export class EpochTracker implements IPersistedFileCache {
|
|
|
309
337
|
// initializes this value. Sometimes response does not contain epoch as it is still in
|
|
310
338
|
// implementation phase at server side. In that case also, don't compare it with our epoch value.
|
|
311
339
|
if (this.fluidEpoch && epochFromResponse && (this.fluidEpoch !== epochFromResponse)) {
|
|
312
|
-
|
|
340
|
+
// This is similar in nature to how fluidEpochMismatchError (409) is handled.
|
|
341
|
+
// Difference - client detected mismatch, instead of server detecting it.
|
|
342
|
+
return new NonRetryableError("epochMismatch", "Epoch mismatch", DriverErrorType.fileOverwrittenInStorage);
|
|
313
343
|
}
|
|
314
344
|
}
|
|
315
345
|
|
package/src/fetchSnapshot.ts
CHANGED
|
@@ -104,7 +104,14 @@ export async function fetchSnapshotWithRedeem(
|
|
|
104
104
|
}, error);
|
|
105
105
|
await redeemSharingLink(odspResolvedUrl, storageTokenFetcher, logger);
|
|
106
106
|
const odspResolvedUrlWithoutShareLink: IOdspResolvedUrl =
|
|
107
|
-
|
|
107
|
+
{ ...odspResolvedUrl, sharingLinkToRedeem: undefined };
|
|
108
|
+
|
|
109
|
+
if(odspResolvedUrlWithoutShareLink.shareLinkInfo) {
|
|
110
|
+
odspResolvedUrlWithoutShareLink.shareLinkInfo = {
|
|
111
|
+
...odspResolvedUrlWithoutShareLink.shareLinkInfo,
|
|
112
|
+
sharingLinkToRedeem: undefined,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
108
115
|
|
|
109
116
|
return fetchLatestSnapshotCore(
|
|
110
117
|
odspResolvedUrlWithoutShareLink,
|
|
@@ -140,10 +147,10 @@ async function redeemSharingLink(
|
|
|
140
147
|
eventName: "RedeemShareLink",
|
|
141
148
|
},
|
|
142
149
|
async () => getWithRetryForTokenRefresh(async (tokenFetchOptions) => {
|
|
143
|
-
assert(!!odspResolvedUrl.
|
|
150
|
+
assert(!!odspResolvedUrl.sharingLinkToRedeem,
|
|
144
151
|
0x1ed /* "Share link should be present" */);
|
|
145
152
|
const storageToken = await storageTokenFetcher(tokenFetchOptions, "RedeemShareLink");
|
|
146
|
-
const encodedShareUrl = getEncodedShareUrl(odspResolvedUrl.
|
|
153
|
+
const encodedShareUrl = getEncodedShareUrl(odspResolvedUrl.sharingLinkToRedeem);
|
|
147
154
|
const redeemUrl = `${odspResolvedUrl.siteUrl}/_api/v2.0/shares/${encodedShareUrl}`;
|
|
148
155
|
const { url, headers } = getUrlAndHeadersWithAuth(redeemUrl, storageToken);
|
|
149
156
|
headers.prefer = "redeemSharingLink";
|
|
@@ -349,8 +356,8 @@ async function fetchSnapshotContentsCoreV1(
|
|
|
349
356
|
}
|
|
350
357
|
});
|
|
351
358
|
}
|
|
352
|
-
if (odspResolvedUrl.
|
|
353
|
-
formParams.push(`sl: ${odspResolvedUrl.
|
|
359
|
+
if (odspResolvedUrl.sharingLinkToRedeem) {
|
|
360
|
+
formParams.push(`sl: ${odspResolvedUrl.sharingLinkToRedeem}`);
|
|
354
361
|
}
|
|
355
362
|
formParams.push(`_post: 1`);
|
|
356
363
|
formParams.push(`\r\n--${formBoundary}--`);
|
|
@@ -396,9 +403,9 @@ async function fetchSnapshotContentsCoreV2(
|
|
|
396
403
|
const fullUrl = `${odspResolvedUrl.siteUrl}/_api/v2.1/drives/${odspResolvedUrl.driveId}/items/${
|
|
397
404
|
odspResolvedUrl.itemId}/opStream/attachments/latest/content`;
|
|
398
405
|
const queryParams = { ...snapshotOptions };
|
|
399
|
-
if (odspResolvedUrl.
|
|
406
|
+
if (odspResolvedUrl.sharingLinkToRedeem) {
|
|
400
407
|
// eslint-disable-next-line @typescript-eslint/dot-notation
|
|
401
|
-
queryParams["sl"] = odspResolvedUrl.
|
|
408
|
+
queryParams["sl"] = odspResolvedUrl.sharingLinkToRedeem;
|
|
402
409
|
}
|
|
403
410
|
const queryString = getQueryString(queryParams);
|
|
404
411
|
const { url, headers } = getUrlAndHeadersWithAuth(`${fullUrl}${queryString}`, storageToken);
|
|
@@ -460,7 +467,7 @@ export async function downloadSnapshot(
|
|
|
460
467
|
}
|
|
461
468
|
|
|
462
469
|
function isRedeemSharingLinkError(odspResolvedUrl: IOdspResolvedUrl, error: any) {
|
|
463
|
-
if (odspResolvedUrl.
|
|
470
|
+
if (odspResolvedUrl.sharingLinkToRedeem !== undefined
|
|
464
471
|
&& (typeof error === "object" && error !== null)
|
|
465
472
|
&& (error.errorType === DriverErrorType.authorizationError
|
|
466
473
|
|| error.errorType === DriverErrorType.fileNotFoundOrAccessDeniedError)) {
|
package/src/getFileLink.ts
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
|
|
6
6
|
import { ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
7
7
|
import { assert, delay } from "@fluidframework/common-utils";
|
|
8
|
-
import { canRetryOnError, getRetryDelayFromError } from "@fluidframework/driver-utils";
|
|
8
|
+
import { canRetryOnError, getRetryDelayFromError, NonRetryableError } from "@fluidframework/driver-utils";
|
|
9
9
|
import { PerformanceEvent } from "@fluidframework/telemetry-utils";
|
|
10
|
-
import {
|
|
10
|
+
import { DriverErrorType } from "@fluidframework/driver-definitions";
|
|
11
11
|
import {
|
|
12
12
|
IOdspUrlParts,
|
|
13
13
|
OdspResourceTokenFetchOptions,
|
|
@@ -120,7 +120,10 @@ async function getFileLinkCore(
|
|
|
120
120
|
const directUrl = sharingInfo?.d?.directUrl;
|
|
121
121
|
if (typeof directUrl !== "string") {
|
|
122
122
|
// This will retry once in getWithRetryForTokenRefresh
|
|
123
|
-
|
|
123
|
+
throw new NonRetryableError(
|
|
124
|
+
"getFileLinkCoreMalformedResponse",
|
|
125
|
+
"Malformed GetSharingInformation response",
|
|
126
|
+
DriverErrorType.incorrectServerResponse);
|
|
124
127
|
}
|
|
125
128
|
return directUrl;
|
|
126
129
|
});
|
|
@@ -171,7 +174,10 @@ async function getFileItemLite(
|
|
|
171
174
|
const responseJson = await response.content.json();
|
|
172
175
|
if (!isFileItemLite(responseJson)) {
|
|
173
176
|
// This will retry once in getWithRetryForTokenRefresh
|
|
174
|
-
|
|
177
|
+
throw new NonRetryableError(
|
|
178
|
+
"getFileItemLiteMalformedResponse",
|
|
179
|
+
"Malformed getFileItemLite response",
|
|
180
|
+
DriverErrorType.incorrectServerResponse);
|
|
175
181
|
}
|
|
176
182
|
return responseJson;
|
|
177
183
|
});
|
|
@@ -41,6 +41,7 @@ export class OdspDeltaStorageService {
|
|
|
41
41
|
from: number,
|
|
42
42
|
to: number,
|
|
43
43
|
telemetryProps: ITelemetryProperties,
|
|
44
|
+
fetchReason?: string,
|
|
44
45
|
): Promise<IDeltasFetchResult> {
|
|
45
46
|
return getWithRetryForTokenRefresh(async (options) => {
|
|
46
47
|
// Note - this call ends up in getSocketStorageDiscovery() and can refresh token
|
|
@@ -52,6 +53,9 @@ export class OdspDeltaStorageService {
|
|
|
52
53
|
let postBody = `--${formBoundary}\r\n`;
|
|
53
54
|
postBody += `Authorization: Bearer ${storageToken}\r\n`;
|
|
54
55
|
postBody += `X-HTTP-Method-Override: GET\r\n`;
|
|
56
|
+
if (fetchReason !== undefined) {
|
|
57
|
+
postBody += `fetchReason: ${fetchReason}\r\n`;
|
|
58
|
+
}
|
|
55
59
|
|
|
56
60
|
postBody += `_post: 1\r\n`;
|
|
57
61
|
postBody += `\r\n--${formBoundary}--`;
|
|
@@ -123,7 +127,8 @@ export class OdspDeltaStorageWithCache implements IDocumentDeltaStorageService {
|
|
|
123
127
|
private readonly getFromStorage: (
|
|
124
128
|
from: number,
|
|
125
129
|
to: number,
|
|
126
|
-
telemetryProps: ITelemetryProperties
|
|
130
|
+
telemetryProps: ITelemetryProperties,
|
|
131
|
+
fetchReason?: string) => Promise<IDeltasFetchResult>,
|
|
127
132
|
private readonly getCached: (from: number, to: number) => Promise<ISequencedDocumentMessage[]>,
|
|
128
133
|
private readonly requestFromSocket: (from: number, to: number) => void,
|
|
129
134
|
private readonly opsReceived: (ops: ISequencedDocumentMessage[]) => void,
|
|
@@ -151,7 +156,8 @@ export class OdspDeltaStorageWithCache implements IDocumentDeltaStorageService {
|
|
|
151
156
|
fromTotal: number,
|
|
152
157
|
toTotal: number | undefined,
|
|
153
158
|
abortSignal?: AbortSignal,
|
|
154
|
-
cachedOnly?: boolean
|
|
159
|
+
cachedOnly?: boolean,
|
|
160
|
+
fetchReason?: string)
|
|
155
161
|
{
|
|
156
162
|
// We do not control what's in the cache. Current API assumes that fetchMessages() keeps banging on
|
|
157
163
|
// storage / cache until it gets ops it needs. This would result in deadlock if fixed range is asked from
|
|
@@ -198,7 +204,7 @@ export class OdspDeltaStorageWithCache implements IDocumentDeltaStorageService {
|
|
|
198
204
|
return { messages: [], partialResult: false };
|
|
199
205
|
}
|
|
200
206
|
|
|
201
|
-
const ops = await this.getFromStorage(from, to, telemetryProps);
|
|
207
|
+
const ops = await this.getFromStorage(from, to, telemetryProps, fetchReason);
|
|
202
208
|
this.validateMessages("storage", ops.messages, from);
|
|
203
209
|
opsFromStorage += ops.messages.length;
|
|
204
210
|
this.opsReceived(ops.messages);
|
|
@@ -220,6 +226,7 @@ export class OdspDeltaStorageWithCache implements IDocumentDeltaStorageService {
|
|
|
220
226
|
this.batchSize,
|
|
221
227
|
this.logger,
|
|
222
228
|
abortSignal,
|
|
229
|
+
fetchReason,
|
|
223
230
|
);
|
|
224
231
|
|
|
225
232
|
return streamObserver(stream, (result) => {
|
|
@@ -20,6 +20,7 @@ import { v4 as uuid } from "uuid";
|
|
|
20
20
|
import { IOdspSocketError, IGetOpsResponse, IFlushOpsResponse } from "./contracts";
|
|
21
21
|
import { EpochTracker } from "./epochTracker";
|
|
22
22
|
import { errorObjectFromSocketError } from "./odspError";
|
|
23
|
+
import { pkgVersion } from "./packageVersion";
|
|
23
24
|
|
|
24
25
|
const protocolVersions = ["^0.4.0", "^0.3.0", "^0.2.0", "^0.1.0"];
|
|
25
26
|
const feature_get_ops = "api_get_ops";
|
|
@@ -226,6 +227,7 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
|
|
|
226
227
|
versions: protocolVersions,
|
|
227
228
|
nonce: uuid(),
|
|
228
229
|
epoch: epochTracker.fluidEpoch,
|
|
230
|
+
relayUserAgent: [client.details.environment, ` driverVersion:${pkgVersion}`].join(";"),
|
|
229
231
|
};
|
|
230
232
|
|
|
231
233
|
// Reference to this client supporting get_ops flow.
|