@fluidframework/file-driver 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.225277

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/.eslintrc.js +6 -7
  2. package/CHANGELOG.md +117 -0
  3. package/README.md +39 -1
  4. package/api-extractor-esm.json +5 -0
  5. package/api-extractor-lint.json +4 -0
  6. package/api-extractor.json +2 -2
  7. package/api-report/file-driver.api.md +171 -0
  8. package/dist/file-driver-alpha.d.ts +51 -0
  9. package/dist/file-driver-beta.d.ts +69 -0
  10. package/dist/file-driver-public.d.ts +69 -0
  11. package/dist/file-driver-untrimmed.d.ts +209 -0
  12. package/dist/fileDeltaStorageService.d.ts +1 -0
  13. package/dist/fileDeltaStorageService.d.ts.map +1 -1
  14. package/dist/fileDeltaStorageService.js +3 -2
  15. package/dist/fileDeltaStorageService.js.map +1 -1
  16. package/dist/fileDocumentDeltaConnection.d.ts +6 -2
  17. package/dist/fileDocumentDeltaConnection.d.ts.map +1 -1
  18. package/dist/fileDocumentDeltaConnection.js +19 -18
  19. package/dist/fileDocumentDeltaConnection.js.map +1 -1
  20. package/dist/fileDocumentService.d.ts +2 -2
  21. package/dist/fileDocumentService.d.ts.map +1 -1
  22. package/dist/fileDocumentService.js +3 -5
  23. package/dist/fileDocumentService.js.map +1 -1
  24. package/dist/fileDocumentServiceFactory.d.ts +3 -3
  25. package/dist/fileDocumentServiceFactory.d.ts.map +1 -1
  26. package/dist/fileDocumentServiceFactory.js +3 -3
  27. package/dist/fileDocumentServiceFactory.js.map +1 -1
  28. package/dist/fileDocumentStorageService.d.ts +19 -3
  29. package/dist/fileDocumentStorageService.d.ts.map +1 -1
  30. package/dist/fileDocumentStorageService.js +31 -10
  31. package/dist/fileDocumentStorageService.js.map +1 -1
  32. package/dist/index.d.ts +4 -5
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +13 -15
  35. package/dist/index.js.map +1 -1
  36. package/dist/tsdoc-metadata.json +11 -0
  37. package/package.json +59 -42
  38. package/prettier.config.cjs +8 -0
  39. package/src/fileDeltaStorageService.ts +55 -51
  40. package/src/fileDocumentDeltaConnection.ts +192 -179
  41. package/src/fileDocumentService.ts +24 -28
  42. package/src/fileDocumentServiceFactory.ts +39 -34
  43. package/src/fileDocumentStorageService.ts +215 -179
  44. package/src/index.ts +11 -5
  45. package/tsconfig.json +12 -14
  46. package/dist/packageVersion.d.ts +0 -9
  47. package/dist/packageVersion.d.ts.map +0 -1
  48. package/dist/packageVersion.js +0 -12
  49. package/dist/packageVersion.js.map +0 -1
  50. package/src/packageVersion.ts +0 -9
@@ -4,7 +4,8 @@
4
4
  */
5
5
 
6
6
  import fs from "fs";
7
- import { assert, bufferToString } from "@fluidframework/common-utils";
7
+ import { bufferToString } from "@fluid-internal/client-utils";
8
+ import { assert } from "@fluidframework/core-utils";
8
9
  import { IDocumentStorageService, ISummaryContext } from "@fluidframework/driver-definitions";
9
10
  import { buildSnapshotTree, convertSummaryTreeToSnapshotITree } from "@fluidframework/driver-utils";
10
11
  import * as api from "@fluidframework/protocol-definitions";
@@ -12,6 +13,9 @@ import { IFileSnapshot, ReadDocumentStorageServiceBase } from "@fluidframework/r
12
13
 
13
14
  // This ID is used by replay tool as Document Id.
14
15
  // We leverage it to figure out when container is asking for root document tree.
16
+ /**
17
+ * @internal
18
+ */
15
19
  export const FileStorageDocumentName = "FileStorageDocId"; // Some unique document name
16
20
 
17
21
  // Tree ID use to communicate between getVersions() & getSnapshotTree() that IVersion is ours.
@@ -19,193 +23,225 @@ const FileStorageVersionTreeId = "FileStorageTreeId";
19
23
 
20
24
  /**
21
25
  * Document storage service for the file driver.
26
+ * @internal
22
27
  */
