@fluidframework/container-loader 2.0.0-dev.2.3.0.115467 → 2.0.0-dev.4.1.0.148229

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 (168) hide show
  1. package/.eslintrc.js +18 -21
  2. package/.mocharc.js +2 -2
  3. package/README.md +65 -44
  4. package/api-extractor.json +2 -2
  5. package/closeAndGetPendingLocalState.md +51 -0
  6. package/dist/audience.d.ts +0 -1
  7. package/dist/audience.d.ts.map +1 -1
  8. package/dist/audience.js.map +1 -1
  9. package/dist/catchUpMonitor.d.ts.map +1 -1
  10. package/dist/catchUpMonitor.js.map +1 -1
  11. package/dist/collabWindowTracker.d.ts.map +1 -1
  12. package/dist/collabWindowTracker.js.map +1 -1
  13. package/dist/connectionManager.d.ts +5 -5
  14. package/dist/connectionManager.d.ts.map +1 -1
  15. package/dist/connectionManager.js +107 -44
  16. package/dist/connectionManager.js.map +1 -1
  17. package/dist/connectionState.d.ts.map +1 -1
  18. package/dist/connectionState.js.map +1 -1
  19. package/dist/connectionStateHandler.d.ts +7 -7
  20. package/dist/connectionStateHandler.d.ts.map +1 -1
  21. package/dist/connectionStateHandler.js +50 -21
  22. package/dist/connectionStateHandler.js.map +1 -1
  23. package/dist/container.d.ts +64 -5
  24. package/dist/container.d.ts.map +1 -1
  25. package/dist/container.js +329 -137
  26. package/dist/container.js.map +1 -1
  27. package/dist/containerContext.d.ts +19 -8
  28. package/dist/containerContext.d.ts.map +1 -1
  29. package/dist/containerContext.js +58 -14
  30. package/dist/containerContext.js.map +1 -1
  31. package/dist/containerStorageAdapter.d.ts +41 -2
  32. package/dist/containerStorageAdapter.d.ts.map +1 -1
  33. package/dist/containerStorageAdapter.js +88 -14
  34. package/dist/containerStorageAdapter.js.map +1 -1
  35. package/dist/contracts.d.ts +3 -3
  36. package/dist/contracts.d.ts.map +1 -1
  37. package/dist/contracts.js.map +1 -1
  38. package/dist/deltaManager.d.ts +21 -8
  39. package/dist/deltaManager.d.ts.map +1 -1
  40. package/dist/deltaManager.js +112 -37
  41. package/dist/deltaManager.js.map +1 -1
  42. package/dist/deltaManagerProxy.d.ts +10 -22
  43. package/dist/deltaManagerProxy.d.ts.map +1 -1
  44. package/dist/deltaManagerProxy.js +14 -50
  45. package/dist/deltaManagerProxy.js.map +1 -1
  46. package/dist/deltaQueue.d.ts.map +1 -1
  47. package/dist/deltaQueue.js +4 -2
  48. package/dist/deltaQueue.js.map +1 -1
  49. package/dist/index.d.ts +4 -3
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +1 -3
  52. package/dist/index.js.map +1 -1
  53. package/dist/loader.d.ts +13 -4
  54. package/dist/loader.d.ts.map +1 -1
  55. package/dist/loader.js +38 -24
  56. package/dist/loader.js.map +1 -1
  57. package/dist/packageVersion.d.ts +1 -1
  58. package/dist/packageVersion.js +1 -1
  59. package/dist/packageVersion.js.map +1 -1
  60. package/dist/protocol.d.ts.map +1 -1
  61. package/dist/protocol.js +2 -1
  62. package/dist/protocol.js.map +1 -1
  63. package/dist/protocolTreeDocumentStorageService.d.ts +6 -2
  64. package/dist/protocolTreeDocumentStorageService.d.ts.map +1 -1
  65. package/dist/protocolTreeDocumentStorageService.js +7 -4
  66. package/dist/protocolTreeDocumentStorageService.js.map +1 -1
  67. package/dist/quorum.d.ts.map +1 -1
  68. package/dist/quorum.js.map +1 -1
  69. package/dist/retriableDocumentStorageService.d.ts.map +1 -1
  70. package/dist/retriableDocumentStorageService.js +6 -2
  71. package/dist/retriableDocumentStorageService.js.map +1 -1
  72. package/dist/utils.d.ts.map +1 -1
  73. package/dist/utils.js +8 -5
  74. package/dist/utils.js.map +1 -1
  75. package/lib/audience.d.ts +0 -1
  76. package/lib/audience.d.ts.map +1 -1
  77. package/lib/audience.js.map +1 -1
  78. package/lib/catchUpMonitor.d.ts.map +1 -1
  79. package/lib/catchUpMonitor.js.map +1 -1
  80. package/lib/collabWindowTracker.d.ts.map +1 -1
  81. package/lib/collabWindowTracker.js.map +1 -1
  82. package/lib/connectionManager.d.ts +5 -5
  83. package/lib/connectionManager.d.ts.map +1 -1
  84. package/lib/connectionManager.js +110 -47
  85. package/lib/connectionManager.js.map +1 -1
  86. package/lib/connectionState.d.ts.map +1 -1
  87. package/lib/connectionState.js.map +1 -1
  88. package/lib/connectionStateHandler.d.ts +7 -7
  89. package/lib/connectionStateHandler.d.ts.map +1 -1
  90. package/lib/connectionStateHandler.js +50 -21
  91. package/lib/connectionStateHandler.js.map +1 -1
  92. package/lib/container.d.ts +64 -5
  93. package/lib/container.d.ts.map +1 -1
  94. package/lib/container.js +336 -144
  95. package/lib/container.js.map +1 -1
  96. package/lib/containerContext.d.ts +19 -8
  97. package/lib/containerContext.d.ts.map +1 -1
  98. package/lib/containerContext.js +59 -15
  99. package/lib/containerContext.js.map +1 -1
  100. package/lib/containerStorageAdapter.d.ts +41 -2
  101. package/lib/containerStorageAdapter.d.ts.map +1 -1
  102. package/lib/containerStorageAdapter.js +86 -14
  103. package/lib/containerStorageAdapter.js.map +1 -1
  104. package/lib/contracts.d.ts +3 -3
  105. package/lib/contracts.d.ts.map +1 -1
  106. package/lib/contracts.js.map +1 -1
  107. package/lib/deltaManager.d.ts +21 -8
  108. package/lib/deltaManager.d.ts.map +1 -1
  109. package/lib/deltaManager.js +114 -39
  110. package/lib/deltaManager.js.map +1 -1
  111. package/lib/deltaManagerProxy.d.ts +10 -22
  112. package/lib/deltaManagerProxy.d.ts.map +1 -1
  113. package/lib/deltaManagerProxy.js +14 -50
  114. package/lib/deltaManagerProxy.js.map +1 -1
  115. package/lib/deltaQueue.d.ts.map +1 -1
  116. package/lib/deltaQueue.js +4 -2
  117. package/lib/deltaQueue.js.map +1 -1
  118. package/lib/index.d.ts +4 -3
  119. package/lib/index.d.ts.map +1 -1
  120. package/lib/index.js +2 -2
  121. package/lib/index.js.map +1 -1
  122. package/lib/loader.d.ts +13 -4
  123. package/lib/loader.d.ts.map +1 -1
  124. package/lib/loader.js +37 -24
  125. package/lib/loader.js.map +1 -1
  126. package/lib/packageVersion.d.ts +1 -1
  127. package/lib/packageVersion.js +1 -1
  128. package/lib/packageVersion.js.map +1 -1
  129. package/lib/protocol.d.ts.map +1 -1
  130. package/lib/protocol.js +2 -1
  131. package/lib/protocol.js.map +1 -1
  132. package/lib/protocolTreeDocumentStorageService.d.ts +6 -2
  133. package/lib/protocolTreeDocumentStorageService.d.ts.map +1 -1
  134. package/lib/protocolTreeDocumentStorageService.js +7 -4
  135. package/lib/protocolTreeDocumentStorageService.js.map +1 -1
  136. package/lib/quorum.d.ts.map +1 -1
  137. package/lib/quorum.js.map +1 -1
  138. package/lib/retriableDocumentStorageService.d.ts.map +1 -1
  139. package/lib/retriableDocumentStorageService.js +6 -2
  140. package/lib/retriableDocumentStorageService.js.map +1 -1
  141. package/lib/utils.d.ts.map +1 -1
  142. package/lib/utils.js +8 -5
  143. package/lib/utils.js.map +1 -1
  144. package/package.json +67 -56
  145. package/prettier.config.cjs +1 -1
  146. package/src/audience.ts +51 -46
  147. package/src/catchUpMonitor.ts +39 -37
  148. package/src/collabWindowTracker.ts +75 -70
  149. package/src/connectionManager.ts +1040 -941
  150. package/src/connectionState.ts +19 -19
  151. package/src/connectionStateHandler.ts +557 -463
  152. package/src/container.ts +2147 -1784
  153. package/src/containerContext.ts +417 -345
  154. package/src/containerStorageAdapter.ts +268 -154
  155. package/src/contracts.ts +155 -153
  156. package/src/deltaManager.ts +1074 -945
  157. package/src/deltaManagerProxy.ts +88 -137
  158. package/src/deltaQueue.ts +155 -151
  159. package/src/index.ts +13 -17
  160. package/src/loader.ts +434 -427
  161. package/src/packageVersion.ts +1 -1
  162. package/src/protocol.ts +93 -87
  163. package/src/protocolTreeDocumentStorageService.ts +34 -34
  164. package/src/quorum.ts +34 -34
  165. package/src/retriableDocumentStorageService.ts +118 -102
  166. package/src/utils.ts +93 -83
  167. package/tsconfig.esnext.json +6 -6
  168. package/tsconfig.json +8 -12
