@fluidframework/runtime-utils 2.0.0-internal.3.0.2 → 2.0.0-internal.3.2.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.
Files changed (96) hide show
  1. package/.eslintrc.js +5 -7
  2. package/.mocharc.js +2 -2
  3. package/api-extractor.json +2 -2
  4. package/dist/dataStoreHandleContextUtils.d.ts.map +1 -1
  5. package/dist/dataStoreHandleContextUtils.js +3 -1
  6. package/dist/dataStoreHandleContextUtils.js.map +1 -1
  7. package/dist/dataStoreHelpers.d.ts.map +1 -1
  8. package/dist/dataStoreHelpers.js +23 -7
  9. package/dist/dataStoreHelpers.js.map +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/objectstoragepartition.d.ts.map +1 -1
  14. package/dist/objectstoragepartition.js.map +1 -1
  15. package/dist/objectstorageutils.d.ts.map +1 -1
  16. package/dist/objectstorageutils.js.map +1 -1
  17. package/dist/packageVersion.d.ts +1 -1
  18. package/dist/packageVersion.js +1 -1
  19. package/dist/packageVersion.js.map +1 -1
  20. package/dist/requestParser.d.ts.map +1 -1
  21. package/dist/requestParser.js.map +1 -1
  22. package/dist/runtimeFactoryHelper.d.ts.map +1 -1
  23. package/dist/runtimeFactoryHelper.js +6 -2
  24. package/dist/runtimeFactoryHelper.js.map +1 -1
  25. package/dist/summarizerNode/summarizerNode.d.ts +25 -10
  26. package/dist/summarizerNode/summarizerNode.d.ts.map +1 -1
  27. package/dist/summarizerNode/summarizerNode.js +117 -52
  28. package/dist/summarizerNode/summarizerNode.js.map +1 -1
  29. package/dist/summarizerNode/summarizerNodeUtils.d.ts +12 -14
  30. package/dist/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  31. package/dist/summarizerNode/summarizerNodeUtils.js.map +1 -1
  32. package/dist/summarizerNode/summarizerNodeWithGc.d.ts +8 -114
  33. package/dist/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  34. package/dist/summarizerNode/summarizerNodeWithGc.js +45 -19
  35. package/dist/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  36. package/dist/summaryUtils.d.ts +2 -2
  37. package/dist/summaryUtils.d.ts.map +1 -1
  38. package/dist/summaryUtils.js +5 -4
  39. package/dist/summaryUtils.js.map +1 -1
  40. package/dist/utils.d.ts.map +1 -1
  41. package/dist/utils.js.map +1 -1
  42. package/lib/dataStoreHandleContextUtils.d.ts.map +1 -1
  43. package/lib/dataStoreHandleContextUtils.js +3 -1
  44. package/lib/dataStoreHandleContextUtils.js.map +1 -1
  45. package/lib/dataStoreHelpers.d.ts.map +1 -1
  46. package/lib/dataStoreHelpers.js +23 -7
  47. package/lib/dataStoreHelpers.js.map +1 -1
  48. package/lib/index.d.ts.map +1 -1
  49. package/lib/index.js +1 -0
  50. package/lib/index.js.map +1 -1
  51. package/lib/objectstoragepartition.d.ts.map +1 -1
  52. package/lib/objectstoragepartition.js.map +1 -1
  53. package/lib/objectstorageutils.d.ts.map +1 -1
  54. package/lib/objectstorageutils.js.map +1 -1
  55. package/lib/packageVersion.d.ts +1 -1
  56. package/lib/packageVersion.js +1 -1
  57. package/lib/packageVersion.js.map +1 -1
  58. package/lib/requestParser.d.ts.map +1 -1
  59. package/lib/requestParser.js.map +1 -1
  60. package/lib/runtimeFactoryHelper.d.ts.map +1 -1
  61. package/lib/runtimeFactoryHelper.js +6 -2
  62. package/lib/runtimeFactoryHelper.js.map +1 -1
  63. package/lib/summarizerNode/summarizerNode.d.ts +25 -10
  64. package/lib/summarizerNode/summarizerNode.d.ts.map +1 -1
  65. package/lib/summarizerNode/summarizerNode.js +117 -52
  66. package/lib/summarizerNode/summarizerNode.js.map +1 -1
  67. package/lib/summarizerNode/summarizerNodeUtils.d.ts +12 -14
  68. package/lib/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  69. package/lib/summarizerNode/summarizerNodeUtils.js.map +1 -1
  70. package/lib/summarizerNode/summarizerNodeWithGc.d.ts +8 -114
  71. package/lib/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  72. package/lib/summarizerNode/summarizerNodeWithGc.js +46 -19
  73. package/lib/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  74. package/lib/summaryUtils.d.ts +2 -2
  75. package/lib/summaryUtils.d.ts.map +1 -1
  76. package/lib/summaryUtils.js +5 -4
  77. package/lib/summaryUtils.js.map +1 -1
  78. package/lib/utils.d.ts.map +1 -1
  79. package/lib/utils.js.map +1 -1
  80. package/package.json +45 -48
  81. package/prettier.config.cjs +1 -1
  82. package/src/dataStoreHandleContextUtils.ts +23 -16
  83. package/src/dataStoreHelpers.ts +104 -86
  84. package/src/index.ts +3 -2
  85. package/src/objectstoragepartition.ts +13 -13
  86. package/src/objectstorageutils.ts +31 -28
  87. package/src/packageVersion.ts +1 -1
  88. package/src/requestParser.ts +80 -82
  89. package/src/runtimeFactoryHelper.ts +24 -17
  90. package/src/summarizerNode/summarizerNode.ts +702 -575
  91. package/src/summarizerNode/summarizerNodeUtils.ts +157 -159
  92. package/src/summarizerNode/summarizerNodeWithGc.ts +532 -473
  93. package/src/summaryUtils.ts +313 -305
  94. package/src/utils.ts +6 -6
  95. package/tsconfig.esnext.json +6 -6
  96. package/tsconfig.json +8 -12