23
- export class FluidFetchReader extends ReadDocumentStorageServiceBase implements IDocumentStorageService {
24
- protected docTree: api.ISnapshotTree | null = null;
25
-
26
- constructor(private readonly path: string, private readonly versionName?: string) {
27
- super();
28
- }
29
-
30
- /**
31
- * Read the file and returns the snapshot tree.
32
- * @param version - The version contains the path of the file which contains the snapshot tree.
33
- */
34
- public async getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null> {
35
- assert(version !== null, 0x092 /* "version input for reading snapshot tree is null!" */);
36
- assert(!version || version.treeId === FileStorageVersionTreeId,
37
- 0x093 /* "invalid version input for reading snapshot tree!" */);
38
-
39
- let filename: string;
40
- let rootTree = false;
41
- if (!version || version.id === "latest") {
42
- if (this.docTree) {
43
- return this.docTree;
44
- }
45
- if (this.versionName === undefined) {
46
- return null;
47
- }
48
- rootTree = true;
49
- filename = `${this.path}/${this.versionName}/tree.json`;
50
- } else {
51
- filename = `${this.path}/${this.versionName}/${version.id}.json`;
52
- }
53
-
54
- if (!fs.existsSync(filename)) {
55
- throw new Error(`Can't find file ${filename}`);
56
- }
57
- const data = fs.readFileSync(filename);
58
- const tree = JSON.parse(data.toString("utf-8"));
59
- if (rootTree) {
60
- this.docTree = tree;
61
- }
62
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
63
- return tree;
64
- }
65
-
66
- /**
67
- * Gets the path of the snapshot tree to be read.
68
- * @param versionId - version ID.
69
- * @param count - Number of versions to be returned.
70
- */
71
- public async getVersions(versionId: string | null, count: number): Promise<api.IVersion[]> {
72
- if (versionId === FileStorageDocumentName || versionId === null) {
73
- if (this.docTree || this.versionName !== undefined) {
74
- return [{ id: "latest", treeId: FileStorageVersionTreeId }];
75
- }
76
- // Started with ops - return empty set.
77
- return [];
78
- } else if (this.versionName !== undefined) {
79
- assert(!!this.docTree, 0x094 /* "Missing snapshot tree!" */);
80
- return [{
81
- id: versionId,
82
- treeId: FileStorageVersionTreeId,
83
- }];
84
- }
85
- throw new Error(`Unknown version: ${versionId}`);
86
- }
87
-
88
- public async readBlob(sha: string): Promise<ArrayBufferLike> {
89
- if (this.versionName !== undefined) {
90
- const fileName = `${this.path}/${this.versionName}/${sha}`;
91
- if (fs.existsSync(fileName)) {
92
- const data = fs.readFileSync(fileName);
93
- return data;
94
- }
95
- }
96
- throw new Error(`Can't find blob ${sha}`);
97
- }
28
+ export class FluidFetchReader
29
+ extends ReadDocumentStorageServiceBase
30
+ implements IDocumentStorageService
31
+ {
32
+ protected docTree: api.ISnapshotTree | null = null;
33
+
34
+ constructor(
35
+ private readonly path: string,
36
+ private readonly versionName?: string,
37
+ ) {
38
+ super();
39
+ }
40
+
41
+ /**
42
+ * Read the file and returns the snapshot tree.
43
+ * @param version - The version contains the path of the file which contains the snapshot tree.
44
+ */
45
+ // eslint-disable-next-line @rushstack/no-new-null
46
+ public async getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null> {
47
+ assert(version !== null, 0x092 /* "version input for reading snapshot tree is null!" */);
48
+ assert(
49
+ !version || version.treeId === FileStorageVersionTreeId,
50
+ 0x093 /* "invalid version input for reading snapshot tree!" */,
51
+ );
52
+
53
+ let filename: string;
54
+ let rootTree = false;
55
+ if (!version || version.id === "latest") {
56
+ if (this.docTree) {
57
+ return this.docTree;
58
+ }
59
+ if (this.versionName === undefined) {
60
+ return null;
61
+ }
62
+ rootTree = true;
63
+ filename = `${this.path}/${this.versionName}/tree.json`;
64
+ } else {
65
+ filename = `${this.path}/${this.versionName}/${version.id}.json`;
66
+ }
67
+
68
+ if (!fs.existsSync(filename)) {
69
+ throw new Error(`Can't find file ${filename}`);
70
+ }
71
+ const data = fs.readFileSync(filename);
72
+ const tree = JSON.parse(data.toString("utf-8"));
73
+ if (rootTree) {
74
+ this.docTree = tree;
75
+ }
76
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
77
+ return tree;
78
+ }
79
+
80
+ /**
81
+ * Gets the path of the snapshot tree to be read.
82
+ * @param versionId - version ID.
83
+ * @param count - Number of versions to be returned.
84
+ */
85
+ // eslint-disable-next-line @rushstack/no-new-null
86
+ public async getVersions(versionId: string | null, count: number): Promise<api.IVersion[]> {
87
+ if (versionId === FileStorageDocumentName || versionId === null) {
88
+ if (this.docTree !== null || this.versionName !== undefined) {
89
+ return [{ id: "latest", treeId: FileStorageVersionTreeId }];
90
+ }
91
+ // Started with ops - return empty set.
92
+ return [];
93
+ } else if (this.versionName !== undefined) {
94
+ assert(!!this.docTree, 0x094 /* "Missing snapshot tree!" */);
95
+ return [
96
+ {
97
+ id: versionId,
98
+ treeId: FileStorageVersionTreeId,
99
+ },
100
+ ];
101
+ }
102
+ throw new Error(`Unknown version: ${versionId}`);
103
+ }
104
+
105
+ public async readBlob(sha: string): Promise<ArrayBufferLike> {
106
+ if (this.versionName !== undefined) {
107
+ const fileName = `${this.path}/${this.versionName}/${sha}`;
108
+ if (fs.existsSync(fileName)) {
109
+ const data = fs.readFileSync(fileName);
110
+ return data;
111
+ }
112
+ }
113
+ throw new Error(`Can't find blob ${sha}`);
114
+ }
98
115
  }
99
116
 
117
+ /**
118
+ * @internal
119
+ */
100
120
  export interface ISnapshotWriterStorage extends IDocumentStorageService {
101
- onSnapshotHandler(snapshot: IFileSnapshot): void;
102
- reset(): void;
121
+ onSnapshotHandler(snapshot: IFileSnapshot): void;
122
+ reset(): void;
103
123
  }
104
124
 
125
+ /**
126
+ * @internal
127
+ */
105
128
  export type ReaderConstructor = new (...args: any[]) => IDocumentStorageService;
129
+ /**
130
+ * @internal
131
+ */
106
132
  export const FileSnapshotWriterClassFactory = <TBase extends ReaderConstructor>(Base: TBase) =>
107
- class extends Base implements ISnapshotWriterStorage {
108
- // Note: if variable name has same name as in base class, it overrides it!
109
- public blobsWriter = new Map<string, ArrayBufferLike>();
110
- public latestWriterTree?: api.ISnapshotTree;
111
- public docId?: string;
112
-
113
- public reset() {
114
- this.blobsWriter = new Map<string, ArrayBufferLike>();
115
- this.latestWriterTree = undefined;
116
- this.docId = undefined;
117
- }
118
-
119
- public onSnapshotHandler(snapshot: IFileSnapshot): void {
120
- throw new Error("onSnapshotHandler is not setup! Please provide your handler!");
121
- }
122
-
123
- public async readBlob(sha: string): Promise<ArrayBufferLike> {
124
- const blob = this.blobsWriter.get(sha);
125
- if (blob !== undefined) {
126
- return blob;
127
- }
128
- return super.readBlob(sha);
129
- }
130
-
131
- public async getVersions(versionId: string | null, count: number): Promise<api.IVersion[]> {
132
- // If we already saved document, that means we are getting here because of snapshot generation.
133
- // Not returning tree ensures that ContainerRuntime.snapshot() would regenerate subtrees for
134
- // each unchanged data store.
135
- // If we want to change that, we would need to capture docId on first call and return this.latestWriterTree
136
- // when latest is requested.
137
- if (this.latestWriterTree && (this.docId === versionId || versionId === null)) {
138
- return [{ id: "latest", treeId: FileStorageVersionTreeId }];
139
- }
140
-
141
- if (this.docId === undefined && versionId !== null) {
142
- this.docId = versionId;
143
- }
144
-
145
- return super.getVersions(versionId, count);
146
- }
147
-
148
- public async getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null> {
149
- if (this.latestWriterTree && (!version || version.id === "latest")) {
150
- return this.latestWriterTree;
151
- }
152
- return super.getSnapshotTree(version);
153
- }
154
-
155
- public async uploadSummaryWithContext(summary: api.ISummaryTree, context: ISummaryContext): Promise<string> {
156
- const tree = convertSummaryTreeToSnapshotITree(summary);
157
-
158
- // Remove tree IDs for easier comparison of snapshots
159
- delete tree.id;
160
- removeNullTreeIds(tree);
161
-
162
- this.latestWriterTree = buildSnapshotTree(tree.entries, this.blobsWriter);
163
-
164
- const fileSnapshot: IFileSnapshot = { tree, commits: {} };
165
- this.onSnapshotHandler(fileSnapshot);
166
- return "testHandleId";
167
- }
168
-
169
- public async buildTree(snapshotTree: api.ISnapshotTree): Promise<api.ITree> {
170
- const tree: api.ITree = { entries: [] };
171
-
172
- for (const subTreeId of Object.keys(snapshotTree.trees)) {
173
- const subTree = await this.buildTree(snapshotTree.trees[subTreeId]);
174
- tree.entries.push({
175
- mode: api.FileMode.Directory,
176
- path: subTreeId,
177
- type: api.TreeEntry.Tree,
178
- value: subTree,
179
- });
180
- }
181
-
182
- for (const blobName of Object.keys(snapshotTree.blobs)) {
183
- const buffer = await this.readBlob(snapshotTree.blobs[blobName]);
184
- const contents = bufferToString(buffer, "utf8");
185
- const blob: api.IBlob = {
186
- contents,
187
- encoding: "utf-8",
188
- };
189
- tree.entries.push({
190
- mode: api.FileMode.File,
191
- path: blobName,
192
- type: api.TreeEntry.Blob,
193
- value: blob,
194
- });
195
- }
196
-
197
- return tree;
198
- }
199
- };
133
+ class extends Base implements ISnapshotWriterStorage {
134
+ // Note: if variable name has same name as in base class, it overrides it!
135
+ public blobsWriter = new Map<string, ArrayBufferLike>();
136
+ public latestWriterTree?: api.ISnapshotTree;
137
+ public docId?: string;
138
+
139
+ public reset() {
140
+ this.blobsWriter = new Map<string, ArrayBufferLike>();
141
+ this.latestWriterTree = undefined;
142
+ this.docId = undefined;
143
+ }
144
+
145
+ public onSnapshotHandler(snapshot: IFileSnapshot): void {
146
+ throw new Error("onSnapshotHandler is not setup! Please provide your handler!");
147
+ }
148
+
149
+ public async readBlob(sha: string): Promise<ArrayBufferLike> {
150
+ const blob = this.blobsWriter.get(sha);
151
+ if (blob !== undefined) {
152
+ return blob;
153
+ }
154
+ return super.readBlob(sha);
155
+ }
156
+
157
+ // eslint-disable-next-line @rushstack/no-new-null
158
+ public async getVersions(versionId: string | null, count: number): Promise<api.IVersion[]> {
159
+ // If we already saved document, that means we are getting here because of snapshot generation.
160
+ // Not returning tree ensures that ContainerRuntime.snapshot() would regenerate subtrees for
161
+ // each unchanged data store.
162
+ // If we want to change that, we would need to capture docId on first call and return this.latestWriterTree
163
+ // when latest is requested.
164
+ if (this.latestWriterTree && (this.docId === versionId || versionId === null)) {
165
+ return [{ id: "latest", treeId: FileStorageVersionTreeId }];
166
+ }
167
+
168
+ if (this.docId === undefined && versionId !== null) {
169
+ this.docId = versionId;
170
+ }
171
+
172
+ return super.getVersions(versionId, count);
173
+ }
174
+
175
+ // eslint-disable-next-line @rushstack/no-new-null
176
+ public async getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null> {
177
+ if (this.latestWriterTree && (!version || version.id === "latest")) {
178
+ return this.latestWriterTree;
179
+ }
180
+ return super.getSnapshotTree(version);
181
+ }
182
+
183
+ public async uploadSummaryWithContext(
184
+ summary: api.ISummaryTree,
185
+ context: ISummaryContext,
186
+ ): Promise<string> {
187
+ const tree = convertSummaryTreeToSnapshotITree(summary);
188
+
189
+ // Remove tree IDs for easier comparison of snapshots
190
+ delete tree.id;
191
+ removeNullTreeIds(tree);
192
+
193
+ this.latestWriterTree = buildSnapshotTree(tree.entries, this.blobsWriter);
194
+
195
+ const fileSnapshot: IFileSnapshot = { tree, commits: {} };
196
+ this.onSnapshotHandler(fileSnapshot);
197
+ return "testHandleId";
198
+ }
199
+
200
+ public async buildTree(snapshotTree: api.ISnapshotTree): Promise<api.ITree> {
201
+ const tree: api.ITree = { entries: [] };
202
+
203
+ for (const subTreeId of Object.keys(snapshotTree.trees)) {
204
+ const subTree = await this.buildTree(snapshotTree.trees[subTreeId]);
205
+ tree.entries.push({
206
+ mode: api.FileMode.Directory,
207
+ path: subTreeId,
208
+ type: api.TreeEntry.Tree,
209
+ value: subTree,
210
+ });
211
+ }
212
+
213
+ for (const blobName of Object.keys(snapshotTree.blobs)) {
214
+ const buffer = await this.readBlob(snapshotTree.blobs[blobName]);
215
+ const contents = bufferToString(buffer, "utf8");
216
+ const blob: api.IBlob = {
217
+ contents,
218
+ encoding: "utf-8",
219
+ };
220
+ tree.entries.push({
221
+ mode: api.FileMode.File,
222
+ path: blobName,
223
+ type: api.TreeEntry.Blob,
224
+ value: blob,
225
+ });
226
+ }
227
+
228
+ return tree;
229
+ }
230
+ };
200
231
 
201
232
  function removeNullTreeIds(tree: api.ITree) {
202
- for (const node of tree.entries) {
203
- if (node.type === api.TreeEntry.Tree) {
204
- removeNullTreeIds(node.value);
205
- }
206
- }
207
- assert(tree.id === undefined || tree.id === null,
208
- 0x096 /* "Trying to remove valid tree IDs in removeNullTreeIds()!" */);
209
- delete tree.id;
233
+ for (const node of tree.entries) {
234
+ if (node.type === api.TreeEntry.Tree) {
235
+ removeNullTreeIds(node.value);
236
+ }
237
+ }
238
+ assert(
239
+ tree.id === undefined || tree.id === null,
240
+ 0x096 /* "Trying to remove valid tree IDs in removeNullTreeIds()!" */,
241
+ );
242
+ delete tree.id;
210
243
  }
244
+ /**
245
+ * @internal
246
+ */
211
247
  export const FluidFetchReaderFileSnapshotWriter = FileSnapshotWriterClassFactory(FluidFetchReader);
package/src/index.ts CHANGED
@@ -3,8 +3,14 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- export * from "./fileDeltaStorageService";
7
- export * from "./fileDocumentService";
8
- export * from "./fileDocumentServiceFactory";
9
- export * from "./fileDocumentDeltaConnection";
10
- export * from "./fileDocumentStorageService";
6
+ export { FileDeltaStorageService } from "./fileDeltaStorageService";
7
+ export { FileDocumentServiceFactory } from "./fileDocumentServiceFactory";
8
+ export { Replayer, ReplayFileDeltaConnection } from "./fileDocumentDeltaConnection";
9
+ export {
10
+ FileSnapshotWriterClassFactory,
11
+ FileStorageDocumentName,
12
+ FluidFetchReader,
13
+ FluidFetchReaderFileSnapshotWriter,
14
+ ISnapshotWriterStorage,
15
+ ReaderConstructor,
16
+ } from "./fileDocumentStorageService";
package/tsconfig.json CHANGED
@@ -1,16 +1,14 @@
1
1
  {
2
- "extends": "@fluidframework/build-common/ts-common-config.json",
3
- "exclude": [
4
- "dist",
5
- "node_modules"
6
- ],
7
- "compilerOptions": {
8
- "rootDir": "./src",
9
- "outDir": "./dist",
10
- "types": [ "node" ],
11
- "noUnusedLocals": false
12
- },
13
- "include": [
14
- "src/**/*"
15
- ]
2
+ "extends": [
3
+ "../../../common/build/build-common/tsconfig.base.json",
4
+ "../../../common/build/build-common/tsconfig.cjs.json",
5
+ ],
6
+ "include": ["src/**/*"],
7
+ "exclude": ["dist", "node_modules"],
8
+ "compilerOptions": {
9
+ "rootDir": "./src",
10
+ "outDir": "./dist",
11
+ "types": ["node"],
12
+ "noUnusedLocals": false,
13
+ },
16
14
  }
@@ -1,9 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- *
5
- * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
- */
7
- export declare const pkgName = "@fluidframework/file-driver";
8
- export declare const pkgVersion = "1.4.0-121020";
9
- //# sourceMappingURL=packageVersion.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,gCAAgC,CAAC;AACrD,eAAO,MAAM,UAAU,iBAAiB,CAAC"}
@@ -1,12 +0,0 @@
1
- "use strict";
2
- /*!
3
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
- * Licensed under the MIT License.
5
- *
6
- * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.pkgVersion = exports.pkgName = void 0;
10
- exports.pkgName = "@fluidframework/file-driver";
11
- exports.pkgVersion = "1.4.0-121020";
12
- //# sourceMappingURL=packageVersion.js.map
@@ -1 +0,0 @@
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,cAAc,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 = \"1.4.0-121020\";\n"]}
@@ -1,9 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- *
5
- * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
- */
7
-
8
- export const pkgName = "@fluidframework/file-driver";
9
- export const pkgVersion = "1.4.0-121020";