package/src/utils.ts CHANGED
@@ -6,44 +6,45 @@
6
6
  import { parse } from "url";
7
7
  import { v4 as uuid } from "uuid";
8
8
  import {
9
- assert,
10
- stringToBuffer,
11
- Uint8ArrayToArrayBuffer,
12
- unreachableCase,
9
+ assert,
10
+ stringToBuffer,
11
+ Uint8ArrayToArrayBuffer,
12
+ unreachableCase,
13
13
  } from "@fluidframework/common-utils";
14
14
  import { ISummaryTree, ISnapshotTree, SummaryType } from "@fluidframework/protocol-definitions";
15
15
  import { LoggingError } from "@fluidframework/telemetry-utils";
16
+ import { isCombinedAppAndProtocolSummary } from "@fluidframework/driver-utils";
16
17
 
17
18
  // This is used when we rehydrate a container from the snapshot. Here we put the blob contents
18
19
  // in separate property: blobContents.
19
20
  export interface ISnapshotTreeWithBlobContents extends ISnapshotTree {
20
- blobsContents: { [path: string]: ArrayBufferLike; };
21
- trees: { [path: string]: ISnapshotTreeWithBlobContents; };
21
+ blobsContents: { [path: string]: ArrayBufferLike };
22
+ trees: { [path: string]: ISnapshotTreeWithBlobContents };
22
23
  }
