@fluidframework/file-driver 0.59.2000-63294 → 0.59.3000-66610

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/.eslintrc.js CHANGED
@@ -9,6 +9,5 @@ module.exports = {
9
9
  ],
10
10
  "rules": {
11
11
  "@typescript-eslint/strict-boolean-expressions": "off",
12
- "no-null/no-null": "off"
13
12
  }
14
13
  }
@@ -57,7 +57,7 @@ class FileDeltaStorageService {
57
57
  return this.lastOps;
58
58
  }
59
59
  this.lastOps = this.messages.slice(readFrom, readTo);
60
- common_utils_1.assert(this.lastOps[0].sequenceNumber === readFrom + 1, 0x091 /* "Retrieved ops' first sequence number has unexpected value!" */);
60
+ (0, common_utils_1.assert)(this.lastOps[0].sequenceNumber === readFrom + 1, 0x091 /* "Retrieved ops' first sequence number has unexpected value!" */);
61
61
  return this.lastOps;
62
62
  }
63
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fileDeltaStorageService.js","sourceRoot":"","sources":["../src/fileDeltaStorageService.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,4CAAoB;AACpB,+DAAsD;AAEtD,+DAAkE;AAGlE;;GAEG;AACH,MAAa,uBAAuB;IAIhC,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QAFjC,YAAO,GAAoC,EAAE,CAAC;QAGlD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,iDAAiD;QACjD,OAAO,IAAI,EAAE;YACT,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,IAAI,aAAa,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC;YAC9E,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gBAC1B,IAAI,OAAO,KAAK,CAAC,EAAE;oBACf,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,YAAY,CAAC,CAAC;iBACjD;gBACD,MAAM;aACT;YACD,MAAM,IAAI,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzE,OAAO,EAAE,CAAC;SACb;IACL,CAAC;IAEM,aAAa,CAAC,IAAY,EAC7B,EAAsB,EACtB,WAAyB,EACzB,UAAoB;QAEpB,OAAO,iCAAkB,CAAC;IAC9B,CAAC;IAED,IAAW,GAAG;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACI,gBAAgB,CAAC,IAAY,EAAE,EAAU;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY;QAE/D,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,IAAI,QAAQ,IAAI,MAAM,EAAE;YACvE,OAAO,EAAE,CAAC;SACb;QAED,mDAAmD;QACnD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,QAAQ,GAAG,CAAC,EAAE;YAC5E,OAAO,IAAI,CAAC,OAAO,CAAC;SACvB;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrD,qBAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,QAAQ,GAAG,CAAC,EAClD,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;CACJ;AAzDD,0DAyDC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IDocumentDeltaStorageService, IStream } from \"@fluidframework/driver-definitions\";\nimport { emptyMessageStream } from \"@fluidframework/driver-utils\";\nimport * as api from \"@fluidframework/protocol-definitions\";\n\n/**\n * Provides access to the underlying delta storage on the local file storage for file driver.\n */\nexport class FileDeltaStorageService implements IDocumentDeltaStorageService {\n private readonly messages: api.ISequencedDocumentMessage[];\n private lastOps: api.ISequencedDocumentMessage[] = [];\n\n constructor(private readonly path: string) {\n this.messages = [];\n let counter = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const filename = `${this.path}//messages${counter === 0 ? \"\" : counter}.json`;\n if (!fs.existsSync(filename)) {\n if (counter === 0) {\n throw new Error(`file ${filename} not found`);\n }\n break;\n }\n const data = fs.readFileSync(filename);\n this.messages = this.messages.concat(JSON.parse(data.toString(\"utf-8\")));\n counter++;\n }\n }\n\n public fetchMessages(from: number,\n to: number | undefined,\n abortSignal?: AbortSignal,\n cachedOnly?: boolean,\n ): IStream<api.ISequencedDocumentMessage[]> {\n return emptyMessageStream;\n }\n\n public get ops(): readonly Readonly<api.ISequencedDocumentMessage>[] {\n return this.messages;\n }\n\n /**\n * Retrieve ops within the exclusive sequence number range.\n *\n * @param from - First op to be fetched.\n * @param to - Last op to be fetched. This is exclusive.\n */\n public getFromWebSocket(from: number, to: number): api.ISequencedDocumentMessage[] {\n const readFrom = Math.max(from, 0); // Inclusive\n const readTo = Math.min(to, this.messages.length); // Exclusive\n\n if (readFrom >= this.messages.length || readTo <= 0 || readFrom >= readTo) {\n return [];\n }\n\n // Optimizations for multiple readers (replay tool)\n if (this.lastOps.length > 0 && this.lastOps[0].sequenceNumber === readFrom + 1) {\n return this.lastOps;\n }\n this.lastOps = this.messages.slice(readFrom, readTo);\n assert(this.lastOps[0].sequenceNumber === readFrom + 1,\n 0x091 /* \"Retrieved ops' first sequence number has unexpected value!\" */);\n return this.lastOps;\n }\n}\n"]}
1
+ {"version":3,"file":"fileDeltaStorageService.js","sourceRoot":"","sources":["../src/fileDeltaStorageService.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,4CAAoB;AACpB,+DAAsD;AAEtD,+DAAkE;AAGlE;;GAEG;AACH,MAAa,uBAAuB;IAIhC,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QAFjC,YAAO,GAAoC,EAAE,CAAC;QAGlD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,iDAAiD;QACjD,OAAO,IAAI,EAAE;YACT,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,IAAI,aAAa,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC;YAC9E,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gBAC1B,IAAI,OAAO,KAAK,CAAC,EAAE;oBACf,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,YAAY,CAAC,CAAC;iBACjD;gBACD,MAAM;aACT;YACD,MAAM,IAAI,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzE,OAAO,EAAE,CAAC;SACb;IACL,CAAC;IAEM,aAAa,CAAC,IAAY,EAC7B,EAAsB,EACtB,WAAyB,EACzB,UAAoB;QAEpB,OAAO,iCAAkB,CAAC;IAC9B,CAAC;IAED,IAAW,GAAG;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACI,gBAAgB,CAAC,IAAY,EAAE,EAAU;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY;QAE/D,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,IAAI,QAAQ,IAAI,MAAM,EAAE;YACvE,OAAO,EAAE,CAAC;SACb;QAED,mDAAmD;QACnD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,QAAQ,GAAG,CAAC,EAAE;YAC5E,OAAO,IAAI,CAAC,OAAO,CAAC;SACvB;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrD,IAAA,qBAAM,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,QAAQ,GAAG,CAAC,EAClD,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;CACJ;AAzDD,0DAyDC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IDocumentDeltaStorageService, IStream } from \"@fluidframework/driver-definitions\";\nimport { emptyMessageStream } from \"@fluidframework/driver-utils\";\nimport * as api from \"@fluidframework/protocol-definitions\";\n\n/**\n * Provides access to the underlying delta storage on the local file storage for file driver.\n */\nexport class FileDeltaStorageService implements IDocumentDeltaStorageService {\n private readonly messages: api.ISequencedDocumentMessage[];\n private lastOps: api.ISequencedDocumentMessage[] = [];\n\n constructor(private readonly path: string) {\n this.messages = [];\n let counter = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const filename = `${this.path}//messages${counter === 0 ? \"\" : counter}.json`;\n if (!fs.existsSync(filename)) {\n if (counter === 0) {\n throw new Error(`file ${filename} not found`);\n }\n break;\n }\n const data = fs.readFileSync(filename);\n this.messages = this.messages.concat(JSON.parse(data.toString(\"utf-8\")));\n counter++;\n }\n }\n\n public fetchMessages(from: number,\n to: number | undefined,\n abortSignal?: AbortSignal,\n cachedOnly?: boolean,\n ): IStream<api.ISequencedDocumentMessage[]> {\n return emptyMessageStream;\n }\n\n public get ops(): readonly Readonly<api.ISequencedDocumentMessage>[] {\n return this.messages;\n }\n\n /**\n * Retrieve ops within the exclusive sequence number range.\n *\n * @param from - First op to be fetched.\n * @param to - Last op to be fetched. This is exclusive.\n */\n public getFromWebSocket(from: number, to: number): api.ISequencedDocumentMessage[] {\n const readFrom = Math.max(from, 0); // Inclusive\n const readTo = Math.min(to, this.messages.length); // Exclusive\n\n if (readFrom >= this.messages.length || readTo <= 0 || readFrom >= readTo) {\n return [];\n }\n\n // Optimizations for multiple readers (replay tool)\n if (this.lastOps.length > 0 && this.lastOps[0].sequenceNumber === readFrom + 1) {\n return this.lastOps;\n }\n this.lastOps = this.messages.slice(readFrom, readTo);\n assert(this.lastOps[0].sequenceNumber === readFrom + 1,\n 0x091 /* \"Retrieved ops' first sequence number has unexpected value!\" */);\n return this.lastOps;\n }\n}\n"]}
@@ -52,8 +52,8 @@ class FluidFetchReader extends replay_driver_1.ReadDocumentStorageServiceBase {
52
52
  * @param version - The version contains the path of the file which contains the snapshot tree.
53
53
  */
54
54
  async getSnapshotTree(version) {
55
- common_utils_1.assert(version !== null, 0x092 /* "version input for reading snapshot tree is null!" */);
56
- common_utils_1.assert(!version || version.treeId === FileStorageVersionTreeId, 0x093 /* "invalid version input for reading snapshot tree!" */);
55
+ (0, common_utils_1.assert)(version !== null, 0x092 /* "version input for reading snapshot tree is null!" */);
56
+ (0, common_utils_1.assert)(!version || version.treeId === FileStorageVersionTreeId, 0x093 /* "invalid version input for reading snapshot tree!" */);
57
57
  let filename;
58
58
  let rootTree = false;
59
59
  if (!version || version.id === "latest") {
@@ -94,7 +94,7 @@ class FluidFetchReader extends replay_driver_1.ReadDocumentStorageServiceBase {
94
94
  return [];
95
95
  }
96
96
  else if (this.versionName !== undefined) {
97
- common_utils_1.assert(!!this.docTree, 0x094 /* "Missing snapshot tree!" */);
97
+ (0, common_utils_1.assert)(!!this.docTree, 0x094 /* "Missing snapshot tree!" */);
98
98
  return [{
99
99
  id: versionId,
100
100
  treeId: FileStorageVersionTreeId,
@@ -156,11 +156,11 @@ const FileSnapshotWriterClassFactory = (Base) => class extends Base {
156
156
  return super.getSnapshotTree(version);
157
157
  }
158
158
  async uploadSummaryWithContext(summary, context) {
159
- const tree = driver_utils_1.convertSummaryTreeToSnapshotITree(summary);
159
+ const tree = (0, driver_utils_1.convertSummaryTreeToSnapshotITree)(summary);
160
160
  // Remove tree IDs for easier comparison of snapshots
161
161
  delete tree.id;
162
162
  removeNullTreeIds(tree);
163
- this.latestWriterTree = driver_utils_1.buildSnapshotTree(tree.entries, this.blobsWriter);
163
+ this.latestWriterTree = (0, driver_utils_1.buildSnapshotTree)(tree.entries, this.blobsWriter);
164
164
  const fileSnapshot = { tree, commits: {} };
165
165
  this.onSnapshotHandler(fileSnapshot);
166
166
  return "testHandleId";
@@ -178,7 +178,7 @@ const FileSnapshotWriterClassFactory = (Base) => class extends Base {
178
178
  }
179
179
  for (const blobName of Object.keys(snapshotTree.blobs)) {
180
180
  const buffer = await this.readBlob(snapshotTree.blobs[blobName]);
181
- const contents = common_utils_1.bufferToString(buffer, "utf8");
181
+ const contents = (0, common_utils_1.bufferToString)(buffer, "utf8");
182
182
  const blob = {
183
183
  contents,
184
184
  encoding: "utf-8",
@@ -200,8 +200,8 @@ function removeNullTreeIds(tree) {
200
200
  removeNullTreeIds(node.value);
201
201
  }
202
202
  }
203
- common_utils_1.assert(tree.id === undefined || tree.id === null, 0x096 /* "Trying to remove valid tree IDs in removeNullTreeIds()!" */);
203
+ (0, common_utils_1.assert)(tree.id === undefined || tree.id === null, 0x096 /* "Trying to remove valid tree IDs in removeNullTreeIds()!" */);
204
204
  delete tree.id;
205
205
  }
206
- exports.FluidFetchReaderFileSnapshotWriter = exports.FileSnapshotWriterClassFactory(FluidFetchReader);
206
+ exports.FluidFetchReaderFileSnapshotWriter = (0, exports.FileSnapshotWriterClassFactory)(FluidFetchReader);
207
207
  //# sourceMappingURL=fileDocumentStorageService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileDocumentStorageService.js","sourceRoot":"","sources":["../src/fileDocumentStorageService.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 fs from \"fs\";\nimport { assert, bufferToString } from \"@fluidframework/common-utils\";\nimport {\n IDocumentStorageService,\n IDocumentStorageServicePolicies, // these are needed for api-extractor\n ISummaryContext, // these are needed for api-extractor\n} from \"@fluidframework/driver-definitions\";\nimport { buildSnapshotTree, convertSummaryTreeToSnapshotITree } from \"@fluidframework/driver-utils\";\nimport * as api from \"@fluidframework/protocol-definitions\";\nimport { IFileSnapshot, ReadDocumentStorageServiceBase } from \"@fluidframework/replay-driver\";\n\n// This ID is used by replay tool as Document Id.\n// We leverage it to figure out when container is asking for root document tree.\nexport const FileStorageDocumentName = \"FileStorageDocId\"; // Some unique document name\n\n// Tree ID use to communicate between getVersions() & getSnapshotTree() that IVersion is ours.\nconst FileStorageVersionTreeId = \"FileStorageTreeId\";\n\n/**\n * Document storage service for the file driver.\n */\nexport class FluidFetchReader extends ReadDocumentStorageServiceBase implements IDocumentStorageService {\n protected docTree: api.ISnapshotTree | null = null;\n\n constructor(private readonly path: string, private readonly versionName?: string) {\n super();\n }\n\n /**\n * Read the file and returns the snapshot tree.\n * @param version - The version contains the path of the file which contains the snapshot tree.\n */\n public async getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null> {\n assert(version !== null, 0x092 /* \"version input for reading snapshot tree is null!\" */);\n assert(!version || version.treeId === FileStorageVersionTreeId,\n 0x093 /* \"invalid version input for reading snapshot tree!\" */);\n\n let filename: string;\n let rootTree = false;\n if (!version || version.id === \"latest\") {\n if (this.docTree) {\n return this.docTree;\n }\n if (this.versionName === undefined) {\n return null;\n }\n rootTree = true;\n filename = `${this.path}/${this.versionName}/tree.json`;\n } else {\n filename = `${this.path}/${this.versionName}/${version.id}.json`;\n }\n\n if (!fs.existsSync(filename)) {\n throw new Error(`Can't find file ${filename}`);\n }\n const data = fs.readFileSync(filename);\n const tree = JSON.parse(data.toString(\"utf-8\"));\n if (rootTree) {\n this.docTree = tree;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return tree;\n }\n\n /**\n * Gets the path of the snapshot tree to be read.\n * @param versionId - version ID.\n * @param count - Number of versions to be returned.\n */\n public async getVersions(versionId: string | null, count: number): Promise<api.IVersion[]> {\n if (versionId === FileStorageDocumentName || versionId === null) {\n if (this.docTree || this.versionName !== undefined) {\n return [{ id: \"latest\", treeId: FileStorageVersionTreeId }];\n }\n // Started with ops - return empty set.\n return [];\n } else if (this.versionName !== undefined) {\n assert(!!this.docTree, 0x094 /* \"Missing snapshot tree!\" */);\n return [{\n id: versionId,\n treeId: FileStorageVersionTreeId,\n }];\n }\n throw new Error(`Unknown version: ${versionId}`);\n }\n\n public async readBlob(sha: string): Promise<ArrayBufferLike> {\n if (this.versionName !== undefined) {\n const fileName = `${this.path}/${this.versionName}/${sha}`;\n if (fs.existsSync(fileName)) {\n const data = fs.readFileSync(fileName);\n return data;\n }\n }\n throw new Error(`Can't find blob ${sha}`);\n }\n}\n\nexport interface ISnapshotWriterStorage extends IDocumentStorageService {\n onSnapshotHandler(snapshot: IFileSnapshot): void;\n reset(): void;\n}\n\nexport type ReaderConstructor = new (...args: any[]) => IDocumentStorageService;\nexport const FileSnapshotWriterClassFactory = <TBase extends ReaderConstructor>(Base: TBase) =>\n class extends Base implements ISnapshotWriterStorage {\n // Note: if variable name has same name as in base class, it overrides it!\n public blobsWriter = new Map<string, ArrayBufferLike>();\n public latestWriterTree?: api.ISnapshotTree;\n public docId?: string;\n\n public reset() {\n this.blobsWriter = new Map<string, ArrayBufferLike>();\n this.latestWriterTree = undefined;\n this.docId = undefined;\n }\n\n public onSnapshotHandler(snapshot: IFileSnapshot): void {\n throw new Error(\"onSnapshotHandler is not setup! Please provide your handler!\");\n }\n\n public async readBlob(sha: string): Promise<ArrayBufferLike> {\n const blob = this.blobsWriter.get(sha);\n if (blob !== undefined) {\n return blob;\n }\n return super.readBlob(sha);\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<api.IVersion[]> {\n // If we already saved document, that means we are getting here because of snapshot generation.\n // Not returning tree ensures that ContainerRuntime.snapshot() would regenerate subtrees for\n // each unchanged data store.\n // If we want to change that, we would need to capture docId on first call and return this.latestWriterTree\n // when latest is requested.\n if (this.latestWriterTree && (this.docId === versionId || versionId === null)) {\n return [{ id: \"latest\", treeId: FileStorageVersionTreeId }];\n }\n\n if (this.docId === undefined && versionId !== null) {\n this.docId = versionId;\n }\n\n return super.getVersions(versionId, count);\n }\n\n public async getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null> {\n if (this.latestWriterTree && (!version || version.id === \"latest\")) {\n return this.latestWriterTree;\n }\n return super.getSnapshotTree(version);\n }\n\n public async uploadSummaryWithContext(summary: api.ISummaryTree, context: ISummaryContext): Promise<string> {\n const tree = convertSummaryTreeToSnapshotITree(summary);\n\n // Remove tree IDs for easier comparison of snapshots\n delete tree.id;\n removeNullTreeIds(tree);\n\n this.latestWriterTree = buildSnapshotTree(tree.entries, this.blobsWriter);\n\n const fileSnapshot: IFileSnapshot = { tree, commits: {} };\n this.onSnapshotHandler(fileSnapshot);\n return \"testHandleId\";\n }\n\n public async buildTree(snapshotTree: api.ISnapshotTree): Promise<api.ITree> {\n const tree: api.ITree = { entries: [] };\n\n for (const subTreeId of Object.keys(snapshotTree.trees)) {\n const subTree = await this.buildTree(snapshotTree.trees[subTreeId]);\n tree.entries.push({\n mode: api.FileMode.Directory,\n path: subTreeId,\n type: api.TreeEntry.Tree,\n value: subTree,\n });\n }\n\n for (const blobName of Object.keys(snapshotTree.blobs)) {\n const buffer = await this.readBlob(snapshotTree.blobs[blobName]);\n const contents = bufferToString(buffer, \"utf8\");\n const blob: api.IBlob = {\n contents,\n encoding: \"utf-8\",\n };\n tree.entries.push({\n mode: api.FileMode.File,\n path: blobName,\n type: api.TreeEntry.Blob,\n value: blob,\n });\n }\n\n return tree;\n }\n };\n\nfunction removeNullTreeIds(tree: api.ITree) {\n for (const node of tree.entries) {\n if (node.type === api.TreeEntry.Tree) {\n removeNullTreeIds(node.value);\n }\n }\n assert(tree.id === undefined || tree.id === null,\n 0x096 /* \"Trying to remove valid tree IDs in removeNullTreeIds()!\" */);\n delete tree.id;\n}\nexport const FluidFetchReaderFileSnapshotWriter = FileSnapshotWriterClassFactory(FluidFetchReader);\n"]}
1
+ {"version":3,"file":"fileDocumentStorageService.js","sourceRoot":"","sources":["../src/fileDocumentStorageService.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 fs from \"fs\";\nimport { assert, bufferToString } from \"@fluidframework/common-utils\";\nimport {\n IDocumentStorageService,\n IDocumentStorageServicePolicies, // these are needed for api-extractor\n ISummaryContext, // these are needed for api-extractor\n} from \"@fluidframework/driver-definitions\";\nimport { buildSnapshotTree, convertSummaryTreeToSnapshotITree } from \"@fluidframework/driver-utils\";\nimport * as api from \"@fluidframework/protocol-definitions\";\nimport { IFileSnapshot, ReadDocumentStorageServiceBase } from \"@fluidframework/replay-driver\";\n\n// This ID is used by replay tool as Document Id.\n// We leverage it to figure out when container is asking for root document tree.\nexport const FileStorageDocumentName = \"FileStorageDocId\"; // Some unique document name\n\n// Tree ID use to communicate between getVersions() & getSnapshotTree() that IVersion is ours.\nconst FileStorageVersionTreeId = \"FileStorageTreeId\";\n\n/**\n * Document storage service for the file driver.\n */\nexport class FluidFetchReader extends ReadDocumentStorageServiceBase implements IDocumentStorageService {\n protected docTree: api.ISnapshotTree | null = null;\n\n constructor(private readonly path: string, private readonly versionName?: string) {\n super();\n }\n\n /**\n * Read the file and returns the snapshot tree.\n * @param version - The version contains the path of the file which contains the snapshot tree.\n */\n public async getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null> {\n assert(version !== null, 0x092 /* \"version input for reading snapshot tree is null!\" */);\n assert(!version || version.treeId === FileStorageVersionTreeId,\n 0x093 /* \"invalid version input for reading snapshot tree!\" */);\n\n let filename: string;\n let rootTree = false;\n if (!version || version.id === \"latest\") {\n if (this.docTree) {\n return this.docTree;\n }\n if (this.versionName === undefined) {\n return null;\n }\n rootTree = true;\n filename = `${this.path}/${this.versionName}/tree.json`;\n } else {\n filename = `${this.path}/${this.versionName}/${version.id}.json`;\n }\n\n if (!fs.existsSync(filename)) {\n throw new Error(`Can't find file ${filename}`);\n }\n const data = fs.readFileSync(filename);\n const tree = JSON.parse(data.toString(\"utf-8\"));\n if (rootTree) {\n this.docTree = tree;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return tree;\n }\n\n /**\n * Gets the path of the snapshot tree to be read.\n * @param versionId - version ID.\n * @param count - Number of versions to be returned.\n */\n public async getVersions(versionId: string | null, count: number): Promise<api.IVersion[]> {\n if (versionId === FileStorageDocumentName || versionId === null) {\n if (this.docTree || this.versionName !== undefined) {\n return [{ id: \"latest\", treeId: FileStorageVersionTreeId }];\n }\n // Started with ops - return empty set.\n return [];\n } else if (this.versionName !== undefined) {\n assert(!!this.docTree, 0x094 /* \"Missing snapshot tree!\" */);\n return [{\n id: versionId,\n treeId: FileStorageVersionTreeId,\n }];\n }\n throw new Error(`Unknown version: ${versionId}`);\n }\n\n public async readBlob(sha: string): Promise<ArrayBufferLike> {\n if (this.versionName !== undefined) {\n const fileName = `${this.path}/${this.versionName}/${sha}`;\n if (fs.existsSync(fileName)) {\n const data = fs.readFileSync(fileName);\n return data;\n }\n }\n throw new Error(`Can't find blob ${sha}`);\n }\n}\n\nexport interface ISnapshotWriterStorage extends IDocumentStorageService {\n onSnapshotHandler(snapshot: IFileSnapshot): void;\n reset(): void;\n}\n\nexport type ReaderConstructor = new (...args: any[]) => IDocumentStorageService;\nexport const FileSnapshotWriterClassFactory = <TBase extends ReaderConstructor>(Base: TBase) =>\n class extends Base implements ISnapshotWriterStorage {\n // Note: if variable name has same name as in base class, it overrides it!\n public blobsWriter = new Map<string, ArrayBufferLike>();\n public latestWriterTree?: api.ISnapshotTree;\n public docId?: string;\n\n public reset() {\n this.blobsWriter = new Map<string, ArrayBufferLike>();\n this.latestWriterTree = undefined;\n this.docId = undefined;\n }\n\n public onSnapshotHandler(snapshot: IFileSnapshot): void {\n throw new Error(\"onSnapshotHandler is not setup! Please provide your handler!\");\n }\n\n public async readBlob(sha: string): Promise<ArrayBufferLike> {\n const blob = this.blobsWriter.get(sha);\n if (blob !== undefined) {\n return blob;\n }\n return super.readBlob(sha);\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<api.IVersion[]> {\n // If we already saved document, that means we are getting here because of snapshot generation.\n // Not returning tree ensures that ContainerRuntime.snapshot() would regenerate subtrees for\n // each unchanged data store.\n // If we want to change that, we would need to capture docId on first call and return this.latestWriterTree\n // when latest is requested.\n if (this.latestWriterTree && (this.docId === versionId || versionId === null)) {\n return [{ id: \"latest\", treeId: FileStorageVersionTreeId }];\n }\n\n if (this.docId === undefined && versionId !== null) {\n this.docId = versionId;\n }\n\n return super.getVersions(versionId, count);\n }\n\n public async getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null> {\n if (this.latestWriterTree && (!version || version.id === \"latest\")) {\n return this.latestWriterTree;\n }\n return super.getSnapshotTree(version);\n }\n\n public async uploadSummaryWithContext(summary: api.ISummaryTree, context: ISummaryContext): Promise<string> {\n const tree = convertSummaryTreeToSnapshotITree(summary);\n\n // Remove tree IDs for easier comparison of snapshots\n delete tree.id;\n removeNullTreeIds(tree);\n\n this.latestWriterTree = buildSnapshotTree(tree.entries, this.blobsWriter);\n\n const fileSnapshot: IFileSnapshot = { tree, commits: {} };\n this.onSnapshotHandler(fileSnapshot);\n return \"testHandleId\";\n }\n\n public async buildTree(snapshotTree: api.ISnapshotTree): Promise<api.ITree> {\n const tree: api.ITree = { entries: [] };\n\n for (const subTreeId of Object.keys(snapshotTree.trees)) {\n const subTree = await this.buildTree(snapshotTree.trees[subTreeId]);\n tree.entries.push({\n mode: api.FileMode.Directory,\n path: subTreeId,\n type: api.TreeEntry.Tree,\n value: subTree,\n });\n }\n\n for (const blobName of Object.keys(snapshotTree.blobs)) {\n const buffer = await this.readBlob(snapshotTree.blobs[blobName]);\n const contents = bufferToString(buffer, \"utf8\");\n const blob: api.IBlob = {\n contents,\n encoding: \"utf-8\",\n };\n tree.entries.push({\n mode: api.FileMode.File,\n path: blobName,\n type: api.TreeEntry.Blob,\n value: blob,\n });\n }\n\n return tree;\n }\n };\n\nfunction removeNullTreeIds(tree: api.ITree) {\n for (const node of tree.entries) {\n if (node.type === api.TreeEntry.Tree) {\n removeNullTreeIds(node.value);\n }\n }\n assert(tree.id === undefined || tree.id === null,\n 0x096 /* \"Trying to remove valid tree IDs in removeNullTreeIds()!\" */);\n delete tree.id;\n}\nexport const FluidFetchReaderFileSnapshotWriter = FileSnapshotWriterClassFactory(FluidFetchReader);\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/file-driver";
8
- export declare const pkgVersion = "0.59.2000-63294";
8
+ export declare const pkgVersion = "0.59.3000-66610";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -8,5 +8,5 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.pkgVersion = exports.pkgName = void 0;
10
10
  exports.pkgName = "@fluidframework/file-driver";
11
- exports.pkgVersion = "0.59.2000-63294";
11
+ exports.pkgVersion = "0.59.3000-66610";
12
12
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,6BAA6B,CAAC;AACxC,QAAA,UAAU,GAAG,iBAAiB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/file-driver\";\nexport const pkgVersion = \"0.59.2000-63294\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,6BAA6B,CAAC;AACxC,QAAA,UAAU,GAAG,iBAAiB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/file-driver\";\nexport const pkgVersion = \"0.59.3000-66610\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/file-driver",
3
- "version": "0.59.2000-63294",
3
+ "version": "0.59.3000-66610",
4
4
  "description": "A driver that reads/write from/to local file storage.",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -36,14 +36,15 @@
36
36
  "@fluidframework/common-definitions": "^0.20.1",
37
37
  "@fluidframework/common-utils": "^0.32.1",
38
38
  "@fluidframework/driver-definitions": "^0.46.1000",
39
- "@fluidframework/driver-utils": "0.59.2000-63294",
39
+ "@fluidframework/driver-utils": "0.59.3000-66610",
40
40
  "@fluidframework/protocol-definitions": "^0.1028.1000",
41
- "@fluidframework/replay-driver": "0.59.2000-63294"
41
+ "@fluidframework/replay-driver": "0.59.3000-66610"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@fluidframework/build-common": "^0.23.0",
45
- "@fluidframework/eslint-config-fluid": "^0.28.1000",
46
- "@fluidframework/file-driver-previous": "npm:@fluidframework/file-driver@0.59.1000",
45
+ "@fluidframework/build-tools": "^0.2.66048",
46
+ "@fluidframework/eslint-config-fluid": "^0.28.2000-0",
47
+ "@fluidframework/file-driver-previous": "npm:@fluidframework/file-driver@0.59.2000",
47
48
  "@microsoft/api-extractor": "^7.22.2",
48
49
  "@rushstack/eslint-config": "^2.5.1",
49
50
  "@types/node": "^14.18.0",
@@ -62,11 +63,11 @@
62
63
  "eslint-plugin-tsdoc": "~0.2.14",
63
64
  "eslint-plugin-unicorn": "~40.0.0",
64
65
  "rimraf": "^2.6.2",
65
- "typescript": "~4.1.3",
66
+ "typescript": "~4.5.5",
66
67
  "typescript-formatter": "7.1.0"
67
68
  },
68
69
  "typeValidation": {
69
- "version": "0.59.2000",
70
+ "version": "0.59.3000",
70
71
  "broken": {}
71
72
  }
72
73
  }
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/file-driver";
9
- export const pkgVersion = "0.59.2000-63294";
9
+ export const pkgVersion = "0.59.3000-66610";