@fluid-tools/fetch-tool 1.0.1 → 1.1.0-75972
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 -3
- package/dist/fluidAnalyzeMessages.js +10 -9
- package/dist/fluidAnalyzeMessages.js.map +1 -1
- package/dist/fluidFetch.js +7 -3
- package/dist/fluidFetch.js.map +1 -1
- package/dist/fluidFetchArgs.js +3 -3
- package/dist/fluidFetchArgs.js.map +1 -1
- package/dist/fluidFetchInit.js +1 -1
- package/dist/fluidFetchInit.js.map +1 -1
- package/dist/fluidFetchMessages.js +8 -8
- package/dist/fluidFetchMessages.js.map +1 -1
- package/dist/fluidFetchSnapshot.js +2 -2
- package/dist/fluidFetchSnapshot.js.map +1 -1
- package/package.json +17 -17
- package/src/fluidAnalyzeMessages.ts +10 -10
- package/src/fluidFetch.ts +8 -4
- package/src/fluidFetchArgs.ts +3 -3
- package/src/fluidFetchInit.ts +1 -1
- package/src/fluidFetchMessages.ts +8 -8
- package/src/fluidFetchSnapshot.ts +2 -2
package/.eslintrc.js
CHANGED
|
@@ -58,18 +58,19 @@ class ActiveSession {
|
|
|
58
58
|
const formatNumber = (num) => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
|
59
59
|
exports.formatNumber = formatNumber;
|
|
60
60
|
function dumpStats(map, props) {
|
|
61
|
+
var _a;
|
|
61
62
|
const fieldSizes = [10, 14];
|
|
62
63
|
const nameLength = 72;
|
|
63
64
|
const fieldsLength = fieldSizes[0] + fieldSizes[1] + 1;
|
|
64
65
|
let headers = props.headers;
|
|
65
|
-
let recordsToShow = props.lines ?
|
|
66
|
-
if (map.size !== recordsToShow &&
|
|
66
|
+
let recordsToShow = (_a = props.lines) !== null && _a !== void 0 ? _a : 10;
|
|
67
|
+
if (map.size !== recordsToShow && props.removeTotals === undefined && recordsToShow > 1) {
|
|
67
68
|
recordsToShow--;
|
|
68
69
|
}
|
|
69
70
|
let sorted;
|
|
70
|
-
const sortIndex = props.orderByFirstColumn ? 0 : 1;
|
|
71
|
+
const sortIndex = props.orderByFirstColumn === true ? 0 : 1;
|
|
71
72
|
let add;
|
|
72
|
-
if (props.reverseSort) {
|
|
73
|
+
if (props.reverseSort !== undefined) {
|
|
73
74
|
sorted = [...map.entries()].sort((a, b) => a[1][sortIndex] - b[1][sortIndex]);
|
|
74
75
|
add = "↑";
|
|
75
76
|
}
|
|
@@ -78,7 +79,7 @@ function dumpStats(map, props) {
|
|
|
78
79
|
add = "↓";
|
|
79
80
|
}
|
|
80
81
|
headers[sortIndex] = `${headers[sortIndex]} ${add}`;
|
|
81
|
-
if (props.reverseColumnsInUI) {
|
|
82
|
+
if (props.reverseColumnsInUI !== undefined) {
|
|
82
83
|
headers = [headers[1], headers[0]];
|
|
83
84
|
const sorted2 = [];
|
|
84
85
|
for (const [name, [count, size]] of sorted) {
|
|
@@ -113,7 +114,7 @@ function dumpStats(map, props) {
|
|
|
113
114
|
allOtherSize += size;
|
|
114
115
|
}
|
|
115
116
|
}
|
|
116
|
-
if (
|
|
117
|
+
if (props.removeTotals === undefined) {
|
|
117
118
|
if (allOtherCount || allOtherSize) {
|
|
118
119
|
// eslint-disable-next-line max-len
|
|
119
120
|
console.log(`${`All Others (${sorted.length - recordsToShow})`.padEnd(nameLength)} │ ${(0, exports.formatNumber)(allOtherCount).padStart(fieldSizes[0])} ${(0, exports.formatNumber)(allOtherSize).padStart(fieldSizes[1])}`);
|
|
@@ -469,7 +470,7 @@ function processOp(message, dataType, objectStats, msgSize, dataTypeStats, messa
|
|
|
469
470
|
{
|
|
470
471
|
let envelope = runtimeMessage.contents;
|
|
471
472
|
// TODO: Legacy?
|
|
472
|
-
if (envelope && typeof envelope === "string") {
|
|
473
|
+
if (envelope !== undefined && typeof envelope === "string") {
|
|
473
474
|
envelope = JSON.parse(envelope);
|
|
474
475
|
}
|
|
475
476
|
const innerContent = envelope.contents;
|
|
@@ -508,7 +509,7 @@ function processOp(message, dataType, objectStats, msgSize, dataTypeStats, messa
|
|
|
508
509
|
}
|
|
509
510
|
else if (objectType === "mergeTree" && subType !== undefined) {
|
|
510
511
|
const types = ["insert", "remove", "annotate", "group"];
|
|
511
|
-
if (types[subType]) {
|
|
512
|
+
if (types[subType] !== undefined) {
|
|
512
513
|
subType = types[subType];
|
|
513
514
|
}
|
|
514
515
|
}
|
|
@@ -616,7 +617,7 @@ function processQuorumMessages(message, skipMessage, sessionsInProgress, session
|
|
|
616
617
|
session = sessionsInProgress.get(clientId);
|
|
617
618
|
sessionsInProgress.delete(clientId);
|
|
618
619
|
(0, common_utils_1.assert)(!!session, 0x1b7 /* "Bad session state for processing quorum messages" */);
|
|
619
|
-
if (session) {
|
|
620
|
+
if (session !== undefined) {
|
|
620
621
|
if (!skipMessage) {
|
|
621
622
|
session.reportOp(message.timestamp);
|
|
622
623
|
}
|
|
@@ -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(\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"]}
|
|
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 ?? 10;\n if (map.size !== recordsToShow && props.removeTotals === undefined && recordsToShow > 1) {\n recordsToShow--;\n }\n\n let sorted: [string, [number, number]][];\n const sortIndex = props.orderByFirstColumn === true ? 0 : 1;\n let add: string;\n if (props.reverseSort !== undefined) {\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 !== undefined) {\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 === undefined) {\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 !== undefined && 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] !== undefined) {\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: string = 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 !== undefined) {\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
|
@@ -17,7 +17,11 @@ const fluidFetchSharePoint_1 = require("./fluidFetchSharePoint");
|
|
|
17
17
|
const fluidFetchSnapshot_1 = require("./fluidFetchSnapshot");
|
|
18
18
|
async function fluidFetchOneFile(urlStr, name) {
|
|
19
19
|
const documentService = await (0, fluidFetchInit_1.fluidFetchInit)(urlStr);
|
|
20
|
-
const saveDir = fluidFetchArgs_1.paramSaveDir
|
|
20
|
+
const saveDir = fluidFetchArgs_1.paramSaveDir !== undefined
|
|
21
|
+
? (name !== undefined
|
|
22
|
+
? `${fluidFetchArgs_1.paramSaveDir}/${name}`
|
|
23
|
+
: fluidFetchArgs_1.paramSaveDir)
|
|
24
|
+
: undefined;
|
|
21
25
|
if (saveDir !== undefined) {
|
|
22
26
|
const mkdir = util_1.default.promisify(fs_1.default.mkdir);
|
|
23
27
|
const writeFile = util_1.default.promisify(fs_1.default.writeFile);
|
|
@@ -64,7 +68,7 @@ function getSharepointServerRelativePathFromURL(url) {
|
|
|
64
68
|
return decodeURI(sitePath);
|
|
65
69
|
}
|
|
66
70
|
async function fluidFetchMain() {
|
|
67
|
-
if (
|
|
71
|
+
if (fluidFetchArgs_1.paramURL === undefined) {
|
|
68
72
|
return;
|
|
69
73
|
}
|
|
70
74
|
const url = new URL(fluidFetchArgs_1.paramURL);
|
|
@@ -79,7 +83,7 @@ async function fluidFetchMain() {
|
|
|
79
83
|
}
|
|
80
84
|
// See if the url given represent a sharepoint directory
|
|
81
85
|
const serverRelativePath = getSharepointServerRelativePathFromURL(url);
|
|
82
|
-
if (serverRelativePath) {
|
|
86
|
+
if (serverRelativePath !== undefined) {
|
|
83
87
|
const files = await (0, fluidFetchSharePoint_1.getSharepointFiles)(server, serverRelativePath, false);
|
|
84
88
|
for (const file of files) {
|
|
85
89
|
if (file.name.endsWith(".b") || file.name.endsWith(".fluid")) {
|
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,IAAA,+BAAc,EAAC,MAAM,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,6BAAY,
|
|
1
|
+
{"version":3,"file":"fluidFetch.js","sourceRoot":"","sources":["../src/fluidFetch.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 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 !== undefined\n ? (name !== undefined\n ? `${paramSaveDir}/${name}`\n : paramSaveDir)\n : 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 === undefined) {\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 !== undefined) {\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.js
CHANGED
|
@@ -181,8 +181,8 @@ function checkArgs() {
|
|
|
181
181
|
if (exports.paramSnapshotVersionIndex !== undefined) {
|
|
182
182
|
exports.paramNumSnapshotVersions = Math.max(exports.paramSnapshotVersionIndex + 1, exports.paramNumSnapshotVersions);
|
|
183
183
|
}
|
|
184
|
-
if (
|
|
185
|
-
if (exports.paramSaveDir) {
|
|
184
|
+
if (exports.paramURL === undefined) {
|
|
185
|
+
if (exports.paramSaveDir !== undefined) {
|
|
186
186
|
const file = `${exports.paramSaveDir}/info.json`;
|
|
187
187
|
if (fs_1.default.existsSync(file)) {
|
|
188
188
|
const info = JSON.parse(fs_1.default.readFileSync(file, { encoding: "utf-8" }));
|
|
@@ -192,7 +192,7 @@ function checkArgs() {
|
|
|
192
192
|
console.log(`Can't find file ${file}`);
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
|
-
if (
|
|
195
|
+
if (exports.paramURL === undefined) {
|
|
196
196
|
console.error("ERROR: Missing URL");
|
|
197
197
|
printUsage();
|
|
198
198
|
process.exit(-1);
|
|
@@ -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;\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
|
+
{"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;\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 === undefined) {\n if (paramSaveDir !== undefined) {\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 === undefined) {\n console.error(\"ERROR: Missing URL\");\n printUsage();\n process.exit(-1);\n }\n }\n}\n"]}
|
package/dist/fluidFetchInit.js
CHANGED
|
@@ -119,7 +119,7 @@ async function resolveUrl(url) {
|
|
|
119
119
|
}
|
|
120
120
|
async function fluidFetchInit(urlStr) {
|
|
121
121
|
const resolvedUrl = await resolveUrl(urlStr);
|
|
122
|
-
if (
|
|
122
|
+
if (resolvedUrl === undefined) {
|
|
123
123
|
return Promise.reject(new Error(`Unknown URL ${urlStr}`));
|
|
124
124
|
}
|
|
125
125
|
const protocol = new url_1.URL(resolvedUrl.url).protocol;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidFetchInit.js","sourceRoot":"","sources":["../src/fluidFetchInit.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"fluidFetchInit.js","sourceRoot":"","sources":["../src/fluidFetchInit.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 { URL } from \"url\";\nimport child_process from \"child_process\";\nimport { IFluidResolvedUrl, IResolvedUrl, IUrlResolver } from \"@fluidframework/driver-definitions\";\nimport { configurableUrlResolver } from \"@fluidframework/driver-utils\";\nimport { FluidAppOdspUrlResolver } from \"@fluid-tools/fluidapp-odsp-urlresolver\";\nimport { IClientConfig, IOdspAuthRequestInfo } from \"@fluidframework/odsp-doclib-utils\";\nimport * as odsp from \"@fluidframework/odsp-driver\";\nimport { IOdspResolvedUrl, OdspResourceTokenFetchOptions } from \"@fluidframework/odsp-driver-definitions\";\nimport { OdspUrlResolver } from \"@fluidframework/odsp-urlresolver\";\nimport * as r11s from \"@fluidframework/routerlicious-driver\";\nimport { RouterliciousUrlResolver } from \"@fluidframework/routerlicious-urlresolver\";\nimport { getMicrosoftConfiguration } from \"@fluidframework/tool-utils\";\nimport { localDataOnly, paramJWT } from \"./fluidFetchArgs\";\nimport { resolveWrapper } from \"./fluidFetchSharePoint\";\n\nexport let latestVersionsId: string = \"\";\nexport let connectionInfo: any;\n\nexport const fluidFetchWebNavigator = (url: string) => {\n let message = \"Please open browser and navigate to this URL:\";\n if (process.platform === \"win32\") {\n child_process.exec(`start \"fluid-fetch\" /B \"${url}\"`);\n message = \"Opening browser to get authorization code. If that doesn't open, please go to this URL manually\";\n }\n console.log(`${message}\\n ${url}`);\n};\n\nasync function initializeODSPCore(\n odspResolvedUrl: IOdspResolvedUrl,\n server: string,\n clientConfig: IClientConfig,\n) {\n const { driveId, itemId } = odspResolvedUrl;\n\n connectionInfo = {\n server,\n drive: driveId,\n item: itemId,\n };\n\n if (localDataOnly) {\n return;\n }\n\n const docId = await odsp.getHashedDocumentId(driveId, itemId);\n\n console.log(`Connecting to ODSP:\n server: ${server}\n drive: ${driveId}\n item: ${itemId}\n docId: ${docId}`);\n\n const getStorageTokenStub = async (options: OdspResourceTokenFetchOptions) => {\n return resolveWrapper(\n async (authRequestInfo: IOdspAuthRequestInfo) => {\n if ((options.refresh || !authRequestInfo.accessToken) && authRequestInfo.refreshTokenFn) {\n return authRequestInfo.refreshTokenFn();\n }\n return authRequestInfo.accessToken;\n },\n server,\n clientConfig,\n undefined,\n true,\n );\n };\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n const getWebsocketTokenStub = (_options: OdspResourceTokenFetchOptions) => Promise.resolve(\"\");\n const odspDocumentServiceFactory = new odsp.OdspDocumentServiceFactory(\n getStorageTokenStub,\n getWebsocketTokenStub,\n undefined,\n {\n opsBatchSize: 20000,\n concurrentOpsBatches: 4,\n });\n return odspDocumentServiceFactory.createDocumentService(odspResolvedUrl);\n}\n\nasync function initializeR11s(server: string, pathname: string, r11sResolvedUrl: IFluidResolvedUrl) {\n const path = pathname.split(\"/\");\n let tenantId: string;\n let documentId: string;\n if (server === \"localhost\" && path.length < 4) {\n tenantId = \"fluid\";\n documentId = path[2];\n } else {\n tenantId = path[2];\n documentId = path[3];\n }\n\n // Latest version id is the documentId for r11s\n latestVersionsId = documentId;\n\n connectionInfo = {\n server,\n tenantId,\n id: documentId,\n };\n\n if (localDataOnly) {\n return;\n }\n\n console.log(`Connecting to r11s: tenantId=${tenantId} id:${documentId}`);\n const tokenProvider = new r11s.DefaultTokenProvider(paramJWT);\n const r11sDocumentServiceFactory = new r11s.RouterliciousDocumentServiceFactory(tokenProvider);\n return r11sDocumentServiceFactory.createDocumentService(r11sResolvedUrl);\n}\n\nasync function resolveUrl(url: string): Promise<IResolvedUrl | undefined> {\n const resolversList: IUrlResolver[] = [\n new OdspUrlResolver(),\n new FluidAppOdspUrlResolver(),\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n new RouterliciousUrlResolver(undefined, () => Promise.resolve(paramJWT), \"\"),\n ];\n const resolved = await configurableUrlResolver(resolversList, { url });\n return resolved;\n}\n\nexport async function fluidFetchInit(urlStr: string) {\n const resolvedUrl = await resolveUrl(urlStr) as IFluidResolvedUrl;\n if (resolvedUrl === undefined) {\n return Promise.reject(new Error(`Unknown URL ${urlStr}`));\n }\n const protocol = new URL(resolvedUrl.url).protocol;\n if (protocol === \"fluid-odsp:\") {\n const odspResolvedUrl = resolvedUrl as IOdspResolvedUrl;\n return initializeODSPCore(odspResolvedUrl, new URL(odspResolvedUrl.siteUrl).host, getMicrosoftConfiguration());\n } else if (protocol === \"fluid:\") {\n const url = new URL(urlStr);\n const server = url.hostname.toLowerCase();\n return initializeR11s(server, url.pathname, resolvedUrl);\n }\n return Promise.reject(new Error(`Unknown resolved protocol ${protocol}`));\n}\n"]}
|
|
@@ -155,7 +155,7 @@ function loadAllSequencedMessages(documentService, dir, files) {
|
|
|
155
155
|
const initialMessages = deltaStream.initialMessages;
|
|
156
156
|
deltaStream.dispose();
|
|
157
157
|
console.log(`${Math.floor((Date.now() - timeStart) / 1000)} seconds to connect to web socket`);
|
|
158
|
-
if (initialMessages) {
|
|
158
|
+
if (initialMessages !== undefined) {
|
|
159
159
|
const lastSequenceNumber = lastSeq;
|
|
160
160
|
const filtered = initialMessages.filter((a) => a.sequenceNumber > lastSequenceNumber);
|
|
161
161
|
const sorted = filtered.sort((a, b) => a.sequenceNumber - b.sequenceNumber);
|
|
@@ -189,7 +189,7 @@ dir, files) {
|
|
|
189
189
|
if (files.length === 0) {
|
|
190
190
|
curr = firstAvailableDelta;
|
|
191
191
|
}
|
|
192
|
-
if (
|
|
192
|
+
if (result.done !== true) {
|
|
193
193
|
let messages = result.value;
|
|
194
194
|
yield yield __await(messages);
|
|
195
195
|
if (messages[messages.length - 1].sequenceNumber < curr) {
|
|
@@ -205,7 +205,7 @@ dir, files) {
|
|
|
205
205
|
=== curr + sequencedMessages.length - 1, 0x1bc /* "Unexpected sequence number on last of messages to save" */);
|
|
206
206
|
}
|
|
207
207
|
// Time to write it out?
|
|
208
|
-
while (sequencedMessages.length >= chunk || (result.done && sequencedMessages.length !== 0)) {
|
|
208
|
+
while (sequencedMessages.length >= chunk || (result.done === true && sequencedMessages.length !== 0)) {
|
|
209
209
|
const name = filenameFromIndex(index);
|
|
210
210
|
const write = sequencedMessages.splice(0, chunk);
|
|
211
211
|
console.log(`writing messages${name}.json`);
|
|
@@ -215,7 +215,7 @@ dir, files) {
|
|
|
215
215
|
(0, common_utils_1.assert)(sequencedMessages.length === 0 || sequencedMessages[0].sequenceNumber === curr, 0x1bd /* "Stopped writing at unexpected sequence number" */);
|
|
216
216
|
index++;
|
|
217
217
|
}
|
|
218
|
-
if (result.done) {
|
|
218
|
+
if (result.done === true) {
|
|
219
219
|
break;
|
|
220
220
|
}
|
|
221
221
|
}
|
|
@@ -227,9 +227,9 @@ async function fluidFetchMessages(documentService, saveDir) {
|
|
|
227
227
|
if (!messageStats && (saveDir === undefined || documentService === undefined)) {
|
|
228
228
|
return;
|
|
229
229
|
}
|
|
230
|
-
const files =
|
|
231
|
-
undefined
|
|
232
|
-
fs_1.default.readdirSync(saveDir)
|
|
230
|
+
const files = saveDir === undefined
|
|
231
|
+
? undefined
|
|
232
|
+
: fs_1.default.readdirSync(saveDir)
|
|
233
233
|
.filter((file) => {
|
|
234
234
|
if (!file.startsWith("messages")) {
|
|
235
235
|
return false;
|
|
@@ -238,7 +238,7 @@ async function fluidFetchMessages(documentService, saveDir) {
|
|
|
238
238
|
})
|
|
239
239
|
.sort((a, b) => a.localeCompare(b));
|
|
240
240
|
let generator = loadAllSequencedMessages(documentService, saveDir, files);
|
|
241
|
-
if (saveDir && files !== undefined && documentService) {
|
|
241
|
+
if (saveDir !== undefined && files !== undefined && documentService) {
|
|
242
242
|
generator = saveOps(generator, saveDir, files);
|
|
243
243
|
}
|
|
244
244
|
if (messageStats) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidFetchMessages.js","sourceRoot":"","sources":["../src/fluidFetchMessages.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 { assert } from \"@fluidframework/common-utils\";\nimport {\n IDocumentService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n IClient,\n ISequencedDocumentMessage,\n MessageType,\n ScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport { printMessageStats } from \"./fluidAnalyzeMessages\";\nimport {\n connectToWebSocket,\n dumpMessages,\n dumpMessageStats,\n overWrite,\n paramActualFormatting,\n messageTypeFilter,\n} from \"./fluidFetchArgs\";\n\nfunction filenameFromIndex(index: number): string {\n return index === 0 ? \"\" : index.toString(); // support old tools...\n}\n\nlet firstAvailableDelta = 1;\nasync function* loadAllSequencedMessages(\n documentService?: IDocumentService,\n dir?: string,\n files?: string[]) {\n let lastSeq = 0;\n // flag for mismatch between last sequence number read and new one to be read\n let seqNumMismatch = false;\n\n // If we have local save, read ops from there first\n if (files !== undefined) {\n for (let i = 0; i < files.length; i++) {\n const file = filenameFromIndex(i);\n try {\n console.log(`reading messages${file}.json`);\n const fileContent = fs.readFileSync(`${dir}/messages${file}.json`, { encoding: \"utf-8\" });\n const messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n // check if there is mismatch\n seqNumMismatch = messages[0].sequenceNumber !== lastSeq + 1;\n assert(!seqNumMismatch, 0x1b9 /* \"Unexpected value for sequence number of first message in file\" */);\n lastSeq = messages[messages.length - 1].sequenceNumber;\n yield messages;\n } catch (e) {\n if (seqNumMismatch) {\n if (overWrite) {\n // with overWrite option on, we will delete all exisintg message.json files\n for (let index = 0; index < files.length; index++) {\n const name = filenameFromIndex(index);\n fs.unlinkSync(`${dir}/messages${name}.json`);\n }\n break;\n }\n // prompt user to back up and delete existing files\n console.error(\"There are deleted ops in the document being requested,\" +\n \" please back up the existing messages.json file and delete it from its directory.\" +\n \" Then try fetch tool again.\");\n console.error(e);\n return;\n } else {\n console.error(`Error reading / parsing messages from ${files}`);\n console.error(e);\n return;\n }\n }\n }\n if (lastSeq !== 0) {\n console.log(`Read ${lastSeq} ops from local cache`);\n }\n }\n\n if (!documentService) {\n return;\n }\n\n const deltaStorage = await documentService.connectToDeltaStorage();\n\n let timeStart = Date.now();\n let requests = 0;\n let opsStorage = 0;\n\n // reading only 1 op to test if there is mismatch\n const teststream = deltaStorage.fetchMessages(\n lastSeq + 1,\n lastSeq + 2);\n\n let statusCode;\n let innerMostErrorCode;\n let response;\n\n try {\n await teststream.read();\n } catch (error: any) {\n statusCode = error.getTelemetryProperties().statusCode;\n innerMostErrorCode = error.getTelemetryProperties().innerMostErrorCode;\n // if there is gap between ops, catch the error and check it is the error we need\n if (statusCode !== 410 || innerMostErrorCode !== \"fluidDeltaDataNotAvailable\") {\n throw error;\n }\n // get firstAvailableDelta from the error response, and set current sequence number to that\n response = JSON.parse(error.getTelemetryProperties().response);\n firstAvailableDelta = response.error.firstAvailableDelta;\n lastSeq = firstAvailableDelta - 1;\n }\n\n // continue reading rest of the ops\n const stream = deltaStorage.fetchMessages(\n lastSeq + 1, // inclusive left\n undefined, // to\n );\n\n while (true) {\n const result = await stream.read();\n if (result.done) {\n break;\n }\n requests++;\n const messages = result.value;\n\n // Empty buckets should never be returned\n assert(messages.length !== 0, 0x1ba /* \"should not return empty buckets\" */);\n // console.log(`Loaded ops at ${messages[0].sequenceNumber}`);\n\n // This parsing of message contents happens in delta manager. But when we analyze messages\n // for message stats, we skip that path. So parsing of json contents needs to happen here.\n for (const message of messages) {\n if (typeof message.contents === \"string\"\n && message.contents !== \"\"\n && message.type !== MessageType.ClientLeave\n ) {\n message.contents = JSON.parse(message.contents);\n }\n }\n\n opsStorage += messages.length;\n lastSeq = messages[messages.length - 1].sequenceNumber;\n yield messages;\n }\n\n // eslint-disable-next-line max-len\n console.log(`\\n${Math.floor((Date.now() - timeStart) / 1000)} seconds to retrieve ${opsStorage} ops in ${requests} requests`);\n\n if (connectToWebSocket) {\n let logMsg = \"\";\n const client: IClient = {\n mode: \"write\",\n permission: [],\n scopes: [ScopeType.DocRead, ScopeType.DocWrite, ScopeType.SummaryWrite],\n details: {\n capabilities: { interactive: true },\n },\n user: { id: \"blah\" },\n };\n console.log(\"Retrieving messages from web socket\");\n timeStart = Date.now();\n const deltaStream = await documentService.connectToDeltaStream(client);\n const initialMessages = deltaStream.initialMessages;\n deltaStream.dispose();\n console.log(`${Math.floor((Date.now() - timeStart) / 1000)} seconds to connect to web socket`);\n\n if (initialMessages) {\n const lastSequenceNumber = lastSeq;\n const filtered = initialMessages.filter((a) => a.sequenceNumber > lastSequenceNumber);\n const sorted = filtered.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n lastSeq = sorted[sorted.length - 1].sequenceNumber;\n // eslint-disable-next-line max-len\n logMsg = ` (${opsStorage} delta storage, ${initialMessages.length} initial ws messages, ${initialMessages.length - sorted.length} dup)`;\n yield sorted;\n }\n console.log(`${lastSeq} total messages${logMsg}`);\n }\n}\n\nasync function* saveOps(\n gen, // AsyncGenerator<ISequencedDocumentMessage[]>,\n dir: string,\n files: string[]) {\n // Split into 100K ops\n const chunk = 100 * 1000;\n\n let sequencedMessages: ISequencedDocumentMessage[] = [];\n\n // Figure out first file we want to write to\n let index = 0;\n let curr: number = 1;\n if (files.length !== 0) {\n index = files.length - 1;\n const name = filenameFromIndex(index);\n const fileContent = fs.readFileSync(`${dir}/messages${name}.json`, { encoding: \"utf-8\" });\n const messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n curr = messages[0].sequenceNumber;\n }\n\n while (true) {\n const result: IteratorResult<ISequencedDocumentMessage[]> = await gen.next();\n if (files.length === 0) {\n curr = firstAvailableDelta;\n }\n if (!result.done) {\n let messages = result.value;\n yield messages;\n if (messages[messages.length - 1].sequenceNumber < curr) {\n // Nothing interesting.\n continue;\n }\n if (messages[0].sequenceNumber < curr) {\n messages = messages.filter((msg) => msg.sequenceNumber >= curr);\n }\n sequencedMessages = sequencedMessages.concat(messages);\n assert(sequencedMessages[0].sequenceNumber === curr,\n 0x1bb /* \"Unexpected sequence number on first of messages to save\" */);\n assert(sequencedMessages[sequencedMessages.length - 1].sequenceNumber\n === curr + sequencedMessages.length - 1,\n 0x1bc /* \"Unexpected sequence number on last of messages to save\" */);\n }\n\n // Time to write it out?\n while (sequencedMessages.length >= chunk || (result.done && sequencedMessages.length !== 0)) {\n const name = filenameFromIndex(index);\n const write = sequencedMessages.splice(0, chunk);\n console.log(`writing messages${name}.json`);\n fs.writeFileSync(\n `${dir}/messages${name}.json`,\n JSON.stringify(write, undefined, paramActualFormatting ? 0 : 2));\n // increment curr by chunk\n curr += chunk;\n assert(sequencedMessages.length === 0 || sequencedMessages[0].sequenceNumber === curr,\n 0x1bd /* \"Stopped writing at unexpected sequence number\" */);\n index++;\n }\n\n if (result.done) {\n break;\n }\n }\n}\n\nexport async function fluidFetchMessages(documentService?: IDocumentService, saveDir?: string) {\n const messageStats = dumpMessageStats || dumpMessages;\n if (!messageStats && (saveDir === undefined || documentService === undefined)) {\n return;\n }\n\n const files = !saveDir ?\n undefined :\n fs.readdirSync(saveDir)\n .filter((file) => {\n if (!file.startsWith(\"messages\")) {\n return false;\n }\n return true;\n })\n .sort((a, b) => a.localeCompare(b));\n\n let generator = loadAllSequencedMessages(documentService, saveDir, files);\n\n if (saveDir && files !== undefined && documentService) {\n generator = saveOps(generator, saveDir, files);\n }\n\n if (messageStats) {\n return printMessageStats(\n generator,\n dumpMessageStats,\n dumpMessages,\n messageTypeFilter);\n } else {\n let item;\n for await (item of generator) { }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fluidFetchMessages.js","sourceRoot":"","sources":["../src/fluidFetchMessages.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 { assert } from \"@fluidframework/common-utils\";\nimport {\n IDocumentService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n IClient,\n ISequencedDocumentMessage,\n MessageType,\n ScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport { printMessageStats } from \"./fluidAnalyzeMessages\";\nimport {\n connectToWebSocket,\n dumpMessages,\n dumpMessageStats,\n overWrite,\n paramActualFormatting,\n messageTypeFilter,\n} from \"./fluidFetchArgs\";\n\nfunction filenameFromIndex(index: number): string {\n return index === 0 ? \"\" : index.toString(); // support old tools...\n}\n\nlet firstAvailableDelta = 1;\nasync function* loadAllSequencedMessages(\n documentService?: IDocumentService,\n dir?: string,\n files?: string[]) {\n let lastSeq = 0;\n // flag for mismatch between last sequence number read and new one to be read\n let seqNumMismatch = false;\n\n // If we have local save, read ops from there first\n if (files !== undefined) {\n for (let i = 0; i < files.length; i++) {\n const file = filenameFromIndex(i);\n try {\n console.log(`reading messages${file}.json`);\n const fileContent = fs.readFileSync(`${dir}/messages${file}.json`, { encoding: \"utf-8\" });\n const messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n // check if there is mismatch\n seqNumMismatch = messages[0].sequenceNumber !== lastSeq + 1;\n assert(!seqNumMismatch, 0x1b9 /* \"Unexpected value for sequence number of first message in file\" */);\n lastSeq = messages[messages.length - 1].sequenceNumber;\n yield messages;\n } catch (e) {\n if (seqNumMismatch) {\n if (overWrite) {\n // with overWrite option on, we will delete all exisintg message.json files\n for (let index = 0; index < files.length; index++) {\n const name = filenameFromIndex(index);\n fs.unlinkSync(`${dir}/messages${name}.json`);\n }\n break;\n }\n // prompt user to back up and delete existing files\n console.error(\"There are deleted ops in the document being requested,\" +\n \" please back up the existing messages.json file and delete it from its directory.\" +\n \" Then try fetch tool again.\");\n console.error(e);\n return;\n } else {\n console.error(`Error reading / parsing messages from ${files}`);\n console.error(e);\n return;\n }\n }\n }\n if (lastSeq !== 0) {\n console.log(`Read ${lastSeq} ops from local cache`);\n }\n }\n\n if (!documentService) {\n return;\n }\n\n const deltaStorage = await documentService.connectToDeltaStorage();\n\n let timeStart = Date.now();\n let requests = 0;\n let opsStorage = 0;\n\n // reading only 1 op to test if there is mismatch\n const teststream = deltaStorage.fetchMessages(\n lastSeq + 1,\n lastSeq + 2);\n\n let statusCode;\n let innerMostErrorCode;\n let response;\n\n try {\n await teststream.read();\n } catch (error: any) {\n statusCode = error.getTelemetryProperties().statusCode;\n innerMostErrorCode = error.getTelemetryProperties().innerMostErrorCode;\n // if there is gap between ops, catch the error and check it is the error we need\n if (statusCode !== 410 || innerMostErrorCode !== \"fluidDeltaDataNotAvailable\") {\n throw error;\n }\n // get firstAvailableDelta from the error response, and set current sequence number to that\n response = JSON.parse(error.getTelemetryProperties().response);\n firstAvailableDelta = response.error.firstAvailableDelta;\n lastSeq = firstAvailableDelta - 1;\n }\n\n // continue reading rest of the ops\n const stream = deltaStorage.fetchMessages(\n lastSeq + 1, // inclusive left\n undefined, // to\n );\n\n while (true) {\n const result = await stream.read();\n if (result.done) {\n break;\n }\n requests++;\n const messages = result.value;\n\n // Empty buckets should never be returned\n assert(messages.length !== 0, 0x1ba /* \"should not return empty buckets\" */);\n // console.log(`Loaded ops at ${messages[0].sequenceNumber}`);\n\n // This parsing of message contents happens in delta manager. But when we analyze messages\n // for message stats, we skip that path. So parsing of json contents needs to happen here.\n for (const message of messages) {\n if (typeof message.contents === \"string\"\n && message.contents !== \"\"\n && message.type !== MessageType.ClientLeave\n ) {\n message.contents = JSON.parse(message.contents);\n }\n }\n\n opsStorage += messages.length;\n lastSeq = messages[messages.length - 1].sequenceNumber;\n yield messages;\n }\n\n // eslint-disable-next-line max-len\n console.log(`\\n${Math.floor((Date.now() - timeStart) / 1000)} seconds to retrieve ${opsStorage} ops in ${requests} requests`);\n\n if (connectToWebSocket) {\n let logMsg = \"\";\n const client: IClient = {\n mode: \"write\",\n permission: [],\n scopes: [ScopeType.DocRead, ScopeType.DocWrite, ScopeType.SummaryWrite],\n details: {\n capabilities: { interactive: true },\n },\n user: { id: \"blah\" },\n };\n console.log(\"Retrieving messages from web socket\");\n timeStart = Date.now();\n const deltaStream = await documentService.connectToDeltaStream(client);\n const initialMessages = deltaStream.initialMessages;\n deltaStream.dispose();\n console.log(`${Math.floor((Date.now() - timeStart) / 1000)} seconds to connect to web socket`);\n\n if (initialMessages !== undefined) {\n const lastSequenceNumber = lastSeq;\n const filtered = initialMessages.filter((a) => a.sequenceNumber > lastSequenceNumber);\n const sorted = filtered.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n lastSeq = sorted[sorted.length - 1].sequenceNumber;\n // eslint-disable-next-line max-len\n logMsg = ` (${opsStorage} delta storage, ${initialMessages.length} initial ws messages, ${initialMessages.length - sorted.length} dup)`;\n yield sorted;\n }\n console.log(`${lastSeq} total messages${logMsg}`);\n }\n}\n\nasync function* saveOps(\n gen, // AsyncGenerator<ISequencedDocumentMessage[]>,\n dir: string,\n files: string[]) {\n // Split into 100K ops\n const chunk = 100 * 1000;\n\n let sequencedMessages: ISequencedDocumentMessage[] = [];\n\n // Figure out first file we want to write to\n let index = 0;\n let curr: number = 1;\n if (files.length !== 0) {\n index = files.length - 1;\n const name = filenameFromIndex(index);\n const fileContent = fs.readFileSync(`${dir}/messages${name}.json`, { encoding: \"utf-8\" });\n const messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n curr = messages[0].sequenceNumber;\n }\n\n while (true) {\n const result: IteratorResult<ISequencedDocumentMessage[]> = await gen.next();\n if (files.length === 0) {\n curr = firstAvailableDelta;\n }\n if (result.done !== true) {\n let messages = result.value;\n yield messages;\n if (messages[messages.length - 1].sequenceNumber < curr) {\n // Nothing interesting.\n continue;\n }\n if (messages[0].sequenceNumber < curr) {\n messages = messages.filter((msg) => msg.sequenceNumber >= curr);\n }\n sequencedMessages = sequencedMessages.concat(messages);\n assert(sequencedMessages[0].sequenceNumber === curr,\n 0x1bb /* \"Unexpected sequence number on first of messages to save\" */);\n assert(sequencedMessages[sequencedMessages.length - 1].sequenceNumber\n === curr + sequencedMessages.length - 1,\n 0x1bc /* \"Unexpected sequence number on last of messages to save\" */);\n }\n\n // Time to write it out?\n while (sequencedMessages.length >= chunk || (result.done === true && sequencedMessages.length !== 0)) {\n const name = filenameFromIndex(index);\n const write = sequencedMessages.splice(0, chunk);\n console.log(`writing messages${name}.json`);\n fs.writeFileSync(\n `${dir}/messages${name}.json`,\n JSON.stringify(write, undefined, paramActualFormatting ? 0 : 2));\n // increment curr by chunk\n curr += chunk;\n assert(sequencedMessages.length === 0 || sequencedMessages[0].sequenceNumber === curr,\n 0x1bd /* \"Stopped writing at unexpected sequence number\" */);\n index++;\n }\n\n if (result.done === true) {\n break;\n }\n }\n}\n\nexport async function fluidFetchMessages(documentService?: IDocumentService, saveDir?: string) {\n const messageStats = dumpMessageStats || dumpMessages;\n if (!messageStats && (saveDir === undefined || documentService === undefined)) {\n return;\n }\n\n const files = saveDir === undefined\n ? undefined\n : fs.readdirSync(saveDir)\n .filter((file) => {\n if (!file.startsWith(\"messages\")) {\n return false;\n }\n return true;\n })\n .sort((a, b) => a.localeCompare(b));\n\n let generator = loadAllSequencedMessages(documentService, saveDir, files);\n\n if (saveDir !== undefined && files !== undefined && documentService) {\n generator = saveOps(generator, saveDir, files);\n }\n\n if (messageStats) {\n return printMessageStats(\n generator,\n dumpMessageStats,\n dumpMessages,\n messageTypeFilter);\n } else {\n let item;\n for await (item of generator) { }\n }\n}\n"]}
|
|
@@ -41,7 +41,7 @@ function fetchBlobs(prefix, tree, storage, blobIdMap) {
|
|
|
41
41
|
// Use the blobIdMap to assign a number for each unique blob
|
|
42
42
|
// and use it as a prefix for files to avoid case-insensitive fs
|
|
43
43
|
let index = blobIdMap.get(blobId);
|
|
44
|
-
if (
|
|
44
|
+
if (index === undefined) {
|
|
45
45
|
index = blobIdMap.size;
|
|
46
46
|
blobIdMap.set(blobId, index);
|
|
47
47
|
}
|
|
@@ -231,7 +231,7 @@ async function fluidFetchSnapshot(documentService, saveDir) {
|
|
|
231
231
|
const name = `${i}-${v.id}`;
|
|
232
232
|
const res = await dumpSnapshotTree(name, blobs);
|
|
233
233
|
let date = "";
|
|
234
|
-
if (v.date) {
|
|
234
|
+
if (v.date !== undefined) {
|
|
235
235
|
try {
|
|
236
236
|
date = new Date(v.date).toLocaleString();
|
|
237
237
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidFetchSnapshot.js","sourceRoot":"","sources":["../src/fluidFetchSnapshot.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 util from \"util\";\nimport { bufferToString, stringToBuffer, TelemetryNullLogger } from \"@fluidframework/common-utils\";\nimport {\n IDocumentService,\n IDocumentStorageService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ISnapshotTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { BlobAggregationStorage } from \"@fluidframework/driver-utils\";\nimport { formatNumber } from \"./fluidAnalyzeMessages\";\nimport {\n dumpSnapshotStats,\n dumpSnapshotTrees,\n dumpSnapshotVersions,\n paramActualFormatting,\n paramNumSnapshotVersions,\n paramSnapshotVersionIndex,\n paramUnpackAggregatedBlobs,\n} from \"./fluidFetchArgs\";\nimport { latestVersionsId } from \"./fluidFetchInit\";\n\ninterface ISnapshotInfo {\n blobCountNew: number;\n blobCount: number;\n size: number;\n sizeNew: number;\n}\n\ntype IFetchedData = IFetchedBlob | IFetchedTree;\n\ninterface IFetchedBlob {\n treePath: string;\n filename: string;\n blobId: string;\n blob: Promise<ArrayBufferLike | undefined>;\n reused: boolean;\n}\n\ninterface IFetchedTree {\n treePath: string;\n blobId: string;\n filename: string;\n blob: ArrayBufferLike;\n\n reused: false;\n\n patched: boolean;\n}\n\nfunction isFetchedTree(fetchedData: IFetchedData): fetchedData is IFetchedTree {\n return \"patched\" in fetchedData;\n}\n\nconst blobCache = new Map<string, Promise<ArrayBufferLike>>();\nlet blobCachePrevious = new Map<string, Promise<ArrayBufferLike>>();\nlet blobCacheCurrent = new Map<string, Promise<ArrayBufferLike>>();\n\nfunction fetchBlobs(prefix: string,\n tree: ISnapshotTree,\n storage: IDocumentStorageService,\n blobIdMap: Map<string, number>,\n) {\n const result: IFetchedBlob[] = [];\n for (const item of Object.keys(tree.blobs)) {\n const treePath = `${prefix}${item}`;\n const blobId = tree.blobs[item];\n if (blobId !== null) {\n let reused = true;\n let blob = blobCachePrevious.get(blobId);\n if (!blob) {\n reused = false;\n blob = blobCache.get(blobId);\n if (blob === undefined) {\n blob = storage.readBlob(blobId);\n blobCache.set(blobId, blob);\n }\n }\n blobCacheCurrent.set(blobId, blob);\n\n // Use the blobIdMap to assign a number for each unique blob\n // and use it as a prefix for files to avoid case-insensitive fs\n let index = blobIdMap.get(blobId);\n if (!index) {\n index = blobIdMap.size;\n blobIdMap.set(blobId, index);\n }\n const filename = `${index}-${blobId}`;\n result.push({ treePath, blobId, blob, reused, filename });\n\n // patch the tree so that we can write it out to reference the file\n tree.blobs[item] = filename;\n }\n }\n return result;\n}\n\nfunction createTreeBlob(tree: ISnapshotTree, prefix: string, patched: boolean): IFetchedTree {\n const id = tree.id ?? \"original\";\n const blob = stringToBuffer(JSON.stringify(tree), \"utf8\");\n const filename = patched ? \"tree\" : `tree-${id}`;\n const treePath = `${prefix}${filename}`;\n return { treePath, blobId: \"original tree $id\", filename, blob, patched, reused: false };\n}\n\nasync function fetchBlobsFromSnapshotTree(\n storage: IDocumentStorageService,\n tree: ISnapshotTree,\n prefix: string = \"/\",\n parentBlobIdMap?: Map<string, number>): Promise<IFetchedData[]> {\n const isTopLevel = !parentBlobIdMap;\n if (isTopLevel && dumpSnapshotTrees) {\n console.log(tree);\n }\n\n if (prefix === \"/\") {\n blobCachePrevious = blobCacheCurrent;\n blobCacheCurrent = new Map<string, Promise<ArrayBufferLike>>();\n }\n\n // Create the tree info before fetching blobs (which will modify it)\n let topLevelBlob: IFetchedTree | undefined;\n if (isTopLevel) {\n topLevelBlob = createTreeBlob(tree, prefix, false);\n }\n\n const blobIdMap = parentBlobIdMap ?? new Map<string, number>();\n let result: IFetchedData[] = fetchBlobs(prefix, tree, storage, blobIdMap);\n\n for (const subtreeId of Object.keys(tree.trees)) {\n const subtree = tree.trees[subtreeId];\n const dataStoreBlobs = await fetchBlobsFromSnapshotTree(\n storage,\n subtree,\n `${prefix}${subtreeId}/`, blobIdMap);\n result = result.concat(dataStoreBlobs);\n }\n\n if (topLevelBlob) {\n result.push(topLevelBlob);\n result.push(createTreeBlob(tree, prefix, true));\n }\n return result;\n}\n\nfunction getDumpFetchedData(fetchedData: IFetchedData[]) {\n const sorted = fetchedData.sort((a, b) => a.treePath.localeCompare(b.treePath));\n return sorted.filter((item) => !isFetchedTree(item) || !item.patched);\n}\n\nasync function dumpSnapshotTreeVerbose(name: string, fetchedData: IFetchedData[]) {\n let size = 0;\n const sorted = getDumpFetchedData(fetchedData);\n\n let nameLength = 10;\n for (const item of sorted) {\n nameLength = Math.max(nameLength, item.treePath.length);\n }\n\n console.log(\"\");\n console.log(`${\"Blob Path\".padEnd(nameLength)} | Reused | Bytes`);\n console.log(\"-\".repeat(nameLength + 26));\n for (const item of sorted) {\n const buffer = await item.blob;\n if (buffer === undefined) {\n continue;\n }\n const blob = bufferToString(buffer, \"utf8\");\n // eslint-disable-next-line max-len\n console.log(`${item.treePath.padEnd(nameLength)} | ${item.reused ? \"X\" : \" \"} | ${formatNumber(blob.length).padStart(10)}`);\n size += blob.length;\n }\n\n console.log(\"-\".repeat(nameLength + 26));\n console.log(`${\"Total snapshot size\".padEnd(nameLength)} | | ${formatNumber(size).padStart(10)}`);\n}\n\nasync function dumpSnapshotTree(name: string, fetchedData: IFetchedData[]): Promise<ISnapshotInfo> {\n let size = 0;\n let sizeNew = 0;\n let blobCountNew = 0;\n const sorted = getDumpFetchedData(fetchedData);\n\n for (const item of sorted) {\n const buffer = await item.blob;\n if (buffer === undefined) {\n continue;\n }\n const blob = bufferToString(buffer, \"utf8\");\n if (!item.reused) {\n sizeNew += blob.length;\n blobCountNew++;\n }\n size += blob.length;\n }\n\n return { blobCountNew, blobCount: sorted.length, size, sizeNew };\n}\n\nasync function saveSnapshot(name: string, fetchedData: IFetchedData[], saveDir: string) {\n const outDir = `${saveDir}/${name}/`;\n const mkdir = util.promisify(fs.mkdir);\n\n await mkdir(`${outDir}/decoded`, { recursive: true });\n await Promise.all(fetchedData.map(async (item) => {\n const buffer = await item.blob;\n if (buffer === undefined) {\n console.error(`ERROR: Unable to get data for blob ${item.blobId}`);\n return;\n }\n\n if (!isFetchedTree(item)) {\n // Just write the data as is.\n fs.writeFileSync(`${outDir}/${item.filename}`, Buffer.from(buffer));\n\n // we assume that the buffer is utf8 here, which currently is true for\n // all of our snapshot blobs. It doesn't necessary be true in the future\n let decoded = bufferToString(buffer, \"utf8\");\n try {\n if (!paramActualFormatting) {\n decoded = JSON.stringify(JSON.parse(decoded), undefined, 2);\n }\n } catch (e) {\n }\n fs.writeFileSync(\n `${outDir}/decoded/${item.filename}.json`, decoded);\n } else {\n // Write out same data for tree decoded or not, except for formatting\n const treeString = bufferToString(buffer, \"utf8\");\n fs.writeFileSync(`${outDir}/${item.filename}.json`, treeString);\n fs.writeFileSync(`${outDir}/decoded/${item.filename}.json`,\n paramActualFormatting ? treeString : JSON.stringify(JSON.parse(treeString), undefined, 2));\n }\n }));\n}\n\nasync function fetchBlobsFromVersion(storage: IDocumentStorageService, version: IVersion) {\n const tree = await reportErrors(`getSnapshotTree ${version.id}`, storage.getSnapshotTree(version));\n if (!tree) {\n return Promise.reject(new Error(\"Failed to load snapshot tree\"));\n }\n return fetchBlobsFromSnapshotTree(storage, tree);\n}\n\nasync function reportErrors<T>(message: string, res: Promise<T>) {\n try {\n return await res;\n } catch (error) {\n console.error(`Error calling ${message}`);\n throw error;\n }\n}\n\nexport async function fluidFetchSnapshot(\n documentService?: IDocumentService,\n saveDir?: string,\n ) {\n if (!dumpSnapshotStats && !dumpSnapshotTrees && !dumpSnapshotVersions && saveDir === undefined) {\n return;\n }\n\n // --local mode - do not connect to storage.\n // For now, bail out early.\n // In future, separate download from analyzes parts and allow offline analyzes\n if (!documentService) {\n return;\n }\n\n console.log(\"\\n\");\n\n let storage = await documentService.connectToStorage();\n if (paramUnpackAggregatedBlobs) {\n storage = BlobAggregationStorage.wrap(storage, new TelemetryNullLogger(), false /* allowPacking */);\n }\n\n let version: IVersion | undefined;\n const versions = await reportErrors(\n `getVersions ${latestVersionsId}`,\n storage.getVersions(latestVersionsId, paramNumSnapshotVersions));\n if (dumpSnapshotVersions) {\n console.log(\"Snapshot versions\");\n console.log(versions);\n }\n\n let blobsToDump: IFetchedData[] | undefined;\n if (paramSnapshotVersionIndex !== undefined) {\n version = versions[paramSnapshotVersionIndex];\n if (version === undefined) {\n console.log(`There are only ${versions.length} snapshots, --snapshotVersionIndex is too large`);\n return;\n }\n if (saveDir !== undefined) {\n blobsToDump = await fetchBlobsFromVersion(storage, version);\n const name = version.id;\n console.log(`Saving snapshot ${name}`);\n await saveSnapshot(name, blobsToDump, saveDir);\n }\n } else {\n version = versions[0];\n if (saveDir !== undefined && versions.length > 0) {\n console.log(\" Name | Date | Size | New Size | Blobs | New Blobs\");\n console.log(\"-\".repeat(86));\n\n // Go in reverse order, to correctly calculate blob reuse - from oldest to newest snapshots\n for (let i = versions.length - 1; i >= 0; i--) {\n const v = versions[i];\n const blobs = await fetchBlobsFromVersion(storage, v);\n blobsToDump = blobs;\n const name = `${i}-${v.id}`;\n const res = await dumpSnapshotTree(name, blobs);\n\n let date = \"\";\n if (v.date) {\n try {\n date = new Date(v.date).toLocaleString();\n } catch (e) {\n date = v.date.replace(\"T\", \" \");\n const index = date.lastIndexOf(\".\");\n if (index > 0) {\n date = `${date.substr(0, index)} Z`;\n }\n }\n }\n date = date.padStart(23);\n const size = formatNumber(res.size).padStart(10);\n const sizeNew = formatNumber(res.sizeNew).padStart(10);\n const blobCount = formatNumber(res.blobCount).padStart(6);\n const blobCountNew = formatNumber(res.blobCountNew).padStart(9);\n\n console.log(`${name.padEnd(15)} | ${date} | ${size} | ${sizeNew} | ${blobCount} | ${blobCountNew}`);\n\n await saveSnapshot(name, blobs, saveDir);\n }\n }\n }\n\n if (dumpSnapshotStats || dumpSnapshotTrees) {\n if (version === undefined) {\n console.log(\"No snapshot tree\");\n } else {\n if (blobsToDump === undefined) {\n blobsToDump = await fetchBlobsFromVersion(storage, version);\n }\n console.log(`\\n\\nSnapshot version ${version.id}`);\n await dumpSnapshotTreeVerbose(version.id, blobsToDump);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fluidFetchSnapshot.js","sourceRoot":"","sources":["../src/fluidFetchSnapshot.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 util from \"util\";\nimport { bufferToString, stringToBuffer, TelemetryNullLogger } from \"@fluidframework/common-utils\";\nimport {\n IDocumentService,\n IDocumentStorageService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ISnapshotTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { BlobAggregationStorage } from \"@fluidframework/driver-utils\";\nimport { formatNumber } from \"./fluidAnalyzeMessages\";\nimport {\n dumpSnapshotStats,\n dumpSnapshotTrees,\n dumpSnapshotVersions,\n paramActualFormatting,\n paramNumSnapshotVersions,\n paramSnapshotVersionIndex,\n paramUnpackAggregatedBlobs,\n} from \"./fluidFetchArgs\";\nimport { latestVersionsId } from \"./fluidFetchInit\";\n\ninterface ISnapshotInfo {\n blobCountNew: number;\n blobCount: number;\n size: number;\n sizeNew: number;\n}\n\ntype IFetchedData = IFetchedBlob | IFetchedTree;\n\ninterface IFetchedBlob {\n treePath: string;\n filename: string;\n blobId: string;\n blob: Promise<ArrayBufferLike | undefined>;\n reused: boolean;\n}\n\ninterface IFetchedTree {\n treePath: string;\n blobId: string;\n filename: string;\n blob: ArrayBufferLike;\n\n reused: false;\n\n patched: boolean;\n}\n\nfunction isFetchedTree(fetchedData: IFetchedData): fetchedData is IFetchedTree {\n return \"patched\" in fetchedData;\n}\n\nconst blobCache = new Map<string, Promise<ArrayBufferLike>>();\nlet blobCachePrevious = new Map<string, Promise<ArrayBufferLike>>();\nlet blobCacheCurrent = new Map<string, Promise<ArrayBufferLike>>();\n\nfunction fetchBlobs(prefix: string,\n tree: ISnapshotTree,\n storage: IDocumentStorageService,\n blobIdMap: Map<string, number>,\n) {\n const result: IFetchedBlob[] = [];\n for (const item of Object.keys(tree.blobs)) {\n const treePath = `${prefix}${item}`;\n const blobId = tree.blobs[item];\n if (blobId !== null) {\n let reused = true;\n let blob = blobCachePrevious.get(blobId);\n if (!blob) {\n reused = false;\n blob = blobCache.get(blobId);\n if (blob === undefined) {\n blob = storage.readBlob(blobId);\n blobCache.set(blobId, blob);\n }\n }\n blobCacheCurrent.set(blobId, blob);\n\n // Use the blobIdMap to assign a number for each unique blob\n // and use it as a prefix for files to avoid case-insensitive fs\n let index = blobIdMap.get(blobId);\n if (index === undefined) {\n index = blobIdMap.size;\n blobIdMap.set(blobId, index);\n }\n const filename = `${index}-${blobId}`;\n result.push({ treePath, blobId, blob, reused, filename });\n\n // patch the tree so that we can write it out to reference the file\n tree.blobs[item] = filename;\n }\n }\n return result;\n}\n\nfunction createTreeBlob(tree: ISnapshotTree, prefix: string, patched: boolean): IFetchedTree {\n const id = tree.id ?? \"original\";\n const blob = stringToBuffer(JSON.stringify(tree), \"utf8\");\n const filename = patched ? \"tree\" : `tree-${id}`;\n const treePath = `${prefix}${filename}`;\n return { treePath, blobId: \"original tree $id\", filename, blob, patched, reused: false };\n}\n\nasync function fetchBlobsFromSnapshotTree(\n storage: IDocumentStorageService,\n tree: ISnapshotTree,\n prefix: string = \"/\",\n parentBlobIdMap?: Map<string, number>): Promise<IFetchedData[]> {\n const isTopLevel = !parentBlobIdMap;\n if (isTopLevel && dumpSnapshotTrees) {\n console.log(tree);\n }\n\n if (prefix === \"/\") {\n blobCachePrevious = blobCacheCurrent;\n blobCacheCurrent = new Map<string, Promise<ArrayBufferLike>>();\n }\n\n // Create the tree info before fetching blobs (which will modify it)\n let topLevelBlob: IFetchedTree | undefined;\n if (isTopLevel) {\n topLevelBlob = createTreeBlob(tree, prefix, false);\n }\n\n const blobIdMap = parentBlobIdMap ?? new Map<string, number>();\n let result: IFetchedData[] = fetchBlobs(prefix, tree, storage, blobIdMap);\n\n for (const subtreeId of Object.keys(tree.trees)) {\n const subtree = tree.trees[subtreeId];\n const dataStoreBlobs = await fetchBlobsFromSnapshotTree(\n storage,\n subtree,\n `${prefix}${subtreeId}/`, blobIdMap);\n result = result.concat(dataStoreBlobs);\n }\n\n if (topLevelBlob) {\n result.push(topLevelBlob);\n result.push(createTreeBlob(tree, prefix, true));\n }\n return result;\n}\n\nfunction getDumpFetchedData(fetchedData: IFetchedData[]) {\n const sorted = fetchedData.sort((a, b) => a.treePath.localeCompare(b.treePath));\n return sorted.filter((item) => !isFetchedTree(item) || !item.patched);\n}\n\nasync function dumpSnapshotTreeVerbose(name: string, fetchedData: IFetchedData[]) {\n let size = 0;\n const sorted = getDumpFetchedData(fetchedData);\n\n let nameLength = 10;\n for (const item of sorted) {\n nameLength = Math.max(nameLength, item.treePath.length);\n }\n\n console.log(\"\");\n console.log(`${\"Blob Path\".padEnd(nameLength)} | Reused | Bytes`);\n console.log(\"-\".repeat(nameLength + 26));\n for (const item of sorted) {\n const buffer = await item.blob;\n if (buffer === undefined) {\n continue;\n }\n const blob = bufferToString(buffer, \"utf8\");\n // eslint-disable-next-line max-len\n console.log(`${item.treePath.padEnd(nameLength)} | ${item.reused ? \"X\" : \" \"} | ${formatNumber(blob.length).padStart(10)}`);\n size += blob.length;\n }\n\n console.log(\"-\".repeat(nameLength + 26));\n console.log(`${\"Total snapshot size\".padEnd(nameLength)} | | ${formatNumber(size).padStart(10)}`);\n}\n\nasync function dumpSnapshotTree(name: string, fetchedData: IFetchedData[]): Promise<ISnapshotInfo> {\n let size = 0;\n let sizeNew = 0;\n let blobCountNew = 0;\n const sorted = getDumpFetchedData(fetchedData);\n\n for (const item of sorted) {\n const buffer = await item.blob;\n if (buffer === undefined) {\n continue;\n }\n const blob = bufferToString(buffer, \"utf8\");\n if (!item.reused) {\n sizeNew += blob.length;\n blobCountNew++;\n }\n size += blob.length;\n }\n\n return { blobCountNew, blobCount: sorted.length, size, sizeNew };\n}\n\nasync function saveSnapshot(name: string, fetchedData: IFetchedData[], saveDir: string) {\n const outDir = `${saveDir}/${name}/`;\n const mkdir = util.promisify(fs.mkdir);\n\n await mkdir(`${outDir}/decoded`, { recursive: true });\n await Promise.all(fetchedData.map(async (item) => {\n const buffer = await item.blob;\n if (buffer === undefined) {\n console.error(`ERROR: Unable to get data for blob ${item.blobId}`);\n return;\n }\n\n if (!isFetchedTree(item)) {\n // Just write the data as is.\n fs.writeFileSync(`${outDir}/${item.filename}`, Buffer.from(buffer));\n\n // we assume that the buffer is utf8 here, which currently is true for\n // all of our snapshot blobs. It doesn't necessary be true in the future\n let decoded = bufferToString(buffer, \"utf8\");\n try {\n if (!paramActualFormatting) {\n decoded = JSON.stringify(JSON.parse(decoded), undefined, 2);\n }\n } catch (e) {\n }\n fs.writeFileSync(\n `${outDir}/decoded/${item.filename}.json`, decoded);\n } else {\n // Write out same data for tree decoded or not, except for formatting\n const treeString = bufferToString(buffer, \"utf8\");\n fs.writeFileSync(`${outDir}/${item.filename}.json`, treeString);\n fs.writeFileSync(`${outDir}/decoded/${item.filename}.json`,\n paramActualFormatting ? treeString : JSON.stringify(JSON.parse(treeString), undefined, 2));\n }\n }));\n}\n\nasync function fetchBlobsFromVersion(storage: IDocumentStorageService, version: IVersion) {\n const tree = await reportErrors(`getSnapshotTree ${version.id}`, storage.getSnapshotTree(version));\n if (!tree) {\n return Promise.reject(new Error(\"Failed to load snapshot tree\"));\n }\n return fetchBlobsFromSnapshotTree(storage, tree);\n}\n\nasync function reportErrors<T>(message: string, res: Promise<T>) {\n try {\n return await res;\n } catch (error) {\n console.error(`Error calling ${message}`);\n throw error;\n }\n}\n\nexport async function fluidFetchSnapshot(\n documentService?: IDocumentService,\n saveDir?: string,\n ) {\n if (!dumpSnapshotStats && !dumpSnapshotTrees && !dumpSnapshotVersions && saveDir === undefined) {\n return;\n }\n\n // --local mode - do not connect to storage.\n // For now, bail out early.\n // In future, separate download from analyzes parts and allow offline analyzes\n if (!documentService) {\n return;\n }\n\n console.log(\"\\n\");\n\n let storage = await documentService.connectToStorage();\n if (paramUnpackAggregatedBlobs) {\n storage = BlobAggregationStorage.wrap(storage, new TelemetryNullLogger(), false /* allowPacking */);\n }\n\n let version: IVersion | undefined;\n const versions = await reportErrors(\n `getVersions ${latestVersionsId}`,\n storage.getVersions(latestVersionsId, paramNumSnapshotVersions));\n if (dumpSnapshotVersions) {\n console.log(\"Snapshot versions\");\n console.log(versions);\n }\n\n let blobsToDump: IFetchedData[] | undefined;\n if (paramSnapshotVersionIndex !== undefined) {\n version = versions[paramSnapshotVersionIndex];\n if (version === undefined) {\n console.log(`There are only ${versions.length} snapshots, --snapshotVersionIndex is too large`);\n return;\n }\n if (saveDir !== undefined) {\n blobsToDump = await fetchBlobsFromVersion(storage, version);\n const name = version.id;\n console.log(`Saving snapshot ${name}`);\n await saveSnapshot(name, blobsToDump, saveDir);\n }\n } else {\n version = versions[0];\n if (saveDir !== undefined && versions.length > 0) {\n console.log(\" Name | Date | Size | New Size | Blobs | New Blobs\");\n console.log(\"-\".repeat(86));\n\n // Go in reverse order, to correctly calculate blob reuse - from oldest to newest snapshots\n for (let i = versions.length - 1; i >= 0; i--) {\n const v = versions[i];\n const blobs = await fetchBlobsFromVersion(storage, v);\n blobsToDump = blobs;\n const name = `${i}-${v.id}`;\n const res = await dumpSnapshotTree(name, blobs);\n\n let date = \"\";\n if (v.date !== undefined) {\n try {\n date = new Date(v.date).toLocaleString();\n } catch (e) {\n date = v.date.replace(\"T\", \" \");\n const index = date.lastIndexOf(\".\");\n if (index > 0) {\n date = `${date.substr(0, index)} Z`;\n }\n }\n }\n date = date.padStart(23);\n const size = formatNumber(res.size).padStart(10);\n const sizeNew = formatNumber(res.sizeNew).padStart(10);\n const blobCount = formatNumber(res.blobCount).padStart(6);\n const blobCountNew = formatNumber(res.blobCountNew).padStart(9);\n\n console.log(`${name.padEnd(15)} | ${date} | ${size} | ${sizeNew} | ${blobCount} | ${blobCountNew}`);\n\n await saveSnapshot(name, blobs, saveDir);\n }\n }\n }\n\n if (dumpSnapshotStats || dumpSnapshotTrees) {\n if (version === undefined) {\n console.log(\"No snapshot tree\");\n } else {\n if (blobsToDump === undefined) {\n blobsToDump = await fetchBlobsFromVersion(storage, version);\n }\n console.log(`\\n\\nSnapshot version ${version.id}`);\n await dumpSnapshotTreeVerbose(version.id, blobsToDump);\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluid-tools/fetch-tool",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0-75972",
|
|
4
4
|
"description": "Console tool to fetch Fluid data from relay service",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -29,26 +29,26 @@
|
|
|
29
29
|
"tsfmt:fix": "tsfmt --replace"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@fluid-tools/fluidapp-odsp-urlresolver": "
|
|
32
|
+
"@fluid-tools/fluidapp-odsp-urlresolver": "1.1.0-75972",
|
|
33
33
|
"@fluidframework/common-utils": "^0.32.1",
|
|
34
|
-
"@fluidframework/container-runtime": "
|
|
35
|
-
"@fluidframework/datastore": "
|
|
36
|
-
"@fluidframework/driver-definitions": "
|
|
37
|
-
"@fluidframework/driver-utils": "
|
|
38
|
-
"@fluidframework/odsp-doclib-utils": "
|
|
39
|
-
"@fluidframework/odsp-driver": "
|
|
40
|
-
"@fluidframework/odsp-driver-definitions": "
|
|
41
|
-
"@fluidframework/odsp-urlresolver": "
|
|
34
|
+
"@fluidframework/container-runtime": "1.1.0-75972",
|
|
35
|
+
"@fluidframework/datastore": "1.1.0-75972",
|
|
36
|
+
"@fluidframework/driver-definitions": "1.1.0-75972",
|
|
37
|
+
"@fluidframework/driver-utils": "1.1.0-75972",
|
|
38
|
+
"@fluidframework/odsp-doclib-utils": "1.1.0-75972",
|
|
39
|
+
"@fluidframework/odsp-driver": "1.1.0-75972",
|
|
40
|
+
"@fluidframework/odsp-driver-definitions": "1.1.0-75972",
|
|
41
|
+
"@fluidframework/odsp-urlresolver": "1.1.0-75972",
|
|
42
42
|
"@fluidframework/protocol-definitions": "^0.1028.2000",
|
|
43
|
-
"@fluidframework/routerlicious-driver": "
|
|
44
|
-
"@fluidframework/routerlicious-urlresolver": "
|
|
45
|
-
"@fluidframework/runtime-definitions": "
|
|
46
|
-
"@fluidframework/telemetry-utils": "
|
|
47
|
-
"@fluidframework/test-client-utils": "
|
|
48
|
-
"@fluidframework/tool-utils": "
|
|
43
|
+
"@fluidframework/routerlicious-driver": "1.1.0-75972",
|
|
44
|
+
"@fluidframework/routerlicious-urlresolver": "1.1.0-75972",
|
|
45
|
+
"@fluidframework/runtime-definitions": "1.1.0-75972",
|
|
46
|
+
"@fluidframework/telemetry-utils": "1.1.0-75972",
|
|
47
|
+
"@fluidframework/test-client-utils": "1.1.0-75972",
|
|
48
|
+
"@fluidframework/tool-utils": "1.1.0-75972"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@fluidframework/build-common": "^0.
|
|
51
|
+
"@fluidframework/build-common": "^0.24.0-0",
|
|
52
52
|
"@fluidframework/eslint-config-fluid": "^0.28.2000",
|
|
53
53
|
"@rushstack/eslint-config": "^2.5.1",
|
|
54
54
|
"@types/node": "^14.18.0",
|
|
@@ -92,15 +92,15 @@ function dumpStats(
|
|
|
92
92
|
const fieldsLength = fieldSizes[0] + fieldSizes[1] + 1;
|
|
93
93
|
let headers = props.headers;
|
|
94
94
|
|
|
95
|
-
let recordsToShow = props.lines
|
|
96
|
-
if (map.size !== recordsToShow &&
|
|
95
|
+
let recordsToShow = props.lines ?? 10;
|
|
96
|
+
if (map.size !== recordsToShow && props.removeTotals === undefined && recordsToShow > 1) {
|
|
97
97
|
recordsToShow--;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
let sorted: [string, [number, number]][];
|
|
101
|
-
const sortIndex = props.orderByFirstColumn ? 0 : 1;
|
|
101
|
+
const sortIndex = props.orderByFirstColumn === true ? 0 : 1;
|
|
102
102
|
let add: string;
|
|
103
|
-
if (props.reverseSort) {
|
|
103
|
+
if (props.reverseSort !== undefined) {
|
|
104
104
|
sorted = [...map.entries()].sort((a, b) => a[1][sortIndex] - b[1][sortIndex]);
|
|
105
105
|
add = "↑";
|
|
106
106
|
} else {
|
|
@@ -109,7 +109,7 @@ function dumpStats(
|
|
|
109
109
|
}
|
|
110
110
|
headers[sortIndex] = `${headers[sortIndex]} ${add}`;
|
|
111
111
|
|
|
112
|
-
if (props.reverseColumnsInUI) {
|
|
112
|
+
if (props.reverseColumnsInUI !== undefined) {
|
|
113
113
|
headers = [headers[1], headers[0]];
|
|
114
114
|
const sorted2: [string, [number, number]][] = [];
|
|
115
115
|
for (const [name, [count, size]] of sorted) {
|
|
@@ -147,7 +147,7 @@ function dumpStats(
|
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
-
if (
|
|
150
|
+
if (props.removeTotals === undefined) {
|
|
151
151
|
if (allOtherCount || allOtherSize) {
|
|
152
152
|
// eslint-disable-next-line max-len
|
|
153
153
|
console.log(`${`All Others (${sorted.length - recordsToShow})`.padEnd(nameLength)} │ ${formatNumber(allOtherCount).padStart(fieldSizes[0])} ${formatNumber(allOtherSize).padStart(fieldSizes[1])}`);
|
|
@@ -535,7 +535,7 @@ function processOp(
|
|
|
535
535
|
{
|
|
536
536
|
let envelope = runtimeMessage.contents as IEnvelope;
|
|
537
537
|
// TODO: Legacy?
|
|
538
|
-
if (envelope && typeof envelope === "string") {
|
|
538
|
+
if (envelope !== undefined && typeof envelope === "string") {
|
|
539
539
|
envelope = JSON.parse(envelope);
|
|
540
540
|
}
|
|
541
541
|
const innerContent = envelope.contents as {
|
|
@@ -581,7 +581,7 @@ function processOp(
|
|
|
581
581
|
subType = innerContent2.value.type;
|
|
582
582
|
} else if (objectType === "mergeTree" && subType !== undefined) {
|
|
583
583
|
const types = ["insert", "remove", "annotate", "group"];
|
|
584
|
-
if (types[subType]) {
|
|
584
|
+
if (types[subType] !== undefined) {
|
|
585
585
|
subType = types[subType];
|
|
586
586
|
}
|
|
587
587
|
}
|
|
@@ -630,7 +630,7 @@ function processDataStoreAttachOp(
|
|
|
630
630
|
for (const entry2 of entry.value.entries) {
|
|
631
631
|
if (entry2.path === ".attributes" && entry2.type === TreeEntry.Blob) {
|
|
632
632
|
const attrib = JSON.parse(entry2.value.contents);
|
|
633
|
-
let objectType = attrib.type;
|
|
633
|
+
let objectType: string = attrib.type;
|
|
634
634
|
if (objectType.startsWith(objectTypePrefix)) {
|
|
635
635
|
objectType = objectType.substring(objectTypePrefix.length);
|
|
636
636
|
}
|
|
@@ -707,7 +707,7 @@ function processQuorumMessages(
|
|
|
707
707
|
session = sessionsInProgress.get(clientId);
|
|
708
708
|
sessionsInProgress.delete(clientId);
|
|
709
709
|
assert(!!session, 0x1b7 /* "Bad session state for processing quorum messages" */);
|
|
710
|
-
if (session) {
|
|
710
|
+
if (session !== undefined) {
|
|
711
711
|
if (!skipMessage) {
|
|
712
712
|
session.reportOp(message.timestamp);
|
|
713
713
|
}
|
package/src/fluidFetch.ts
CHANGED
|
@@ -14,7 +14,11 @@ import { fluidFetchSnapshot } from "./fluidFetchSnapshot";
|
|
|
14
14
|
|
|
15
15
|
async function fluidFetchOneFile(urlStr: string, name?: string) {
|
|
16
16
|
const documentService = await fluidFetchInit(urlStr);
|
|
17
|
-
const saveDir = paramSaveDir
|
|
17
|
+
const saveDir = paramSaveDir !== undefined
|
|
18
|
+
? (name !== undefined
|
|
19
|
+
? `${paramSaveDir}/${name}`
|
|
20
|
+
: paramSaveDir)
|
|
21
|
+
: undefined;
|
|
18
22
|
if (saveDir !== undefined) {
|
|
19
23
|
const mkdir = util.promisify(fs.mkdir);
|
|
20
24
|
const writeFile = util.promisify(fs.writeFile);
|
|
@@ -67,7 +71,7 @@ function getSharepointServerRelativePathFromURL(url: URL) {
|
|
|
67
71
|
}
|
|
68
72
|
|
|
69
73
|
async function fluidFetchMain() {
|
|
70
|
-
if (
|
|
74
|
+
if (paramURL === undefined) {
|
|
71
75
|
return;
|
|
72
76
|
}
|
|
73
77
|
|
|
@@ -84,7 +88,7 @@ async function fluidFetchMain() {
|
|
|
84
88
|
|
|
85
89
|
// See if the url given represent a sharepoint directory
|
|
86
90
|
const serverRelativePath = getSharepointServerRelativePathFromURL(url);
|
|
87
|
-
if (serverRelativePath) {
|
|
91
|
+
if (serverRelativePath !== undefined) {
|
|
88
92
|
const files = await getSharepointFiles(server, serverRelativePath, false);
|
|
89
93
|
for (const file of files) {
|
|
90
94
|
if (file.name.endsWith(".b") || file.name.endsWith(".fluid")) {
|
|
@@ -111,7 +115,7 @@ fluidFetchMain()
|
|
|
111
115
|
if (key !== "message" && key !== "stack") {
|
|
112
116
|
extraMsg += `\n${key}: ${JSON.stringify(error[key], undefined, 2)}`;
|
|
113
117
|
}
|
|
114
|
-
} catch (_) {}
|
|
118
|
+
} catch (_) { }
|
|
115
119
|
}
|
|
116
120
|
console.error(`ERROR: ${error.stack}${extraMsg}`);
|
|
117
121
|
} else if (typeof error === "object") {
|
package/src/fluidFetchArgs.ts
CHANGED
|
@@ -199,8 +199,8 @@ function checkArgs() {
|
|
|
199
199
|
paramNumSnapshotVersions = Math.max(paramSnapshotVersionIndex + 1, paramNumSnapshotVersions);
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
-
if (
|
|
203
|
-
if (paramSaveDir) {
|
|
202
|
+
if (paramURL === undefined) {
|
|
203
|
+
if (paramSaveDir !== undefined) {
|
|
204
204
|
const file = `${paramSaveDir}/info.json`;
|
|
205
205
|
if (fs.existsSync(file)) {
|
|
206
206
|
const info = JSON.parse(fs.readFileSync(file, { encoding: "utf-8" }));
|
|
@@ -210,7 +210,7 @@ function checkArgs() {
|
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
if (
|
|
213
|
+
if (paramURL === undefined) {
|
|
214
214
|
console.error("ERROR: Missing URL");
|
|
215
215
|
printUsage();
|
|
216
216
|
process.exit(-1);
|
package/src/fluidFetchInit.ts
CHANGED
|
@@ -126,7 +126,7 @@ async function resolveUrl(url: string): Promise<IResolvedUrl | undefined> {
|
|
|
126
126
|
|
|
127
127
|
export async function fluidFetchInit(urlStr: string) {
|
|
128
128
|
const resolvedUrl = await resolveUrl(urlStr) as IFluidResolvedUrl;
|
|
129
|
-
if (
|
|
129
|
+
if (resolvedUrl === undefined) {
|
|
130
130
|
return Promise.reject(new Error(`Unknown URL ${urlStr}`));
|
|
131
131
|
}
|
|
132
132
|
const protocol = new URL(resolvedUrl.url).protocol;
|
|
@@ -167,7 +167,7 @@ async function* loadAllSequencedMessages(
|
|
|
167
167
|
deltaStream.dispose();
|
|
168
168
|
console.log(`${Math.floor((Date.now() - timeStart) / 1000)} seconds to connect to web socket`);
|
|
169
169
|
|
|
170
|
-
if (initialMessages) {
|
|
170
|
+
if (initialMessages !== undefined) {
|
|
171
171
|
const lastSequenceNumber = lastSeq;
|
|
172
172
|
const filtered = initialMessages.filter((a) => a.sequenceNumber > lastSequenceNumber);
|
|
173
173
|
const sorted = filtered.sort((a, b) => a.sequenceNumber - b.sequenceNumber);
|
|
@@ -205,7 +205,7 @@ async function* saveOps(
|
|
|
205
205
|
if (files.length === 0) {
|
|
206
206
|
curr = firstAvailableDelta;
|
|
207
207
|
}
|
|
208
|
-
if (
|
|
208
|
+
if (result.done !== true) {
|
|
209
209
|
let messages = result.value;
|
|
210
210
|
yield messages;
|
|
211
211
|
if (messages[messages.length - 1].sequenceNumber < curr) {
|
|
@@ -224,7 +224,7 @@ async function* saveOps(
|
|
|
224
224
|
}
|
|
225
225
|
|
|
226
226
|
// Time to write it out?
|
|
227
|
-
while (sequencedMessages.length >= chunk || (result.done && sequencedMessages.length !== 0)) {
|
|
227
|
+
while (sequencedMessages.length >= chunk || (result.done === true && sequencedMessages.length !== 0)) {
|
|
228
228
|
const name = filenameFromIndex(index);
|
|
229
229
|
const write = sequencedMessages.splice(0, chunk);
|
|
230
230
|
console.log(`writing messages${name}.json`);
|
|
@@ -238,7 +238,7 @@ async function* saveOps(
|
|
|
238
238
|
index++;
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
-
if (result.done) {
|
|
241
|
+
if (result.done === true) {
|
|
242
242
|
break;
|
|
243
243
|
}
|
|
244
244
|
}
|
|
@@ -250,9 +250,9 @@ export async function fluidFetchMessages(documentService?: IDocumentService, sav
|
|
|
250
250
|
return;
|
|
251
251
|
}
|
|
252
252
|
|
|
253
|
-
const files =
|
|
254
|
-
undefined
|
|
255
|
-
fs.readdirSync(saveDir)
|
|
253
|
+
const files = saveDir === undefined
|
|
254
|
+
? undefined
|
|
255
|
+
: fs.readdirSync(saveDir)
|
|
256
256
|
.filter((file) => {
|
|
257
257
|
if (!file.startsWith("messages")) {
|
|
258
258
|
return false;
|
|
@@ -263,7 +263,7 @@ export async function fluidFetchMessages(documentService?: IDocumentService, sav
|
|
|
263
263
|
|
|
264
264
|
let generator = loadAllSequencedMessages(documentService, saveDir, files);
|
|
265
265
|
|
|
266
|
-
if (saveDir && files !== undefined && documentService) {
|
|
266
|
+
if (saveDir !== undefined && files !== undefined && documentService) {
|
|
267
267
|
generator = saveOps(generator, saveDir, files);
|
|
268
268
|
}
|
|
269
269
|
|
|
@@ -88,7 +88,7 @@ function fetchBlobs(prefix: string,
|
|
|
88
88
|
// Use the blobIdMap to assign a number for each unique blob
|
|
89
89
|
// and use it as a prefix for files to avoid case-insensitive fs
|
|
90
90
|
let index = blobIdMap.get(blobId);
|
|
91
|
-
if (
|
|
91
|
+
if (index === undefined) {
|
|
92
92
|
index = blobIdMap.size;
|
|
93
93
|
blobIdMap.set(blobId, index);
|
|
94
94
|
}
|
|
@@ -317,7 +317,7 @@ export async function fluidFetchSnapshot(
|
|
|
317
317
|
const res = await dumpSnapshotTree(name, blobs);
|
|
318
318
|
|
|
319
319
|
let date = "";
|
|
320
|
-
if (v.date) {
|
|
320
|
+
if (v.date !== undefined) {
|
|
321
321
|
try {
|
|
322
322
|
date = new Date(v.date).toLocaleString();
|
|
323
323
|
} catch (e) {
|