23
24
 
24
25
  export interface IParsedUrl {
25
- id: string;
26
- path: string;
27
- query: string;
28
- /**
29
- * Null means do not use snapshots, undefined means load latest snapshot
30
- * otherwise it's version ID passed to IDocumentStorageService.getVersions() to figure out what snapshot to use.
31
- * If needed, can add undefined which is treated by Container.load() as load latest snapshot.
32
- */
33
- version: string | null | undefined;
26
+ id: string;
27
+ path: string;
28
+ query: string;
29
+ /**
30
+ * Null means do not use snapshots, undefined means load latest snapshot
31
+ * otherwise it's version ID passed to IDocumentStorageService.getVersions() to figure out what snapshot to use.
32
+ * If needed, can add undefined which is treated by Container.load() as load latest snapshot.
33
+ */
34
+ version: string | null | undefined;
34
35
  }
35
36
 
36
37
  export function parseUrl(url: string): IParsedUrl | undefined {
37
- const parsed = parse(url, true);
38
- if (typeof parsed.pathname !== "string") {
39
- throw new LoggingError("Failed to parse pathname");
40
- }
41
- const query = parsed.search ?? "";
42
- const regex = /^\/([^/]*\/[^/]*)(\/?.*)$/;
43
- const match = regex.exec(parsed.pathname);
44
- return (match?.length === 3)
45
- ? { id: match[1], path: match[2], query, version: parsed.query.version as string }
46
- : undefined;
38
+ const parsed = parse(url, true);
39
+ if (typeof parsed.pathname !== "string") {
40
+ throw new LoggingError("Failed to parse pathname");
41
+ }
42
+ const query = parsed.search ?? "";
43
+ const regex = /^\/([^/]*\/[^/]*)(\/?.*)$/;
44
+ const match = regex.exec(parsed.pathname);
45
+ return match?.length === 3
46
+ ? { id: match[1], path: match[2], query, version: parsed.query.version as string }
47
+ : undefined;
47
48
  }
