@fluid-tools/fetch-tool 2.118.1 → 3.0.1
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/CHANGELOG.md +15 -4
- package/README.md +14 -17
- package/dist/fluidAnalyzeMessages.d.ts.map +1 -1
- package/dist/fluidAnalyzeMessages.js +34 -44
- package/dist/fluidAnalyzeMessages.js.map +1 -1
- package/dist/fluidFetchArgs.js +3 -3
- package/dist/fluidFetchArgs.js.map +1 -1
- package/dist/fluidFetchInit.js +19 -9
- package/dist/fluidFetchInit.js.map +1 -1
- package/dist/fluidFetchMessages.js +1 -2
- package/dist/fluidFetchMessages.js.map +1 -1
- package/dist/fluidFetchSharePoint.js +4 -4
- package/dist/fluidFetchSharePoint.js.map +1 -1
- package/dist/fluidFetchSnapshot.js +1 -2
- package/dist/fluidFetchSnapshot.js.map +1 -1
- package/lib/fluidAnalyzeMessages.d.ts.map +1 -1
- package/lib/fluidAnalyzeMessages.js +32 -42
- package/lib/fluidAnalyzeMessages.js.map +1 -1
- package/package.json +19 -19
- package/tsconfig.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,23 @@
|
|
|
1
1
|
# @fluid-tools/fetch-tool
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 3.0.0
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
### Minor Changes
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- Client packages now target ES2022 ([#27846](https://github.com/microsoft/FluidFramework/pull/27846)) [91c78541bdd](https://github.com/microsoft/FluidFramework/commit/91c78541bddcbca5d6c5f357b023eeaee617d885)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
The TypeScript compilation `target` and `lib` for the Fluid Framework client packages have been raised from ES2021/ES2020 to **ES2022**.
|
|
10
|
+
The published JavaScript now uses ES2022 language features (with correspondingly less down-leveling), so consuming these packages requires a runtime that supports ES2022.
|
|
11
|
+
All actively supported Node.js versions and evergreen browsers already meet this requirement.
|
|
12
|
+
|
|
13
|
+
Note that Fluid Framework has not officially supported targets older than ES2022 since before 2.0: this is documented in [ClientRequirements.md](https://github.com/microsoft/FluidFramework/blob/main/ClientRequirements.md) as well as the README for every client package.
|
|
14
|
+
|
|
15
|
+
It is possible this change could impact users of less up to date JavaScript runtimes.
|
|
16
|
+
Impacted users can use a tool like [babel](https://babeljs.io/) to transpile out unsupported language features.
|
|
17
|
+
|
|
18
|
+
- Build with TypeScript 6 ([#28052](https://github.com/microsoft/FluidFramework/pull/28052)) [7ab015c49de](https://github.com/microsoft/FluidFramework/commit/7ab015c49deec84833cdfe1fb5e1606b901f6e81)
|
|
19
|
+
|
|
20
|
+
FluidFramework Client SDK is now built using TypeScript 6. Consumers should build with TypeScript v6 or v7 or compatible tooling.
|
|
10
21
|
|
|
11
22
|
## 2.116.0
|
|
12
23
|
|
package/README.md
CHANGED
|
@@ -9,13 +9,13 @@ Beware that to use fetch-tool on documents in the Microsoft tenant, you will nee
|
|
|
9
9
|
<!-- prettier-ignore-start -->
|
|
10
10
|
<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->
|
|
11
11
|
|
|
12
|
-
**NOTE: This package is a library
|
|
13
|
-
**
|
|
14
|
-
**We
|
|
12
|
+
**NOTE: This package is a library for use in the [microsoft/FluidFramework](https://github.com/microsoft/FluidFramework) repository.**
|
|
13
|
+
**Do not use this package as a public dependency.**
|
|
14
|
+
**We do not guarantee the stability of this package or its APIs.**
|
|
15
15
|
|
|
16
16
|
## Installation
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Run this command to install the package:
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
21
|
npm i @fluid-tools/fetch-tool -D
|
|
@@ -156,17 +156,18 @@ describe("fetch tool", () => {
|
|
|
156
156
|
|
|
157
157
|
## Contribution Guidelines
|
|
158
158
|
|
|
159
|
-
|
|
159
|
+
You can [contribute](https://github.com/microsoft/FluidFramework/blob/main/CONTRIBUTING.md) to Fluid Framework in these ways:
|
|
160
160
|
|
|
161
|
-
-
|
|
162
|
-
- [Submit
|
|
163
|
-
- Review
|
|
161
|
+
- Answer questions in [GitHub Discussions](https://github.com/microsoft/FluidFramework/discussions).
|
|
162
|
+
- [Submit bug reports](https://github.com/microsoft/FluidFramework/issues) and help verify fixes.
|
|
163
|
+
- Review [source code changes](https://github.com/microsoft/FluidFramework/pulls).
|
|
164
164
|
- [Contribute bug fixes](https://github.com/microsoft/FluidFramework/blob/main/CONTRIBUTING.md).
|
|
165
165
|
|
|
166
|
-
|
|
166
|
+
For detailed instructions, read the [repo documentation](https://github.com/microsoft/FluidFramework/blob/main/docs/content/Home.md).
|
|
167
167
|
|
|
168
|
-
This project
|
|
169
|
-
For more information
|
|
168
|
+
This project follows the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
|
|
169
|
+
For more information, read the [Code of Conduct frequently asked questions](https://opensource.microsoft.com/codeofconduct/faq/).
|
|
170
|
+
For questions or comments, contact [opencode@microsoft.com](mailto:opencode@microsoft.com).
|
|
170
171
|
|
|
171
172
|
This project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.
|
|
172
173
|
Use of these trademarks or logos must follow Microsoft’s [Trademark & Brand Guidelines](https://www.microsoft.com/trademarks).
|
|
@@ -174,13 +175,9 @@ Use of Microsoft trademarks or logos in modified versions of this project must n
|
|
|
174
175
|
|
|
175
176
|
## Help
|
|
176
177
|
|
|
177
|
-
|
|
178
|
-
Check out [fluidframework.com](https://fluidframework.com/docs/).
|
|
178
|
+
Read the [Fluid Framework documentation](https://fluidframework.com/docs/) for information about Fluid Framework concepts and APIs.
|
|
179
179
|
|
|
180
|
-
|
|
181
|
-
Please [file an issue](https://github.com/microsoft/FluidFramework/blob/main/docs/content/Contributing/Submitting-Bugs-and-Feature-Requests.md).
|
|
182
|
-
|
|
183
|
-
Thank you!
|
|
180
|
+
To request information that the documentation does not contain, [create an issue](https://github.com/microsoft/FluidFramework/blob/main/docs/content/Contributing/Submitting-Bugs-and-Feature-Requests.md).
|
|
184
181
|
|
|
185
182
|
## Trademark
|
|
186
183
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidAnalyzeMessages.d.ts","sourceRoot":"","sources":["../src/fluidAnalyzeMessages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAMN,KAAK,yBAAyB,EAC9B,MAAM,6CAA6C,CAAC;AA2DrD,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"fluidAnalyzeMessages.d.ts","sourceRoot":"","sources":["../src/fluidAnalyzeMessages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAMN,KAAK,yBAAyB,EAC9B,MAAM,6CAA6C,CAAC;AA2DrD,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,MACU,CAAC;AA+YtD,wBAAsB,iBAAiB,CACtC,SAAS,EAAE,cAAc,CAAC,yBAAyB,EAAE,CAAC,EACtD,gBAAgB,EAAE,OAAO,EACzB,YAAY,EAAE,OAAO,EACrB,iBAAiB,GAAE,GAAG,CAAC,MAAM,CAAqB,GAChD,OAAO,CAAC,IAAI,CAAC,CAwCf"}
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
7
|
+
exports.formatNumber = void 0;
|
|
8
|
+
exports.printMessageStats = printMessageStats;
|
|
8
9
|
const internal_1 = require("@fluidframework/container-runtime/internal");
|
|
9
10
|
const internal_2 = require("@fluidframework/core-utils/internal");
|
|
10
11
|
const internal_3 = require("@fluidframework/datastore/internal");
|
|
@@ -26,13 +27,15 @@ function incr(map, key, size, count = 1) {
|
|
|
26
27
|
* Helper class to track session statistics
|
|
27
28
|
*/
|
|
28
29
|
class ActiveSession {
|
|
30
|
+
email;
|
|
31
|
+
startMessage;
|
|
29
32
|
static create(email, message) {
|
|
30
33
|
return new ActiveSession(email, message);
|
|
31
34
|
}
|
|
35
|
+
opCount = 0;
|
|
32
36
|
constructor(email, startMessage) {
|
|
33
37
|
this.email = email;
|
|
34
38
|
this.startMessage = startMessage;
|
|
35
|
-
this.opCount = 0;
|
|
36
39
|
}
|
|
37
40
|
reportOp(timestamp) {
|
|
38
41
|
this.opCount++;
|
|
@@ -118,12 +121,10 @@ const getObjectId = (dataStoreId, id) => `[${dataStoreId}]/${id}`;
|
|
|
118
121
|
* Analyzer for sessions
|
|
119
122
|
*/
|
|
120
123
|
class SessionAnalyzer {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
this.first = true;
|
|
126
|
-
}
|
|
124
|
+
sessionsInProgress = new Map();
|
|
125
|
+
sessions = new Map();
|
|
126
|
+
users = new Map();
|
|
127
|
+
first = true;
|
|
127
128
|
processOp(message, msgSize, skipMessage) {
|
|
128
129
|
if (this.first) {
|
|
129
130
|
this.first = false;
|
|
@@ -165,13 +166,11 @@ class SessionAnalyzer {
|
|
|
165
166
|
* Analyzer for data structures
|
|
166
167
|
*/
|
|
167
168
|
class DataStructureAnalyzer {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
this.chunkMap = new Map();
|
|
174
|
-
}
|
|
169
|
+
messageTypeStats = new Map();
|
|
170
|
+
dataType = new Map();
|
|
171
|
+
dataTypeStats = new Map();
|
|
172
|
+
objectStats = new Map();
|
|
173
|
+
chunkMap = new Map();
|
|
175
174
|
processOp(message, msgSize, skipMessage) {
|
|
176
175
|
if (!skipMessage) {
|
|
177
176
|
processOp(message, this.dataType, this.objectStats, msgSize, this.dataTypeStats, this.messageTypeStats, this.chunkMap);
|
|
@@ -200,13 +199,11 @@ class DataStructureAnalyzer {
|
|
|
200
199
|
* Helper class to report if we filtered out any messages.
|
|
201
200
|
*/
|
|
202
201
|
class FilteredMessageAnalyzer {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
this.filtered = false;
|
|
209
|
-
}
|
|
202
|
+
sizeTotal = 0;
|
|
203
|
+
opsTotal = 0;
|
|
204
|
+
sizeFiltered = 0;
|
|
205
|
+
opsFiltered = 0;
|
|
206
|
+
filtered = false;
|
|
210
207
|
processOp(message, msgSize, skipMessage) {
|
|
211
208
|
this.sizeTotal += msgSize;
|
|
212
209
|
this.opsTotal++;
|
|
@@ -231,14 +228,12 @@ class FilteredMessageAnalyzer {
|
|
|
231
228
|
* Helper class to find places where we generated too many ops
|
|
232
229
|
*/
|
|
233
230
|
class MessageDensityAnalyzer {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
this.ranges = new Map();
|
|
241
|
-
}
|
|
231
|
+
opChunk = 1000;
|
|
232
|
+
opLimit = 1;
|
|
233
|
+
size = 0;
|
|
234
|
+
timeStart = 0;
|
|
235
|
+
doctimerStart = 0;
|
|
236
|
+
ranges = new Map();
|
|
242
237
|
processOp(message, msgSize, skipMessage) {
|
|
243
238
|
if (message.sequenceNumber >= this.opLimit) {
|
|
244
239
|
if (message.sequenceNumber !== 1) {
|
|
@@ -273,10 +268,8 @@ class MessageDensityAnalyzer {
|
|
|
273
268
|
* Helper class to analyze collab window size
|
|
274
269
|
*/
|
|
275
270
|
class CollabWindowSizeAnalyzer {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
this.opSeq = 0;
|
|
279
|
-
}
|
|
271
|
+
maxCollabWindow = 0;
|
|
272
|
+
opSeq = 0;
|
|
280
273
|
processOp(message, msgSize, skipMessage) {
|
|
281
274
|
const value = message.sequenceNumber - message.minimumSequenceNumber;
|
|
282
275
|
if (value > this.maxCollabWindow) {
|
|
@@ -292,15 +285,13 @@ class CollabWindowSizeAnalyzer {
|
|
|
292
285
|
* Helper class to analyze frequency of summaries
|
|
293
286
|
*/
|
|
294
287
|
class SummaryAnalyzer {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
this.maxResponseSeq = 0;
|
|
303
|
-
}
|
|
288
|
+
lastSummaryOp = 0;
|
|
289
|
+
maxDistance = 0;
|
|
290
|
+
maxSeq = 0;
|
|
291
|
+
minDistance = Number.MAX_SAFE_INTEGER;
|
|
292
|
+
minSeq = 0;
|
|
293
|
+
maxResponse = 0;
|
|
294
|
+
maxResponseSeq = 0;
|
|
304
295
|
processOp(message, msgSize, skipMessage) {
|
|
305
296
|
if (message.type === internal_4.MessageType.SummaryAck) {
|
|
306
297
|
const distance = message.sequenceNumber - this.lastSummaryOp - 1;
|
|
@@ -388,7 +379,6 @@ async function printMessageStats(generator, dumpMessageStats, dumpMessages, mess
|
|
|
388
379
|
}
|
|
389
380
|
console.log("");
|
|
390
381
|
}
|
|
391
|
-
exports.printMessageStats = printMessageStats;
|
|
392
382
|
function processOp(runtimeMessage, dataType, objectStats, msgSize, dataTypeStats, messageTypeStats, chunkMap) {
|
|
393
383
|
let type = runtimeMessage.type;
|
|
394
384
|
let recorded = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidAnalyzeMessages.js","sourceRoot":"","sources":["../src/fluidAnalyzeMessages.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 {\n\tContainerMessageType,\n\ttype IChunkedOp,\n\tunpackRuntimeMessage,\n} from \"@fluidframework/container-runtime/internal\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport { DataStoreMessageType } from \"@fluidframework/datastore/internal\";\nimport {\n\ttype ISummaryAck,\n\ttype ISummaryNack,\n\ttype ISummaryProposal,\n\tMessageType,\n\tTreeEntry,\n\ttype ISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport type { IAttachMessage, IEnvelope } from \"@fluidframework/runtime-definitions/internal\";\n\nconst noClientName = \"No Client\";\nconst objectTypePrefix = \"https://graph.microsoft.com/types/\";\n\nfunction incr(map: Map<string, [number, number]>, key: string, size: number, count = 1): void {\n\tconst value = map.get(key);\n\tif (value === undefined) {\n\t\tmap.set(key, [count, size]);\n\t} else {\n\t\tvalue[0] += count;\n\t\tvalue[1] += size;\n\t\tmap.set(key, value);\n\t}\n}\n\ninterface ISessionInfo {\n\tstartSeq: number;\n\topCount: number;\n\temail: string;\n\tduration: number;\n}\n\ninterface IMessageAnalyzer {\n\tprocessOp(op: ISequencedDocumentMessage, msgSize: number, filteredOutOp: boolean): void;\n\treportAnalyzes(lastOp: ISequencedDocumentMessage): void;\n}\n\n/**\n * Helper class to track session statistics\n */\nclass ActiveSession {\n\tpublic static create(email: string, message: ISequencedDocumentMessage): ActiveSession {\n\t\treturn new ActiveSession(email, message);\n\t}\n\n\tprivate opCount = 0;\n\n\tconstructor(\n\t\tprivate readonly email: string,\n\t\tprivate readonly startMessage: ISequencedDocumentMessage,\n\t) {}\n\n\tpublic reportOp(timestamp: number): void {\n\t\tthis.opCount++;\n\t}\n\n\tpublic leave(timestamp: number): ISessionInfo {\n\t\treturn {\n\t\t\topCount: this.opCount,\n\t\t\temail: this.email,\n\t\t\tstartSeq: this.startMessage.sequenceNumber,\n\t\t\tduration: timestamp - this.startMessage.timestamp,\n\t\t};\n\t}\n}\n\n// Format a number separating 3 digits by comma\nexport const formatNumber = (num: number): string =>\n\tnum.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n\nfunction dumpStats(\n\tmap: Map<string, [number, number]>,\n\tprops: {\n\t\ttitle: string;\n\t\theaders: [string, string];\n\t\tlines?: number;\n\t\torderByFirstColumn?: boolean;\n\t\treverseColumnsInUI?: boolean;\n\t\tremoveTotals?: boolean;\n\t\treverseSort?: boolean;\n\t},\n): void {\n\tconst fieldSizes = [10, 14];\n\tconst nameLength = 72;\n\tconst fieldsLength = fieldSizes[0] + fieldSizes[1] + 1;\n\tlet headers = props.headers;\n\n\tlet recordsToShow = props.lines ?? 10;\n\tif (map.size !== recordsToShow && props.removeTotals === undefined && recordsToShow > 1) {\n\t\trecordsToShow--;\n\t}\n\n\tlet sorted: [string, [number, number]][];\n\tconst sortIndex = props.orderByFirstColumn === true ? 0 : 1;\n\tlet add: string;\n\tif (props.reverseSort !== undefined) {\n\t\tsorted = [...map.entries()].sort((a, b) => a[1][sortIndex] - b[1][sortIndex]);\n\t\tadd = \"↑\";\n\t} else {\n\t\tsorted = [...map.entries()].sort((a, b) => b[1][sortIndex] - a[1][sortIndex]);\n\t\tadd = \"↓\";\n\t}\n\theaders[sortIndex] = `${headers[sortIndex]} ${add}`;\n\n\tif (props.reverseColumnsInUI !== undefined) {\n\t\theaders = [headers[1], headers[0]];\n\t\tconst sorted2: [string, [number, number]][] = [];\n\t\tfor (const [name, [count, size]] of sorted) {\n\t\t\tsorted2.push([name, [size, count]]);\n\t\t}\n\t\tsorted = sorted2;\n\t}\n\n\tlet totalCount = 0;\n\tlet sizeTotal = 0;\n\n\tprops.title = `${props.title} (${sorted.length})`;\n\tconst header0 = headers[0].padStart(fieldSizes[0]);\n\tlet overflow = header0.length - fieldSizes[0];\n\tconsole.log(\n\t\t`\\n\\n${props.title.padEnd(nameLength)} │ ${header0} ${headers[1].padStart(\n\t\t\tfieldSizes[1] - overflow,\n\t\t)}`,\n\t);\n\n\tconsole.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n\tlet index = 0;\n\tlet allOtherCount = 0;\n\tlet allOtherSize = 0;\n\tfor (const [name, [count, size]] of sorted) {\n\t\tindex++;\n\t\ttotalCount += count;\n\t\tsizeTotal += size;\n\t\tif (index <= recordsToShow) {\n\t\t\tconst item = name.padEnd(nameLength);\n\t\t\toverflow = item.length - nameLength;\n\t\t\tconst col1 = formatNumber(count).padStart(fieldSizes[0] - overflow);\n\t\t\toverflow += col1.length - fieldSizes[0];\n\t\t\tconst col2 = formatNumber(size).padStart(fieldSizes[1] - overflow);\n\t\t\tconsole.log(`${item} │ ${col1} ${col2}`);\n\t\t} else {\n\t\t\tallOtherCount += count;\n\t\t\tallOtherSize += size;\n\t\t}\n\t}\n\n\tif (props.removeTotals === undefined) {\n\t\tif (allOtherCount || allOtherSize) {\n\t\t\tconsole.log(\n\t\t\t\t`${`All Others (${sorted.length - recordsToShow})`.padEnd(\n\t\t\t\t\tnameLength,\n\t\t\t\t)} │ ${formatNumber(allOtherCount).padStart(fieldSizes[0])} ${formatNumber(\n\t\t\t\t\tallOtherSize,\n\t\t\t\t).padStart(fieldSizes[1])}`,\n\t\t\t);\n\t\t}\n\t\tconsole.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n\t\tconsole.log(\n\t\t\t`${\"Total\".padEnd(nameLength)} │ ${formatNumber(totalCount).padStart(\n\t\t\t\tfieldSizes[0],\n\t\t\t)} ${formatNumber(sizeTotal).padStart(fieldSizes[1])}`,\n\t\t);\n\t}\n}\n\nconst getObjectId = (dataStoreId: string, id: string): string => `[${dataStoreId}]/${id}`;\n\n/**\n * Analyzer for sessions\n */\nclass SessionAnalyzer implements IMessageAnalyzer {\n\tprivate readonly sessionsInProgress = new Map<string, ActiveSession>();\n\tprivate readonly sessions = new Map<string, [number, number]>();\n\tprivate readonly users = new Map<string, [number, number]>();\n\n\tprivate first = true;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (this.first) {\n\t\t\tthis.first = false;\n\t\t\t// Start of the road.\n\t\t\tconst noNameSession = ActiveSession.create(noClientName, message);\n\t\t\tthis.sessionsInProgress.set(noClientName, noNameSession);\n\t\t}\n\t\tconst session = processQuorumMessages(\n\t\t\tmessage,\n\t\t\tskipMessage,\n\t\t\tthis.sessionsInProgress,\n\t\t\tthis.sessions,\n\t\t\tthis.users,\n\t\t);\n\t\tif (!skipMessage && session) {\n\t\t\tsession.reportOp(message.timestamp);\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\t// Close any open sessions\n\t\treportOpenSessions(lastOp.timestamp, this.sessionsInProgress, this.sessions, this.users);\n\t\tdumpStats(this.users, {\n\t\t\ttitle: \"Users\",\n\t\t\theaders: [\"Sessions\", \"Op count\"],\n\t\t\treverseColumnsInUI: true,\n\t\t\tlines: 6,\n\t\t});\n\t\tdumpStats(this.sessions, {\n\t\t\ttitle: \"Sessions\",\n\t\t\theaders: [\"Duration(s)\", \"Op count\"],\n\t\t\treverseColumnsInUI: true,\n\t\t\tlines: 6,\n\t\t});\n\t\tdumpStats(this.sessions, {\n\t\t\ttitle: \"Sessions\",\n\t\t\theaders: [\"Duration(s)\", \"Op count\"],\n\t\t\torderByFirstColumn: true,\n\t\t\treverseColumnsInUI: true,\n\t\t\tremoveTotals: true,\n\t\t\tlines: 5,\n\t\t});\n\t}\n}\n\n/**\n * Analyzer for data structures\n */\nclass DataStructureAnalyzer implements IMessageAnalyzer {\n\tprivate readonly messageTypeStats = new Map<string, [number, number]>();\n\tprivate readonly dataType = new Map<string, string>();\n\tprivate readonly dataTypeStats = new Map<string, [number, number]>();\n\tprivate readonly objectStats = new Map<string, [number, number]>();\n\tprivate readonly chunkMap = new Map<string, { chunks: string[]; totalSize: number }>();\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (!skipMessage) {\n\t\t\tprocessOp(\n\t\t\t\tmessage,\n\t\t\t\tthis.dataType,\n\t\t\t\tthis.objectStats,\n\t\t\t\tmsgSize,\n\t\t\t\tthis.dataTypeStats,\n\t\t\t\tthis.messageTypeStats,\n\t\t\t\tthis.chunkMap,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tdumpStats(this.messageTypeStats, {\n\t\t\ttitle: \"Message Type\",\n\t\t\theaders: [\"Op count\", \"Bytes\"],\n\t\t\tlines: 20,\n\t\t});\n\t\tdumpStats(calcChannelStats(this.dataType, this.objectStats), {\n\t\t\ttitle: \"Channel name\",\n\t\t\theaders: [\"Op count\", \"Bytes\"],\n\t\t\tlines: 7,\n\t\t});\n\t\t/*\n dumpStats(this.dataTypeStats, {\n title: \"Channel type\",\n headers: [\"Op count\", \"Bytes\"],\n });\n */\n\t}\n}\n\n/**\n * Helper class to report if we filtered out any messages.\n */\nclass FilteredMessageAnalyzer implements IMessageAnalyzer {\n\tprivate sizeTotal = 0;\n\tprivate opsTotal = 0;\n\tprivate sizeFiltered = 0;\n\tprivate opsFiltered = 0;\n\tprivate filtered = false;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tthis.sizeTotal += msgSize;\n\t\tthis.opsTotal++;\n\t\tif (!skipMessage) {\n\t\t\tthis.sizeFiltered += msgSize;\n\t\t\tthis.opsFiltered++;\n\t\t} else {\n\t\t\tthis.filtered = true;\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tif (this.filtered) {\n\t\t\tconsole.log(\n\t\t\t\t`\\nData is filtered according to --filter:messageType argument(s):\\nOp size: ${this.sizeFiltered} / ${this.sizeTotal}\\nOp count ${this.opsFiltered} / ${this.opsTotal}`,\n\t\t\t);\n\t\t}\n\t\tif (this.opsTotal === 0) {\n\t\t\tconsole.error(\"No ops were found\");\n\t\t}\n\t}\n}\n\n/**\n * Helper class to find places where we generated too many ops\n */\nclass MessageDensityAnalyzer implements IMessageAnalyzer {\n\tprivate readonly opChunk = 1000;\n\tprivate opLimit = 1;\n\tprivate size = 0;\n\tprivate timeStart = 0;\n\tprivate doctimerStart = 0;\n\tprivate readonly ranges = new Map<string, [number, number]>();\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (message.sequenceNumber >= this.opLimit) {\n\t\t\tif (message.sequenceNumber !== 1) {\n\t\t\t\tconst timeDiff = durationFromTime(message.timestamp - this.timeStart);\n\t\t\t\tconst opsString = `ops = [${this.opLimit - this.opChunk}, ${this.opLimit - 1}]`.padEnd(\n\t\t\t\t\t26,\n\t\t\t\t);\n\t\t\t\tconst timeString = `time = [${durationFromTime(\n\t\t\t\t\tthis.timeStart - this.doctimerStart,\n\t\t\t\t)}, ${durationFromTime(message.timestamp - this.doctimerStart)}]`;\n\t\t\t\tthis.ranges.set(`${opsString} ${timeString}`, [timeDiff, this.size]);\n\t\t\t} else {\n\t\t\t\tthis.doctimerStart = message.timestamp;\n\t\t\t}\n\t\t\tthis.opLimit += this.opChunk;\n\t\t\tthis.size = 0;\n\t\t\tthis.timeStart = message.timestamp;\n\t\t}\n\t\tif (!skipMessage) {\n\t\t\tthis.size += msgSize;\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tdumpStats(this.ranges, {\n\t\t\ttitle: \"Fastest 1000 op ranges\",\n\t\t\theaders: [\"Duration(s)\", \"Bytes\"],\n\t\t\torderByFirstColumn: true,\n\t\t\treverseSort: true,\n\t\t\tremoveTotals: true,\n\t\t\tlines: 3,\n\t\t});\n\t}\n}\n\n/**\n * Helper class to analyze collab window size\n */\nclass CollabWindowSizeAnalyzer implements IMessageAnalyzer {\n\tprivate maxCollabWindow = 0;\n\tprivate opSeq = 0;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tconst value = message.sequenceNumber - message.minimumSequenceNumber;\n\t\tif (value > this.maxCollabWindow) {\n\t\t\tthis.maxCollabWindow = value;\n\t\t\tthis.opSeq = message.sequenceNumber;\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tconsole.log(`\\nMaximum collab window size: ${this.maxCollabWindow}, seq# ${this.opSeq}`);\n\t}\n}\n\n/**\n * Helper class to analyze frequency of summaries\n */\nclass SummaryAnalyzer implements IMessageAnalyzer {\n\tprivate lastSummaryOp = 0;\n\tprivate maxDistance = 0;\n\tprivate maxSeq = 0;\n\tprivate minDistance = Number.MAX_SAFE_INTEGER;\n\tprivate minSeq = 0;\n\tprivate maxResponse = 0;\n\tprivate maxResponseSeq = 0;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (message.type === MessageType.SummaryAck) {\n\t\t\tconst distance = message.sequenceNumber - this.lastSummaryOp - 1;\n\t\t\tif (this.maxDistance < distance) {\n\t\t\t\tthis.maxDistance = distance;\n\t\t\t\tthis.maxSeq = message.sequenceNumber;\n\t\t\t}\n\t\t\tif (this.minDistance > distance) {\n\t\t\t\tthis.minDistance = distance;\n\t\t\t\tthis.minSeq = message.sequenceNumber;\n\t\t\t}\n\n\t\t\tthis.lastSummaryOp = message.sequenceNumber;\n\t\t}\n\t\tif (message.type === MessageType.SummaryAck || message.type === MessageType.SummaryNack) {\n\t\t\tconst contents: ISummaryProposal = (message.contents as ISummaryAck | ISummaryNack)\n\t\t\t\t.summaryProposal;\n\t\t\tconst distance = message.sequenceNumber - contents.summarySequenceNumber;\n\t\t\tif (distance > this.maxResponse) {\n\t\t\t\tthis.maxResponse = distance;\n\t\t\t\tthis.maxResponseSeq = message.sequenceNumber;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tconst distance = lastOp.sequenceNumber - this.lastSummaryOp;\n\t\tif (this.maxDistance < distance) {\n\t\t\tthis.maxDistance = distance;\n\t\t\tthis.maxSeq = lastOp.sequenceNumber + 1;\n\t\t}\n\n\t\tconsole.log(\"\");\n\t\tif (this.minDistance === Number.MAX_SAFE_INTEGER) {\n\t\t\tconsole.log(\"No summaries found in this document\");\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t`Maximum distance between summaries: ${this.maxDistance}, seq# ${this.maxSeq}`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`Maximum server response for summary: ${this.maxResponse}, seq# ${this.maxResponseSeq}`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`Minimum distance between summaries: ${this.minDistance}, seq# ${this.minSeq}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Helper class to dump messages to console\n */\nclass MessageDumper implements IMessageAnalyzer {\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (!skipMessage) {\n\t\t\tconsole.log(JSON.stringify(message, undefined, 2));\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {}\n}\n\nexport async function printMessageStats(\n\tgenerator: AsyncGenerator<ISequencedDocumentMessage[]>,\n\tdumpMessageStats: boolean,\n\tdumpMessages: boolean,\n\tmessageTypeFilter: Set<string> = new Set<string>(),\n): Promise<void> {\n\tlet lastMessage: ISequencedDocumentMessage | undefined;\n\n\tconst analyzers: IMessageAnalyzer[] = [\n\t\tnew FilteredMessageAnalyzer(), // Should come first\n\t\tnew SessionAnalyzer(),\n\t\tnew DataStructureAnalyzer(),\n\t\tnew MessageDensityAnalyzer(),\n\t\tnew CollabWindowSizeAnalyzer(),\n\t\tnew SummaryAnalyzer(),\n\t];\n\n\tif (dumpMessages) {\n\t\tanalyzers.push(new MessageDumper());\n\t}\n\n\tfor await (const messages of generator) {\n\t\tfor (const message of messages) {\n\t\t\tconst msgSize = JSON.stringify(message).length;\n\t\t\tlastMessage = message;\n\n\t\t\tconst skipMessage = messageTypeFilter.size !== 0 && !messageTypeFilter.has(message.type);\n\n\t\t\tfor (const analyzer of analyzers) {\n\t\t\t\tanalyzer.processOp(message, msgSize, skipMessage);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (lastMessage !== undefined) {\n\t\tif (dumpMessageStats) {\n\t\t\tfor (const analyzer of analyzers) {\n\t\t\t\tanalyzer.reportAnalyzes(lastMessage);\n\t\t\t}\n\t\t} else {\n\t\t\t// Warn about filtered messages\n\t\t\tanalyzers[0].reportAnalyzes(lastMessage);\n\t\t}\n\t}\n\tconsole.log(\"\");\n}\n\nfunction processOp(\n\truntimeMessage: ISequencedDocumentMessage,\n\tdataType: Map<string, string>,\n\tobjectStats: Map<string, [number, number]>,\n\tmsgSize: number,\n\tdataTypeStats: Map<string, [number, number]>,\n\tmessageTypeStats: Map<string, [number, number]>,\n\tchunkMap: Map<string, { chunks: string[]; totalSize: number }>,\n): void {\n\tlet type = runtimeMessage.type;\n\tlet recorded = false;\n\tlet totalMsgSize = msgSize;\n\tlet opCount = 1;\n\tif (unpackRuntimeMessage(runtimeMessage)) {\n\t\tconst messageType = runtimeMessage.type as ContainerMessageType;\n\t\tswitch (messageType) {\n\t\t\tcase ContainerMessageType.Attach: {\n\t\t\t\tconst attachMessage = runtimeMessage.contents as IAttachMessage;\n\t\t\t\tprocessDataStoreAttachOp(attachMessage, dataType);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// skip for now because these ops do not have contents\n\t\t\tcase ContainerMessageType.BlobAttach: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// The default method to count stats should be used for GC messages.\n\t\t\tcase ContainerMessageType.GC: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ContainerMessageType.DocumentSchemaChange: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ContainerMessageType.ChunkedOp: {\n\t\t\t\tconst chunk = runtimeMessage.contents as IChunkedOp;\n\t\t\t\t// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)\n\n\t\t\t\tif (!chunkMap.has(runtimeMessage.clientId as string)) {\n\t\t\t\t\tchunkMap.set(runtimeMessage.clientId as string, {\n\t\t\t\t\t\tchunks: new Array<string>(chunk.totalChunks),\n\t\t\t\t\t\ttotalSize: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst value = chunkMap.get(runtimeMessage.clientId as string);\n\t\t\t\tassert(value !== undefined, 0x2b8 /* \"Chunk should be set in map\" */);\n\t\t\t\tconst chunks = value.chunks;\n\t\t\t\tconst chunkIndex = chunk.chunkId - 1;\n\t\t\t\tif (chunks[chunkIndex] !== undefined) {\n\t\t\t\t\tthrow new Error(\"Chunk already assigned\");\n\t\t\t\t}\n\t\t\t\tchunks[chunkIndex] = chunk.contents;\n\t\t\t\tvalue.totalSize += msgSize;\n\t\t\t\tif (chunk.chunkId === chunk.totalChunks) {\n\t\t\t\t\topCount = chunk.totalChunks; // 1 op for each chunk.\n\t\t\t\t\tconst patchedMessage = Object.create(runtimeMessage);\n\t\t\t\t\tpatchedMessage.contents = chunks.join(\"\");\n\t\t\t\t\ttype = (chunk as any).originalType;\n\t\t\t\t\tpatchedMessage.type = type;\n\t\t\t\t\ttotalMsgSize = value.totalSize;\n\t\t\t\t\tchunkMap.delete(patchedMessage.clientId);\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase ContainerMessageType.IdAllocation:\n\t\t\tcase ContainerMessageType.FluidDataStoreOp:\n\t\t\tcase ContainerMessageType.Alias:\n\t\t\tcase ContainerMessageType.Rejoin: {\n\t\t\t\tlet envelope = runtimeMessage.contents as IEnvelope;\n\t\t\t\t// TODO: Legacy?\n\t\t\t\tif (envelope !== undefined && typeof envelope === \"string\") {\n\t\t\t\t\tenvelope = JSON.parse(envelope);\n\t\t\t\t}\n\t\t\t\tconst innerContent = envelope.contents as {\n\t\t\t\t\tcontent: any;\n\t\t\t\t\ttype: string;\n\t\t\t\t};\n\t\t\t\tconst address = envelope.address;\n\t\t\t\ttype = `${type}/${innerContent.type}`;\n\t\t\t\tswitch (innerContent.type) {\n\t\t\t\t\tcase DataStoreMessageType.Attach: {\n\t\t\t\t\t\tconst attachMessage = innerContent.content as IAttachMessage;\n\t\t\t\t\t\tlet objectType = attachMessage.type;\n\t\t\t\t\t\tif (objectType.startsWith(objectTypePrefix)) {\n\t\t\t\t\t\t\tobjectType = objectType.substring(objectTypePrefix.length);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdataType.set(getObjectId(address, attachMessage.id), objectType);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase DataStoreMessageType.ChannelOp:\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tconst innerEnvelope = innerContent.content as IEnvelope;\n\t\t\t\t\t\tconst innerContent2 = innerEnvelope.contents as {\n\t\t\t\t\t\t\ttype?: string;\n\t\t\t\t\t\t\tvalue?: any;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst objectId = getObjectId(address, innerEnvelope.address);\n\t\t\t\t\t\tincr(objectStats, objectId, totalMsgSize, opCount);\n\t\t\t\t\t\tlet objectType = dataType.get(objectId);\n\t\t\t\t\t\tif (objectType === undefined) {\n\t\t\t\t\t\t\t// Somehow we do not have data...\n\t\t\t\t\t\t\tdataType.set(objectId, objectId);\n\t\t\t\t\t\t\tobjectType = objectId;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tincr(dataTypeStats, objectType, totalMsgSize, opCount);\n\t\t\t\t\t\trecorded = true;\n\n\t\t\t\t\t\tlet subType = innerContent2.type;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tinnerContent2.type === \"set\" &&\n\t\t\t\t\t\t\ttypeof innerContent2.value === \"object\" &&\n\t\t\t\t\t\t\tinnerContent2.value !== null\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttype = `${type}/${subType}`;\n\t\t\t\t\t\t\tsubType = innerContent2.value.type;\n\t\t\t\t\t\t} else if (objectType === \"mergeTree\" && subType !== undefined) {\n\t\t\t\t\t\t\tconst types = [\"insert\", \"remove\", \"annotate\", \"group\"];\n\t\t\t\t\t\t\tif (types[subType] !== undefined) {\n\t\t\t\t\t\t\t\tsubType = types[subType];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (subType !== undefined) {\n\t\t\t\t\t\t\ttype = `${type}/${subType}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttype = `${type} (${objectType})`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tunreachableCase(messageType, \"Message type not recognized!\");\n\t\t}\n\t}\n\n\tincr(messageTypeStats, type, totalMsgSize, opCount);\n\tif (!recorded) {\n\t\t// const objectId = `${type} (system)`;\n\t\tconst objectId = `(system messages)`;\n\t\tconst objectType = objectId;\n\t\tif (dataType.get(objectId) === undefined) {\n\t\t\tdataType.set(objectId, objectId);\n\t\t}\n\t\tincr(objectStats, objectId, totalMsgSize, opCount);\n\t\tincr(dataTypeStats, objectType, totalMsgSize, opCount);\n\t}\n}\n\nfunction processDataStoreAttachOp(\n\tattachMessage: IAttachMessage | string,\n\tdataType: Map<string, string>,\n): void {\n\t// dataType.set(getObjectId(attachMessage.id), attachMessage.type);\n\n\t// That's data store, and it brings a bunch of data structures.\n\t// Let's try to crack it.\n\tconst parsedAttachMessage =\n\t\ttypeof attachMessage === \"string\" ? JSON.parse(attachMessage) : attachMessage;\n\tfor (const entry of parsedAttachMessage.snapshot.entries) {\n\t\tif (entry.type === TreeEntry.Tree) {\n\t\t\tfor (const entry2 of entry.value.entries) {\n\t\t\t\tif (entry2.path === \".attributes\" && entry2.type === TreeEntry.Blob) {\n\t\t\t\t\tconst attrib = JSON.parse(entry2.value.contents);\n\t\t\t\t\tlet objectType: string = attrib.type;\n\t\t\t\t\tif (objectType.startsWith(objectTypePrefix)) {\n\t\t\t\t\t\tobjectType = objectType.substring(objectTypePrefix.length);\n\t\t\t\t\t}\n\t\t\t\t\tdataType.set(getObjectId(parsedAttachMessage.id, entry.path), objectType);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction reportOpenSessions(\n\tlastOpTimestamp: number,\n\tsessionsInProgress: Map<string, ActiveSession>,\n\tsessions: Map<string, [number, number]>,\n\tusers: Map<string, [number, number]>,\n): void {\n\tconst activeSessions = new Map<string, [number, number]>();\n\n\tfor (const [clientId, ses] of sessionsInProgress) {\n\t\tconst sessionInfo = ses.leave(lastOpTimestamp);\n\t\tif (clientId !== noClientName) {\n\t\t\tconst sessionName = `${clientId} (${sessionInfo.email})`;\n\t\t\tconst sessionPayload: [number, number] = [\n\t\t\t\tdurationFromTime(sessionInfo.duration),\n\t\t\t\tsessionInfo.opCount,\n\t\t\t];\n\t\t\tsessions.set(sessionName, sessionPayload);\n\t\t\tactiveSessions.set(sessionName, sessionPayload);\n\t\t} else {\n\t\t\tsessions.set(`Full file lifespan (noClient messages)`, [\n\t\t\t\tdurationFromTime(sessionInfo.duration),\n\t\t\t\tsessionInfo.opCount,\n\t\t\t]);\n\t\t}\n\t\tincr(users, sessionInfo.email, sessionInfo.opCount);\n\t}\n\n\tif (activeSessions.size > 0) {\n\t\tdumpStats(activeSessions, {\n\t\t\ttitle: \"Active sessions\",\n\t\t\theaders: [\"Duration\", \"Op count\"],\n\t\t\tlines: 6,\n\t\t\torderByFirstColumn: true,\n\t\t\tremoveTotals: true,\n\t\t});\n\t}\n}\n\nfunction calcChannelStats(\n\tdataType: Map<string, string>,\n\tobjectStats: Map<string, [number, number]>,\n): Map<string, [number, number]> {\n\tconst channelStats = new Map<string, [number, number]>();\n\tfor (const [objectId, type] of dataType) {\n\t\tlet value = objectStats.get(objectId);\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (value === undefined) {\n\t\t\tvalue = [0, 0];\n\t\t}\n\t\tif (type === objectId) {\n\t\t\tchannelStats.set(`${objectId}`, value);\n\t\t} else {\n\t\t\tchannelStats.set(`${objectId} (${type})`, value);\n\t\t}\n\t}\n\treturn channelStats;\n}\n\nfunction processQuorumMessages(\n\tmessage: ISequencedDocumentMessage,\n\tskipMessage: boolean,\n\tsessionsInProgress: Map<string, ActiveSession>,\n\tsessions: Map<string, [number, number]>,\n\tusers: Map<string, [number, number]>,\n): ActiveSession | undefined {\n\tlet session: ActiveSession | undefined;\n\tconst dataString = (message as any).data;\n\tif (message.type === \"join\") {\n\t\tconst data = JSON.parse(dataString);\n\t\tsession = ActiveSession.create(data.detail.user.id, message);\n\t\tsessionsInProgress.set(data.clientId, session);\n\t} else if (message.type === \"leave\") {\n\t\tconst clientId = JSON.parse(dataString);\n\t\tsession = sessionsInProgress.get(clientId);\n\t\tsessionsInProgress.delete(clientId);\n\t\tassert(!!session, 0x1b7 /* \"Bad session state for processing quorum messages\" */);\n\t\tif (session !== undefined) {\n\t\t\tif (!skipMessage) {\n\t\t\t\tsession.reportOp(message.timestamp);\n\t\t\t}\n\t\t\tconst sessionInfo: ISessionInfo = session.leave(message.timestamp);\n\t\t\tsessions.set(`${clientId} (${sessionInfo.email})`, [\n\t\t\t\tdurationFromTime(sessionInfo.duration),\n\t\t\t\tsessionInfo.opCount,\n\t\t\t]);\n\t\t\tincr(users, sessionInfo.email, sessionInfo.opCount);\n\t\t\tsession = undefined; // Do not record it second time\n\t\t}\n\t} else {\n\t\t// message.clientId can be null\n\t\t// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)\n\n\t\tsession = sessionsInProgress.get(message.clientId as string);\n\t\tif (session === undefined) {\n\t\t\tsession = sessionsInProgress.get(noClientName);\n\t\t\tassert(!!session, 0x1b8 /* \"Bad session state for processing quorum messages\" */);\n\t\t}\n\t}\n\treturn session;\n}\n\nconst durationFromTime = (time: number): number => Math.floor(time / 1000);\n"]}
|
|
1
|
+
{"version":3,"file":"fluidAnalyzeMessages.js","sourceRoot":"","sources":["../src/fluidAnalyzeMessages.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 {\n\tContainerMessageType,\n\ttype IChunkedOp,\n\tunpackRuntimeMessage,\n} from \"@fluidframework/container-runtime/internal\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport { DataStoreMessageType } from \"@fluidframework/datastore/internal\";\nimport {\n\ttype ISummaryAck,\n\ttype ISummaryNack,\n\ttype ISummaryProposal,\n\tMessageType,\n\tTreeEntry,\n\ttype ISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport type { IAttachMessage, IEnvelope } from \"@fluidframework/runtime-definitions/internal\";\n\nconst noClientName = \"No Client\";\nconst objectTypePrefix = \"https://graph.microsoft.com/types/\";\n\nfunction incr(map: Map<string, [number, number]>, key: string, size: number, count = 1): void {\n\tconst value = map.get(key);\n\tif (value === undefined) {\n\t\tmap.set(key, [count, size]);\n\t} else {\n\t\tvalue[0] += count;\n\t\tvalue[1] += size;\n\t\tmap.set(key, value);\n\t}\n}\n\ninterface ISessionInfo {\n\tstartSeq: number;\n\topCount: number;\n\temail: string;\n\tduration: number;\n}\n\ninterface IMessageAnalyzer {\n\tprocessOp(op: ISequencedDocumentMessage, msgSize: number, filteredOutOp: boolean): void;\n\treportAnalyzes(lastOp: ISequencedDocumentMessage): void;\n}\n\n/**\n * Helper class to track session statistics\n */\nclass ActiveSession {\n\tpublic static create(email: string, message: ISequencedDocumentMessage): ActiveSession {\n\t\treturn new ActiveSession(email, message);\n\t}\n\n\tprivate opCount = 0;\n\n\tconstructor(\n\t\tprivate readonly email: string,\n\t\tprivate readonly startMessage: ISequencedDocumentMessage,\n\t) {}\n\n\tpublic reportOp(timestamp: number): void {\n\t\tthis.opCount++;\n\t}\n\n\tpublic leave(timestamp: number): ISessionInfo {\n\t\treturn {\n\t\t\topCount: this.opCount,\n\t\t\temail: this.email,\n\t\t\tstartSeq: this.startMessage.sequenceNumber,\n\t\t\tduration: timestamp - this.startMessage.timestamp,\n\t\t};\n\t}\n}\n\n// Format a number separating 3 digits by comma\nexport const formatNumber = (num: number): string =>\n\tnum.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n\nfunction dumpStats(\n\tmap: Map<string, [number, number]>,\n\tprops: {\n\t\ttitle: string;\n\t\theaders: [string, string];\n\t\tlines?: number;\n\t\torderByFirstColumn?: boolean;\n\t\treverseColumnsInUI?: boolean;\n\t\tremoveTotals?: boolean;\n\t\treverseSort?: boolean;\n\t},\n): void {\n\tconst fieldSizes = [10, 14];\n\tconst nameLength = 72;\n\tconst fieldsLength = fieldSizes[0] + fieldSizes[1] + 1;\n\tlet headers = props.headers;\n\n\tlet recordsToShow = props.lines ?? 10;\n\tif (map.size !== recordsToShow && props.removeTotals === undefined && recordsToShow > 1) {\n\t\trecordsToShow--;\n\t}\n\n\tlet sorted: [string, [number, number]][];\n\tconst sortIndex = props.orderByFirstColumn === true ? 0 : 1;\n\tlet add: string;\n\tif (props.reverseSort !== undefined) {\n\t\tsorted = [...map.entries()].sort((a, b) => a[1][sortIndex] - b[1][sortIndex]);\n\t\tadd = \"↑\";\n\t} else {\n\t\tsorted = [...map.entries()].sort((a, b) => b[1][sortIndex] - a[1][sortIndex]);\n\t\tadd = \"↓\";\n\t}\n\theaders[sortIndex] = `${headers[sortIndex]} ${add}`;\n\n\tif (props.reverseColumnsInUI !== undefined) {\n\t\theaders = [headers[1], headers[0]];\n\t\tconst sorted2: [string, [number, number]][] = [];\n\t\tfor (const [name, [count, size]] of sorted) {\n\t\t\tsorted2.push([name, [size, count]]);\n\t\t}\n\t\tsorted = sorted2;\n\t}\n\n\tlet totalCount = 0;\n\tlet sizeTotal = 0;\n\n\tprops.title = `${props.title} (${sorted.length})`;\n\tconst header0 = headers[0].padStart(fieldSizes[0]);\n\tlet overflow = header0.length - fieldSizes[0];\n\tconsole.log(\n\t\t`\\n\\n${props.title.padEnd(nameLength)} │ ${header0} ${headers[1].padStart(\n\t\t\tfieldSizes[1] - overflow,\n\t\t)}`,\n\t);\n\n\tconsole.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n\tlet index = 0;\n\tlet allOtherCount = 0;\n\tlet allOtherSize = 0;\n\tfor (const [name, [count, size]] of sorted) {\n\t\tindex++;\n\t\ttotalCount += count;\n\t\tsizeTotal += size;\n\t\tif (index <= recordsToShow) {\n\t\t\tconst item = name.padEnd(nameLength);\n\t\t\toverflow = item.length - nameLength;\n\t\t\tconst col1 = formatNumber(count).padStart(fieldSizes[0] - overflow);\n\t\t\toverflow += col1.length - fieldSizes[0];\n\t\t\tconst col2 = formatNumber(size).padStart(fieldSizes[1] - overflow);\n\t\t\tconsole.log(`${item} │ ${col1} ${col2}`);\n\t\t} else {\n\t\t\tallOtherCount += count;\n\t\t\tallOtherSize += size;\n\t\t}\n\t}\n\n\tif (props.removeTotals === undefined) {\n\t\tif (allOtherCount || allOtherSize) {\n\t\t\tconsole.log(\n\t\t\t\t`${`All Others (${sorted.length - recordsToShow})`.padEnd(\n\t\t\t\t\tnameLength,\n\t\t\t\t)} │ ${formatNumber(allOtherCount).padStart(fieldSizes[0])} ${formatNumber(\n\t\t\t\t\tallOtherSize,\n\t\t\t\t).padStart(fieldSizes[1])}`,\n\t\t\t);\n\t\t}\n\t\tconsole.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n\t\tconsole.log(\n\t\t\t`${\"Total\".padEnd(nameLength)} │ ${formatNumber(totalCount).padStart(\n\t\t\t\tfieldSizes[0],\n\t\t\t)} ${formatNumber(sizeTotal).padStart(fieldSizes[1])}`,\n\t\t);\n\t}\n}\n\nconst getObjectId = (dataStoreId: string, id: string): string => `[${dataStoreId}]/${id}`;\n\n/**\n * Analyzer for sessions\n */\nclass SessionAnalyzer implements IMessageAnalyzer {\n\tprivate readonly sessionsInProgress = new Map<string, ActiveSession>();\n\tprivate readonly sessions = new Map<string, [number, number]>();\n\tprivate readonly users = new Map<string, [number, number]>();\n\n\tprivate first = true;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (this.first) {\n\t\t\tthis.first = false;\n\t\t\t// Start of the road.\n\t\t\tconst noNameSession = ActiveSession.create(noClientName, message);\n\t\t\tthis.sessionsInProgress.set(noClientName, noNameSession);\n\t\t}\n\t\tconst session = processQuorumMessages(\n\t\t\tmessage,\n\t\t\tskipMessage,\n\t\t\tthis.sessionsInProgress,\n\t\t\tthis.sessions,\n\t\t\tthis.users,\n\t\t);\n\t\tif (!skipMessage && session) {\n\t\t\tsession.reportOp(message.timestamp);\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\t// Close any open sessions\n\t\treportOpenSessions(lastOp.timestamp, this.sessionsInProgress, this.sessions, this.users);\n\t\tdumpStats(this.users, {\n\t\t\ttitle: \"Users\",\n\t\t\theaders: [\"Sessions\", \"Op count\"],\n\t\t\treverseColumnsInUI: true,\n\t\t\tlines: 6,\n\t\t});\n\t\tdumpStats(this.sessions, {\n\t\t\ttitle: \"Sessions\",\n\t\t\theaders: [\"Duration(s)\", \"Op count\"],\n\t\t\treverseColumnsInUI: true,\n\t\t\tlines: 6,\n\t\t});\n\t\tdumpStats(this.sessions, {\n\t\t\ttitle: \"Sessions\",\n\t\t\theaders: [\"Duration(s)\", \"Op count\"],\n\t\t\torderByFirstColumn: true,\n\t\t\treverseColumnsInUI: true,\n\t\t\tremoveTotals: true,\n\t\t\tlines: 5,\n\t\t});\n\t}\n}\n\n/**\n * Analyzer for data structures\n */\nclass DataStructureAnalyzer implements IMessageAnalyzer {\n\tprivate readonly messageTypeStats = new Map<string, [number, number]>();\n\tprivate readonly dataType = new Map<string, string>();\n\tprivate readonly dataTypeStats = new Map<string, [number, number]>();\n\tprivate readonly objectStats = new Map<string, [number, number]>();\n\tprivate readonly chunkMap = new Map<string, { chunks: string[]; totalSize: number }>();\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (!skipMessage) {\n\t\t\tprocessOp(\n\t\t\t\tmessage,\n\t\t\t\tthis.dataType,\n\t\t\t\tthis.objectStats,\n\t\t\t\tmsgSize,\n\t\t\t\tthis.dataTypeStats,\n\t\t\t\tthis.messageTypeStats,\n\t\t\t\tthis.chunkMap,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tdumpStats(this.messageTypeStats, {\n\t\t\ttitle: \"Message Type\",\n\t\t\theaders: [\"Op count\", \"Bytes\"],\n\t\t\tlines: 20,\n\t\t});\n\t\tdumpStats(calcChannelStats(this.dataType, this.objectStats), {\n\t\t\ttitle: \"Channel name\",\n\t\t\theaders: [\"Op count\", \"Bytes\"],\n\t\t\tlines: 7,\n\t\t});\n\t\t/*\n dumpStats(this.dataTypeStats, {\n title: \"Channel type\",\n headers: [\"Op count\", \"Bytes\"],\n });\n */\n\t}\n}\n\n/**\n * Helper class to report if we filtered out any messages.\n */\nclass FilteredMessageAnalyzer implements IMessageAnalyzer {\n\tprivate sizeTotal = 0;\n\tprivate opsTotal = 0;\n\tprivate sizeFiltered = 0;\n\tprivate opsFiltered = 0;\n\tprivate filtered = false;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tthis.sizeTotal += msgSize;\n\t\tthis.opsTotal++;\n\t\tif (!skipMessage) {\n\t\t\tthis.sizeFiltered += msgSize;\n\t\t\tthis.opsFiltered++;\n\t\t} else {\n\t\t\tthis.filtered = true;\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tif (this.filtered) {\n\t\t\tconsole.log(\n\t\t\t\t`\\nData is filtered according to --filter:messageType argument(s):\\nOp size: ${this.sizeFiltered} / ${this.sizeTotal}\\nOp count ${this.opsFiltered} / ${this.opsTotal}`,\n\t\t\t);\n\t\t}\n\t\tif (this.opsTotal === 0) {\n\t\t\tconsole.error(\"No ops were found\");\n\t\t}\n\t}\n}\n\n/**\n * Helper class to find places where we generated too many ops\n */\nclass MessageDensityAnalyzer implements IMessageAnalyzer {\n\tprivate readonly opChunk = 1000;\n\tprivate opLimit = 1;\n\tprivate size = 0;\n\tprivate timeStart = 0;\n\tprivate doctimerStart = 0;\n\tprivate readonly ranges = new Map<string, [number, number]>();\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (message.sequenceNumber >= this.opLimit) {\n\t\t\tif (message.sequenceNumber !== 1) {\n\t\t\t\tconst timeDiff = durationFromTime(message.timestamp - this.timeStart);\n\t\t\t\tconst opsString = `ops = [${this.opLimit - this.opChunk}, ${this.opLimit - 1}]`.padEnd(\n\t\t\t\t\t26,\n\t\t\t\t);\n\t\t\t\tconst timeString = `time = [${durationFromTime(\n\t\t\t\t\tthis.timeStart - this.doctimerStart,\n\t\t\t\t)}, ${durationFromTime(message.timestamp - this.doctimerStart)}]`;\n\t\t\t\tthis.ranges.set(`${opsString} ${timeString}`, [timeDiff, this.size]);\n\t\t\t} else {\n\t\t\t\tthis.doctimerStart = message.timestamp;\n\t\t\t}\n\t\t\tthis.opLimit += this.opChunk;\n\t\t\tthis.size = 0;\n\t\t\tthis.timeStart = message.timestamp;\n\t\t}\n\t\tif (!skipMessage) {\n\t\t\tthis.size += msgSize;\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tdumpStats(this.ranges, {\n\t\t\ttitle: \"Fastest 1000 op ranges\",\n\t\t\theaders: [\"Duration(s)\", \"Bytes\"],\n\t\t\torderByFirstColumn: true,\n\t\t\treverseSort: true,\n\t\t\tremoveTotals: true,\n\t\t\tlines: 3,\n\t\t});\n\t}\n}\n\n/**\n * Helper class to analyze collab window size\n */\nclass CollabWindowSizeAnalyzer implements IMessageAnalyzer {\n\tprivate maxCollabWindow = 0;\n\tprivate opSeq = 0;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tconst value = message.sequenceNumber - message.minimumSequenceNumber;\n\t\tif (value > this.maxCollabWindow) {\n\t\t\tthis.maxCollabWindow = value;\n\t\t\tthis.opSeq = message.sequenceNumber;\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tconsole.log(`\\nMaximum collab window size: ${this.maxCollabWindow}, seq# ${this.opSeq}`);\n\t}\n}\n\n/**\n * Helper class to analyze frequency of summaries\n */\nclass SummaryAnalyzer implements IMessageAnalyzer {\n\tprivate lastSummaryOp = 0;\n\tprivate maxDistance = 0;\n\tprivate maxSeq = 0;\n\tprivate minDistance = Number.MAX_SAFE_INTEGER;\n\tprivate minSeq = 0;\n\tprivate maxResponse = 0;\n\tprivate maxResponseSeq = 0;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (message.type === MessageType.SummaryAck) {\n\t\t\tconst distance = message.sequenceNumber - this.lastSummaryOp - 1;\n\t\t\tif (this.maxDistance < distance) {\n\t\t\t\tthis.maxDistance = distance;\n\t\t\t\tthis.maxSeq = message.sequenceNumber;\n\t\t\t}\n\t\t\tif (this.minDistance > distance) {\n\t\t\t\tthis.minDistance = distance;\n\t\t\t\tthis.minSeq = message.sequenceNumber;\n\t\t\t}\n\n\t\t\tthis.lastSummaryOp = message.sequenceNumber;\n\t\t}\n\t\tif (message.type === MessageType.SummaryAck || message.type === MessageType.SummaryNack) {\n\t\t\tconst contents: ISummaryProposal = (message.contents as ISummaryAck | ISummaryNack)\n\t\t\t\t.summaryProposal;\n\t\t\tconst distance = message.sequenceNumber - contents.summarySequenceNumber;\n\t\t\tif (distance > this.maxResponse) {\n\t\t\t\tthis.maxResponse = distance;\n\t\t\t\tthis.maxResponseSeq = message.sequenceNumber;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tconst distance = lastOp.sequenceNumber - this.lastSummaryOp;\n\t\tif (this.maxDistance < distance) {\n\t\t\tthis.maxDistance = distance;\n\t\t\tthis.maxSeq = lastOp.sequenceNumber + 1;\n\t\t}\n\n\t\tconsole.log(\"\");\n\t\tif (this.minDistance === Number.MAX_SAFE_INTEGER) {\n\t\t\tconsole.log(\"No summaries found in this document\");\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t`Maximum distance between summaries: ${this.maxDistance}, seq# ${this.maxSeq}`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`Maximum server response for summary: ${this.maxResponse}, seq# ${this.maxResponseSeq}`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`Minimum distance between summaries: ${this.minDistance}, seq# ${this.minSeq}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Helper class to dump messages to console\n */\nclass MessageDumper implements IMessageAnalyzer {\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (!skipMessage) {\n\t\t\tconsole.log(JSON.stringify(message, undefined, 2));\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {}\n}\n\nexport async function printMessageStats(\n\tgenerator: AsyncGenerator<ISequencedDocumentMessage[]>,\n\tdumpMessageStats: boolean,\n\tdumpMessages: boolean,\n\tmessageTypeFilter: Set<string> = new Set<string>(),\n): Promise<void> {\n\tlet lastMessage: ISequencedDocumentMessage | undefined;\n\n\tconst analyzers: IMessageAnalyzer[] = [\n\t\tnew FilteredMessageAnalyzer(), // Should come first\n\t\tnew SessionAnalyzer(),\n\t\tnew DataStructureAnalyzer(),\n\t\tnew MessageDensityAnalyzer(),\n\t\tnew CollabWindowSizeAnalyzer(),\n\t\tnew SummaryAnalyzer(),\n\t];\n\n\tif (dumpMessages) {\n\t\tanalyzers.push(new MessageDumper());\n\t}\n\n\tfor await (const messages of generator) {\n\t\tfor (const message of messages) {\n\t\t\tconst msgSize = JSON.stringify(message).length;\n\t\t\tlastMessage = message;\n\n\t\t\tconst skipMessage = messageTypeFilter.size !== 0 && !messageTypeFilter.has(message.type);\n\n\t\t\tfor (const analyzer of analyzers) {\n\t\t\t\tanalyzer.processOp(message, msgSize, skipMessage);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (lastMessage !== undefined) {\n\t\tif (dumpMessageStats) {\n\t\t\tfor (const analyzer of analyzers) {\n\t\t\t\tanalyzer.reportAnalyzes(lastMessage);\n\t\t\t}\n\t\t} else {\n\t\t\t// Warn about filtered messages\n\t\t\tanalyzers[0].reportAnalyzes(lastMessage);\n\t\t}\n\t}\n\tconsole.log(\"\");\n}\n\nfunction processOp(\n\truntimeMessage: ISequencedDocumentMessage,\n\tdataType: Map<string, string>,\n\tobjectStats: Map<string, [number, number]>,\n\tmsgSize: number,\n\tdataTypeStats: Map<string, [number, number]>,\n\tmessageTypeStats: Map<string, [number, number]>,\n\tchunkMap: Map<string, { chunks: string[]; totalSize: number }>,\n): void {\n\tlet type = runtimeMessage.type;\n\tlet recorded = false;\n\tlet totalMsgSize = msgSize;\n\tlet opCount = 1;\n\tif (unpackRuntimeMessage(runtimeMessage)) {\n\t\tconst messageType = runtimeMessage.type as ContainerMessageType;\n\t\tswitch (messageType) {\n\t\t\tcase ContainerMessageType.Attach: {\n\t\t\t\tconst attachMessage = runtimeMessage.contents as IAttachMessage;\n\t\t\t\tprocessDataStoreAttachOp(attachMessage, dataType);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// skip for now because these ops do not have contents\n\t\t\tcase ContainerMessageType.BlobAttach: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// The default method to count stats should be used for GC messages.\n\t\t\tcase ContainerMessageType.GC: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ContainerMessageType.DocumentSchemaChange: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ContainerMessageType.ChunkedOp: {\n\t\t\t\tconst chunk = runtimeMessage.contents as IChunkedOp;\n\t\t\t\t// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)\n\n\t\t\t\tif (!chunkMap.has(runtimeMessage.clientId as string)) {\n\t\t\t\t\tchunkMap.set(runtimeMessage.clientId as string, {\n\t\t\t\t\t\tchunks: new Array<string>(chunk.totalChunks),\n\t\t\t\t\t\ttotalSize: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst value = chunkMap.get(runtimeMessage.clientId as string);\n\t\t\t\tassert(value !== undefined, 0x2b8 /* \"Chunk should be set in map\" */);\n\t\t\t\tconst chunks = value.chunks;\n\t\t\t\tconst chunkIndex = chunk.chunkId - 1;\n\t\t\t\tif (chunks[chunkIndex] !== undefined) {\n\t\t\t\t\tthrow new Error(\"Chunk already assigned\");\n\t\t\t\t}\n\t\t\t\tchunks[chunkIndex] = chunk.contents;\n\t\t\t\tvalue.totalSize += msgSize;\n\t\t\t\tif (chunk.chunkId === chunk.totalChunks) {\n\t\t\t\t\topCount = chunk.totalChunks; // 1 op for each chunk.\n\t\t\t\t\tconst patchedMessage = Object.create(runtimeMessage);\n\t\t\t\t\tpatchedMessage.contents = chunks.join(\"\");\n\t\t\t\t\ttype = (chunk as any).originalType;\n\t\t\t\t\tpatchedMessage.type = type;\n\t\t\t\t\ttotalMsgSize = value.totalSize;\n\t\t\t\t\tchunkMap.delete(patchedMessage.clientId);\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase ContainerMessageType.IdAllocation:\n\t\t\tcase ContainerMessageType.FluidDataStoreOp:\n\t\t\tcase ContainerMessageType.Alias:\n\t\t\tcase ContainerMessageType.Rejoin: {\n\t\t\t\tlet envelope = runtimeMessage.contents as IEnvelope;\n\t\t\t\t// TODO: Legacy?\n\t\t\t\tif (envelope !== undefined && typeof envelope === \"string\") {\n\t\t\t\t\tenvelope = JSON.parse(envelope);\n\t\t\t\t}\n\t\t\t\tconst innerContent = envelope.contents as {\n\t\t\t\t\tcontent: any;\n\t\t\t\t\ttype: string;\n\t\t\t\t};\n\t\t\t\tconst address = envelope.address;\n\t\t\t\ttype = `${type}/${innerContent.type}`;\n\t\t\t\tswitch (innerContent.type) {\n\t\t\t\t\tcase DataStoreMessageType.Attach: {\n\t\t\t\t\t\tconst attachMessage = innerContent.content as IAttachMessage;\n\t\t\t\t\t\tlet objectType = attachMessage.type;\n\t\t\t\t\t\tif (objectType.startsWith(objectTypePrefix)) {\n\t\t\t\t\t\t\tobjectType = objectType.substring(objectTypePrefix.length);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdataType.set(getObjectId(address, attachMessage.id), objectType);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase DataStoreMessageType.ChannelOp:\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tconst innerEnvelope = innerContent.content as IEnvelope;\n\t\t\t\t\t\tconst innerContent2 = innerEnvelope.contents as {\n\t\t\t\t\t\t\ttype?: string;\n\t\t\t\t\t\t\tvalue?: any;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst objectId = getObjectId(address, innerEnvelope.address);\n\t\t\t\t\t\tincr(objectStats, objectId, totalMsgSize, opCount);\n\t\t\t\t\t\tlet objectType = dataType.get(objectId);\n\t\t\t\t\t\tif (objectType === undefined) {\n\t\t\t\t\t\t\t// Somehow we do not have data...\n\t\t\t\t\t\t\tdataType.set(objectId, objectId);\n\t\t\t\t\t\t\tobjectType = objectId;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tincr(dataTypeStats, objectType, totalMsgSize, opCount);\n\t\t\t\t\t\trecorded = true;\n\n\t\t\t\t\t\tlet subType = innerContent2.type;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tinnerContent2.type === \"set\" &&\n\t\t\t\t\t\t\ttypeof innerContent2.value === \"object\" &&\n\t\t\t\t\t\t\tinnerContent2.value !== null\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttype = `${type}/${subType}`;\n\t\t\t\t\t\t\tsubType = innerContent2.value.type;\n\t\t\t\t\t\t} else if (objectType === \"mergeTree\" && subType !== undefined) {\n\t\t\t\t\t\t\tconst types = [\"insert\", \"remove\", \"annotate\", \"group\"];\n\t\t\t\t\t\t\tif (types[subType] !== undefined) {\n\t\t\t\t\t\t\t\tsubType = types[subType];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (subType !== undefined) {\n\t\t\t\t\t\t\ttype = `${type}/${subType}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttype = `${type} (${objectType})`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tunreachableCase(messageType, \"Message type not recognized!\");\n\t\t}\n\t}\n\n\tincr(messageTypeStats, type, totalMsgSize, opCount);\n\tif (!recorded) {\n\t\t// const objectId = `${type} (system)`;\n\t\tconst objectId = `(system messages)`;\n\t\tconst objectType = objectId;\n\t\tif (dataType.get(objectId) === undefined) {\n\t\t\tdataType.set(objectId, objectId);\n\t\t}\n\t\tincr(objectStats, objectId, totalMsgSize, opCount);\n\t\tincr(dataTypeStats, objectType, totalMsgSize, opCount);\n\t}\n}\n\nfunction processDataStoreAttachOp(\n\tattachMessage: IAttachMessage | string,\n\tdataType: Map<string, string>,\n): void {\n\t// dataType.set(getObjectId(attachMessage.id), attachMessage.type);\n\n\t// That's data store, and it brings a bunch of data structures.\n\t// Let's try to crack it.\n\tconst parsedAttachMessage =\n\t\ttypeof attachMessage === \"string\" ? JSON.parse(attachMessage) : attachMessage;\n\tfor (const entry of parsedAttachMessage.snapshot.entries) {\n\t\tif (entry.type === TreeEntry.Tree) {\n\t\t\tfor (const entry2 of entry.value.entries) {\n\t\t\t\tif (entry2.path === \".attributes\" && entry2.type === TreeEntry.Blob) {\n\t\t\t\t\tconst attrib = JSON.parse(entry2.value.contents);\n\t\t\t\t\tlet objectType: string = attrib.type;\n\t\t\t\t\tif (objectType.startsWith(objectTypePrefix)) {\n\t\t\t\t\t\tobjectType = objectType.substring(objectTypePrefix.length);\n\t\t\t\t\t}\n\t\t\t\t\tdataType.set(getObjectId(parsedAttachMessage.id, entry.path), objectType);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction reportOpenSessions(\n\tlastOpTimestamp: number,\n\tsessionsInProgress: Map<string, ActiveSession>,\n\tsessions: Map<string, [number, number]>,\n\tusers: Map<string, [number, number]>,\n): void {\n\tconst activeSessions = new Map<string, [number, number]>();\n\n\tfor (const [clientId, ses] of sessionsInProgress) {\n\t\tconst sessionInfo = ses.leave(lastOpTimestamp);\n\t\tif (clientId !== noClientName) {\n\t\t\tconst sessionName = `${clientId} (${sessionInfo.email})`;\n\t\t\tconst sessionPayload: [number, number] = [\n\t\t\t\tdurationFromTime(sessionInfo.duration),\n\t\t\t\tsessionInfo.opCount,\n\t\t\t];\n\t\t\tsessions.set(sessionName, sessionPayload);\n\t\t\tactiveSessions.set(sessionName, sessionPayload);\n\t\t} else {\n\t\t\tsessions.set(`Full file lifespan (noClient messages)`, [\n\t\t\t\tdurationFromTime(sessionInfo.duration),\n\t\t\t\tsessionInfo.opCount,\n\t\t\t]);\n\t\t}\n\t\tincr(users, sessionInfo.email, sessionInfo.opCount);\n\t}\n\n\tif (activeSessions.size > 0) {\n\t\tdumpStats(activeSessions, {\n\t\t\ttitle: \"Active sessions\",\n\t\t\theaders: [\"Duration\", \"Op count\"],\n\t\t\tlines: 6,\n\t\t\torderByFirstColumn: true,\n\t\t\tremoveTotals: true,\n\t\t});\n\t}\n}\n\nfunction calcChannelStats(\n\tdataType: Map<string, string>,\n\tobjectStats: Map<string, [number, number]>,\n): Map<string, [number, number]> {\n\tconst channelStats = new Map<string, [number, number]>();\n\tfor (const [objectId, type] of dataType) {\n\t\tlet value = objectStats.get(objectId);\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (value === undefined) {\n\t\t\tvalue = [0, 0];\n\t\t}\n\t\tif (type === objectId) {\n\t\t\tchannelStats.set(`${objectId}`, value);\n\t\t} else {\n\t\t\tchannelStats.set(`${objectId} (${type})`, value);\n\t\t}\n\t}\n\treturn channelStats;\n}\n\nfunction processQuorumMessages(\n\tmessage: ISequencedDocumentMessage,\n\tskipMessage: boolean,\n\tsessionsInProgress: Map<string, ActiveSession>,\n\tsessions: Map<string, [number, number]>,\n\tusers: Map<string, [number, number]>,\n): ActiveSession | undefined {\n\tlet session: ActiveSession | undefined;\n\tconst dataString = (message as any).data;\n\tif (message.type === \"join\") {\n\t\tconst data = JSON.parse(dataString);\n\t\tsession = ActiveSession.create(data.detail.user.id, message);\n\t\tsessionsInProgress.set(data.clientId, session);\n\t} else if (message.type === \"leave\") {\n\t\tconst clientId = JSON.parse(dataString);\n\t\tsession = sessionsInProgress.get(clientId);\n\t\tsessionsInProgress.delete(clientId);\n\t\tassert(!!session, 0x1b7 /* \"Bad session state for processing quorum messages\" */);\n\t\tif (session !== undefined) {\n\t\t\tif (!skipMessage) {\n\t\t\t\tsession.reportOp(message.timestamp);\n\t\t\t}\n\t\t\tconst sessionInfo: ISessionInfo = session.leave(message.timestamp);\n\t\t\tsessions.set(`${clientId} (${sessionInfo.email})`, [\n\t\t\t\tdurationFromTime(sessionInfo.duration),\n\t\t\t\tsessionInfo.opCount,\n\t\t\t]);\n\t\t\tincr(users, sessionInfo.email, sessionInfo.opCount);\n\t\t\tsession = undefined; // Do not record it second time\n\t\t}\n\t} else {\n\t\t// message.clientId can be null\n\t\t// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)\n\n\t\tsession = sessionsInProgress.get(message.clientId as string);\n\t\tif (session === undefined) {\n\t\t\tsession = sessionsInProgress.get(noClientName);\n\t\t\tassert(!!session, 0x1b8 /* \"Bad session state for processing quorum messages\" */);\n\t\t}\n\t}\n\treturn session;\n}\n\nconst durationFromTime = (time: number): number => Math.floor(time / 1000);\n"]}
|
package/dist/fluidFetchArgs.js
CHANGED
|
@@ -7,7 +7,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
7
7
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
8
|
};
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.
|
|
10
|
+
exports.loginHint = exports.localDataOnly = exports.connectToWebSocket = exports.paramJWT = exports.paramURL = exports.messageTypeFilter = exports.paramSaveDir = exports.paramActualFormatting = exports.paramNumSnapshotVersions = exports.paramSnapshotVersionIndex = exports.overWrite = exports.dumpSnapshotVersions = exports.dumpSnapshotTrees = exports.dumpSnapshotStats = exports.dumpMessageStats = exports.dumpMessages = void 0;
|
|
11
|
+
exports.setArguments = setArguments;
|
|
12
|
+
exports.parseArguments = parseArguments;
|
|
11
13
|
const fs_1 = __importDefault(require("fs"));
|
|
12
14
|
exports.dumpMessages = false;
|
|
13
15
|
exports.dumpMessageStats = false;
|
|
@@ -59,7 +61,6 @@ function setArguments(values) {
|
|
|
59
61
|
exports.dumpSnapshotTrees = values.dumpSnapshotTrees ?? exports.dumpSnapshotTrees;
|
|
60
62
|
exports.overWrite = values.overWrite ?? exports.overWrite;
|
|
61
63
|
}
|
|
62
|
-
exports.setArguments = setArguments;
|
|
63
64
|
function parseArguments() {
|
|
64
65
|
for (let i = 2; i < process.argv.length; i++) {
|
|
65
66
|
const arg = process.argv[i];
|
|
@@ -140,7 +141,6 @@ function parseArguments() {
|
|
|
140
141
|
}
|
|
141
142
|
checkArgs();
|
|
142
143
|
}
|
|
143
|
-
exports.parseArguments = parseArguments;
|
|
144
144
|
function parseStrArg(i, name) {
|
|
145
145
|
if (i + 1 >= process.argv.length) {
|
|
146
146
|
console.error(`ERROR: Missing ${name}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidFetchArgs.js","sourceRoot":"","sources":["../src/fluidFetchArgs.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\";\n\nexport let dumpMessages = false;\nexport let dumpMessageStats = false;\nexport let dumpSnapshotStats = false;\nexport let dumpSnapshotTrees = false;\nexport let dumpSnapshotVersions = false;\nexport let overWrite = false;\nexport let paramSnapshotVersionIndex: number | undefined;\nexport let paramNumSnapshotVersions = 10;\nexport let paramActualFormatting = false;\n\nexport let paramSaveDir: string | undefined;\nexport const messageTypeFilter = new Set<string>();\n\nexport let paramURL: string | undefined;\nexport let paramJWT: string;\n\nexport let connectToWebSocket = false;\n\nexport let localDataOnly = false;\nexport let loginHint: string | undefined;\n\nconst optionsArray = [\n\t[\"--dump:rawmessage\", \"dump all messages\"],\n\t[\"--dump:snapshotVersion\", \"dump a list of snapshot version\"],\n\t[\"--dump:snapshotTree\", \"dump the snapshot trees\"],\n\t[\"--stat:message\", \"show message type, channel type, data type statistics\"],\n\t[\"--stat:snapshot\", \"show a table of snapshot path and blob size\"],\n\t[\"--stat\", \"Show both messages & snapshot stats\"],\n\t[\"--filter:messageType <type>\", \"filter message by <type>\"],\n\t[\"--jwt <token>\", \"token to be used for routerlicious URLs\"],\n\t[\"--numSnapshotVersions <number>\", \"Number of versions to load (default:10)\"],\n\t[\n\t\t\"--actualPayload\",\n\t\t\"Do not format json payloads nicely, preserve actual bytes / formatting in storage\",\n\t],\n\t[\"--saveDir <outdir>\", \"Save data of the snapshots and messages\"],\n\t[\"--snapshotVersionIndex <number>\", \"Index of the version to dump\"],\n\t[\"--websocket\", \"Connect to web socket to download initial messages\"],\n\t[\"--local\", \"Do not connect to storage, use earlier downloaded data. Requires --saveDir.\"],\n\t[\"--loginHint\", \"login hint for the user with document access.\"],\n];\n\nfunction printUsage(): void {\n\tconsole.log(\"Usage: fluid-fetch [options] URL\");\n\tconsole.log(\"URL: <ODSP URL>|<Routerlicious URL>\");\n\tconsole.log(\"Options:\");\n\tfor (const i of optionsArray) {\n\t\tconsole.log(` ${i[0].padEnd(32)}: ${i[1]}`);\n\t}\n}\n\n// Can be used in unit test to pass in customized argument values\n// More argument options can be added when needed\nexport function setArguments(values: {\n\tsaveDir: string;\n\tparamURL: string;\n\tdumpMessages?: boolean;\n\tdumpMessageStats?: boolean;\n\tdumpSnapshotStats?: boolean;\n\tdumpSnapshotTrees?: boolean;\n\toverWrite?: boolean;\n}): void {\n\tparamSaveDir = values.saveDir;\n\tparamURL = values.paramURL;\n\tdumpMessages = values.dumpMessages ?? dumpMessages;\n\tdumpMessageStats = values.dumpMessageStats ?? dumpMessageStats;\n\tdumpSnapshotStats = values.dumpSnapshotStats ?? dumpSnapshotStats;\n\tdumpSnapshotTrees = values.dumpSnapshotTrees ?? dumpSnapshotTrees;\n\toverWrite = values.overWrite ?? overWrite;\n}\n\nexport function parseArguments(): void {\n\tfor (let i = 2; i < process.argv.length; i++) {\n\t\tconst arg = process.argv[i];\n\t\tswitch (arg) {\n\t\t\tcase \"--dump:rawmessage\":\n\t\t\t\tdumpMessages = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--dump:rawmessage:overwrite\":\n\t\t\t\tdumpMessages = true;\n\t\t\t\toverWrite = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--stat:message\":\n\t\t\t\tdumpMessageStats = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--stat\":\n\t\t\t\tdumpMessageStats = true;\n\t\t\t\tdumpSnapshotStats = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--filter:messageType\":\n\t\t\t\tmessageTypeFilter.add(parseStrArg(i++, \"type name for messageType filter\"));\n\t\t\t\tbreak;\n\t\t\tcase \"--stat:snapshot\":\n\t\t\t\tdumpSnapshotStats = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--dump:snapshotVersion\":\n\t\t\t\tdumpSnapshotVersions = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--dump:snapshotTree\":\n\t\t\t\tdumpSnapshotTrees = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--help\":\n\t\t\t\tprintUsage();\n\t\t\t\tprocess.exit(0);\n\t\t\tcase \"--jwt\":\n\t\t\t\tparamJWT = parseStrArg(i++, \"jwt token\");\n\t\t\t\tbreak;\n\t\t\tcase \"--snapshotVersionIndex\":\n\t\t\t\tparamSnapshotVersionIndex = parseIntArg(i++, \"version index\", true);\n\t\t\t\tbreak;\n\t\t\tcase \"--numSnapshotVersions\":\n\t\t\t\tparamNumSnapshotVersions = parseIntArg(i++, \"number of versions\", false);\n\t\t\t\tbreak;\n\t\t\tcase \"--actualPayload\":\n\t\t\t\tparamActualFormatting = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--saveDir\":\n\t\t\t\tparamSaveDir = parseStrArg(i++, \"save data path\");\n\t\t\t\tbreak;\n\t\t\tcase \"--websocket\":\n\t\t\t\tconnectToWebSocket = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--local\":\n\t\t\t\tlocalDataOnly = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--loginHint\":\n\t\t\t\tloginHint = parseStrArg(i++, \"login hint\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ttry {\n\t\t\t\t\tconst url = new URL(arg);\n\t\t\t\t\tif (url.protocol === \"https:\") {\n\t\t\t\t\t\tparamURL = arg;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (url.protocol === \"http:\" && url.hostname === \"localhost\") {\n\t\t\t\t\t\tparamURL = arg;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\n\t\t\t\tconsole.error(`ERROR: Invalid argument ${arg}`);\n\t\t\t\tprintUsage();\n\t\t\t\tprocess.exit(-1);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tcheckArgs();\n}\n\nfunction parseStrArg(i: number, name: string): string {\n\tif (i + 1 >= process.argv.length) {\n\t\tconsole.error(`ERROR: Missing ${name}`);\n\t\tprintUsage();\n\t\tprocess.exit(-1);\n\t}\n\treturn process.argv[i + 1];\n}\nfunction parseIntArg(i: number, name: string, allowZero: boolean): number {\n\tif (i + 1 >= process.argv.length) {\n\t\tconsole.error(`ERROR: Missing ${name}`);\n\t\tprintUsage();\n\t\tprocess.exit(-1);\n\t}\n\tconst numStr = process.argv[i + 1];\n\tconst paramNumber = parseInt(numStr, 10);\n\tif (isNaN(paramNumber) || (allowZero ? paramNumber < 0 : paramNumber <= 0)) {\n\t\tconsole.error(`ERROR: Invalid ${name} ${numStr}`);\n\t\tprintUsage();\n\t\tprocess.exit(-1);\n\t}\n\treturn paramNumber;\n}\n\nfunction checkArgs(): void {\n\tif (paramSnapshotVersionIndex !== undefined) {\n\t\tparamNumSnapshotVersions = Math.max(\n\t\t\tparamSnapshotVersionIndex + 1,\n\t\t\tparamNumSnapshotVersions,\n\t\t);\n\t}\n\n\tif (paramURL === undefined) {\n\t\tif (paramSaveDir !== undefined) {\n\t\t\tconst file = `${paramSaveDir}/info.json`;\n\t\t\tif (fs.existsSync(file)) {\n\t\t\t\tconst info = JSON.parse(fs.readFileSync(file, { encoding: \"utf-8\" }));\n\t\t\t\tparamURL = info.url;\n\t\t\t} else {\n\t\t\t\tconsole.log(`Can't find file ${file}`);\n\t\t\t}\n\t\t}\n\n\t\tif (paramURL === undefined) {\n\t\t\tconsole.error(\"ERROR: Missing URL\");\n\t\t\tprintUsage();\n\t\t\tprocess.exit(-1);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fluidFetchArgs.js","sourceRoot":"","sources":["../src/fluidFetchArgs.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\";\n\nexport let dumpMessages = false;\nexport let dumpMessageStats = false;\nexport let dumpSnapshotStats = false;\nexport let dumpSnapshotTrees = false;\nexport let dumpSnapshotVersions = false;\nexport let overWrite = false;\nexport let paramSnapshotVersionIndex: number | undefined;\nexport let paramNumSnapshotVersions = 10;\nexport let paramActualFormatting = false;\n\nexport let paramSaveDir: string | undefined;\nexport const messageTypeFilter = new Set<string>();\n\nexport let paramURL: string | undefined;\nexport let paramJWT: string;\n\nexport let connectToWebSocket = false;\n\nexport let localDataOnly = false;\nexport let loginHint: string | undefined;\n\nconst optionsArray = [\n\t[\"--dump:rawmessage\", \"dump all messages\"],\n\t[\"--dump:snapshotVersion\", \"dump a list of snapshot version\"],\n\t[\"--dump:snapshotTree\", \"dump the snapshot trees\"],\n\t[\"--stat:message\", \"show message type, channel type, data type statistics\"],\n\t[\"--stat:snapshot\", \"show a table of snapshot path and blob size\"],\n\t[\"--stat\", \"Show both messages & snapshot stats\"],\n\t[\"--filter:messageType <type>\", \"filter message by <type>\"],\n\t[\"--jwt <token>\", \"token to be used for routerlicious URLs\"],\n\t[\"--numSnapshotVersions <number>\", \"Number of versions to load (default:10)\"],\n\t[\n\t\t\"--actualPayload\",\n\t\t\"Do not format json payloads nicely, preserve actual bytes / formatting in storage\",\n\t],\n\t[\"--saveDir <outdir>\", \"Save data of the snapshots and messages\"],\n\t[\"--snapshotVersionIndex <number>\", \"Index of the version to dump\"],\n\t[\"--websocket\", \"Connect to web socket to download initial messages\"],\n\t[\"--local\", \"Do not connect to storage, use earlier downloaded data. Requires --saveDir.\"],\n\t[\"--loginHint\", \"login hint for the user with document access.\"],\n];\n\nfunction printUsage(): void {\n\tconsole.log(\"Usage: fluid-fetch [options] URL\");\n\tconsole.log(\"URL: <ODSP URL>|<Routerlicious URL>\");\n\tconsole.log(\"Options:\");\n\tfor (const i of optionsArray) {\n\t\tconsole.log(` ${i[0].padEnd(32)}: ${i[1]}`);\n\t}\n}\n\n// Can be used in unit test to pass in customized argument values\n// More argument options can be added when needed\nexport function setArguments(values: {\n\tsaveDir: string;\n\tparamURL: string;\n\tdumpMessages?: boolean;\n\tdumpMessageStats?: boolean;\n\tdumpSnapshotStats?: boolean;\n\tdumpSnapshotTrees?: boolean;\n\toverWrite?: boolean;\n}): void {\n\tparamSaveDir = values.saveDir;\n\tparamURL = values.paramURL;\n\tdumpMessages = values.dumpMessages ?? dumpMessages;\n\tdumpMessageStats = values.dumpMessageStats ?? dumpMessageStats;\n\tdumpSnapshotStats = values.dumpSnapshotStats ?? dumpSnapshotStats;\n\tdumpSnapshotTrees = values.dumpSnapshotTrees ?? dumpSnapshotTrees;\n\toverWrite = values.overWrite ?? overWrite;\n}\n\nexport function parseArguments(): void {\n\tfor (let i = 2; i < process.argv.length; i++) {\n\t\tconst arg = process.argv[i];\n\t\tswitch (arg) {\n\t\t\tcase \"--dump:rawmessage\":\n\t\t\t\tdumpMessages = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--dump:rawmessage:overwrite\":\n\t\t\t\tdumpMessages = true;\n\t\t\t\toverWrite = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--stat:message\":\n\t\t\t\tdumpMessageStats = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--stat\":\n\t\t\t\tdumpMessageStats = true;\n\t\t\t\tdumpSnapshotStats = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--filter:messageType\":\n\t\t\t\tmessageTypeFilter.add(parseStrArg(i++, \"type name for messageType filter\"));\n\t\t\t\tbreak;\n\t\t\tcase \"--stat:snapshot\":\n\t\t\t\tdumpSnapshotStats = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--dump:snapshotVersion\":\n\t\t\t\tdumpSnapshotVersions = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--dump:snapshotTree\":\n\t\t\t\tdumpSnapshotTrees = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--help\":\n\t\t\t\tprintUsage();\n\t\t\t\tprocess.exit(0);\n\t\t\tcase \"--jwt\":\n\t\t\t\tparamJWT = parseStrArg(i++, \"jwt token\");\n\t\t\t\tbreak;\n\t\t\tcase \"--snapshotVersionIndex\":\n\t\t\t\tparamSnapshotVersionIndex = parseIntArg(i++, \"version index\", true);\n\t\t\t\tbreak;\n\t\t\tcase \"--numSnapshotVersions\":\n\t\t\t\tparamNumSnapshotVersions = parseIntArg(i++, \"number of versions\", false);\n\t\t\t\tbreak;\n\t\t\tcase \"--actualPayload\":\n\t\t\t\tparamActualFormatting = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--saveDir\":\n\t\t\t\tparamSaveDir = parseStrArg(i++, \"save data path\");\n\t\t\t\tbreak;\n\t\t\tcase \"--websocket\":\n\t\t\t\tconnectToWebSocket = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--local\":\n\t\t\t\tlocalDataOnly = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--loginHint\":\n\t\t\t\tloginHint = parseStrArg(i++, \"login hint\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ttry {\n\t\t\t\t\tconst url = new URL(arg);\n\t\t\t\t\tif (url.protocol === \"https:\") {\n\t\t\t\t\t\tparamURL = arg;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (url.protocol === \"http:\" && url.hostname === \"localhost\") {\n\t\t\t\t\t\tparamURL = arg;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\n\t\t\t\tconsole.error(`ERROR: Invalid argument ${arg}`);\n\t\t\t\tprintUsage();\n\t\t\t\tprocess.exit(-1);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tcheckArgs();\n}\n\nfunction parseStrArg(i: number, name: string): string {\n\tif (i + 1 >= process.argv.length) {\n\t\tconsole.error(`ERROR: Missing ${name}`);\n\t\tprintUsage();\n\t\tprocess.exit(-1);\n\t}\n\treturn process.argv[i + 1];\n}\nfunction parseIntArg(i: number, name: string, allowZero: boolean): number {\n\tif (i + 1 >= process.argv.length) {\n\t\tconsole.error(`ERROR: Missing ${name}`);\n\t\tprintUsage();\n\t\tprocess.exit(-1);\n\t}\n\tconst numStr = process.argv[i + 1];\n\tconst paramNumber = parseInt(numStr, 10);\n\tif (isNaN(paramNumber) || (allowZero ? paramNumber < 0 : paramNumber <= 0)) {\n\t\tconsole.error(`ERROR: Invalid ${name} ${numStr}`);\n\t\tprintUsage();\n\t\tprocess.exit(-1);\n\t}\n\treturn paramNumber;\n}\n\nfunction checkArgs(): void {\n\tif (paramSnapshotVersionIndex !== undefined) {\n\t\tparamNumSnapshotVersions = Math.max(\n\t\t\tparamSnapshotVersionIndex + 1,\n\t\t\tparamNumSnapshotVersions,\n\t\t);\n\t}\n\n\tif (paramURL === undefined) {\n\t\tif (paramSaveDir !== undefined) {\n\t\t\tconst file = `${paramSaveDir}/info.json`;\n\t\t\tif (fs.existsSync(file)) {\n\t\t\t\tconst info = JSON.parse(fs.readFileSync(file, { encoding: \"utf-8\" }));\n\t\t\t\tparamURL = info.url;\n\t\t\t} else {\n\t\t\t\tconsole.log(`Can't find file ${file}`);\n\t\t\t}\n\t\t}\n\n\t\tif (paramURL === undefined) {\n\t\t\tconsole.error(\"ERROR: Missing URL\");\n\t\t\tprintUsage();\n\t\t\tprocess.exit(-1);\n\t\t}\n\t}\n}\n"]}
|
package/dist/fluidFetchInit.js
CHANGED
|
@@ -19,15 +19,26 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
19
19
|
}) : function(o, v) {
|
|
20
20
|
o["default"] = v;
|
|
21
21
|
});
|
|
22
|
-
var __importStar = (this && this.__importStar) || function (
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
};
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
29
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.
|
|
40
|
+
exports.connectionInfo = exports.latestVersionsId = void 0;
|
|
41
|
+
exports.fluidFetchInit = fluidFetchInit;
|
|
31
42
|
const odsp = __importStar(require("@fluidframework/odsp-driver/internal"));
|
|
32
43
|
const internal_1 = require("@fluidframework/odsp-urlresolver/internal");
|
|
33
44
|
const r11s = __importStar(require("@fluidframework/routerlicious-driver/internal"));
|
|
@@ -138,5 +149,4 @@ async function fluidFetchInit(urlStr) {
|
|
|
138
149
|
return initializeR11s(server, url.pathname, fluidResolvedUrl);
|
|
139
150
|
}
|
|
140
151
|
}
|
|
141
|
-
exports.fluidFetchInit = fluidFetchInit;
|
|
142
152
|
//# sourceMappingURL=fluidFetchInit.js.map
|