@@ -4,11 +4,7 @@
4
4
  */
5
5
 
6
6
  import { ITelemetryLogger } from "@fluidframework/common-definitions";
7
- import {
8
- ISnapshotTree,
9
- ISummaryTree,
10
- SummaryObject,
11
- } from "@fluidframework/protocol-definitions";
7
+ import { ISnapshotTree, ISummaryTree, SummaryObject } from "@fluidframework/protocol-definitions";
12
8
  import { channelsTreeName, ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
13
9
  import { ReadAndParseBlob } from "../utils";
14
10
 
@@ -21,168 +17,170 @@ import { ReadAndParseBlob } from "../utils";
21
17
  *
22
18
  * 3. The latest summary was updated but the summary corresponding to the params was not tracked. In this case, the
23
19
  * latest snapshot is fetched and the latest summary state is updated based on it.
20
+ *
21
+ * @deprecated Internal implementation detail and will no longer be exported in an
22
+ * upcoming release.
24
23
  */
25
- export type RefreshSummaryResult = {
26
- latestSummaryUpdated: false;
27
- } | {
28
- latestSummaryUpdated: true;
29
- wasSummaryTracked: true;
30
- summaryRefSeq: number;
31
- } | {
32
- latestSummaryUpdated: true;
33
- wasSummaryTracked: false;
34
- snapshotTree: ISnapshotTree;
35
- summaryRefSeq: number;
36
- };
24
+ export type RefreshSummaryResult =
25
+ | {
26
+ latestSummaryUpdated: false;
27
+ }
28
+ | {
29
+ latestSummaryUpdated: true;
30
+ wasSummaryTracked: true;
31
+ summaryRefSeq: number;
32
+ }
33
+ | {
34
+ latestSummaryUpdated: true;
35
+ wasSummaryTracked: false;
36
+ snapshotTree: ISnapshotTree;
37
+ summaryRefSeq: number;
38
+ };
37
39
 
38
40
  /**
39
41
  * Result of snapshot fetch during refreshing latest summary state.
42
+ *
43
+ * @deprecated Internal implementation detail and will no longer be exported in an
44
+ * upcoming release.
40
45
  */
41
46
  export interface IFetchSnapshotResult {
42
- snapshotTree: ISnapshotTree;
43
- snapshotRefSeq: number;
47
+ snapshotTree: ISnapshotTree;
48
+ snapshotRefSeq: number;
44
49
  }
45
50
 
51
+ /**
52
+ * @deprecated Internal implementation detail and will no longer be exported in an
53
+ * upcoming release.
54
+ */
46
55
  export interface ISummarizerNodeRootContract {
47
- startSummary(referenceSequenceNumber: number, summaryLogger: ITelemetryLogger): void;
48
- completeSummary(proposalHandle: string): void;
49
- clearSummary(): void;
50
- refreshLatestSummary(
51
- proposalHandle: string | undefined,
52
- summaryRefSeq: number,
53
- fetchLatestSnapshot: () => Promise<IFetchSnapshotResult>,
54
- readAndParseBlob: ReadAndParseBlob,
55
- correlatedSummaryLogger: ITelemetryLogger,
56
- ): Promise<RefreshSummaryResult>;
56
+ startSummary(referenceSequenceNumber: number, summaryLogger: ITelemetryLogger): void;
57
+ completeSummary(proposalHandle: string): void;
58
+ clearSummary(): void;
59
+ refreshLatestSummary(
60
+ proposalHandle: string | undefined,
61
+ summaryRefSeq: number,
62
+ fetchLatestSnapshot: () => Promise<IFetchSnapshotResult>,
63
+ readAndParseBlob: ReadAndParseBlob,
64
+ correlatedSummaryLogger: ITelemetryLogger,
65
+ ): Promise<RefreshSummaryResult>;
57
66
  }
58
67
 
59
68
  /** Path for nodes in a tree with escaped special characters */
60
69
  export class EscapedPath {
61
- private constructor(public readonly path: string) { }
62
- public static create(path: string): EscapedPath {
63
- return new EscapedPath(encodeURIComponent(path));
64
- }
65
- public static createAndConcat(pathParts: string[]): EscapedPath {
66
- let ret = EscapedPath.create(pathParts[0] ?? "");
67
- for (let i = 1; i < pathParts.length; i++) {
68
- ret = ret.concat(EscapedPath.create(pathParts[i]));
69
- }
70
- return ret;
71
- }
72
- public toString(): string {
73
- return this.path;
74
- }
75
- public concat(path: EscapedPath): EscapedPath {
76
- return new EscapedPath(`${this.path}/${path.path}`);
77
- }
70
+ private constructor(public readonly path: string) {}
71
+ public static create(path: string): EscapedPath {
72
+ return new EscapedPath(encodeURIComponent(path));
73
+ }
74
+ public static createAndConcat(pathParts: string[]): EscapedPath {
75
+ let ret = EscapedPath.create(pathParts[0] ?? "");
76
+ for (let i = 1; i < pathParts.length; i++) {
77
+ ret = ret.concat(EscapedPath.create(pathParts[i]));
78
+ }
79
+ return ret;
80
+ }
81
+ public toString(): string {
82
+ return this.path;
83
+ }
84
+ public concat(path: EscapedPath): EscapedPath {
85
+ return new EscapedPath(`${this.path}/${path.path}`);
86
+ }
78
87
  }
79
88
 
80
89
  /** Information about a summary relevant to a specific node in the tree */
81
90
  export class SummaryNode {
82
- /** Creates an instance that is valid for the root with specific basePath and localPath */
83
- public static createForRoot(referenceSequenceNumber: number): SummaryNode {
84
- return new SummaryNode({
85
- referenceSequenceNumber,
86
- basePath: undefined,
87
- localPath: EscapedPath.create(""), // root hard-coded to ""
88
- });
89
- }
90
-
91
- /** Summary reference sequence number, i.e. last sequence number seen when it was created */
92
- public get referenceSequenceNumber(): number {
93
- return this.summary.referenceSequenceNumber;
94
- }
95
- /** Full path to parent node, or undefined if this is the root */
96
- public get basePath(): EscapedPath | undefined {
97
- return this.summary.basePath;
98
- }
99
- /** Relative path to this node from its parent node */
100
- public get localPath(): EscapedPath {
101
- return this.summary.localPath;
102
- }
103
- /** Relative path from this node to its node innermost base summary */
104
- public get additionalPath(): EscapedPath | undefined {
105
- return this.summary.additionalPath;
106
- }
107
- public set additionalPath(additionalPath: EscapedPath | undefined) {
108
- this.summary.additionalPath = additionalPath;
109
- }
110
- constructor(private readonly summary: {
111
- readonly referenceSequenceNumber: number;
112
- readonly basePath: EscapedPath | undefined;
113
- readonly localPath: EscapedPath;
114
- additionalPath?: EscapedPath;
115
- }) { }
116
-
117
- /** Gets the full path to this node, to be used when sending a handle */
118
- public get fullPath(): EscapedPath {
119
- return this.basePath?.concat(this.localPath) ?? this.localPath;
120
- }
121
-
122
- /**
123
- * Gets the full path to this node's innermost base summary.
124
- * The children nodes can use this as their basePath to determine their path.
125
- */
126
- public get fullPathForChildren(): EscapedPath {
127
- return this.additionalPath !== undefined
128
- ? this.fullPath.concat(this.additionalPath)
129
- : this.fullPath;
130
- }
131
-
132
- /**
133
- * Creates a new node within the same summary for a child of this node.
134
- * @param id - id of the child node
135
- */
136
- public createForChild(id: string): SummaryNode {
137
- return new SummaryNode({
138
- referenceSequenceNumber: this.referenceSequenceNumber,
139
- basePath: this.fullPathForChildren,
140
- localPath: EscapedPath.create(id),
141
- });
142
- }
91
+ /** Creates an instance that is valid for the root with specific basePath and localPath */
92
+ public static createForRoot(referenceSequenceNumber: number): SummaryNode {
93
+ return new SummaryNode({
94
+ referenceSequenceNumber,
95
+ basePath: undefined,
96
+ localPath: EscapedPath.create(""), // root hard-coded to ""
97
+ });
98
+ }
99
+
100
+ /** Summary reference sequence number, i.e. last sequence number seen when it was created */
101
+ public get referenceSequenceNumber(): number {
102
+ return this.summary.referenceSequenceNumber;
103
+ }
104
+ /** Full path to parent node, or undefined if this is the root */
105
+ public get basePath(): EscapedPath | undefined {
106
+ return this.summary.basePath;
107
+ }
108
+ /** Relative path to this node from its parent node */
109
+ public get localPath(): EscapedPath {
110
+ return this.summary.localPath;
111
+ }
112
+ /** Relative path from this node to its node innermost base summary */
113
+ public get additionalPath(): EscapedPath | undefined {
114
+ return this.summary.additionalPath;
115
+ }
116
+ public set additionalPath(additionalPath: EscapedPath | undefined) {
117
+ this.summary.additionalPath = additionalPath;
118
+ }
119
+ constructor(
120
+ private readonly summary: {
121
+ readonly referenceSequenceNumber: number;
122
+ readonly basePath: EscapedPath | undefined;
123
+ readonly localPath: EscapedPath;
124
+ additionalPath?: EscapedPath;
125
+ },
126
+ ) {}
127
+
128
+ /** Gets the full path to this node, to be used when sending a handle */
129
+ public get fullPath(): EscapedPath {
130
+ return this.basePath?.concat(this.localPath) ?? this.localPath;
131
+ }
132
+
133
+ /**
134
+ * Gets the full path to this node's innermost base summary.
135
+ * The children nodes can use this as their basePath to determine their path.
136
+ */
137
+ public get fullPathForChildren(): EscapedPath {
138
+ return this.additionalPath !== undefined
139
+ ? this.fullPath.concat(this.additionalPath)
140
+ : this.fullPath;
141
+ }
142
+
143
+ /**
144
+ * Creates a new node within the same summary for a child of this node.
145
+ * @param id - id of the child node
146
+ */
147
+ public createForChild(id: string): SummaryNode {
148
+ return new SummaryNode({
149
+ referenceSequenceNumber: this.referenceSequenceNumber,
150
+ basePath: this.fullPathForChildren,
151
+ localPath: EscapedPath.create(id),
152
+ });
153
+ }
143
154
  }
144
155
 
145
- /**
146
- * Parameter to help encode summary with conditional behavior.
147
- * When fromSummary is true, it will contain the SummaryNode of
148
- * its previous summary, which it can use to point to with a handle.
149
- * When fromSummary is false, it will use an actual summary tree
150
- * as its base summary in case the first summary is a differential summary.
151
- */
152
- export type EncodeSummaryParam = {
153
- fromSummary: true;
154
- summaryNode: SummaryNode;
155
- } | {
156
- fromSummary: false;
157
- initialSummary: ISummaryTreeWithStats;
158
- };
159
-
160
156
  /**
161
157
  * Information about the initial summary tree found from an attach op.
162
158
  */
163
159
  export interface IInitialSummary {
164
- sequenceNumber: number;
165
- id: string;
166
- summary: ISummaryTreeWithStats | undefined;
160
+ sequenceNumber: number;
161
+ id: string;
162
+ summary: ISummaryTreeWithStats | undefined;
167
163
  }
168
164
 
169
165
  /**
170
166
  * Represents the details needed to create a child summarizer node.
171
167
  */
172
168
  export interface ICreateChildDetails {
173
- /** Summary from attach op if known */
174
- initialSummary: IInitialSummary | undefined;
175
- /** Latest summary from server node data */
176
- latestSummary: SummaryNode | undefined;
177
- /** Sequence number of latest known change to the node */
178
- changeSequenceNumber: number;
169
+ /** Summary from attach op if known */
170
+ initialSummary: IInitialSummary | undefined;
171
+ /** Latest summary from server node data */
172
+ latestSummary: SummaryNode | undefined;
173
+ /** Sequence number of latest known change to the node */
174
+ changeSequenceNumber: number;
175
+ /** A unique id of this child to be logged when sending telemetry. */
176
+ telemetryNodeId: string;
179
177
  }
180
178
 
181
179
  export interface ISubtreeInfo<T extends ISnapshotTree | SummaryObject> {
182
- /** Tree to use to find children subtrees */
183
- childrenTree: T;
184
- /** Additional path part where children are isolated */
185
- childrenPathPart: string | undefined;
180
+ /** Tree to use to find children subtrees */
181
+ childrenTree: T;
182
+ /** Additional path part where children are isolated */
183
+ childrenPathPart: string | undefined;
186
184
  }
187
185
 
188
186
  /**
@@ -191,18 +189,18 @@ export interface ISubtreeInfo<T extends ISnapshotTree | SummaryObject> {
191
189
  * @param baseSummary - summary to check
192
190
  */
193
191
  export function parseSummaryForSubtrees(baseSummary: ISnapshotTree): ISubtreeInfo<ISnapshotTree> {
194
- // New versions of snapshots have child nodes isolated in .channels subtree
195
- const channelsSubtree = baseSummary.trees[channelsTreeName];
196
- if (channelsSubtree !== undefined) {
197
- return {
198
- childrenTree: channelsSubtree,
199
- childrenPathPart: channelsTreeName,
200
- };
201
- }
202
- return {
203
- childrenTree: baseSummary,
204
- childrenPathPart: undefined,
205
- };
192
+ // New versions of snapshots have child nodes isolated in .channels subtree
193
+ const channelsSubtree = baseSummary.trees[channelsTreeName];
194
+ if (channelsSubtree !== undefined) {
195
+ return {
196
+ childrenTree: channelsSubtree,
197
+ childrenPathPart: channelsTreeName,
198
+ };
199
+ }
200
+ return {
201
+ childrenTree: baseSummary,
202
+ childrenPathPart: undefined,
203
+ };
206
204
  }
207
205
 
208
206
  /**
@@ -211,16 +209,16 @@ export function parseSummaryForSubtrees(baseSummary: ISnapshotTree): ISubtreeInf
211
209
  * @param baseSummary - summary to check
212
210
  */
213
211
  export function parseSummaryTreeForSubtrees(summary: ISummaryTree): ISubtreeInfo<SummaryObject> {
214
- // New versions of snapshots have child nodes isolated in .channels subtree
215
- const channelsSubtree = summary.tree[channelsTreeName];
216
- if (channelsSubtree !== undefined) {
217
- return {
218
- childrenTree: channelsSubtree,
219
- childrenPathPart: channelsTreeName,
220
- };
221
- }
222
- return {
223
- childrenTree: summary,
224
- childrenPathPart: undefined,
225
- };
212
+ // New versions of snapshots have child nodes isolated in .channels subtree
213
+ const channelsSubtree = summary.tree[channelsTreeName];
214
+ if (channelsSubtree !== undefined) {
215
+ return {
216
+ childrenTree: channelsSubtree,
217
+ childrenPathPart: channelsTreeName,
218
+ };
219
+ }
220
+ return {
221
+ childrenTree: summary,
222
+ childrenPathPart: undefined,
223
+ };
226
224
  }