48
49
 
49
50
  /**
@@ -57,44 +58,49 @@ export function parseUrl(url: string): IParsedUrl | undefined {
57
58
  * @param summary - summary to convert
58
59
  */
59
60
  function convertSummaryToSnapshotWithEmbeddedBlobContents(
60
- summary: ISummaryTree,
61
+ summary: ISummaryTree,
61
62
  ): ISnapshotTreeWithBlobContents {
62
- const treeNode: ISnapshotTreeWithBlobContents = {
63
- blobs: {},
64
- blobsContents: {},
65
- trees: {},
66
- id: uuid(),
67
- unreferenced: summary.unreferenced,
68
- };
69
- const keys = Object.keys(summary.tree);
70
- for (const key of keys) {
71
- const summaryObject = summary.tree[key];
63
+ const treeNode: ISnapshotTreeWithBlobContents = {
64
+ blobs: {},
65
+ blobsContents: {},
66
+ trees: {},
67
+ id: uuid(),
68
+ unreferenced: summary.unreferenced,
69
+ };
70
+ const keys = Object.keys(summary.tree);
71
+ for (const key of keys) {
72
+ const summaryObject = summary.tree[key];
72
73
 
73
- switch (summaryObject.type) {
74
- case SummaryType.Tree: {
75
- treeNode.trees[key] = convertSummaryToSnapshotWithEmbeddedBlobContents(summaryObject);
76
- break;
77
- }
78
- case SummaryType.Attachment:
79
- treeNode.blobs[key] = summaryObject.id;
80
- break;
81
- case SummaryType.Blob: {
82
- const blobId = uuid();
83
- treeNode.blobs[key] = blobId;
84
- const contentBuffer = typeof summaryObject.content === "string" ?
85
- stringToBuffer(summaryObject.content, "utf8") : Uint8ArrayToArrayBuffer(summaryObject.content);
86
- treeNode.blobsContents[blobId] = contentBuffer;
87
- break;
88
- }
89
- case SummaryType.Handle:
90
- throw new LoggingError("No handles should be there in summary in detached container!!");
91
- break;
92
- default: {
93
- unreachableCase(summaryObject, `Unknown tree type ${(summaryObject as any).type}`);
94
- }
95
- }
96
- }
97
- return treeNode;
74
+ switch (summaryObject.type) {
75
+ case SummaryType.Tree: {
76
+ treeNode.trees[key] =
77
+ convertSummaryToSnapshotWithEmbeddedBlobContents(summaryObject);
78
+ break;
79
+ }
80
+ case SummaryType.Attachment:
81
+ treeNode.blobs[key] = summaryObject.id;
82
+ break;
83
+ case SummaryType.Blob: {
84
+ const blobId = uuid();
85
+ treeNode.blobs[key] = blobId;
86
+ const contentBuffer =
87
+ typeof summaryObject.content === "string"
88
+ ? stringToBuffer(summaryObject.content, "utf8")
89
+ : Uint8ArrayToArrayBuffer(summaryObject.content);
90
+ treeNode.blobsContents[blobId] = contentBuffer;
91
+ break;
92
+ }
93
+ case SummaryType.Handle:
94
+ throw new LoggingError(
95
+ "No handles should be there in summary in detached container!!",
96
+ );
97
+ break;
98
+ default: {
99
+ unreachableCase(summaryObject, `Unknown tree type ${(summaryObject as any).type}`);
100
+ }
101
+ }
102
+ }
103
+ return treeNode;
98
104
  }
99
105
 
100
106
  /**
@@ -103,35 +109,39 @@ function convertSummaryToSnapshotWithEmbeddedBlobContents(
103
109
  * @param appSummaryTree - App Summary Tree
104
110
  */
