@fluid-tools/fetch-tool 0.59.2001 → 0.59.3000-66610
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +0 -1
- package/dist/fluidAnalyzeMessages.js +14 -11
- package/dist/fluidAnalyzeMessages.js.map +1 -1
- package/dist/fluidFetch.js +7 -7
- package/dist/fluidFetch.js.map +1 -1
- package/dist/fluidFetchArgs.d.ts +0 -1
- package/dist/fluidFetchArgs.d.ts.map +1 -1
- package/dist/fluidFetchArgs.js +1 -6
- package/dist/fluidFetchArgs.js.map +1 -1
- package/dist/fluidFetchInit.d.ts.map +1 -1
- package/dist/fluidFetchInit.js +5 -31
- package/dist/fluidFetchInit.js.map +1 -1
- package/dist/fluidFetchMessages.js +6 -6
- package/dist/fluidFetchMessages.js.map +1 -1
- package/dist/fluidFetchSharePoint.js +7 -7
- package/dist/fluidFetchSharePoint.js.map +1 -1
- package/dist/fluidFetchSnapshot.js +11 -11
- package/dist/fluidFetchSnapshot.js.map +1 -1
- package/package.json +17 -18
- package/src/fluidAnalyzeMessages.ts +63 -59
- package/src/fluidFetch.ts +1 -1
- package/src/fluidFetchArgs.ts +7 -13
- package/src/fluidFetchInit.ts +3 -41
- package/src/fluidFetchSharePoint.ts +1 -1
- package/src/fluidFetchSnapshot.ts +4 -4
package/.eslintrc.js
CHANGED
|
@@ -103,9 +103,9 @@ function dumpStats(map, props) {
|
|
|
103
103
|
if (index <= recordsToShow) {
|
|
104
104
|
const item = name.padEnd(nameLength);
|
|
105
105
|
overflow = item.length - nameLength;
|
|
106
|
-
const col1 = exports.formatNumber(count).padStart(fieldSizes[0] - overflow);
|
|
106
|
+
const col1 = (0, exports.formatNumber)(count).padStart(fieldSizes[0] - overflow);
|
|
107
107
|
overflow += col1.length - fieldSizes[0];
|
|
108
|
-
const col2 = exports.formatNumber(size).padStart(fieldSizes[1] - overflow);
|
|
108
|
+
const col2 = (0, exports.formatNumber)(size).padStart(fieldSizes[1] - overflow);
|
|
109
109
|
console.log(`${item} │ ${col1} ${col2}`);
|
|
110
110
|
}
|
|
111
111
|
else {
|
|
@@ -116,11 +116,11 @@ function dumpStats(map, props) {
|
|
|
116
116
|
if (!props.removeTotals) {
|
|
117
117
|
if (allOtherCount || allOtherSize) {
|
|
118
118
|
// eslint-disable-next-line max-len
|
|
119
|
-
console.log(`${`All Others (${sorted.length - recordsToShow})`.padEnd(nameLength)} │ ${exports.formatNumber(allOtherCount).padStart(fieldSizes[0])} ${exports.formatNumber(allOtherSize).padStart(fieldSizes[1])}`);
|
|
119
|
+
console.log(`${`All Others (${sorted.length - recordsToShow})`.padEnd(nameLength)} │ ${(0, exports.formatNumber)(allOtherCount).padStart(fieldSizes[0])} ${(0, exports.formatNumber)(allOtherSize).padStart(fieldSizes[1])}`);
|
|
120
120
|
}
|
|
121
121
|
console.log(`${"─".repeat(nameLength + 1)}┼${"─".repeat(fieldsLength + 1)}`);
|
|
122
122
|
// eslint-disable-next-line max-len
|
|
123
|
-
console.log(`${"Total".padEnd(nameLength)} │ ${exports.formatNumber(totalCount).padStart(fieldSizes[0])} ${exports.formatNumber(sizeTotal).padStart(fieldSizes[1])}`);
|
|
123
|
+
console.log(`${"Total".padEnd(nameLength)} │ ${(0, exports.formatNumber)(totalCount).padStart(fieldSizes[0])} ${(0, exports.formatNumber)(sizeTotal).padStart(fieldSizes[1])}`);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
const getObjectId = (dataStoreId, id) => `[${dataStoreId}]/${id}`;
|
|
@@ -418,8 +418,8 @@ function processOp(message, dataType, objectStats, msgSize, dataTypeStats, messa
|
|
|
418
418
|
let recorded = false;
|
|
419
419
|
let totalMsgSize = msgSize;
|
|
420
420
|
let opCount = 1;
|
|
421
|
-
if (container_runtime_1.isRuntimeMessage(message)) {
|
|
422
|
-
let runtimeMessage = container_runtime_1.unpackRuntimeMessage(message);
|
|
421
|
+
if ((0, container_runtime_1.isRuntimeMessage)(message)) {
|
|
422
|
+
let runtimeMessage = (0, container_runtime_1.unpackRuntimeMessage)(message);
|
|
423
423
|
const messageType = runtimeMessage.type;
|
|
424
424
|
switch (messageType) {
|
|
425
425
|
case container_runtime_1.RuntimeMessage.Attach: {
|
|
@@ -434,10 +434,13 @@ function processOp(message, dataType, objectStats, msgSize, dataTypeStats, messa
|
|
|
434
434
|
case container_runtime_1.RuntimeMessage.ChunkedOp: {
|
|
435
435
|
const chunk = runtimeMessage.contents;
|
|
436
436
|
if (!chunkMap.has(runtimeMessage.clientId)) {
|
|
437
|
-
chunkMap.set(runtimeMessage.clientId, {
|
|
437
|
+
chunkMap.set(runtimeMessage.clientId, {
|
|
438
|
+
chunks: new Array(chunk.totalChunks),
|
|
439
|
+
totalSize: 0,
|
|
440
|
+
});
|
|
438
441
|
}
|
|
439
442
|
const value = chunkMap.get(runtimeMessage.clientId);
|
|
440
|
-
common_utils_1.assert(value !== undefined, 0x2b8 /* "Chunk should be set in map" */);
|
|
443
|
+
(0, common_utils_1.assert)(value !== undefined, 0x2b8 /* "Chunk should be set in map" */);
|
|
441
444
|
const chunks = value.chunks;
|
|
442
445
|
const chunkIndex = chunk.chunkId - 1;
|
|
443
446
|
if (chunks[chunkIndex] !== undefined) {
|
|
@@ -518,7 +521,7 @@ function processOp(message, dataType, objectStats, msgSize, dataTypeStats, messa
|
|
|
518
521
|
break;
|
|
519
522
|
}
|
|
520
523
|
default:
|
|
521
|
-
common_utils_1.unreachableCase(messageType, "Message type not recognized!");
|
|
524
|
+
(0, common_utils_1.unreachableCase)(messageType, "Message type not recognized!");
|
|
522
525
|
}
|
|
523
526
|
}
|
|
524
527
|
incr(messageTypeStats, type, totalMsgSize, opCount);
|
|
@@ -612,7 +615,7 @@ function processQuorumMessages(message, skipMessage, sessionsInProgress, session
|
|
|
612
615
|
const clientId = JSON.parse(dataString);
|
|
613
616
|
session = sessionsInProgress.get(clientId);
|
|
614
617
|
sessionsInProgress.delete(clientId);
|
|
615
|
-
common_utils_1.assert(!!session, 0x1b7 /* "Bad session state for processing quorum messages" */);
|
|
618
|
+
(0, common_utils_1.assert)(!!session, 0x1b7 /* "Bad session state for processing quorum messages" */);
|
|
616
619
|
if (session) {
|
|
617
620
|
if (!skipMessage) {
|
|
618
621
|
session.reportOp(message.timestamp);
|
|
@@ -628,7 +631,7 @@ function processQuorumMessages(message, skipMessage, sessionsInProgress, session
|
|
|
628
631
|
session = sessionsInProgress.get(message.clientId);
|
|
629
632
|
if (session === undefined) {
|
|
630
633
|
session = sessionsInProgress.get(noClientName);
|
|
631
|
-
common_utils_1.assert(!!session, 0x1b8 /* "Bad session state for processing quorum messages" */);
|
|
634
|
+
(0, common_utils_1.assert)(!!session, 0x1b8 /* "Bad session state for processing quorum messages" */);
|
|
632
635
|
}
|
|
633
636
|
}
|
|
634
637
|
return session;
|
|
@@ -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 { assert, unreachableCase } from \"@fluidframework/common-utils\";\nimport {\n ISequencedDocumentMessage,\n ISummaryProposal,\n MessageType,\n TreeEntry,\n} from \"@fluidframework/protocol-definitions\";\nimport { IAttachMessage, IEnvelope } from \"@fluidframework/runtime-definitions\";\nimport {\n IChunkedOp,\n isRuntimeMessage,\n RuntimeMessage,\n unpackRuntimeMessage,\n} from \"@fluidframework/container-runtime\";\nimport { DataStoreMessageType } from \"@fluidframework/datastore\";\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) {\n const value = map.get(key);\n if (value === undefined) {\n map.set(key, [count, size]);\n } else {\n value[0] += count;\n value[1] += size;\n map.set(key, value);\n }\n}\n\ninterface ISessionInfo {\n startSeq: number;\n opCount: number;\n email: string;\n duration: number;\n}\n\ninterface IMessageAnalyzer {\n processOp(op: ISequencedDocumentMessage, msgSize: number, filteredOutOp: boolean): void;\n reportAnalyzes(lastOp: ISequencedDocumentMessage): void;\n}\n\n/**\n * Helper class to track session statistics\n */\nclass ActiveSession {\n public static create(email: string, message: ISequencedDocumentMessage) {\n return new ActiveSession(email, message);\n }\n\n private opCount = 0;\n\n constructor(private readonly email: string, private readonly startMessage: ISequencedDocumentMessage) {\n }\n\n public reportOp(timestamp: number) {\n this.opCount++;\n }\n\n public leave(timestamp: number): ISessionInfo {\n return {\n opCount: this.opCount,\n email: this.email,\n startSeq: this.startMessage.sequenceNumber,\n duration: timestamp - this.startMessage.timestamp,\n };\n }\n}\n\n// Format a number separating 3 digits by comma\n// eslint-disable-next-line unicorn/no-unsafe-regex\nexport const formatNumber = (num: number): string => num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n\nfunction dumpStats(\n map: Map<string, [number, number]>,\n props: {\n title: string;\n headers: [string, string];\n lines?: number;\n orderByFirstColumn?: boolean;\n reverseColumnsInUI?: boolean;\n removeTotals?: boolean;\n reverseSort?: boolean;\n }) {\n const fieldSizes = [10, 14];\n const nameLength = 72;\n const fieldsLength = fieldSizes[0] + fieldSizes[1] + 1;\n let headers = props.headers;\n\n let recordsToShow = props.lines ? props.lines : 10;\n if (map.size !== recordsToShow && !props.removeTotals && recordsToShow > 1) {\n recordsToShow--;\n }\n\n let sorted: [string, [number, number]][];\n const sortIndex = props.orderByFirstColumn ? 0 : 1;\n let add: string;\n if (props.reverseSort) {\n sorted = [...map.entries()].sort((a, b) => a[1][sortIndex] - b[1][sortIndex]);\n add = \"↑\";\n } else {\n sorted = [...map.entries()].sort((a, b) => b[1][sortIndex] - a[1][sortIndex]);\n add = \"↓\";\n }\n headers[sortIndex] = `${headers[sortIndex]} ${add}`;\n\n if (props.reverseColumnsInUI) {\n headers = [headers[1], headers[0]];\n const sorted2: [string, [number, number]][] = [];\n for (const [name, [count, size]] of sorted) {\n sorted2.push([name, [size, count]]);\n }\n sorted = sorted2;\n }\n\n let totalCount = 0;\n let sizeTotal = 0;\n\n props.title = `${props.title} (${sorted.length})`;\n const header0 = headers[0].padStart(fieldSizes[0]);\n let overflow = header0.length - fieldSizes[0];\n console.log(`\\n\\n${props.title.padEnd(nameLength)} │ ${header0} ${headers[1].padStart(fieldSizes[1] - overflow)}`);\n\n console.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n let index = 0;\n let allOtherCount = 0;\n let allOtherSize = 0;\n for (const [name, [count, size]] of sorted) {\n index++;\n totalCount += count;\n sizeTotal += size;\n if (index <= recordsToShow) {\n const item = name.padEnd(nameLength);\n overflow = item.length - nameLength;\n const col1 = formatNumber(count).padStart(fieldSizes[0] - overflow);\n overflow += col1.length - fieldSizes[0];\n const col2 = formatNumber(size).padStart(fieldSizes[1] - overflow);\n console.log(`${item} │ ${col1} ${col2}`);\n } else {\n allOtherCount += count;\n allOtherSize += size;\n }\n }\n\n if (!props.removeTotals) {\n if (allOtherCount || allOtherSize) {\n // eslint-disable-next-line max-len\n console.log(`${`All Others (${sorted.length - recordsToShow})`.padEnd(nameLength)} │ ${formatNumber(allOtherCount).padStart(fieldSizes[0])} ${formatNumber(allOtherSize).padStart(fieldSizes[1])}`);\n }\n console.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n // eslint-disable-next-line max-len\n console.log(`${\"Total\".padEnd(nameLength)} │ ${formatNumber(totalCount).padStart(fieldSizes[0])} ${formatNumber(sizeTotal).padStart(fieldSizes[1])}`);\n }\n}\n\nconst getObjectId = (dataStoreId: string, id: string) => `[${dataStoreId}]/${id}`;\n\n/**\n * Analyzer for sessions\n */\nclass SessionAnalyzer implements IMessageAnalyzer {\n private readonly sessionsInProgress = new Map<string, ActiveSession>();\n private readonly sessions = new Map<string, [number, number]>();\n private readonly users = new Map<string, [number, number]>();\n\n private first = true;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (this.first) {\n this.first = false;\n // Start of the road.\n const noNameSession = ActiveSession.create(noClientName, message);\n this.sessionsInProgress.set(noClientName, noNameSession);\n }\n const session = processQuorumMessages(\n message,\n skipMessage,\n this.sessionsInProgress,\n this.sessions,\n this.users);\n if (!skipMessage && session) {\n session.reportOp(message.timestamp);\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n // Close any open sessions\n reportOpenSessions(\n lastOp.timestamp,\n this.sessionsInProgress,\n this.sessions,\n this.users);\n dumpStats(this.users, {\n title: \"Users\",\n headers: [\"Sessions\", \"Op count\"],\n reverseColumnsInUI: true,\n lines: 6,\n });\n dumpStats(this.sessions, {\n title: \"Sessions\",\n headers: [\"Duration(s)\", \"Op count\"],\n reverseColumnsInUI: true,\n lines: 6,\n });\n dumpStats(this.sessions, {\n title: \"Sessions\",\n headers: [\"Duration(s)\", \"Op count\"],\n orderByFirstColumn: true,\n reverseColumnsInUI: true,\n removeTotals: true,\n lines: 5,\n });\n }\n}\n\n/**\n * Analyzer for data structures\n */\nclass DataStructureAnalyzer implements IMessageAnalyzer {\n private readonly messageTypeStats = new Map<string, [number, number]>();\n private readonly dataType = new Map<string, string>();\n private readonly dataTypeStats = new Map<string, [number, number]>();\n private readonly objectStats = new Map<string, [number, number]>();\n private readonly chunkMap = new Map<string, {chunks: string[], totalSize: number}>();\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (!skipMessage) {\n processOp(\n message,\n this.dataType,\n this.objectStats,\n msgSize,\n this.dataTypeStats,\n this.messageTypeStats,\n this.chunkMap);\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n dumpStats(this.messageTypeStats, {\n title: \"Message Type\",\n headers: [\"Op count\", \"Bytes\"],\n lines: 20,\n });\n dumpStats(calcChannelStats(this.dataType, this.objectStats), {\n title: \"Channel name\",\n headers: [\"Op count\", \"Bytes\"],\n lines: 7,\n });\n /*\n dumpStats(this.dataTypeStats, {\n title: \"Channel type\",\n headers: [\"Op count\", \"Bytes\"],\n });\n */\n }\n}\n\n/**\n * Helper class to report if we filtered out any messages.\n */\nclass FilteredMessageAnalyzer implements IMessageAnalyzer {\n private sizeTotal = 0;\n private opsTotal = 0;\n private sizeFiltered = 0;\n private opsFiltered = 0;\n private filtered = false;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n this.sizeTotal += msgSize;\n this.opsTotal++;\n if (!skipMessage) {\n this.sizeFiltered += msgSize;\n this.opsFiltered++;\n } else {\n this.filtered = true;\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n if (this.filtered) {\n // eslint-disable-next-line max-len\n console.log(`\\nData is filtered according to --filter:messageType argument(s):\\nOp size: ${this.sizeFiltered} / ${this.sizeTotal}\\nOp count ${this.opsFiltered} / ${this.opsTotal}`);\n }\n if (this.opsTotal === 0) {\n console.error(\"No ops were found\");\n }\n }\n}\n\n/**\n * Helper class to find places where we generated too many ops\n */\nclass MessageDensityAnalyzer implements IMessageAnalyzer {\n private readonly opChunk = 1000;\n private opLimit = 1;\n private size = 0;\n private timeStart = 0;\n private doctimerStart = 0;\n private readonly ranges = new Map<string, [number, number]>();\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (message.sequenceNumber >= this.opLimit) {\n if (message.sequenceNumber !== 1) {\n const timeDiff = durationFromTime(message.timestamp - this.timeStart);\n const opsString = `ops = [${this.opLimit - this.opChunk}, ${this.opLimit - 1}]`.padEnd(26);\n // eslint-disable-next-line max-len\n const timeString = `time = [${durationFromTime(this.timeStart - this.doctimerStart)}, ${durationFromTime(message.timestamp - this.doctimerStart)}]`;\n this.ranges.set(\n `${opsString} ${timeString}`,\n [timeDiff, this.size]);\n } else {\n this.doctimerStart = message.timestamp;\n }\n this.opLimit += this.opChunk;\n this.size = 0;\n this.timeStart = message.timestamp;\n }\n if (!skipMessage) {\n this.size += msgSize;\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n dumpStats(this.ranges, {\n title: \"Fastest 1000 op ranges\",\n headers: [\"Duration(s)\", \"Bytes\"],\n orderByFirstColumn: true,\n reverseSort: true,\n removeTotals: true,\n lines: 3,\n });\n }\n}\n\n/**\n * Helper class to analyze collab window size\n */\nclass CollabWindowSizeAnalyzer implements IMessageAnalyzer {\n private maxCollabWindow = 0;\n private opSeq = 0;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n const value = message.sequenceNumber - message.minimumSequenceNumber;\n if (value > this.maxCollabWindow) {\n this.maxCollabWindow = value;\n this.opSeq = message.sequenceNumber;\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n console.log(`\\nMaximum collab window size: ${this.maxCollabWindow}, seq# ${this.opSeq}`);\n }\n}\n\n/**\n * Helper class to analyze frequency of summaries\n */\nclass SummaryAnalyzer implements IMessageAnalyzer {\n private lastSummaryOp = 0;\n private maxDistance = 0;\n private maxSeq = 0;\n private minDistance = Number.MAX_SAFE_INTEGER;\n private minSeq = 0;\n private maxResponse = 0;\n private maxResponseSeq = 0;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (message.type === MessageType.SummaryAck) {\n const distance = message.sequenceNumber - this.lastSummaryOp - 1;\n if (this.maxDistance < distance) {\n this.maxDistance = distance;\n this.maxSeq = message.sequenceNumber;\n }\n if (this.minDistance > distance) {\n this.minDistance = distance;\n this.minSeq = message.sequenceNumber;\n }\n\n this.lastSummaryOp = message.sequenceNumber;\n }\n if (message.type === MessageType.SummaryAck || message.type === MessageType.SummaryNack) {\n const contents: ISummaryProposal = message.contents.summaryProposal;\n const distance = message.sequenceNumber - contents.summarySequenceNumber;\n if (distance > this.maxResponse) {\n this.maxResponse = distance;\n this.maxResponseSeq = message.sequenceNumber;\n }\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n const distance = lastOp.sequenceNumber - this.lastSummaryOp;\n if (this.maxDistance < distance) {\n this.maxDistance = distance;\n this.maxSeq = lastOp.sequenceNumber + 1;\n }\n\n console.log(\"\");\n if (this.minDistance === Number.MAX_SAFE_INTEGER) {\n console.log(\"No summaries found in this document\");\n } else {\n console.log(`Maximum distance between summaries: ${this.maxDistance}, seq# ${this.maxSeq}`);\n console.log(`Maximum server response for summary: ${this.maxResponse}, seq# ${this.maxResponseSeq}`);\n console.log(`Minimum distance between summaries: ${this.minDistance}, seq# ${this.minSeq}`);\n }\n }\n}\n\n/**\n * Helper class to dump messages to console\n */\nclass MessageDumper implements IMessageAnalyzer {\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (!skipMessage) {\n console.log(JSON.stringify(message, undefined, 2));\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n }\n}\n\nexport async function printMessageStats(\n generator, // AsyncGenerator<ISequencedDocumentMessage[]>,\n dumpMessageStats: boolean,\n dumpMessages: boolean,\n messageTypeFilter: Set<string> = new Set<string>()) {\n let lastMessage: ISequencedDocumentMessage | undefined;\n\n const analyzers: IMessageAnalyzer[] = [\n new FilteredMessageAnalyzer(), // Should come first\n new SessionAnalyzer(),\n new DataStructureAnalyzer(),\n new MessageDensityAnalyzer(),\n new CollabWindowSizeAnalyzer(),\n new SummaryAnalyzer(),\n ];\n\n if (dumpMessages) {\n analyzers.push(new MessageDumper());\n }\n\n for await (const messages of generator) {\n for (const message of (messages as ISequencedDocumentMessage[])) {\n const msgSize = JSON.stringify(message).length;\n lastMessage = message;\n\n const skipMessage = messageTypeFilter.size !== 0 && !messageTypeFilter.has(message.type);\n\n for (const analyzer of analyzers) {\n analyzer.processOp(message, msgSize, skipMessage);\n }\n }\n }\n\n if (lastMessage !== undefined) {\n if (dumpMessageStats) {\n for (const analyzer of analyzers) {\n analyzer.reportAnalyzes(lastMessage);\n }\n } else {\n // Warn about filtered messages\n analyzers[0].reportAnalyzes(lastMessage);\n }\n }\n console.log(\"\");\n}\n\nfunction processOp(\n message: ISequencedDocumentMessage,\n dataType: Map<string, string>,\n objectStats: Map<string, [number, number]>,\n msgSize: number,\n dataTypeStats: Map<string, [number, number]>,\n messageTypeStats: Map<string, [number, number]>,\n chunkMap: Map<string, {chunks: string[], totalSize: number}>) {\n let type = message.type;\n let recorded = false;\n let totalMsgSize = msgSize;\n let opCount = 1;\n if (isRuntimeMessage(message)) {\n let runtimeMessage = unpackRuntimeMessage(message);\n const messageType = runtimeMessage.type as RuntimeMessage;\n switch (messageType) {\n case RuntimeMessage.Attach: {\n const attachMessage = runtimeMessage.contents as IAttachMessage;\n processDataStoreAttachOp(attachMessage, dataType);\n break;\n }\n // skip for now because these ops do not have contents\n case RuntimeMessage.BlobAttach: {\n break;\n }\n case RuntimeMessage.ChunkedOp: {\n const chunk = runtimeMessage.contents as IChunkedOp;\n if (!chunkMap.has(runtimeMessage.clientId)) {\n chunkMap.set(runtimeMessage.clientId, {chunks: new Array<string>(chunk.totalChunks), totalSize:0});\n }\n const value = chunkMap.get(runtimeMessage.clientId);\n assert(value !== undefined, 0x2b8 /* \"Chunk should be set in map\" */);\n const chunks = value.chunks;\n const chunkIndex = chunk.chunkId - 1;\n if (chunks[chunkIndex] !== undefined) {\n throw new Error(\"Chunk already assigned\");\n }\n chunks[chunkIndex] = chunk.contents;\n value.totalSize += msgSize;\n if (chunk.chunkId === chunk.totalChunks) {\n opCount = chunk.totalChunks; // 1 op for each chunk.\n runtimeMessage = Object.create(runtimeMessage);\n runtimeMessage.contents = chunks.join(\"\");\n runtimeMessage.type = chunk.originalType;\n type = chunk.originalType;\n totalMsgSize = value.totalSize;\n chunkMap.delete(runtimeMessage.clientId);\n } else {\n return;\n }\n // eslint-disable-next-line no-fallthrough\n }\n case RuntimeMessage.FluidDataStoreOp:\n case RuntimeMessage.Alias:\n case RuntimeMessage.Rejoin:\n case RuntimeMessage.Operation:\n {\n let envelope = runtimeMessage.contents as IEnvelope;\n // TODO: Legacy?\n if (envelope && typeof envelope === \"string\") {\n envelope = JSON.parse(envelope);\n }\n const innerContent = envelope.contents as {\n content: any;\n type: string;\n };\n const address = envelope.address;\n type = `${type}/${innerContent.type}`;\n switch (innerContent.type) {\n case DataStoreMessageType.Attach: {\n const attachMessage = innerContent.content as IAttachMessage;\n let objectType = attachMessage.type;\n if (objectType.startsWith(objectTypePrefix)) {\n objectType = objectType.substring(objectTypePrefix.length);\n }\n dataType.set(getObjectId(address, attachMessage.id), objectType);\n break;\n }\n case DataStoreMessageType.ChannelOp:\n default: {\n const innerEnvelope = innerContent.content as IEnvelope;\n const innerContent2 = innerEnvelope.contents as {\n type?: string;\n value?: any;\n };\n\n const objectId = getObjectId(address, innerEnvelope.address);\n incr(objectStats, objectId, totalMsgSize, opCount);\n let objectType = dataType.get(objectId);\n if (objectType === undefined) {\n // Somehow we do not have data...\n dataType.set(objectId, objectId);\n objectType = objectId;\n }\n incr(dataTypeStats, objectType, totalMsgSize, opCount);\n recorded = true;\n\n let subType = innerContent2.type;\n if (innerContent2.type === \"set\" &&\n typeof innerContent2.value === \"object\" &&\n innerContent2.value !== null) {\n type = `${type}/${subType}`;\n subType = innerContent2.value.type;\n } else if (objectType === \"mergeTree\" && subType !== undefined) {\n const types = [\"insert\", \"remove\", \"annotate\", \"group\"];\n if (types[subType]) {\n subType = types[subType];\n }\n }\n if (subType !== undefined) {\n type = `${type}/${subType}`;\n }\n\n type = `${type} (${objectType})`;\n }\n }\n break;\n }\n default:\n unreachableCase(messageType, \"Message type not recognized!\");\n }\n }\n\n incr(messageTypeStats, type, totalMsgSize, opCount);\n if (!recorded) {\n // const objectId = `${type} (system)`;\n const objectId = `(system messages)`;\n const objectType = objectId;\n if (dataType.get(objectId) === undefined) {\n dataType.set(objectId, objectId);\n }\n incr(objectStats, objectId, totalMsgSize, opCount);\n incr(dataTypeStats, objectType, totalMsgSize, opCount);\n }\n}\n\nfunction processDataStoreAttachOp(\n attachMessage: IAttachMessage | string,\n dataType: Map<string, string>) {\n // dataType.set(getObjectId(attachMessage.id), attachMessage.type);\n\n // That's data store, and it brings a bunch of data structures.\n // Let's try to crack it.\n let parsedAttachMessage: IAttachMessage;\n if (typeof attachMessage === \"string\") {\n parsedAttachMessage = JSON.parse(attachMessage);\n } else {\n parsedAttachMessage = attachMessage;\n }\n for (const entry of parsedAttachMessage.snapshot.entries) {\n if (entry.type === TreeEntry.Tree) {\n for (const entry2 of entry.value.entries) {\n if (entry2.path === \".attributes\" && entry2.type === TreeEntry.Blob) {\n const attrib = JSON.parse(entry2.value.contents);\n let objectType = attrib.type;\n if (objectType.startsWith(objectTypePrefix)) {\n objectType = objectType.substring(objectTypePrefix.length);\n }\n dataType.set(getObjectId(parsedAttachMessage.id, entry.path), objectType);\n }\n }\n }\n }\n}\n\nfunction reportOpenSessions(\n lastOpTimestamp: number,\n sessionsInProgress: Map<string, ActiveSession>,\n sessions: Map<string, [number, number]>,\n users: Map<string, [number, number]>) {\n const activeSessions = new Map<string, [number, number]>();\n\n for (const [clientId, ses] of sessionsInProgress) {\n const sessionInfo = ses.leave(lastOpTimestamp);\n if (clientId !== noClientName) {\n const sessionName = `${clientId} (${sessionInfo.email})`;\n const sessionPayload: [number, number] = [durationFromTime(sessionInfo.duration), sessionInfo.opCount];\n sessions.set(sessionName, sessionPayload);\n activeSessions.set(sessionName, sessionPayload);\n } else {\n sessions.set(\n `Full file lifespan (noClient messages)`,\n [durationFromTime(sessionInfo.duration), sessionInfo.opCount]);\n }\n incr(users, sessionInfo.email, sessionInfo.opCount);\n }\n\n if (activeSessions.size > 0) {\n dumpStats(activeSessions, {\n title: \"Active sessions\",\n headers: [\"Duration\", \"Op count\"],\n lines: 6,\n orderByFirstColumn: true,\n removeTotals: true,\n });\n }\n}\n\nfunction calcChannelStats(dataType: Map<string, string>, objectStats: Map<string, [number, number]>) {\n const channelStats = new Map<string, [number, number]>();\n for (const [objectId, type] of dataType) {\n let value = objectStats.get(objectId);\n if (value === undefined) {\n value = [0, 0];\n }\n if (type === objectId) {\n channelStats.set(`${objectId}`, value);\n } else {\n channelStats.set(`${objectId} (${type})`, value);\n }\n }\n return channelStats;\n}\n\nfunction processQuorumMessages(\n message: ISequencedDocumentMessage,\n skipMessage: boolean,\n sessionsInProgress: Map<string, ActiveSession>,\n sessions: Map<string, [number, number]>,\n users: Map<string, [number, number]>) {\n let session: ActiveSession | undefined;\n const dataString = (message as any).data;\n if (message.type === \"join\") {\n const data = JSON.parse(dataString);\n session = ActiveSession.create(data.detail.user.id, message);\n sessionsInProgress.set(data.clientId, session);\n } else if (message.type === \"leave\") {\n const clientId = JSON.parse(dataString);\n session = sessionsInProgress.get(clientId);\n sessionsInProgress.delete(clientId);\n assert(!!session, 0x1b7 /* \"Bad session state for processing quorum messages\" */);\n if (session) {\n if (!skipMessage) {\n session.reportOp(message.timestamp);\n }\n const sessionInfo: ISessionInfo = session.leave(message.timestamp);\n sessions.set(\n `${clientId} (${sessionInfo.email})`,\n [durationFromTime(sessionInfo.duration), sessionInfo.opCount]);\n incr(users, sessionInfo.email, sessionInfo.opCount);\n session = undefined; // Do not record it second time\n }\n } else {\n // message.clientId can be null\n session = sessionsInProgress.get(message.clientId);\n if (session === undefined) {\n session = sessionsInProgress.get(noClientName);\n assert(!!session, 0x1b8 /* \"Bad session state for processing quorum messages\" */);\n }\n }\n return 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 { assert, unreachableCase } from \"@fluidframework/common-utils\";\nimport {\n ISequencedDocumentMessage,\n ISummaryProposal,\n MessageType,\n TreeEntry,\n} from \"@fluidframework/protocol-definitions\";\nimport { IAttachMessage, IEnvelope } from \"@fluidframework/runtime-definitions\";\nimport {\n IChunkedOp,\n isRuntimeMessage,\n RuntimeMessage,\n unpackRuntimeMessage,\n} from \"@fluidframework/container-runtime\";\nimport { DataStoreMessageType } from \"@fluidframework/datastore\";\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) {\n const value = map.get(key);\n if (value === undefined) {\n map.set(key, [count, size]);\n } else {\n value[0] += count;\n value[1] += size;\n map.set(key, value);\n }\n}\n\ninterface ISessionInfo {\n startSeq: number;\n opCount: number;\n email: string;\n duration: number;\n}\n\ninterface IMessageAnalyzer {\n processOp(op: ISequencedDocumentMessage, msgSize: number, filteredOutOp: boolean): void;\n reportAnalyzes(lastOp: ISequencedDocumentMessage): void;\n}\n\n/**\n * Helper class to track session statistics\n */\nclass ActiveSession {\n public static create(email: string, message: ISequencedDocumentMessage) {\n return new ActiveSession(email, message);\n }\n\n private opCount = 0;\n\n constructor(private readonly email: string, private readonly startMessage: ISequencedDocumentMessage) {\n }\n\n public reportOp(timestamp: number) {\n this.opCount++;\n }\n\n public leave(timestamp: number): ISessionInfo {\n return {\n opCount: this.opCount,\n email: this.email,\n startSeq: this.startMessage.sequenceNumber,\n duration: timestamp - this.startMessage.timestamp,\n };\n }\n}\n\n// Format a number separating 3 digits by comma\n// eslint-disable-next-line unicorn/no-unsafe-regex\nexport const formatNumber = (num: number): string => num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n\nfunction dumpStats(\n map: Map<string, [number, number]>,\n props: {\n title: string;\n headers: [string, string];\n lines?: number;\n orderByFirstColumn?: boolean;\n reverseColumnsInUI?: boolean;\n removeTotals?: boolean;\n reverseSort?: boolean;\n }) {\n const fieldSizes = [10, 14];\n const nameLength = 72;\n const fieldsLength = fieldSizes[0] + fieldSizes[1] + 1;\n let headers = props.headers;\n\n let recordsToShow = props.lines ? props.lines : 10;\n if (map.size !== recordsToShow && !props.removeTotals && recordsToShow > 1) {\n recordsToShow--;\n }\n\n let sorted: [string, [number, number]][];\n const sortIndex = props.orderByFirstColumn ? 0 : 1;\n let add: string;\n if (props.reverseSort) {\n sorted = [...map.entries()].sort((a, b) => a[1][sortIndex] - b[1][sortIndex]);\n add = \"↑\";\n } else {\n sorted = [...map.entries()].sort((a, b) => b[1][sortIndex] - a[1][sortIndex]);\n add = \"↓\";\n }\n headers[sortIndex] = `${headers[sortIndex]} ${add}`;\n\n if (props.reverseColumnsInUI) {\n headers = [headers[1], headers[0]];\n const sorted2: [string, [number, number]][] = [];\n for (const [name, [count, size]] of sorted) {\n sorted2.push([name, [size, count]]);\n }\n sorted = sorted2;\n }\n\n let totalCount = 0;\n let sizeTotal = 0;\n\n props.title = `${props.title} (${sorted.length})`;\n const header0 = headers[0].padStart(fieldSizes[0]);\n let overflow = header0.length - fieldSizes[0];\n console.log(`\\n\\n${props.title.padEnd(nameLength)} │ ${header0} ${headers[1].padStart(fieldSizes[1] - overflow)}`);\n\n console.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n let index = 0;\n let allOtherCount = 0;\n let allOtherSize = 0;\n for (const [name, [count, size]] of sorted) {\n index++;\n totalCount += count;\n sizeTotal += size;\n if (index <= recordsToShow) {\n const item = name.padEnd(nameLength);\n overflow = item.length - nameLength;\n const col1 = formatNumber(count).padStart(fieldSizes[0] - overflow);\n overflow += col1.length - fieldSizes[0];\n const col2 = formatNumber(size).padStart(fieldSizes[1] - overflow);\n console.log(`${item} │ ${col1} ${col2}`);\n } else {\n allOtherCount += count;\n allOtherSize += size;\n }\n }\n\n if (!props.removeTotals) {\n if (allOtherCount || allOtherSize) {\n // eslint-disable-next-line max-len\n console.log(`${`All Others (${sorted.length - recordsToShow})`.padEnd(nameLength)} │ ${formatNumber(allOtherCount).padStart(fieldSizes[0])} ${formatNumber(allOtherSize).padStart(fieldSizes[1])}`);\n }\n console.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n // eslint-disable-next-line max-len\n console.log(`${\"Total\".padEnd(nameLength)} │ ${formatNumber(totalCount).padStart(fieldSizes[0])} ${formatNumber(sizeTotal).padStart(fieldSizes[1])}`);\n }\n}\n\nconst getObjectId = (dataStoreId: string, id: string) => `[${dataStoreId}]/${id}`;\n\n/**\n * Analyzer for sessions\n */\nclass SessionAnalyzer implements IMessageAnalyzer {\n private readonly sessionsInProgress = new Map<string, ActiveSession>();\n private readonly sessions = new Map<string, [number, number]>();\n private readonly users = new Map<string, [number, number]>();\n\n private first = true;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (this.first) {\n this.first = false;\n // Start of the road.\n const noNameSession = ActiveSession.create(noClientName, message);\n this.sessionsInProgress.set(noClientName, noNameSession);\n }\n const session = processQuorumMessages(\n message,\n skipMessage,\n this.sessionsInProgress,\n this.sessions,\n this.users);\n if (!skipMessage && session) {\n session.reportOp(message.timestamp);\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n // Close any open sessions\n reportOpenSessions(\n lastOp.timestamp,\n this.sessionsInProgress,\n this.sessions,\n this.users);\n dumpStats(this.users, {\n title: \"Users\",\n headers: [\"Sessions\", \"Op count\"],\n reverseColumnsInUI: true,\n lines: 6,\n });\n dumpStats(this.sessions, {\n title: \"Sessions\",\n headers: [\"Duration(s)\", \"Op count\"],\n reverseColumnsInUI: true,\n lines: 6,\n });\n dumpStats(this.sessions, {\n title: \"Sessions\",\n headers: [\"Duration(s)\", \"Op count\"],\n orderByFirstColumn: true,\n reverseColumnsInUI: true,\n removeTotals: true,\n lines: 5,\n });\n }\n}\n\n/**\n * Analyzer for data structures\n */\nclass DataStructureAnalyzer implements IMessageAnalyzer {\n private readonly messageTypeStats = new Map<string, [number, number]>();\n private readonly dataType = new Map<string, string>();\n private readonly dataTypeStats = new Map<string, [number, number]>();\n private readonly objectStats = new Map<string, [number, number]>();\n private readonly chunkMap = new Map<string, { chunks: string[]; totalSize: number; }>();\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (!skipMessage) {\n processOp(\n message,\n this.dataType,\n this.objectStats,\n msgSize,\n this.dataTypeStats,\n this.messageTypeStats,\n this.chunkMap);\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n dumpStats(this.messageTypeStats, {\n title: \"Message Type\",\n headers: [\"Op count\", \"Bytes\"],\n lines: 20,\n });\n dumpStats(calcChannelStats(this.dataType, this.objectStats), {\n title: \"Channel name\",\n headers: [\"Op count\", \"Bytes\"],\n lines: 7,\n });\n /*\n dumpStats(this.dataTypeStats, {\n title: \"Channel type\",\n headers: [\"Op count\", \"Bytes\"],\n });\n */\n }\n}\n\n/**\n * Helper class to report if we filtered out any messages.\n */\nclass FilteredMessageAnalyzer implements IMessageAnalyzer {\n private sizeTotal = 0;\n private opsTotal = 0;\n private sizeFiltered = 0;\n private opsFiltered = 0;\n private filtered = false;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n this.sizeTotal += msgSize;\n this.opsTotal++;\n if (!skipMessage) {\n this.sizeFiltered += msgSize;\n this.opsFiltered++;\n } else {\n this.filtered = true;\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n if (this.filtered) {\n // eslint-disable-next-line max-len\n console.log(`\\nData is filtered according to --filter:messageType argument(s):\\nOp size: ${this.sizeFiltered} / ${this.sizeTotal}\\nOp count ${this.opsFiltered} / ${this.opsTotal}`);\n }\n if (this.opsTotal === 0) {\n console.error(\"No ops were found\");\n }\n }\n}\n\n/**\n * Helper class to find places where we generated too many ops\n */\nclass MessageDensityAnalyzer implements IMessageAnalyzer {\n private readonly opChunk = 1000;\n private opLimit = 1;\n private size = 0;\n private timeStart = 0;\n private doctimerStart = 0;\n private readonly ranges = new Map<string, [number, number]>();\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (message.sequenceNumber >= this.opLimit) {\n if (message.sequenceNumber !== 1) {\n const timeDiff = durationFromTime(message.timestamp - this.timeStart);\n const opsString = `ops = [${this.opLimit - this.opChunk}, ${this.opLimit - 1}]`.padEnd(26);\n // eslint-disable-next-line max-len\n const timeString = `time = [${durationFromTime(this.timeStart - this.doctimerStart)}, ${durationFromTime(message.timestamp - this.doctimerStart)}]`;\n this.ranges.set(\n `${opsString} ${timeString}`,\n [timeDiff, this.size]);\n } else {\n this.doctimerStart = message.timestamp;\n }\n this.opLimit += this.opChunk;\n this.size = 0;\n this.timeStart = message.timestamp;\n }\n if (!skipMessage) {\n this.size += msgSize;\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n dumpStats(this.ranges, {\n title: \"Fastest 1000 op ranges\",\n headers: [\"Duration(s)\", \"Bytes\"],\n orderByFirstColumn: true,\n reverseSort: true,\n removeTotals: true,\n lines: 3,\n });\n }\n}\n\n/**\n * Helper class to analyze collab window size\n */\nclass CollabWindowSizeAnalyzer implements IMessageAnalyzer {\n private maxCollabWindow = 0;\n private opSeq = 0;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n const value = message.sequenceNumber - message.minimumSequenceNumber;\n if (value > this.maxCollabWindow) {\n this.maxCollabWindow = value;\n this.opSeq = message.sequenceNumber;\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n console.log(`\\nMaximum collab window size: ${this.maxCollabWindow}, seq# ${this.opSeq}`);\n }\n}\n\n/**\n * Helper class to analyze frequency of summaries\n */\nclass SummaryAnalyzer implements IMessageAnalyzer {\n private lastSummaryOp = 0;\n private maxDistance = 0;\n private maxSeq = 0;\n private minDistance = Number.MAX_SAFE_INTEGER;\n private minSeq = 0;\n private maxResponse = 0;\n private maxResponseSeq = 0;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (message.type === MessageType.SummaryAck) {\n const distance = message.sequenceNumber - this.lastSummaryOp - 1;\n if (this.maxDistance < distance) {\n this.maxDistance = distance;\n this.maxSeq = message.sequenceNumber;\n }\n if (this.minDistance > distance) {\n this.minDistance = distance;\n this.minSeq = message.sequenceNumber;\n }\n\n this.lastSummaryOp = message.sequenceNumber;\n }\n if (message.type === MessageType.SummaryAck || message.type === MessageType.SummaryNack) {\n const contents: ISummaryProposal = message.contents.summaryProposal;\n const distance = message.sequenceNumber - contents.summarySequenceNumber;\n if (distance > this.maxResponse) {\n this.maxResponse = distance;\n this.maxResponseSeq = message.sequenceNumber;\n }\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n const distance = lastOp.sequenceNumber - this.lastSummaryOp;\n if (this.maxDistance < distance) {\n this.maxDistance = distance;\n this.maxSeq = lastOp.sequenceNumber + 1;\n }\n\n console.log(\"\");\n if (this.minDistance === Number.MAX_SAFE_INTEGER) {\n console.log(\"No summaries found in this document\");\n } else {\n console.log(`Maximum distance between summaries: ${this.maxDistance}, seq# ${this.maxSeq}`);\n console.log(`Maximum server response for summary: ${this.maxResponse}, seq# ${this.maxResponseSeq}`);\n console.log(`Minimum distance between summaries: ${this.minDistance}, seq# ${this.minSeq}`);\n }\n }\n}\n\n/**\n * Helper class to dump messages to console\n */\nclass MessageDumper implements IMessageAnalyzer {\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (!skipMessage) {\n console.log(JSON.stringify(message, undefined, 2));\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n }\n}\n\nexport async function printMessageStats(\n generator, // AsyncGenerator<ISequencedDocumentMessage[]>,\n dumpMessageStats: boolean,\n dumpMessages: boolean,\n messageTypeFilter: Set<string> = new Set<string>()) {\n let lastMessage: ISequencedDocumentMessage | undefined;\n\n const analyzers: IMessageAnalyzer[] = [\n new FilteredMessageAnalyzer(), // Should come first\n new SessionAnalyzer(),\n new DataStructureAnalyzer(),\n new MessageDensityAnalyzer(),\n new CollabWindowSizeAnalyzer(),\n new SummaryAnalyzer(),\n ];\n\n if (dumpMessages) {\n analyzers.push(new MessageDumper());\n }\n\n for await (const messages of generator) {\n for (const message of (messages as ISequencedDocumentMessage[])) {\n const msgSize = JSON.stringify(message).length;\n lastMessage = message;\n\n const skipMessage = messageTypeFilter.size !== 0 && !messageTypeFilter.has(message.type);\n\n for (const analyzer of analyzers) {\n analyzer.processOp(message, msgSize, skipMessage);\n }\n }\n }\n\n if (lastMessage !== undefined) {\n if (dumpMessageStats) {\n for (const analyzer of analyzers) {\n analyzer.reportAnalyzes(lastMessage);\n }\n } else {\n // Warn about filtered messages\n analyzers[0].reportAnalyzes(lastMessage);\n }\n }\n console.log(\"\");\n}\n\nfunction processOp(\n message: ISequencedDocumentMessage,\n dataType: Map<string, string>,\n objectStats: Map<string, [number, number]>,\n msgSize: number,\n dataTypeStats: Map<string, [number, number]>,\n messageTypeStats: Map<string, [number, number]>,\n chunkMap: Map<string, { chunks: string[]; totalSize: number; }>) {\n let type = message.type;\n let recorded = false;\n let totalMsgSize = msgSize;\n let opCount = 1;\n if (isRuntimeMessage(message)) {\n let runtimeMessage = unpackRuntimeMessage(message);\n const messageType = runtimeMessage.type as RuntimeMessage;\n switch (messageType) {\n case RuntimeMessage.Attach: {\n const attachMessage = runtimeMessage.contents as IAttachMessage;\n processDataStoreAttachOp(attachMessage, dataType);\n break;\n }\n // skip for now because these ops do not have contents\n case RuntimeMessage.BlobAttach: {\n break;\n }\n case RuntimeMessage.ChunkedOp: {\n const chunk = runtimeMessage.contents as IChunkedOp;\n if (!chunkMap.has(runtimeMessage.clientId)) {\n chunkMap.set(\n runtimeMessage.clientId, {\n chunks: new Array<string>(chunk.totalChunks),\n totalSize: 0,\n });\n }\n const value = chunkMap.get(runtimeMessage.clientId);\n assert(value !== undefined, 0x2b8 /* \"Chunk should be set in map\" */);\n const chunks = value.chunks;\n const chunkIndex = chunk.chunkId - 1;\n if (chunks[chunkIndex] !== undefined) {\n throw new Error(\"Chunk already assigned\");\n }\n chunks[chunkIndex] = chunk.contents;\n value.totalSize += msgSize;\n if (chunk.chunkId === chunk.totalChunks) {\n opCount = chunk.totalChunks; // 1 op for each chunk.\n runtimeMessage = Object.create(runtimeMessage);\n runtimeMessage.contents = chunks.join(\"\");\n runtimeMessage.type = chunk.originalType;\n type = chunk.originalType;\n totalMsgSize = value.totalSize;\n chunkMap.delete(runtimeMessage.clientId);\n } else {\n return;\n }\n // eslint-disable-next-line no-fallthrough\n }\n case RuntimeMessage.FluidDataStoreOp:\n case RuntimeMessage.Alias:\n case RuntimeMessage.Rejoin:\n case RuntimeMessage.Operation:\n {\n let envelope = runtimeMessage.contents as IEnvelope;\n // TODO: Legacy?\n if (envelope && typeof envelope === \"string\") {\n envelope = JSON.parse(envelope);\n }\n const innerContent = envelope.contents as {\n content: any;\n type: string;\n };\n const address = envelope.address;\n type = `${type}/${innerContent.type}`;\n switch (innerContent.type) {\n case DataStoreMessageType.Attach: {\n const attachMessage = innerContent.content as IAttachMessage;\n let objectType = attachMessage.type;\n if (objectType.startsWith(objectTypePrefix)) {\n objectType = objectType.substring(objectTypePrefix.length);\n }\n dataType.set(getObjectId(address, attachMessage.id), objectType);\n break;\n }\n case DataStoreMessageType.ChannelOp:\n default: {\n const innerEnvelope = innerContent.content as IEnvelope;\n const innerContent2 = innerEnvelope.contents as {\n type?: string;\n value?: any;\n };\n\n const objectId = getObjectId(address, innerEnvelope.address);\n incr(objectStats, objectId, totalMsgSize, opCount);\n let objectType = dataType.get(objectId);\n if (objectType === undefined) {\n // Somehow we do not have data...\n dataType.set(objectId, objectId);\n objectType = objectId;\n }\n incr(dataTypeStats, objectType, totalMsgSize, opCount);\n recorded = true;\n\n let subType = innerContent2.type;\n if (innerContent2.type === \"set\" &&\n typeof innerContent2.value === \"object\" &&\n innerContent2.value !== null) {\n type = `${type}/${subType}`;\n subType = innerContent2.value.type;\n } else if (objectType === \"mergeTree\" && subType !== undefined) {\n const types = [\"insert\", \"remove\", \"annotate\", \"group\"];\n if (types[subType]) {\n subType = types[subType];\n }\n }\n if (subType !== undefined) {\n type = `${type}/${subType}`;\n }\n\n type = `${type} (${objectType})`;\n }\n }\n break;\n }\n default:\n unreachableCase(messageType, \"Message type not recognized!\");\n }\n }\n\n incr(messageTypeStats, type, totalMsgSize, opCount);\n if (!recorded) {\n // const objectId = `${type} (system)`;\n const objectId = `(system messages)`;\n const objectType = objectId;\n if (dataType.get(objectId) === undefined) {\n dataType.set(objectId, objectId);\n }\n incr(objectStats, objectId, totalMsgSize, opCount);\n incr(dataTypeStats, objectType, totalMsgSize, opCount);\n }\n}\n\nfunction processDataStoreAttachOp(\n attachMessage: IAttachMessage | string,\n dataType: Map<string, string>) {\n // dataType.set(getObjectId(attachMessage.id), attachMessage.type);\n\n // That's data store, and it brings a bunch of data structures.\n // Let's try to crack it.\n let parsedAttachMessage: IAttachMessage;\n if (typeof attachMessage === \"string\") {\n parsedAttachMessage = JSON.parse(attachMessage);\n } else {\n parsedAttachMessage = attachMessage;\n }\n for (const entry of parsedAttachMessage.snapshot.entries) {\n if (entry.type === TreeEntry.Tree) {\n for (const entry2 of entry.value.entries) {\n if (entry2.path === \".attributes\" && entry2.type === TreeEntry.Blob) {\n const attrib = JSON.parse(entry2.value.contents);\n let objectType = attrib.type;\n if (objectType.startsWith(objectTypePrefix)) {\n objectType = objectType.substring(objectTypePrefix.length);\n }\n dataType.set(getObjectId(parsedAttachMessage.id, entry.path), objectType);\n }\n }\n }\n }\n}\n\nfunction reportOpenSessions(\n lastOpTimestamp: number,\n sessionsInProgress: Map<string, ActiveSession>,\n sessions: Map<string, [number, number]>,\n users: Map<string, [number, number]>) {\n const activeSessions = new Map<string, [number, number]>();\n\n for (const [clientId, ses] of sessionsInProgress) {\n const sessionInfo = ses.leave(lastOpTimestamp);\n if (clientId !== noClientName) {\n const sessionName = `${clientId} (${sessionInfo.email})`;\n const sessionPayload: [number, number] = [durationFromTime(sessionInfo.duration), sessionInfo.opCount];\n sessions.set(sessionName, sessionPayload);\n activeSessions.set(sessionName, sessionPayload);\n } else {\n sessions.set(\n `Full file lifespan (noClient messages)`,\n [durationFromTime(sessionInfo.duration), sessionInfo.opCount]);\n }\n incr(users, sessionInfo.email, sessionInfo.opCount);\n }\n\n if (activeSessions.size > 0) {\n dumpStats(activeSessions, {\n title: \"Active sessions\",\n headers: [\"Duration\", \"Op count\"],\n lines: 6,\n orderByFirstColumn: true,\n removeTotals: true,\n });\n }\n}\n\nfunction calcChannelStats(dataType: Map<string, string>, objectStats: Map<string, [number, number]>) {\n const channelStats = new Map<string, [number, number]>();\n for (const [objectId, type] of dataType) {\n let value = objectStats.get(objectId);\n if (value === undefined) {\n value = [0, 0];\n }\n if (type === objectId) {\n channelStats.set(`${objectId}`, value);\n } else {\n channelStats.set(`${objectId} (${type})`, value);\n }\n }\n return channelStats;\n}\n\nfunction processQuorumMessages(\n message: ISequencedDocumentMessage,\n skipMessage: boolean,\n sessionsInProgress: Map<string, ActiveSession>,\n sessions: Map<string, [number, number]>,\n users: Map<string, [number, number]>) {\n let session: ActiveSession | undefined;\n const dataString = (message as any).data;\n if (message.type === \"join\") {\n const data = JSON.parse(dataString);\n session = ActiveSession.create(data.detail.user.id, message);\n sessionsInProgress.set(data.clientId, session);\n } else if (message.type === \"leave\") {\n const clientId = JSON.parse(dataString);\n session = sessionsInProgress.get(clientId);\n sessionsInProgress.delete(clientId);\n assert(!!session, 0x1b7 /* \"Bad session state for processing quorum messages\" */);\n if (session) {\n if (!skipMessage) {\n session.reportOp(message.timestamp);\n }\n const sessionInfo: ISessionInfo = session.leave(message.timestamp);\n sessions.set(\n `${clientId} (${sessionInfo.email})`,\n [durationFromTime(sessionInfo.duration), sessionInfo.opCount]);\n incr(users, sessionInfo.email, sessionInfo.opCount);\n session = undefined; // Do not record it second time\n }\n } else {\n // message.clientId can be null\n session = sessionsInProgress.get(message.clientId);\n if (session === undefined) {\n session = sessionsInProgress.get(noClientName);\n assert(!!session, 0x1b8 /* \"Bad session state for processing quorum messages\" */);\n }\n }\n return session;\n}\n\nconst durationFromTime = (time: number): number => Math.floor(time / 1000);\n"]}
|
package/dist/fluidFetch.js
CHANGED
|
@@ -16,7 +16,7 @@ const fluidFetchMessages_1 = require("./fluidFetchMessages");
|
|
|
16
16
|
const fluidFetchSharePoint_1 = require("./fluidFetchSharePoint");
|
|
17
17
|
const fluidFetchSnapshot_1 = require("./fluidFetchSnapshot");
|
|
18
18
|
async function fluidFetchOneFile(urlStr, name) {
|
|
19
|
-
const documentService = await fluidFetchInit_1.fluidFetchInit(urlStr);
|
|
19
|
+
const documentService = await (0, fluidFetchInit_1.fluidFetchInit)(urlStr);
|
|
20
20
|
const saveDir = fluidFetchArgs_1.paramSaveDir ? (name ? `${fluidFetchArgs_1.paramSaveDir}/${name}` : fluidFetchArgs_1.paramSaveDir) : undefined;
|
|
21
21
|
if (saveDir !== undefined) {
|
|
22
22
|
const mkdir = util_1.default.promisify(fs_1.default.mkdir);
|
|
@@ -29,8 +29,8 @@ async function fluidFetchOneFile(urlStr, name) {
|
|
|
29
29
|
};
|
|
30
30
|
await writeFile(`${saveDir}/info.json`, JSON.stringify(info, undefined, 2));
|
|
31
31
|
}
|
|
32
|
-
await fluidFetchSnapshot_1.fluidFetchSnapshot(documentService, saveDir);
|
|
33
|
-
await fluidFetchMessages_1.fluidFetchMessages(documentService, saveDir);
|
|
32
|
+
await (0, fluidFetchSnapshot_1.fluidFetchSnapshot)(documentService, saveDir);
|
|
33
|
+
await (0, fluidFetchMessages_1.fluidFetchMessages)(documentService, saveDir);
|
|
34
34
|
}
|
|
35
35
|
async function tryFluidFetchOneSharePointFile(server, driveItem) {
|
|
36
36
|
const { path, name, driveId, itemId } = driveItem;
|
|
@@ -69,18 +69,18 @@ async function fluidFetchMain() {
|
|
|
69
69
|
}
|
|
70
70
|
const url = new URL(fluidFetchArgs_1.paramURL);
|
|
71
71
|
const server = url.hostname;
|
|
72
|
-
if (odsp_doclib_utils_1.isOdspHostname(server)) {
|
|
72
|
+
if ((0, odsp_doclib_utils_1.isOdspHostname)(server)) {
|
|
73
73
|
// See if the url already has the specific item
|
|
74
74
|
const driveItem = getSharePointSpecificDriveItem(url);
|
|
75
75
|
if (driveItem) {
|
|
76
|
-
const file = await fluidFetchSharePoint_1.getSingleSharePointFile(server, driveItem.driveId, driveItem.itemId);
|
|
76
|
+
const file = await (0, fluidFetchSharePoint_1.getSingleSharePointFile)(server, driveItem.driveId, driveItem.itemId);
|
|
77
77
|
await tryFluidFetchOneSharePointFile(server, file);
|
|
78
78
|
return;
|
|
79
79
|
}
|
|
80
80
|
// See if the url given represent a sharepoint directory
|
|
81
81
|
const serverRelativePath = getSharepointServerRelativePathFromURL(url);
|
|
82
82
|
if (serverRelativePath) {
|
|
83
|
-
const files = await fluidFetchSharePoint_1.getSharepointFiles(server, serverRelativePath, false);
|
|
83
|
+
const files = await (0, fluidFetchSharePoint_1.getSharepointFiles)(server, serverRelativePath, false);
|
|
84
84
|
for (const file of files) {
|
|
85
85
|
if (file.name.endsWith(".b") || file.name.endsWith(".fluid")) {
|
|
86
86
|
await tryFluidFetchOneSharePointFile(server, file);
|
|
@@ -91,7 +91,7 @@ async function fluidFetchMain() {
|
|
|
91
91
|
}
|
|
92
92
|
return fluidFetchOneFile(fluidFetchArgs_1.paramURL);
|
|
93
93
|
}
|
|
94
|
-
fluidFetchArgs_1.parseArguments();
|
|
94
|
+
(0, fluidFetchArgs_1.parseArguments)();
|
|
95
95
|
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
96
96
|
fluidFetchMain()
|
|
97
97
|
.catch((error) => {
|
package/dist/fluidFetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidFetch.js","sourceRoot":"","sources":["../src/fluidFetch.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAEH,4CAAoB;AACpB,gDAAwB;AACxB,yEAAmF;AACnF,qDAA0E;AAC1E,qDAAkE;AAClE,6DAA0D;AAC1D,iEAAqF;AACrF,6DAA0D;AAE1D,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,IAAa;IAC1D,MAAM,eAAe,GAAG,MAAM,+BAAc,
|
|
1
|
+
{"version":3,"file":"fluidFetch.js","sourceRoot":"","sources":["../src/fluidFetch.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAEH,4CAAoB;AACpB,gDAAwB;AACxB,yEAAmF;AACnF,qDAA0E;AAC1E,qDAAkE;AAClE,6DAA0D;AAC1D,iEAAqF;AACrF,6DAA0D;AAE1D,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,IAAa;IAC1D,MAAM,eAAe,GAAG,MAAM,IAAA,+BAAc,EAAC,MAAM,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,6BAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,6BAAY,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,6BAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,IAAI,OAAO,KAAK,SAAS,EAAE;QACvB,MAAM,KAAK,GAAG,cAAI,CAAC,SAAS,CAAC,YAAE,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,cAAI,CAAC,SAAS,CAAC,YAAE,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG;YACT,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE;YACnC,cAAc,EAAd,+BAAc;YACd,GAAG,EAAE,MAAM;SACd,CAAC;QACF,MAAM,SAAS,CAAC,GAAG,OAAO,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;KAC/E;IAED,MAAM,IAAA,uCAAkB,EAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,IAAA,uCAAkB,EAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,8BAA8B,CAAC,MAAc,EAAE,SAAyB;IACnF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,iBAAiB,CAAC,WAAW,MAAM,qBAAqB,OAAO,UAAU,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,8BAA8B,CAAC,GAAQ;IAC5C,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;QACnE,OAAO;YACH,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAW;YAClD,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAW;SACnD,CAAC;KACL;AACL,CAAC;AAED,SAAS,sCAAsC,CAAC,GAAQ;IACpD,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE;QAC/C,OAAO,SAAS,CAAC;KACpB;IAED,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAExG,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC5B,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC5B,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAW,CAAC;KACnD;SAAM,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;QAC3C,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAW,CAAC;KAC3D;SAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;QACpD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;KACtE;IAED,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,cAAc;IACzB,IAAI,CAAC,yBAAQ,EAAE;QACX,OAAO;KACV;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,yBAAQ,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC5B,IAAI,IAAA,kCAAc,EAAC,MAAM,CAAC,EAAE;QACxB,+CAA+C;QAC/C,MAAM,SAAS,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,SAAS,EAAE;YACX,MAAM,IAAI,GAAG,MAAM,IAAA,8CAAuB,EAAC,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YACxF,MAAM,8BAA8B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACnD,OAAO;SACV;QAED,wDAAwD;QACxD,MAAM,kBAAkB,GAAG,sCAAsC,CAAC,GAAG,CAAC,CAAC;QACvE,IAAI,kBAAkB,EAAE;YACpB,MAAM,KAAK,GAAG,MAAM,IAAA,yCAAkB,EAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;YAC1E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACtB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBAC1D,MAAM,8BAA8B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;iBACtD;aACJ;YACD,OAAO;SACV;KACJ;IAED,OAAO,iBAAiB,CAAC,yBAAQ,CAAC,CAAC;AACvC,CAAC;AAED,IAAA,+BAAc,GAAE,CAAC;AAEjB,mEAAmE;AACnE,cAAc,EAAE;KACX,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE;IACpB,IAAI,KAAK,YAAY,KAAK,EAAE;QACxB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAClC,2CAA2C;YAC3C,IAAI;gBACA,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO,EAAE;oBACtC,QAAQ,IAAI,KAAK,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;iBACvE;aACJ;YAAC,OAAO,CAAC,EAAE,GAAE;SACjB;QACD,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC,CAAC;KACrD;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAClC,OAAO,CAAC,KAAK,CAAC,oCAAoC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;KAC5F;SAAM;QACH,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;KACpC;AACL,CAAC,CAAC;KACD,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\nimport util from \"util\";\nimport { isOdspHostname, IOdspDriveItem } from \"@fluidframework/odsp-doclib-utils\";\nimport { paramSaveDir, paramURL, parseArguments } from \"./fluidFetchArgs\";\nimport { connectionInfo, fluidFetchInit } from \"./fluidFetchInit\";\nimport { fluidFetchMessages } from \"./fluidFetchMessages\";\nimport { getSharepointFiles, getSingleSharePointFile } from \"./fluidFetchSharePoint\";\nimport { fluidFetchSnapshot } from \"./fluidFetchSnapshot\";\n\nasync function fluidFetchOneFile(urlStr: string, name?: string) {\n const documentService = await fluidFetchInit(urlStr);\n const saveDir = paramSaveDir ? (name ? `${paramSaveDir}/${name}` : paramSaveDir) : undefined;\n if (saveDir !== undefined) {\n const mkdir = util.promisify(fs.mkdir);\n const writeFile = util.promisify(fs.writeFile);\n await mkdir(saveDir, { recursive: true });\n const info = {\n creationDate: new Date().toString(),\n connectionInfo,\n url: urlStr,\n };\n await writeFile(`${saveDir}/info.json`, JSON.stringify(info, undefined, 2));\n }\n\n await fluidFetchSnapshot(documentService, saveDir);\n await fluidFetchMessages(documentService, saveDir);\n}\n\nasync function tryFluidFetchOneSharePointFile(server: string, driveItem: IOdspDriveItem) {\n const { path, name, driveId, itemId } = driveItem;\n console.log(`File: ${path}/${name}`);\n await fluidFetchOneFile(`https://${server}/_api/v2.1/drives/${driveId}/items/${itemId}`, name);\n}\n\nfunction getSharePointSpecificDriveItem(url: URL): { driveId: string; itemId: string; } | undefined {\n if (url.searchParams.has(\"driveId\") && url.searchParams.has(\"itemId\")) {\n return {\n driveId: url.searchParams.get(\"driveId\") as string,\n itemId: url.searchParams.get(\"itemId\") as string,\n };\n }\n}\n\nfunction getSharepointServerRelativePathFromURL(url: URL) {\n if (url.pathname.startsWith(\"/_api/v2.1/drives/\")) {\n return undefined;\n }\n\n const hostnameParts = url.hostname.split(\".\");\n const suffix = hostnameParts[0].endsWith(\"-my\") ? \"/_layouts/15/onedrive.aspx\" : \"/forms/allitems.aspx\";\n\n let sitePath = url.pathname;\n if (url.searchParams.has(\"id\")) {\n sitePath = url.searchParams.get(\"id\") as string;\n } else if (url.searchParams.has(\"RootFolder\")) {\n sitePath = url.searchParams.get(\"RootFolder\") as string;\n } else if (url.pathname.toLowerCase().endsWith(suffix)) {\n sitePath = sitePath.substr(0, url.pathname.length - suffix.length);\n }\n\n return decodeURI(sitePath);\n}\n\nasync function fluidFetchMain() {\n if (!paramURL) {\n return;\n }\n\n const url = new URL(paramURL);\n const server = url.hostname;\n if (isOdspHostname(server)) {\n // See if the url already has the specific item\n const driveItem = getSharePointSpecificDriveItem(url);\n if (driveItem) {\n const file = await getSingleSharePointFile(server, driveItem.driveId, driveItem.itemId);\n await tryFluidFetchOneSharePointFile(server, file);\n return;\n }\n\n // See if the url given represent a sharepoint directory\n const serverRelativePath = getSharepointServerRelativePathFromURL(url);\n if (serverRelativePath) {\n const files = await getSharepointFiles(server, serverRelativePath, false);\n for (const file of files) {\n if (file.name.endsWith(\".b\") || file.name.endsWith(\".fluid\")) {\n await tryFluidFetchOneSharePointFile(server, file);\n }\n }\n return;\n }\n }\n\n return fluidFetchOneFile(paramURL);\n}\n\nparseArguments();\n\n// eslint-disable-next-line @typescript-eslint/no-floating-promises\nfluidFetchMain()\n .catch((error: Error) => {\n if (error instanceof Error) {\n let extraMsg = \"\";\n for (const key of Object.keys(error)) {\n // error[key] might have circular structure\n try {\n if (key !== \"message\" && key !== \"stack\") {\n extraMsg += `\\n${key}: ${JSON.stringify(error[key], undefined, 2)}`;\n }\n } catch (_) {}\n }\n console.error(`ERROR: ${error.stack}${extraMsg}`);\n } else if (typeof error === \"object\") {\n console.error(`ERROR: Unknown exception object\\n${JSON.stringify(error, undefined, 2)}`);\n } else {\n console.error(`ERROR: ${error}`);\n }\n })\n .then(() => process.exit(0));\n"]}
|
package/dist/fluidFetchArgs.d.ts
CHANGED
|
@@ -17,7 +17,6 @@ export declare let paramSaveDir: string | undefined;
|
|
|
17
17
|
export declare const messageTypeFilter: Set<string>;
|
|
18
18
|
export declare let paramURL: string | undefined;
|
|
19
19
|
export declare let paramJWT: string;
|
|
20
|
-
export declare let paramAzureKey: string;
|
|
21
20
|
export declare let connectToWebSocket: boolean;
|
|
22
21
|
export declare let localDataOnly: boolean;
|
|
23
22
|
export declare let paramSite: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidFetchArgs.d.ts","sourceRoot":"","sources":["../src/fluidFetchArgs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,eAAO,IAAI,YAAY,SAAQ,CAAC;AAChC,eAAO,IAAI,gBAAgB,SAAQ,CAAC;AACpC,eAAO,IAAI,iBAAiB,SAAQ,CAAC;AACrC,eAAO,IAAI,iBAAiB,SAAQ,CAAC;AACrC,eAAO,IAAI,oBAAoB,SAAQ,CAAC;AACxC,eAAO,IAAI,SAAS,SAAQ,CAAC;AAC7B,eAAO,IAAI,yBAAyB,EAAE,MAAM,GAAG,SAAS,CAAC;AACzD,eAAO,IAAI,wBAAwB,QAAK,CAAC;AACzC,eAAO,IAAI,0BAA0B,SAAO,CAAC;AAC7C,eAAO,IAAI,qBAAqB,SAAQ,CAAC;AAKzC,wBAAgB,mBAAmB,YAIlC;AAED,eAAO,IAAI,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;AAC5C,eAAO,MAAM,iBAAiB,aAAoB,CAAC;AAEnD,eAAO,IAAI,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;AACxC,eAAO,IAAI,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"fluidFetchArgs.d.ts","sourceRoot":"","sources":["../src/fluidFetchArgs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,eAAO,IAAI,YAAY,SAAQ,CAAC;AAChC,eAAO,IAAI,gBAAgB,SAAQ,CAAC;AACpC,eAAO,IAAI,iBAAiB,SAAQ,CAAC;AACrC,eAAO,IAAI,iBAAiB,SAAQ,CAAC;AACrC,eAAO,IAAI,oBAAoB,SAAQ,CAAC;AACxC,eAAO,IAAI,SAAS,SAAQ,CAAC;AAC7B,eAAO,IAAI,yBAAyB,EAAE,MAAM,GAAG,SAAS,CAAC;AACzD,eAAO,IAAI,wBAAwB,QAAK,CAAC;AACzC,eAAO,IAAI,0BAA0B,SAAO,CAAC;AAC7C,eAAO,IAAI,qBAAqB,SAAQ,CAAC;AAKzC,wBAAgB,mBAAmB,YAIlC;AAED,eAAO,IAAI,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;AAC5C,eAAO,MAAM,iBAAiB,aAAoB,CAAC;AAEnD,eAAO,IAAI,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;AACxC,eAAO,IAAI,QAAQ,EAAE,MAAM,CAAC;AAE5B,eAAO,IAAI,kBAAkB,SAAQ,CAAC;AAEtC,eAAO,IAAI,aAAa,SAAQ,CAAC;AAEjC,eAAO,IAAI,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;AAsBzC,wBAAgB,UAAU,SAOzB;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;CAAE,QAQzB;AAED,wBAAgB,cAAc,SAkF7B"}
|
package/dist/fluidFetchArgs.js
CHANGED
|
@@ -7,7 +7,7 @@ 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.parseArguments = exports.setArguments = exports.printUsage = exports.paramSite = exports.localDataOnly = exports.connectToWebSocket = exports.
|
|
10
|
+
exports.parseArguments = exports.setArguments = exports.printUsage = exports.paramSite = exports.localDataOnly = exports.connectToWebSocket = exports.paramJWT = exports.paramURL = exports.messageTypeFilter = exports.paramSaveDir = exports.getForceTokenReauth = exports.paramActualFormatting = exports.paramUnpackAggregatedBlobs = exports.paramNumSnapshotVersions = exports.paramSnapshotVersionIndex = exports.overWrite = exports.dumpSnapshotVersions = exports.dumpSnapshotTrees = exports.dumpSnapshotStats = exports.dumpMessageStats = exports.dumpMessages = void 0;
|
|
11
11
|
const fs_1 = __importDefault(require("fs"));
|
|
12
12
|
const url_1 = require("url");
|
|
13
13
|
exports.dumpMessages = false;
|
|
@@ -40,7 +40,6 @@ const optionsArray = [
|
|
|
40
40
|
["--stat", "Show both messages & snapshot stats"],
|
|
41
41
|
["--filter:messageType <type>", "filter message by <type>"],
|
|
42
42
|
["--jwt <token>", "token to be used for routerlicious URLs"],
|
|
43
|
-
["--azureKey <key>", "secret key for Azure Fluid Relay instance"],
|
|
44
43
|
["--numSnapshotVersions <number>", "Number of versions to load (default:10)"],
|
|
45
44
|
["--noUnpack", "Do not unpack aggregated blobs"],
|
|
46
45
|
["--actualPayload", "Do not format json payloads nicely, preserve actual bytes / formatting in storage"],
|
|
@@ -104,13 +103,9 @@ function parseArguments() {
|
|
|
104
103
|
case "--help":
|
|
105
104
|
printUsage();
|
|
106
105
|
process.exit(0);
|
|
107
|
-
// fallthrough
|
|
108
106
|
case "--jwt":
|
|
109
107
|
exports.paramJWT = parseStrArg(i++, "jwt token");
|
|
110
108
|
break;
|
|
111
|
-
case "--azureKey":
|
|
112
|
-
exports.paramAzureKey = parseStrArg(i++, "Azure Fluid Relay key");
|
|
113
|
-
break;
|
|
114
109
|
case "--forceTokenReauth":
|
|
115
110
|
paramForceTokenReauth = true;
|
|
116
111
|
break;
|
|
@@ -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\";\nimport { URL } from \"url\";\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 paramUnpackAggregatedBlobs = true;\nexport let paramActualFormatting = false;\n\nlet paramForceTokenReauth = false;\n\n// Only return true once, to reauth on first call.\nexport function getForceTokenReauth() {\n const result = paramForceTokenReauth;\n paramForceTokenReauth = false;\n return result;\n}\n\nexport let paramSaveDir: string | undefined;\nexport const messageTypeFilter = new Set<string>();\n\nexport let paramURL: string | undefined;\nexport let paramJWT: string;\nexport let paramAzureKey: string;\n\nexport let connectToWebSocket = false;\n\nexport let localDataOnly = false;\n\nexport let paramSite: string | undefined;\n\nconst optionsArray =\n [\n [\"--dump:rawmessage\", \"dump all messages\"],\n [\"--dump:snapshotVersion\", \"dump a list of snapshot version\"],\n [\"--dump:snapshotTree\", \"dump the snapshot trees\"],\n [\"--forceTokenReauth\", \"Force reauthorize token (SPO only)\"],\n [\"--stat:message\", \"show message type, channel type, data type statistics\"],\n [\"--stat:snapshot\", \"show a table of snapshot path and blob size\"],\n [\"--stat\", \"Show both messages & snapshot stats\"],\n [\"--filter:messageType <type>\", \"filter message by <type>\"],\n [\"--jwt <token>\", \"token to be used for routerlicious URLs\"],\n [\"--azureKey <key>\", \"secret key for Azure Fluid Relay instance\"],\n [\"--numSnapshotVersions <number>\", \"Number of versions to load (default:10)\"],\n [\"--noUnpack\", \"Do not unpack aggregated blobs\"],\n [\"--actualPayload\", \"Do not format json payloads nicely, preserve actual bytes / formatting in storage\"],\n [\"--saveDir <outdir>\", \"Save data of the snapshots and messages\"],\n [\"--snapshotVersionIndex <number>\", \"Index of the version to dump\"],\n [\"--websocket\", \"Connect to web socket to download initial messages\"],\n [\"--local\", \"Do not connect to storage, use earlier downloaded data. Requires --saveDir.\"],\n ];\n\nexport function printUsage() {\n console.log(\"Usage: fluid-fetch [options] URL\");\n console.log(\"URL: <ODSP URL>|<Routerlicious URL>\");\n console.log(\"Options:\");\n for (const i of optionsArray) {\n console.log(` ${i[0].padEnd(32)}: ${i[1]}`);\n }\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 saveDir: string,\n paramURL: string\n dumpMessages?: boolean,\n dumpMessageStats?: boolean,\n dumpSnapshotStats?: boolean,\n dumpSnapshotTrees?: boolean,\n overWrite?: boolean }) {\n paramSaveDir = values.saveDir;\n paramURL = values.paramURL;\n dumpMessages = values.dumpMessages ?? dumpMessages;\n dumpMessageStats = values.dumpMessageStats ?? dumpMessageStats;\n dumpSnapshotStats = values.dumpSnapshotStats ?? dumpSnapshotStats;\n dumpSnapshotTrees = values.dumpSnapshotTrees ?? dumpSnapshotTrees;\n overWrite = values.overWrite ?? overWrite;\n}\n\nexport function parseArguments() {\n for (let i = 2; i < process.argv.length; i++) {\n const arg = process.argv[i];\n switch (arg) {\n case \"--dump:rawmessage\":\n dumpMessages = true;\n break;\n case \"--dump:rawmessage:overwrite\":\n dumpMessages = true;\n overWrite = true;\n break;\n case \"--stat:message\":\n dumpMessageStats = true;\n break;\n case \"--stat\":\n dumpMessageStats = true;\n dumpSnapshotStats = true;\n break;\n case \"--filter:messageType\":\n messageTypeFilter.add(parseStrArg(i++, \"type name for messageType filter\"));\n break;\n case \"--stat:snapshot\":\n dumpSnapshotStats = true;\n break;\n case \"--dump:snapshotVersion\":\n dumpSnapshotVersions = true;\n break;\n case \"--dump:snapshotTree\":\n dumpSnapshotTrees = true;\n break;\n case \"--help\":\n printUsage();\n process.exit(0);\n // fallthrough\n case \"--jwt\":\n paramJWT = parseStrArg(i++, \"jwt token\");\n break;\n case \"--azureKey\":\n paramAzureKey = parseStrArg(i++, \"Azure Fluid Relay key\");\n break;\n case \"--forceTokenReauth\":\n paramForceTokenReauth = true;\n break;\n case \"--snapshotVersionIndex\":\n paramSnapshotVersionIndex = parseIntArg(i++, \"version index\", true);\n break;\n case \"--numSnapshotVersions\":\n paramNumSnapshotVersions = parseIntArg(i++, \"number of versions\", false);\n break;\n case \"--noUnpack\":\n paramUnpackAggregatedBlobs = false;\n break;\n case \"--actualPayload\":\n paramActualFormatting = true;\n break;\n case \"--saveDir\":\n paramSaveDir = parseStrArg(i++, \"save data path\");\n break;\n case \"--websocket\":\n connectToWebSocket = true;\n break;\n case \"--local\":\n localDataOnly = true;\n break;\n default:\n try {\n const url = new URL(arg);\n if (url.protocol === \"https:\") {\n paramURL = arg;\n break;\n }\n if (url.protocol === \"http:\" && url.hostname === \"localhost\") {\n paramURL = arg;\n break;\n }\n } catch (e) {\n console.error(e);\n }\n\n console.error(`ERROR: Invalid argument ${arg}`);\n printUsage();\n process.exit(-1);\n break;\n }\n }\n checkArgs();\n}\n\nfunction parseStrArg(i: number, name: string) {\n if (i + 1 >= process.argv.length) {\n console.error(`ERROR: Missing ${name}`);\n printUsage();\n process.exit(-1);\n }\n return process.argv[i + 1];\n}\nfunction parseIntArg(i: number, name: string, allowZero: boolean) {\n if (i + 1 >= process.argv.length) {\n console.error(`ERROR: Missing ${name}`);\n printUsage();\n process.exit(-1);\n }\n const numStr = process.argv[i + 1];\n const paramNumber = parseInt(numStr, 10);\n if (isNaN(paramNumber) || (allowZero ? paramNumber < 0 : paramNumber <= 0)) {\n console.error(`ERROR: Invalid ${name} ${numStr}`);\n printUsage();\n process.exit(-1);\n }\n return paramNumber;\n}\n\nfunction checkArgs() {\n if (paramSnapshotVersionIndex !== undefined) {\n paramNumSnapshotVersions = Math.max(paramSnapshotVersionIndex + 1, paramNumSnapshotVersions);\n }\n\n if (!paramURL) {\n if (paramSaveDir) {\n const file = `${paramSaveDir}/info.json`;\n if (fs.existsSync(file)) {\n const info = JSON.parse(fs.readFileSync(file, { encoding: \"utf-8\" }));\n paramURL = info.url;\n } else {\n console.log(`Can't find file ${file}`);\n }\n }\n\n if (!paramURL) {\n console.error(\"ERROR: Missing URL\");\n printUsage();\n process.exit(-1);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fluidFetchArgs.js","sourceRoot":"","sources":["../src/fluidFetchArgs.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,4CAAoB;AACpB,6BAA0B;AAEf,QAAA,YAAY,GAAG,KAAK,CAAC;AACrB,QAAA,gBAAgB,GAAG,KAAK,CAAC;AACzB,QAAA,iBAAiB,GAAG,KAAK,CAAC;AAC1B,QAAA,iBAAiB,GAAG,KAAK,CAAC;AAC1B,QAAA,oBAAoB,GAAG,KAAK,CAAC;AAC7B,QAAA,SAAS,GAAG,KAAK,CAAC;AAElB,QAAA,wBAAwB,GAAG,EAAE,CAAC;AAC9B,QAAA,0BAA0B,GAAG,IAAI,CAAC;AAClC,QAAA,qBAAqB,GAAG,KAAK,CAAC;AAEzC,IAAI,qBAAqB,GAAG,KAAK,CAAC;AAElC,kDAAkD;AAClD,SAAgB,mBAAmB;IAC/B,MAAM,MAAM,GAAG,qBAAqB,CAAC;IACrC,qBAAqB,GAAG,KAAK,CAAC;IAC9B,OAAO,MAAM,CAAC;AAClB,CAAC;AAJD,kDAIC;AAGY,QAAA,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;AAKxC,QAAA,kBAAkB,GAAG,KAAK,CAAC;AAE3B,QAAA,aAAa,GAAG,KAAK,CAAC;AAIjC,MAAM,YAAY,GACd;IACI,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAC1C,CAAC,wBAAwB,EAAE,iCAAiC,CAAC;IAC7D,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;IAClD,CAAC,oBAAoB,EAAE,oCAAoC,CAAC;IAC5D,CAAC,gBAAgB,EAAE,uDAAuD,CAAC;IAC3E,CAAC,iBAAiB,EAAE,6CAA6C,CAAC;IAClE,CAAC,QAAQ,EAAE,qCAAqC,CAAC;IACjD,CAAC,6BAA6B,EAAE,0BAA0B,CAAC;IAC3D,CAAC,eAAe,EAAE,yCAAyC,CAAC;IAC5D,CAAC,gCAAgC,EAAE,yCAAyC,CAAC;IAC7E,CAAC,YAAY,EAAE,gCAAgC,CAAC;IAChD,CAAC,iBAAiB,EAAE,mFAAmF,CAAC;IACxG,CAAC,oBAAoB,EAAE,yCAAyC,CAAC;IACjE,CAAC,iCAAiC,EAAE,8BAA8B,CAAC;IACnE,CAAC,aAAa,EAAE,oDAAoD,CAAC;IACrE,CAAC,SAAS,EAAE,6EAA6E,CAAC;CAC7F,CAAC;AAEN,SAAgB,UAAU;IACtB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KAChD;AACL,CAAC;AAPD,gCAOC;AAED,iEAAiE;AACjE,iDAAiD;AACjD,SAAgB,YAAY,CAAC,MAOH;;IACtB,oBAAY,GAAG,MAAM,CAAC,OAAO,CAAC;IAC9B,gBAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC3B,oBAAY,GAAG,MAAA,MAAM,CAAC,YAAY,mCAAI,oBAAY,CAAC;IACnD,wBAAgB,GAAG,MAAA,MAAM,CAAC,gBAAgB,mCAAI,wBAAgB,CAAC;IAC/D,yBAAiB,GAAG,MAAA,MAAM,CAAC,iBAAiB,mCAAI,yBAAiB,CAAC;IAClE,yBAAiB,GAAG,MAAA,MAAM,CAAC,iBAAiB,mCAAI,yBAAiB,CAAC;IAClE,iBAAS,GAAG,MAAA,MAAM,CAAC,SAAS,mCAAI,iBAAS,CAAC;AAC9C,CAAC;AAfD,oCAeC;AAED,SAAgB,cAAc;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,GAAG,EAAE;YACT,KAAK,mBAAmB;gBACpB,oBAAY,GAAG,IAAI,CAAC;gBACpB,MAAM;YACV,KAAK,6BAA6B;gBAC9B,oBAAY,GAAG,IAAI,CAAC;gBACpB,iBAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACV,KAAK,gBAAgB;gBACjB,wBAAgB,GAAG,IAAI,CAAC;gBACxB,MAAM;YACV,KAAK,QAAQ;gBACT,wBAAgB,GAAG,IAAI,CAAC;gBACxB,yBAAiB,GAAG,IAAI,CAAC;gBACzB,MAAM;YACV,KAAK,sBAAsB;gBACvB,yBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,kCAAkC,CAAC,CAAC,CAAC;gBAC5E,MAAM;YACV,KAAK,iBAAiB;gBAClB,yBAAiB,GAAG,IAAI,CAAC;gBACzB,MAAM;YACV,KAAK,wBAAwB;gBACzB,4BAAoB,GAAG,IAAI,CAAC;gBAC5B,MAAM;YACV,KAAK,qBAAqB;gBACtB,yBAAiB,GAAG,IAAI,CAAC;gBACzB,MAAM;YACV,KAAK,QAAQ;gBACT,UAAU,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,KAAK,OAAO;gBACR,gBAAQ,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBACzC,MAAM;YACV,KAAK,oBAAoB;gBACrB,qBAAqB,GAAG,IAAI,CAAC;gBAC7B,MAAM;YACV,KAAK,wBAAwB;gBACzB,iCAAyB,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;gBACpE,MAAM;YACV,KAAK,uBAAuB;gBACxB,gCAAwB,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAC;gBACzE,MAAM;YACV,KAAK,YAAY;gBACb,kCAA0B,GAAG,KAAK,CAAC;gBACnC,MAAM;YACV,KAAK,iBAAiB;gBAClB,6BAAqB,GAAG,IAAI,CAAC;gBAC7B,MAAM;YACV,KAAK,WAAW;gBACZ,oBAAY,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;gBAClD,MAAM;YACV,KAAK,aAAa;gBACd,0BAAkB,GAAG,IAAI,CAAC;gBAC1B,MAAM;YACV,KAAK,SAAS;gBACV,qBAAa,GAAG,IAAI,CAAC;gBACrB,MAAM;YACV;gBACI,IAAI;oBACA,MAAM,GAAG,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,CAAC;oBACzB,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE;wBAC3B,gBAAQ,GAAG,GAAG,CAAC;wBACf,MAAM;qBACT;oBACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE;wBAC1D,gBAAQ,GAAG,GAAG,CAAC;wBACf,MAAM;qBACT;iBACJ;gBAAC,OAAO,CAAC,EAAE;oBACR,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBACpB;gBAED,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;gBAChD,UAAU,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjB,MAAM;SACb;KACJ;IACD,SAAS,EAAE,CAAC;AAChB,CAAC;AAlFD,wCAkFC;AAED,SAAS,WAAW,CAAC,CAAS,EAAE,IAAY;IACxC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;QAC9B,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QACxC,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;KACpB;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC;AACD,SAAS,WAAW,CAAC,CAAS,EAAE,IAAY,EAAE,SAAkB;IAC5D,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;QAC9B,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QACxC,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;KACpB;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE;QACxE,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;QAClD,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;KACpB;IACD,OAAO,WAAW,CAAC;AACvB,CAAC;AAED,SAAS,SAAS;IACd,IAAI,iCAAyB,KAAK,SAAS,EAAE;QACzC,gCAAwB,GAAG,IAAI,CAAC,GAAG,CAAC,iCAAyB,GAAG,CAAC,EAAE,gCAAwB,CAAC,CAAC;KAChG;IAED,IAAI,CAAC,gBAAQ,EAAE;QACX,IAAI,oBAAY,EAAE;YACd,MAAM,IAAI,GAAG,GAAG,oBAAY,YAAY,CAAC;YACzC,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBACtE,gBAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;aACvB;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;aAC1C;SACJ;QAED,IAAI,CAAC,gBAAQ,EAAE;YACX,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACpC,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SACpB;KACJ;AACL,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\nimport { URL } from \"url\";\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 paramUnpackAggregatedBlobs = true;\nexport let paramActualFormatting = false;\n\nlet paramForceTokenReauth = false;\n\n// Only return true once, to reauth on first call.\nexport function getForceTokenReauth() {\n const result = paramForceTokenReauth;\n paramForceTokenReauth = false;\n return result;\n}\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;\n\nexport let paramSite: string | undefined;\n\nconst optionsArray =\n [\n [\"--dump:rawmessage\", \"dump all messages\"],\n [\"--dump:snapshotVersion\", \"dump a list of snapshot version\"],\n [\"--dump:snapshotTree\", \"dump the snapshot trees\"],\n [\"--forceTokenReauth\", \"Force reauthorize token (SPO only)\"],\n [\"--stat:message\", \"show message type, channel type, data type statistics\"],\n [\"--stat:snapshot\", \"show a table of snapshot path and blob size\"],\n [\"--stat\", \"Show both messages & snapshot stats\"],\n [\"--filter:messageType <type>\", \"filter message by <type>\"],\n [\"--jwt <token>\", \"token to be used for routerlicious URLs\"],\n [\"--numSnapshotVersions <number>\", \"Number of versions to load (default:10)\"],\n [\"--noUnpack\", \"Do not unpack aggregated blobs\"],\n [\"--actualPayload\", \"Do not format json payloads nicely, preserve actual bytes / formatting in storage\"],\n [\"--saveDir <outdir>\", \"Save data of the snapshots and messages\"],\n [\"--snapshotVersionIndex <number>\", \"Index of the version to dump\"],\n [\"--websocket\", \"Connect to web socket to download initial messages\"],\n [\"--local\", \"Do not connect to storage, use earlier downloaded data. Requires --saveDir.\"],\n ];\n\nexport function printUsage() {\n console.log(\"Usage: fluid-fetch [options] URL\");\n console.log(\"URL: <ODSP URL>|<Routerlicious URL>\");\n console.log(\"Options:\");\n for (const i of optionsArray) {\n console.log(` ${i[0].padEnd(32)}: ${i[1]}`);\n }\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 saveDir: string;\n paramURL: string;\n dumpMessages?: boolean;\n dumpMessageStats?: boolean;\n dumpSnapshotStats?: boolean;\n dumpSnapshotTrees?: boolean;\n overWrite?: boolean; }) {\n paramSaveDir = values.saveDir;\n paramURL = values.paramURL;\n dumpMessages = values.dumpMessages ?? dumpMessages;\n dumpMessageStats = values.dumpMessageStats ?? dumpMessageStats;\n dumpSnapshotStats = values.dumpSnapshotStats ?? dumpSnapshotStats;\n dumpSnapshotTrees = values.dumpSnapshotTrees ?? dumpSnapshotTrees;\n overWrite = values.overWrite ?? overWrite;\n}\n\nexport function parseArguments() {\n for (let i = 2; i < process.argv.length; i++) {\n const arg = process.argv[i];\n switch (arg) {\n case \"--dump:rawmessage\":\n dumpMessages = true;\n break;\n case \"--dump:rawmessage:overwrite\":\n dumpMessages = true;\n overWrite = true;\n break;\n case \"--stat:message\":\n dumpMessageStats = true;\n break;\n case \"--stat\":\n dumpMessageStats = true;\n dumpSnapshotStats = true;\n break;\n case \"--filter:messageType\":\n messageTypeFilter.add(parseStrArg(i++, \"type name for messageType filter\"));\n break;\n case \"--stat:snapshot\":\n dumpSnapshotStats = true;\n break;\n case \"--dump:snapshotVersion\":\n dumpSnapshotVersions = true;\n break;\n case \"--dump:snapshotTree\":\n dumpSnapshotTrees = true;\n break;\n case \"--help\":\n printUsage();\n process.exit(0);\n case \"--jwt\":\n paramJWT = parseStrArg(i++, \"jwt token\");\n break;\n case \"--forceTokenReauth\":\n paramForceTokenReauth = true;\n break;\n case \"--snapshotVersionIndex\":\n paramSnapshotVersionIndex = parseIntArg(i++, \"version index\", true);\n break;\n case \"--numSnapshotVersions\":\n paramNumSnapshotVersions = parseIntArg(i++, \"number of versions\", false);\n break;\n case \"--noUnpack\":\n paramUnpackAggregatedBlobs = false;\n break;\n case \"--actualPayload\":\n paramActualFormatting = true;\n break;\n case \"--saveDir\":\n paramSaveDir = parseStrArg(i++, \"save data path\");\n break;\n case \"--websocket\":\n connectToWebSocket = true;\n break;\n case \"--local\":\n localDataOnly = true;\n break;\n default:\n try {\n const url = new URL(arg);\n if (url.protocol === \"https:\") {\n paramURL = arg;\n break;\n }\n if (url.protocol === \"http:\" && url.hostname === \"localhost\") {\n paramURL = arg;\n break;\n }\n } catch (e) {\n console.error(e);\n }\n\n console.error(`ERROR: Invalid argument ${arg}`);\n printUsage();\n process.exit(-1);\n break;\n }\n }\n checkArgs();\n}\n\nfunction parseStrArg(i: number, name: string) {\n if (i + 1 >= process.argv.length) {\n console.error(`ERROR: Missing ${name}`);\n printUsage();\n process.exit(-1);\n }\n return process.argv[i + 1];\n}\nfunction parseIntArg(i: number, name: string, allowZero: boolean) {\n if (i + 1 >= process.argv.length) {\n console.error(`ERROR: Missing ${name}`);\n printUsage();\n process.exit(-1);\n }\n const numStr = process.argv[i + 1];\n const paramNumber = parseInt(numStr, 10);\n if (isNaN(paramNumber) || (allowZero ? paramNumber < 0 : paramNumber <= 0)) {\n console.error(`ERROR: Invalid ${name} ${numStr}`);\n printUsage();\n process.exit(-1);\n }\n return paramNumber;\n}\n\nfunction checkArgs() {\n if (paramSnapshotVersionIndex !== undefined) {\n paramNumSnapshotVersions = Math.max(paramSnapshotVersionIndex + 1, paramNumSnapshotVersions);\n }\n\n if (!paramURL) {\n if (paramSaveDir) {\n const file = `${paramSaveDir}/info.json`;\n if (fs.existsSync(file)) {\n const info = JSON.parse(fs.readFileSync(file, { encoding: \"utf-8\" }));\n paramURL = info.url;\n } else {\n console.log(`Can't find file ${file}`);\n }\n }\n\n if (!paramURL) {\n console.error(\"ERROR: Missing URL\");\n printUsage();\n process.exit(-1);\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidFetchInit.d.ts","sourceRoot":"","sources":["../src/fluidFetchInit.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"fluidFetchInit.d.ts","sourceRoot":"","sources":["../src/fluidFetchInit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,eAAO,IAAI,gBAAgB,EAAE,MAAW,CAAC;AACzC,eAAO,IAAI,cAAc,EAAE,GAAG,CAAC;AAE/B,eAAO,MAAM,sBAAsB,QAAS,MAAM,SAOjD,CAAC;AAgGF,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,sFAelD"}
|