105
111
  export function convertProtocolAndAppSummaryToSnapshotTree(
106
- protocolSummaryTree: ISummaryTree,
107
- appSummaryTree: ISummaryTree,
112
+ protocolSummaryTree: ISummaryTree,
113
+ appSummaryTree: ISummaryTree,
108
114
  ): ISnapshotTreeWithBlobContents {
109
- // Shallow copy is fine, since we are doing a deep clone below.
110
- const combinedSummary: ISummaryTree = {
111
- type: SummaryType.Tree,
112
- tree: { ...appSummaryTree.tree },
113
- };
115
+ // Shallow copy is fine, since we are doing a deep clone below.
116
+ const combinedSummary: ISummaryTree = {
117
+ type: SummaryType.Tree,
118
+ tree: { ...appSummaryTree.tree },
119
+ };
114
120
 
115
- combinedSummary.tree[".protocol"] = protocolSummaryTree;
116
- const snapshotTreeWithBlobContents =
117
- convertSummaryToSnapshotWithEmbeddedBlobContents(combinedSummary);
118
- return snapshotTreeWithBlobContents;
121
+ combinedSummary.tree[".protocol"] = protocolSummaryTree;
122
+ const snapshotTreeWithBlobContents =
123
+ convertSummaryToSnapshotWithEmbeddedBlobContents(combinedSummary);
124
+ return snapshotTreeWithBlobContents;
119
125
  }
120
126
 
121
127
  // This function converts the snapshot taken in detached container(by serialize api) to snapshotTree with which
122
128
  // a detached container can be rehydrated.
123
- export const getSnapshotTreeFromSerializedContainer = (detachedContainerSnapshot: ISummaryTree) => {
124
- const protocolSummaryTree = detachedContainerSnapshot.tree[".protocol"] as ISummaryTree;
125
- const appSummaryTree = detachedContainerSnapshot.tree[".app"] as ISummaryTree;
126
- assert(protocolSummaryTree !== undefined && appSummaryTree !== undefined,
127
- 0x1e0 /* "Protocol and App summary trees should be present" */);
128
- const snapshotTreeWithBlobContents = convertProtocolAndAppSummaryToSnapshotTree(
129
- protocolSummaryTree,
130
- appSummaryTree,
131
- );
132
- return snapshotTreeWithBlobContents;
129
+ export const getSnapshotTreeFromSerializedContainer = (
130
+ detachedContainerSnapshot: ISummaryTree,
131
+ ): ISnapshotTreeWithBlobContents => {
132
+ assert(
133
+ isCombinedAppAndProtocolSummary(detachedContainerSnapshot),
134
+ 0x1e0 /* "Protocol and App summary trees should be present" */,
135
+ );
136
+ const protocolSummaryTree = detachedContainerSnapshot.tree[".protocol"];
137
+ const appSummaryTree = detachedContainerSnapshot.tree[".app"];
138
+ const snapshotTreeWithBlobContents = convertProtocolAndAppSummaryToSnapshotTree(
139
+ protocolSummaryTree,
140
+ appSummaryTree,
141
+ );
142
+ return snapshotTreeWithBlobContents;
133
143
  };
134
144
 
135
145
  export function getProtocolSnapshotTree(snapshot: ISnapshotTree): ISnapshotTree {
136
- return ".protocol" in snapshot.trees ? snapshot.trees[".protocol"] : snapshot;
146
+ return ".protocol" in snapshot.trees ? snapshot.trees[".protocol"] : snapshot;
137
147
  }
@@ -1,7 +1,7 @@
1
1
  {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "./lib",
5
- "module": "esnext"
6
- },
7
- }
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./lib",
5
+ "module": "esnext",
6
+ },
7
+ }
package/tsconfig.json CHANGED
@@ -1,14 +1,10 @@
1
1
  {
2
- "extends": "@fluidframework/build-common/ts-common-config.json",
3
- "exclude": [
4
- "src/test/**/*"
5
- ],
6
- "compilerOptions": {
7
- "rootDir": "./src",
8
- "outDir": "./dist",
9
- "composite": true
10
- },
11
- "include": [
12
- "src/**/*"
13
- ]
2
+ "extends": "@fluidframework/build-common/ts-common-config.json",
3
+ "exclude": ["src/test/**/*"],
4
+ "compilerOptions": {
5
+ "rootDir": "./src",
6
+ "outDir": "./dist",
7
+ "composite": true,
8
+ },
9
+ "include": ["src/**/*"],
14
10
  }