@fluid-tools/fetch-tool 0.59.2001 → 0.59.3000

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 CHANGED
@@ -10,7 +10,6 @@ module.exports = {
10
10
  "rules": {
11
11
  "@typescript-eslint/no-use-before-define": "off",
12
12
  "@typescript-eslint/strict-boolean-expressions": "off",
13
- "no-null/no-null": "off",
14
13
  "import/no-internal-modules": "off"
15
14
  }
16
15
  }
@@ -103,9 +103,9 @@ function dumpStats(map, props) {
103
103
  if (index <= recordsToShow) {
104
104
  const item = name.padEnd(nameLength);
105
105
  overflow = item.length - nameLength;
106
- const col1 = exports.formatNumber(count).padStart(fieldSizes[0] - overflow);
106
+ const col1 = (0, exports.formatNumber)(count).padStart(fieldSizes[0] - overflow);
107
107
  overflow += col1.length - fieldSizes[0];
108
- const col2 = exports.formatNumber(size).padStart(fieldSizes[1] - overflow);
108
+ const col2 = (0, exports.formatNumber)(size).padStart(fieldSizes[1] - overflow);
109
109
  console.log(`${item} │ ${col1} ${col2}`);
110
110
  }
111
111
  else {
@@ -116,11 +116,11 @@ function dumpStats(map, props) {
116
116
  if (!props.removeTotals) {
117
117
  if (allOtherCount || allOtherSize) {
118
118
  // eslint-disable-next-line max-len
119
- console.log(`${`All Others (${sorted.length - recordsToShow})`.padEnd(nameLength)} │ ${exports.formatNumber(allOtherCount).padStart(fieldSizes[0])} ${exports.formatNumber(allOtherSize).padStart(fieldSizes[1])}`);
119
+ console.log(`${`All Others (${sorted.length - recordsToShow})`.padEnd(nameLength)} │ ${(0, exports.formatNumber)(allOtherCount).padStart(fieldSizes[0])} ${(0, exports.formatNumber)(allOtherSize).padStart(fieldSizes[1])}`);
120
120
  }
121
121
  console.log(`${"─".repeat(nameLength + 1)}┼${"─".repeat(fieldsLength + 1)}`);
122
122
  // eslint-disable-next-line max-len
123
- console.log(`${"Total".padEnd(nameLength)} │ ${exports.formatNumber(totalCount).padStart(fieldSizes[0])} ${exports.formatNumber(sizeTotal).padStart(fieldSizes[1])}`);
123
+ console.log(`${"Total".padEnd(nameLength)} │ ${(0, exports.formatNumber)(totalCount).padStart(fieldSizes[0])} ${(0, exports.formatNumber)(sizeTotal).padStart(fieldSizes[1])}`);
124
124
  }
125
125
  }
126
126
  const getObjectId = (dataStoreId, id) => `[${dataStoreId}]/${id}`;
@@ -418,8 +418,8 @@ function processOp(message, dataType, objectStats, msgSize, dataTypeStats, messa
418
418
  let recorded = false;
419
419
  let totalMsgSize = msgSize;
420
420
  let opCount = 1;
421
- if (container_runtime_1.isRuntimeMessage(message)) {
422
- let runtimeMessage = container_runtime_1.unpackRuntimeMessage(message);
421
+ if ((0, container_runtime_1.isRuntimeMessage)(message)) {
422
+ let runtimeMessage = (0, container_runtime_1.unpackRuntimeMessage)(message);
423
423
  const messageType = runtimeMessage.type;
424
424
  switch (messageType) {
425
425
  case container_runtime_1.RuntimeMessage.Attach: {
@@ -434,10 +434,13 @@ function processOp(message, dataType, objectStats, msgSize, dataTypeStats, messa
434
434
  case container_runtime_1.RuntimeMessage.ChunkedOp: {
435
435
  const chunk = runtimeMessage.contents;
436
436
  if (!chunkMap.has(runtimeMessage.clientId)) {
437
- chunkMap.set(runtimeMessage.clientId, { chunks: new Array(chunk.totalChunks), totalSize: 0 });
437
+ chunkMap.set(runtimeMessage.clientId, {
438
+ chunks: new Array(chunk.totalChunks),
439
+ totalSize: 0,
440
+ });
438
441
  }
439
442
  const value = chunkMap.get(runtimeMessage.clientId);
440
- common_utils_1.assert(value !== undefined, 0x2b8 /* "Chunk should be set in map" */);
443
+ (0, common_utils_1.assert)(value !== undefined, 0x2b8 /* "Chunk should be set in map" */);
441
444
  const chunks = value.chunks;
442
445
  const chunkIndex = chunk.chunkId - 1;
443
446
  if (chunks[chunkIndex] !== undefined) {
@@ -518,7 +521,7 @@ function processOp(message, dataType, objectStats, msgSize, dataTypeStats, messa
518
521
  break;
519
522
  }
520
523
  default:
521
- common_utils_1.unreachableCase(messageType, "Message type not recognized!");
524
+ (0, common_utils_1.unreachableCase)(messageType, "Message type not recognized!");
522
525
  }
523
526
  }
524
527
  incr(messageTypeStats, type, totalMsgSize, opCount);
@@ -612,7 +615,7 @@ function processQuorumMessages(message, skipMessage, sessionsInProgress, session
612
615
  const clientId = JSON.parse(dataString);
613
616
  session = sessionsInProgress.get(clientId);
614
617
  sessionsInProgress.delete(clientId);
615
- common_utils_1.assert(!!session, 0x1b7 /* "Bad session state for processing quorum messages" */);
618
+ (0, common_utils_1.assert)(!!session, 0x1b7 /* "Bad session state for processing quorum messages" */);
616
619
  if (session) {
617
620
  if (!skipMessage) {
618
621
  session.reportOp(message.timestamp);
@@ -628,7 +631,7 @@ function processQuorumMessages(message, skipMessage, sessionsInProgress, session
628
631
  session = sessionsInProgress.get(message.clientId);
629
632
  if (session === undefined) {
630
633
  session = sessionsInProgress.get(noClientName);
631
- common_utils_1.assert(!!session, 0x1b8 /* "Bad session state for processing quorum messages" */);
634
+ (0, common_utils_1.assert)(!!session, 0x1b8 /* "Bad session state for processing quorum messages" */);
632
635
  }
633
636
  }
634
637
  return session;
@@ -1 +1 @@
1
- {"version":3,"file":"fluidAnalyzeMessages.js","sourceRoot":"","sources":["../src/fluidAnalyzeMessages.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, unreachableCase } from \"@fluidframework/common-utils\";\nimport {\n ISequencedDocumentMessage,\n ISummaryProposal,\n MessageType,\n TreeEntry,\n} from \"@fluidframework/protocol-definitions\";\nimport { IAttachMessage, IEnvelope } from \"@fluidframework/runtime-definitions\";\nimport {\n IChunkedOp,\n isRuntimeMessage,\n RuntimeMessage,\n unpackRuntimeMessage,\n} from \"@fluidframework/container-runtime\";\nimport { DataStoreMessageType } from \"@fluidframework/datastore\";\n\nconst noClientName = \"No Client\";\nconst objectTypePrefix = \"https://graph.microsoft.com/types/\";\n\nfunction incr(map: Map<string, [number, number]>, key: string, size: number, count = 1) {\n const value = map.get(key);\n if (value === undefined) {\n map.set(key, [count, size]);\n } else {\n value[0] += count;\n value[1] += size;\n map.set(key, value);\n }\n}\n\ninterface ISessionInfo {\n startSeq: number;\n opCount: number;\n email: string;\n duration: number;\n}\n\ninterface IMessageAnalyzer {\n processOp(op: ISequencedDocumentMessage, msgSize: number, filteredOutOp: boolean): void;\n reportAnalyzes(lastOp: ISequencedDocumentMessage): void;\n}\n\n/**\n * Helper class to track session statistics\n */\nclass ActiveSession {\n public static create(email: string, message: ISequencedDocumentMessage) {\n return new ActiveSession(email, message);\n }\n\n private opCount = 0;\n\n constructor(private readonly email: string, private readonly startMessage: ISequencedDocumentMessage) {\n }\n\n public reportOp(timestamp: number) {\n this.opCount++;\n }\n\n public leave(timestamp: number): ISessionInfo {\n return {\n opCount: this.opCount,\n email: this.email,\n startSeq: this.startMessage.sequenceNumber,\n duration: timestamp - this.startMessage.timestamp,\n };\n }\n}\n\n// Format a number separating 3 digits by comma\n// eslint-disable-next-line unicorn/no-unsafe-regex\nexport const formatNumber = (num: number): string => num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n\nfunction dumpStats(\n map: Map<string, [number, number]>,\n props: {\n title: string;\n headers: [string, string];\n lines?: number;\n orderByFirstColumn?: boolean;\n reverseColumnsInUI?: boolean;\n removeTotals?: boolean;\n reverseSort?: boolean;\n }) {\n const fieldSizes = [10, 14];\n const nameLength = 72;\n const fieldsLength = fieldSizes[0] + fieldSizes[1] + 1;\n let headers = props.headers;\n\n let recordsToShow = props.lines ? props.lines : 10;\n if (map.size !== recordsToShow && !props.removeTotals && recordsToShow > 1) {\n recordsToShow--;\n }\n\n let sorted: [string, [number, number]][];\n const sortIndex = props.orderByFirstColumn ? 0 : 1;\n let add: string;\n if (props.reverseSort) {\n sorted = [...map.entries()].sort((a, b) => a[1][sortIndex] - b[1][sortIndex]);\n add = \"↑\";\n } else {\n sorted = [...map.entries()].sort((a, b) => b[1][sortIndex] - a[1][sortIndex]);\n add = \"↓\";\n }\n headers[sortIndex] = `${headers[sortIndex]} ${add}`;\n\n if (props.reverseColumnsInUI) {\n headers = [headers[1], headers[0]];\n const sorted2: [string, [number, number]][] = [];\n for (const [name, [count, size]] of sorted) {\n sorted2.push([name, [size, count]]);\n }\n sorted = sorted2;\n }\n\n let totalCount = 0;\n let sizeTotal = 0;\n\n props.title = `${props.title} (${sorted.length})`;\n const header0 = headers[0].padStart(fieldSizes[0]);\n let overflow = header0.length - fieldSizes[0];\n console.log(`\\n\\n${props.title.padEnd(nameLength)} │ ${header0} ${headers[1].padStart(fieldSizes[1] - overflow)}`);\n\n console.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n let index = 0;\n let allOtherCount = 0;\n let allOtherSize = 0;\n for (const [name, [count, size]] of sorted) {\n index++;\n totalCount += count;\n sizeTotal += size;\n if (index <= recordsToShow) {\n const item = name.padEnd(nameLength);\n overflow = item.length - nameLength;\n const col1 = formatNumber(count).padStart(fieldSizes[0] - overflow);\n overflow += col1.length - fieldSizes[0];\n const col2 = formatNumber(size).padStart(fieldSizes[1] - overflow);\n console.log(`${item} │ ${col1} ${col2}`);\n } else {\n allOtherCount += count;\n allOtherSize += size;\n }\n }\n\n if (!props.removeTotals) {\n if (allOtherCount || allOtherSize) {\n // eslint-disable-next-line max-len\n console.log(`${`All Others (${sorted.length - recordsToShow})`.padEnd(nameLength)} │ ${formatNumber(allOtherCount).padStart(fieldSizes[0])} ${formatNumber(allOtherSize).padStart(fieldSizes[1])}`);\n }\n console.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n // eslint-disable-next-line max-len\n console.log(`${\"Total\".padEnd(nameLength)} │ ${formatNumber(totalCount).padStart(fieldSizes[0])} ${formatNumber(sizeTotal).padStart(fieldSizes[1])}`);\n }\n}\n\nconst getObjectId = (dataStoreId: string, id: string) => `[${dataStoreId}]/${id}`;\n\n/**\n * Analyzer for sessions\n */\nclass SessionAnalyzer implements IMessageAnalyzer {\n private readonly sessionsInProgress = new Map<string, ActiveSession>();\n private readonly sessions = new Map<string, [number, number]>();\n private readonly users = new Map<string, [number, number]>();\n\n private first = true;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (this.first) {\n this.first = false;\n // Start of the road.\n const noNameSession = ActiveSession.create(noClientName, message);\n this.sessionsInProgress.set(noClientName, noNameSession);\n }\n const session = processQuorumMessages(\n message,\n skipMessage,\n this.sessionsInProgress,\n this.sessions,\n this.users);\n if (!skipMessage && session) {\n session.reportOp(message.timestamp);\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n // Close any open sessions\n reportOpenSessions(\n lastOp.timestamp,\n this.sessionsInProgress,\n this.sessions,\n this.users);\n dumpStats(this.users, {\n title: \"Users\",\n headers: [\"Sessions\", \"Op count\"],\n reverseColumnsInUI: true,\n lines: 6,\n });\n dumpStats(this.sessions, {\n title: \"Sessions\",\n headers: [\"Duration(s)\", \"Op count\"],\n reverseColumnsInUI: true,\n lines: 6,\n });\n dumpStats(this.sessions, {\n title: \"Sessions\",\n headers: [\"Duration(s)\", \"Op count\"],\n orderByFirstColumn: true,\n reverseColumnsInUI: true,\n removeTotals: true,\n lines: 5,\n });\n }\n}\n\n/**\n * Analyzer for data structures\n */\nclass DataStructureAnalyzer implements IMessageAnalyzer {\n private readonly messageTypeStats = new Map<string, [number, number]>();\n private readonly dataType = new Map<string, string>();\n private readonly dataTypeStats = new Map<string, [number, number]>();\n private readonly objectStats = new Map<string, [number, number]>();\n private readonly chunkMap = new Map<string, {chunks: string[], totalSize: number}>();\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (!skipMessage) {\n processOp(\n message,\n this.dataType,\n this.objectStats,\n msgSize,\n this.dataTypeStats,\n this.messageTypeStats,\n this.chunkMap);\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n dumpStats(this.messageTypeStats, {\n title: \"Message Type\",\n headers: [\"Op count\", \"Bytes\"],\n lines: 20,\n });\n dumpStats(calcChannelStats(this.dataType, this.objectStats), {\n title: \"Channel name\",\n headers: [\"Op count\", \"Bytes\"],\n lines: 7,\n });\n /*\n dumpStats(this.dataTypeStats, {\n title: \"Channel type\",\n headers: [\"Op count\", \"Bytes\"],\n });\n */\n }\n}\n\n/**\n * Helper class to report if we filtered out any messages.\n */\nclass FilteredMessageAnalyzer implements IMessageAnalyzer {\n private sizeTotal = 0;\n private opsTotal = 0;\n private sizeFiltered = 0;\n private opsFiltered = 0;\n private filtered = false;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n this.sizeTotal += msgSize;\n this.opsTotal++;\n if (!skipMessage) {\n this.sizeFiltered += msgSize;\n this.opsFiltered++;\n } else {\n this.filtered = true;\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n if (this.filtered) {\n // eslint-disable-next-line max-len\n console.log(`\\nData is filtered according to --filter:messageType argument(s):\\nOp size: ${this.sizeFiltered} / ${this.sizeTotal}\\nOp count ${this.opsFiltered} / ${this.opsTotal}`);\n }\n if (this.opsTotal === 0) {\n console.error(\"No ops were found\");\n }\n }\n}\n\n/**\n * Helper class to find places where we generated too many ops\n */\nclass MessageDensityAnalyzer implements IMessageAnalyzer {\n private readonly opChunk = 1000;\n private opLimit = 1;\n private size = 0;\n private timeStart = 0;\n private doctimerStart = 0;\n private readonly ranges = new Map<string, [number, number]>();\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (message.sequenceNumber >= this.opLimit) {\n if (message.sequenceNumber !== 1) {\n const timeDiff = durationFromTime(message.timestamp - this.timeStart);\n const opsString = `ops = [${this.opLimit - this.opChunk}, ${this.opLimit - 1}]`.padEnd(26);\n // eslint-disable-next-line max-len\n const timeString = `time = [${durationFromTime(this.timeStart - this.doctimerStart)}, ${durationFromTime(message.timestamp - this.doctimerStart)}]`;\n this.ranges.set(\n `${opsString} ${timeString}`,\n [timeDiff, this.size]);\n } else {\n this.doctimerStart = message.timestamp;\n }\n this.opLimit += this.opChunk;\n this.size = 0;\n this.timeStart = message.timestamp;\n }\n if (!skipMessage) {\n this.size += msgSize;\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n dumpStats(this.ranges, {\n title: \"Fastest 1000 op ranges\",\n headers: [\"Duration(s)\", \"Bytes\"],\n orderByFirstColumn: true,\n reverseSort: true,\n removeTotals: true,\n lines: 3,\n });\n }\n}\n\n/**\n * Helper class to analyze collab window size\n */\nclass CollabWindowSizeAnalyzer implements IMessageAnalyzer {\n private maxCollabWindow = 0;\n private opSeq = 0;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n const value = message.sequenceNumber - message.minimumSequenceNumber;\n if (value > this.maxCollabWindow) {\n this.maxCollabWindow = value;\n this.opSeq = message.sequenceNumber;\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n console.log(`\\nMaximum collab window size: ${this.maxCollabWindow}, seq# ${this.opSeq}`);\n }\n}\n\n/**\n * Helper class to analyze frequency of summaries\n */\nclass SummaryAnalyzer implements IMessageAnalyzer {\n private lastSummaryOp = 0;\n private maxDistance = 0;\n private maxSeq = 0;\n private minDistance = Number.MAX_SAFE_INTEGER;\n private minSeq = 0;\n private maxResponse = 0;\n private maxResponseSeq = 0;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (message.type === MessageType.SummaryAck) {\n const distance = message.sequenceNumber - this.lastSummaryOp - 1;\n if (this.maxDistance < distance) {\n this.maxDistance = distance;\n this.maxSeq = message.sequenceNumber;\n }\n if (this.minDistance > distance) {\n this.minDistance = distance;\n this.minSeq = message.sequenceNumber;\n }\n\n this.lastSummaryOp = message.sequenceNumber;\n }\n if (message.type === MessageType.SummaryAck || message.type === MessageType.SummaryNack) {\n const contents: ISummaryProposal = message.contents.summaryProposal;\n const distance = message.sequenceNumber - contents.summarySequenceNumber;\n if (distance > this.maxResponse) {\n this.maxResponse = distance;\n this.maxResponseSeq = message.sequenceNumber;\n }\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n const distance = lastOp.sequenceNumber - this.lastSummaryOp;\n if (this.maxDistance < distance) {\n this.maxDistance = distance;\n this.maxSeq = lastOp.sequenceNumber + 1;\n }\n\n console.log(\"\");\n if (this.minDistance === Number.MAX_SAFE_INTEGER) {\n console.log(\"No summaries found in this document\");\n } else {\n console.log(`Maximum distance between summaries: ${this.maxDistance}, seq# ${this.maxSeq}`);\n console.log(`Maximum server response for summary: ${this.maxResponse}, seq# ${this.maxResponseSeq}`);\n console.log(`Minimum distance between summaries: ${this.minDistance}, seq# ${this.minSeq}`);\n }\n }\n}\n\n/**\n * Helper class to dump messages to console\n */\nclass MessageDumper implements IMessageAnalyzer {\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (!skipMessage) {\n console.log(JSON.stringify(message, undefined, 2));\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n }\n}\n\nexport async function printMessageStats(\n generator, // AsyncGenerator<ISequencedDocumentMessage[]>,\n dumpMessageStats: boolean,\n dumpMessages: boolean,\n messageTypeFilter: Set<string> = new Set<string>()) {\n let lastMessage: ISequencedDocumentMessage | undefined;\n\n const analyzers: IMessageAnalyzer[] = [\n new FilteredMessageAnalyzer(), // Should come first\n new SessionAnalyzer(),\n new DataStructureAnalyzer(),\n new MessageDensityAnalyzer(),\n new CollabWindowSizeAnalyzer(),\n new SummaryAnalyzer(),\n ];\n\n if (dumpMessages) {\n analyzers.push(new MessageDumper());\n }\n\n for await (const messages of generator) {\n for (const message of (messages as ISequencedDocumentMessage[])) {\n const msgSize = JSON.stringify(message).length;\n lastMessage = message;\n\n const skipMessage = messageTypeFilter.size !== 0 && !messageTypeFilter.has(message.type);\n\n for (const analyzer of analyzers) {\n analyzer.processOp(message, msgSize, skipMessage);\n }\n }\n }\n\n if (lastMessage !== undefined) {\n if (dumpMessageStats) {\n for (const analyzer of analyzers) {\n analyzer.reportAnalyzes(lastMessage);\n }\n } else {\n // Warn about filtered messages\n analyzers[0].reportAnalyzes(lastMessage);\n }\n }\n console.log(\"\");\n}\n\nfunction processOp(\n message: ISequencedDocumentMessage,\n dataType: Map<string, string>,\n objectStats: Map<string, [number, number]>,\n msgSize: number,\n dataTypeStats: Map<string, [number, number]>,\n messageTypeStats: Map<string, [number, number]>,\n chunkMap: Map<string, {chunks: string[], totalSize: number}>) {\n let type = message.type;\n let recorded = false;\n let totalMsgSize = msgSize;\n let opCount = 1;\n if (isRuntimeMessage(message)) {\n let runtimeMessage = unpackRuntimeMessage(message);\n const messageType = runtimeMessage.type as RuntimeMessage;\n switch (messageType) {\n case RuntimeMessage.Attach: {\n const attachMessage = runtimeMessage.contents as IAttachMessage;\n processDataStoreAttachOp(attachMessage, dataType);\n break;\n }\n // skip for now because these ops do not have contents\n case RuntimeMessage.BlobAttach: {\n break;\n }\n case RuntimeMessage.ChunkedOp: {\n const chunk = runtimeMessage.contents as IChunkedOp;\n if (!chunkMap.has(runtimeMessage.clientId)) {\n chunkMap.set(runtimeMessage.clientId, {chunks: new Array<string>(chunk.totalChunks), totalSize:0});\n }\n const value = chunkMap.get(runtimeMessage.clientId);\n assert(value !== undefined, 0x2b8 /* \"Chunk should be set in map\" */);\n const chunks = value.chunks;\n const chunkIndex = chunk.chunkId - 1;\n if (chunks[chunkIndex] !== undefined) {\n throw new Error(\"Chunk already assigned\");\n }\n chunks[chunkIndex] = chunk.contents;\n value.totalSize += msgSize;\n if (chunk.chunkId === chunk.totalChunks) {\n opCount = chunk.totalChunks; // 1 op for each chunk.\n runtimeMessage = Object.create(runtimeMessage);\n runtimeMessage.contents = chunks.join(\"\");\n runtimeMessage.type = chunk.originalType;\n type = chunk.originalType;\n totalMsgSize = value.totalSize;\n chunkMap.delete(runtimeMessage.clientId);\n } else {\n return;\n }\n // eslint-disable-next-line no-fallthrough\n }\n case RuntimeMessage.FluidDataStoreOp:\n case RuntimeMessage.Alias:\n case RuntimeMessage.Rejoin:\n case RuntimeMessage.Operation:\n {\n let envelope = runtimeMessage.contents as IEnvelope;\n // TODO: Legacy?\n if (envelope && typeof envelope === \"string\") {\n envelope = JSON.parse(envelope);\n }\n const innerContent = envelope.contents as {\n content: any;\n type: string;\n };\n const address = envelope.address;\n type = `${type}/${innerContent.type}`;\n switch (innerContent.type) {\n case DataStoreMessageType.Attach: {\n const attachMessage = innerContent.content as IAttachMessage;\n let objectType = attachMessage.type;\n if (objectType.startsWith(objectTypePrefix)) {\n objectType = objectType.substring(objectTypePrefix.length);\n }\n dataType.set(getObjectId(address, attachMessage.id), objectType);\n break;\n }\n case DataStoreMessageType.ChannelOp:\n default: {\n const innerEnvelope = innerContent.content as IEnvelope;\n const innerContent2 = innerEnvelope.contents as {\n type?: string;\n value?: any;\n };\n\n const objectId = getObjectId(address, innerEnvelope.address);\n incr(objectStats, objectId, totalMsgSize, opCount);\n let objectType = dataType.get(objectId);\n if (objectType === undefined) {\n // Somehow we do not have data...\n dataType.set(objectId, objectId);\n objectType = objectId;\n }\n incr(dataTypeStats, objectType, totalMsgSize, opCount);\n recorded = true;\n\n let subType = innerContent2.type;\n if (innerContent2.type === \"set\" &&\n typeof innerContent2.value === \"object\" &&\n innerContent2.value !== null) {\n type = `${type}/${subType}`;\n subType = innerContent2.value.type;\n } else if (objectType === \"mergeTree\" && subType !== undefined) {\n const types = [\"insert\", \"remove\", \"annotate\", \"group\"];\n if (types[subType]) {\n subType = types[subType];\n }\n }\n if (subType !== undefined) {\n type = `${type}/${subType}`;\n }\n\n type = `${type} (${objectType})`;\n }\n }\n break;\n }\n default:\n unreachableCase(messageType, \"Message type not recognized!\");\n }\n }\n\n incr(messageTypeStats, type, totalMsgSize, opCount);\n if (!recorded) {\n // const objectId = `${type} (system)`;\n const objectId = `(system messages)`;\n const objectType = objectId;\n if (dataType.get(objectId) === undefined) {\n dataType.set(objectId, objectId);\n }\n incr(objectStats, objectId, totalMsgSize, opCount);\n incr(dataTypeStats, objectType, totalMsgSize, opCount);\n }\n}\n\nfunction processDataStoreAttachOp(\n attachMessage: IAttachMessage | string,\n dataType: Map<string, string>) {\n // dataType.set(getObjectId(attachMessage.id), attachMessage.type);\n\n // That's data store, and it brings a bunch of data structures.\n // Let's try to crack it.\n let parsedAttachMessage: IAttachMessage;\n if (typeof attachMessage === \"string\") {\n parsedAttachMessage = JSON.parse(attachMessage);\n } else {\n parsedAttachMessage = attachMessage;\n }\n for (const entry of parsedAttachMessage.snapshot.entries) {\n if (entry.type === TreeEntry.Tree) {\n for (const entry2 of entry.value.entries) {\n if (entry2.path === \".attributes\" && entry2.type === TreeEntry.Blob) {\n const attrib = JSON.parse(entry2.value.contents);\n let objectType = attrib.type;\n if (objectType.startsWith(objectTypePrefix)) {\n objectType = objectType.substring(objectTypePrefix.length);\n }\n dataType.set(getObjectId(parsedAttachMessage.id, entry.path), objectType);\n }\n }\n }\n }\n}\n\nfunction reportOpenSessions(\n lastOpTimestamp: number,\n sessionsInProgress: Map<string, ActiveSession>,\n sessions: Map<string, [number, number]>,\n users: Map<string, [number, number]>) {\n const activeSessions = new Map<string, [number, number]>();\n\n for (const [clientId, ses] of sessionsInProgress) {\n const sessionInfo = ses.leave(lastOpTimestamp);\n if (clientId !== noClientName) {\n const sessionName = `${clientId} (${sessionInfo.email})`;\n const sessionPayload: [number, number] = [durationFromTime(sessionInfo.duration), sessionInfo.opCount];\n sessions.set(sessionName, sessionPayload);\n activeSessions.set(sessionName, sessionPayload);\n } else {\n sessions.set(\n `Full file lifespan (noClient messages)`,\n [durationFromTime(sessionInfo.duration), sessionInfo.opCount]);\n }\n incr(users, sessionInfo.email, sessionInfo.opCount);\n }\n\n if (activeSessions.size > 0) {\n dumpStats(activeSessions, {\n title: \"Active sessions\",\n headers: [\"Duration\", \"Op count\"],\n lines: 6,\n orderByFirstColumn: true,\n removeTotals: true,\n });\n }\n}\n\nfunction calcChannelStats(dataType: Map<string, string>, objectStats: Map<string, [number, number]>) {\n const channelStats = new Map<string, [number, number]>();\n for (const [objectId, type] of dataType) {\n let value = objectStats.get(objectId);\n if (value === undefined) {\n value = [0, 0];\n }\n if (type === objectId) {\n channelStats.set(`${objectId}`, value);\n } else {\n channelStats.set(`${objectId} (${type})`, value);\n }\n }\n return channelStats;\n}\n\nfunction processQuorumMessages(\n message: ISequencedDocumentMessage,\n skipMessage: boolean,\n sessionsInProgress: Map<string, ActiveSession>,\n sessions: Map<string, [number, number]>,\n users: Map<string, [number, number]>) {\n let session: ActiveSession | undefined;\n const dataString = (message as any).data;\n if (message.type === \"join\") {\n const data = JSON.parse(dataString);\n session = ActiveSession.create(data.detail.user.id, message);\n sessionsInProgress.set(data.clientId, session);\n } else if (message.type === \"leave\") {\n const clientId = JSON.parse(dataString);\n session = sessionsInProgress.get(clientId);\n sessionsInProgress.delete(clientId);\n assert(!!session, 0x1b7 /* \"Bad session state for processing quorum messages\" */);\n if (session) {\n if (!skipMessage) {\n session.reportOp(message.timestamp);\n }\n const sessionInfo: ISessionInfo = session.leave(message.timestamp);\n sessions.set(\n `${clientId} (${sessionInfo.email})`,\n [durationFromTime(sessionInfo.duration), sessionInfo.opCount]);\n incr(users, sessionInfo.email, sessionInfo.opCount);\n session = undefined; // Do not record it second time\n }\n } else {\n // message.clientId can be null\n session = sessionsInProgress.get(message.clientId);\n if (session === undefined) {\n session = sessionsInProgress.get(noClientName);\n assert(!!session, 0x1b8 /* \"Bad session state for processing quorum messages\" */);\n }\n }\n return session;\n}\n\nconst durationFromTime = (time: number): number => Math.floor(time / 1000);\n"]}
1
+ {"version":3,"file":"fluidAnalyzeMessages.js","sourceRoot":"","sources":["../src/fluidAnalyzeMessages.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, unreachableCase } from \"@fluidframework/common-utils\";\nimport {\n ISequencedDocumentMessage,\n ISummaryProposal,\n MessageType,\n TreeEntry,\n} from \"@fluidframework/protocol-definitions\";\nimport { IAttachMessage, IEnvelope } from \"@fluidframework/runtime-definitions\";\nimport {\n IChunkedOp,\n isRuntimeMessage,\n RuntimeMessage,\n unpackRuntimeMessage,\n} from \"@fluidframework/container-runtime\";\nimport { DataStoreMessageType } from \"@fluidframework/datastore\";\n\nconst noClientName = \"No Client\";\nconst objectTypePrefix = \"https://graph.microsoft.com/types/\";\n\nfunction incr(map: Map<string, [number, number]>, key: string, size: number, count = 1) {\n const value = map.get(key);\n if (value === undefined) {\n map.set(key, [count, size]);\n } else {\n value[0] += count;\n value[1] += size;\n map.set(key, value);\n }\n}\n\ninterface ISessionInfo {\n startSeq: number;\n opCount: number;\n email: string;\n duration: number;\n}\n\ninterface IMessageAnalyzer {\n processOp(op: ISequencedDocumentMessage, msgSize: number, filteredOutOp: boolean): void;\n reportAnalyzes(lastOp: ISequencedDocumentMessage): void;\n}\n\n/**\n * Helper class to track session statistics\n */\nclass ActiveSession {\n public static create(email: string, message: ISequencedDocumentMessage) {\n return new ActiveSession(email, message);\n }\n\n private opCount = 0;\n\n constructor(private readonly email: string, private readonly startMessage: ISequencedDocumentMessage) {\n }\n\n public reportOp(timestamp: number) {\n this.opCount++;\n }\n\n public leave(timestamp: number): ISessionInfo {\n return {\n opCount: this.opCount,\n email: this.email,\n startSeq: this.startMessage.sequenceNumber,\n duration: timestamp - this.startMessage.timestamp,\n };\n }\n}\n\n// Format a number separating 3 digits by comma\n// eslint-disable-next-line unicorn/no-unsafe-regex\nexport const formatNumber = (num: number): string => num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n\nfunction dumpStats(\n map: Map<string, [number, number]>,\n props: {\n title: string;\n headers: [string, string];\n lines?: number;\n orderByFirstColumn?: boolean;\n reverseColumnsInUI?: boolean;\n removeTotals?: boolean;\n reverseSort?: boolean;\n }) {\n const fieldSizes = [10, 14];\n const nameLength = 72;\n const fieldsLength = fieldSizes[0] + fieldSizes[1] + 1;\n let headers = props.headers;\n\n let recordsToShow = props.lines ? props.lines : 10;\n if (map.size !== recordsToShow && !props.removeTotals && recordsToShow > 1) {\n recordsToShow--;\n }\n\n let sorted: [string, [number, number]][];\n const sortIndex = props.orderByFirstColumn ? 0 : 1;\n let add: string;\n if (props.reverseSort) {\n sorted = [...map.entries()].sort((a, b) => a[1][sortIndex] - b[1][sortIndex]);\n add = \"↑\";\n } else {\n sorted = [...map.entries()].sort((a, b) => b[1][sortIndex] - a[1][sortIndex]);\n add = \"↓\";\n }\n headers[sortIndex] = `${headers[sortIndex]} ${add}`;\n\n if (props.reverseColumnsInUI) {\n headers = [headers[1], headers[0]];\n const sorted2: [string, [number, number]][] = [];\n for (const [name, [count, size]] of sorted) {\n sorted2.push([name, [size, count]]);\n }\n sorted = sorted2;\n }\n\n let totalCount = 0;\n let sizeTotal = 0;\n\n props.title = `${props.title} (${sorted.length})`;\n const header0 = headers[0].padStart(fieldSizes[0]);\n let overflow = header0.length - fieldSizes[0];\n console.log(`\\n\\n${props.title.padEnd(nameLength)} │ ${header0} ${headers[1].padStart(fieldSizes[1] - overflow)}`);\n\n console.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n let index = 0;\n let allOtherCount = 0;\n let allOtherSize = 0;\n for (const [name, [count, size]] of sorted) {\n index++;\n totalCount += count;\n sizeTotal += size;\n if (index <= recordsToShow) {\n const item = name.padEnd(nameLength);\n overflow = item.length - nameLength;\n const col1 = formatNumber(count).padStart(fieldSizes[0] - overflow);\n overflow += col1.length - fieldSizes[0];\n const col2 = formatNumber(size).padStart(fieldSizes[1] - overflow);\n console.log(`${item} │ ${col1} ${col2}`);\n } else {\n allOtherCount += count;\n allOtherSize += size;\n }\n }\n\n if (!props.removeTotals) {\n if (allOtherCount || allOtherSize) {\n // eslint-disable-next-line max-len\n console.log(`${`All Others (${sorted.length - recordsToShow})`.padEnd(nameLength)} │ ${formatNumber(allOtherCount).padStart(fieldSizes[0])} ${formatNumber(allOtherSize).padStart(fieldSizes[1])}`);\n }\n console.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n // eslint-disable-next-line max-len\n console.log(`${\"Total\".padEnd(nameLength)} │ ${formatNumber(totalCount).padStart(fieldSizes[0])} ${formatNumber(sizeTotal).padStart(fieldSizes[1])}`);\n }\n}\n\nconst getObjectId = (dataStoreId: string, id: string) => `[${dataStoreId}]/${id}`;\n\n/**\n * Analyzer for sessions\n */\nclass SessionAnalyzer implements IMessageAnalyzer {\n private readonly sessionsInProgress = new Map<string, ActiveSession>();\n private readonly sessions = new Map<string, [number, number]>();\n private readonly users = new Map<string, [number, number]>();\n\n private first = true;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (this.first) {\n this.first = false;\n // Start of the road.\n const noNameSession = ActiveSession.create(noClientName, message);\n this.sessionsInProgress.set(noClientName, noNameSession);\n }\n const session = processQuorumMessages(\n message,\n skipMessage,\n this.sessionsInProgress,\n this.sessions,\n this.users);\n if (!skipMessage && session) {\n session.reportOp(message.timestamp);\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n // Close any open sessions\n reportOpenSessions(\n lastOp.timestamp,\n this.sessionsInProgress,\n this.sessions,\n this.users);\n dumpStats(this.users, {\n title: \"Users\",\n headers: [\"Sessions\", \"Op count\"],\n reverseColumnsInUI: true,\n lines: 6,\n });\n dumpStats(this.sessions, {\n title: \"Sessions\",\n headers: [\"Duration(s)\", \"Op count\"],\n reverseColumnsInUI: true,\n lines: 6,\n });\n dumpStats(this.sessions, {\n title: \"Sessions\",\n headers: [\"Duration(s)\", \"Op count\"],\n orderByFirstColumn: true,\n reverseColumnsInUI: true,\n removeTotals: true,\n lines: 5,\n });\n }\n}\n\n/**\n * Analyzer for data structures\n */\nclass DataStructureAnalyzer implements IMessageAnalyzer {\n private readonly messageTypeStats = new Map<string, [number, number]>();\n private readonly dataType = new Map<string, string>();\n private readonly dataTypeStats = new Map<string, [number, number]>();\n private readonly objectStats = new Map<string, [number, number]>();\n private readonly chunkMap = new Map<string, { chunks: string[]; totalSize: number; }>();\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (!skipMessage) {\n processOp(\n message,\n this.dataType,\n this.objectStats,\n msgSize,\n this.dataTypeStats,\n this.messageTypeStats,\n this.chunkMap);\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n dumpStats(this.messageTypeStats, {\n title: \"Message Type\",\n headers: [\"Op count\", \"Bytes\"],\n lines: 20,\n });\n dumpStats(calcChannelStats(this.dataType, this.objectStats), {\n title: \"Channel name\",\n headers: [\"Op count\", \"Bytes\"],\n lines: 7,\n });\n /*\n dumpStats(this.dataTypeStats, {\n title: \"Channel type\",\n headers: [\"Op count\", \"Bytes\"],\n });\n */\n }\n}\n\n/**\n * Helper class to report if we filtered out any messages.\n */\nclass FilteredMessageAnalyzer implements IMessageAnalyzer {\n private sizeTotal = 0;\n private opsTotal = 0;\n private sizeFiltered = 0;\n private opsFiltered = 0;\n private filtered = false;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n this.sizeTotal += msgSize;\n this.opsTotal++;\n if (!skipMessage) {\n this.sizeFiltered += msgSize;\n this.opsFiltered++;\n } else {\n this.filtered = true;\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n if (this.filtered) {\n // eslint-disable-next-line max-len\n console.log(`\\nData is filtered according to --filter:messageType argument(s):\\nOp size: ${this.sizeFiltered} / ${this.sizeTotal}\\nOp count ${this.opsFiltered} / ${this.opsTotal}`);\n }\n if (this.opsTotal === 0) {\n console.error(\"No ops were found\");\n }\n }\n}\n\n/**\n * Helper class to find places where we generated too many ops\n */\nclass MessageDensityAnalyzer implements IMessageAnalyzer {\n private readonly opChunk = 1000;\n private opLimit = 1;\n private size = 0;\n private timeStart = 0;\n private doctimerStart = 0;\n private readonly ranges = new Map<string, [number, number]>();\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (message.sequenceNumber >= this.opLimit) {\n if (message.sequenceNumber !== 1) {\n const timeDiff = durationFromTime(message.timestamp - this.timeStart);\n const opsString = `ops = [${this.opLimit - this.opChunk}, ${this.opLimit - 1}]`.padEnd(26);\n // eslint-disable-next-line max-len\n const timeString = `time = [${durationFromTime(this.timeStart - this.doctimerStart)}, ${durationFromTime(message.timestamp - this.doctimerStart)}]`;\n this.ranges.set(\n `${opsString} ${timeString}`,\n [timeDiff, this.size]);\n } else {\n this.doctimerStart = message.timestamp;\n }\n this.opLimit += this.opChunk;\n this.size = 0;\n this.timeStart = message.timestamp;\n }\n if (!skipMessage) {\n this.size += msgSize;\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n dumpStats(this.ranges, {\n title: \"Fastest 1000 op ranges\",\n headers: [\"Duration(s)\", \"Bytes\"],\n orderByFirstColumn: true,\n reverseSort: true,\n removeTotals: true,\n lines: 3,\n });\n }\n}\n\n/**\n * Helper class to analyze collab window size\n */\nclass CollabWindowSizeAnalyzer implements IMessageAnalyzer {\n private maxCollabWindow = 0;\n private opSeq = 0;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n const value = message.sequenceNumber - message.minimumSequenceNumber;\n if (value > this.maxCollabWindow) {\n this.maxCollabWindow = value;\n this.opSeq = message.sequenceNumber;\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n console.log(`\\nMaximum collab window size: ${this.maxCollabWindow}, seq# ${this.opSeq}`);\n }\n}\n\n/**\n * Helper class to analyze frequency of summaries\n */\nclass SummaryAnalyzer implements IMessageAnalyzer {\n private lastSummaryOp = 0;\n private maxDistance = 0;\n private maxSeq = 0;\n private minDistance = Number.MAX_SAFE_INTEGER;\n private minSeq = 0;\n private maxResponse = 0;\n private maxResponseSeq = 0;\n\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (message.type === MessageType.SummaryAck) {\n const distance = message.sequenceNumber - this.lastSummaryOp - 1;\n if (this.maxDistance < distance) {\n this.maxDistance = distance;\n this.maxSeq = message.sequenceNumber;\n }\n if (this.minDistance > distance) {\n this.minDistance = distance;\n this.minSeq = message.sequenceNumber;\n }\n\n this.lastSummaryOp = message.sequenceNumber;\n }\n if (message.type === MessageType.SummaryAck || message.type === MessageType.SummaryNack) {\n const contents: ISummaryProposal = message.contents.summaryProposal;\n const distance = message.sequenceNumber - contents.summarySequenceNumber;\n if (distance > this.maxResponse) {\n this.maxResponse = distance;\n this.maxResponseSeq = message.sequenceNumber;\n }\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n const distance = lastOp.sequenceNumber - this.lastSummaryOp;\n if (this.maxDistance < distance) {\n this.maxDistance = distance;\n this.maxSeq = lastOp.sequenceNumber + 1;\n }\n\n console.log(\"\");\n if (this.minDistance === Number.MAX_SAFE_INTEGER) {\n console.log(\"No summaries found in this document\");\n } else {\n console.log(`Maximum distance between summaries: ${this.maxDistance}, seq# ${this.maxSeq}`);\n console.log(`Maximum server response for summary: ${this.maxResponse}, seq# ${this.maxResponseSeq}`);\n console.log(`Minimum distance between summaries: ${this.minDistance}, seq# ${this.minSeq}`);\n }\n }\n}\n\n/**\n * Helper class to dump messages to console\n */\nclass MessageDumper implements IMessageAnalyzer {\n public processOp(message: ISequencedDocumentMessage, msgSize: number, skipMessage: boolean): void {\n if (!skipMessage) {\n console.log(JSON.stringify(message, undefined, 2));\n }\n }\n\n public reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n }\n}\n\nexport async function printMessageStats(\n generator, // AsyncGenerator<ISequencedDocumentMessage[]>,\n dumpMessageStats: boolean,\n dumpMessages: boolean,\n messageTypeFilter: Set<string> = new Set<string>()) {\n let lastMessage: ISequencedDocumentMessage | undefined;\n\n const analyzers: IMessageAnalyzer[] = [\n new FilteredMessageAnalyzer(), // Should come first\n new SessionAnalyzer(),\n new DataStructureAnalyzer(),\n new MessageDensityAnalyzer(),\n new CollabWindowSizeAnalyzer(),\n new SummaryAnalyzer(),\n ];\n\n if (dumpMessages) {\n analyzers.push(new MessageDumper());\n }\n\n for await (const messages of generator) {\n for (const message of (messages as ISequencedDocumentMessage[])) {\n const msgSize = JSON.stringify(message).length;\n lastMessage = message;\n\n const skipMessage = messageTypeFilter.size !== 0 && !messageTypeFilter.has(message.type);\n\n for (const analyzer of analyzers) {\n analyzer.processOp(message, msgSize, skipMessage);\n }\n }\n }\n\n if (lastMessage !== undefined) {\n if (dumpMessageStats) {\n for (const analyzer of analyzers) {\n analyzer.reportAnalyzes(lastMessage);\n }\n } else {\n // Warn about filtered messages\n analyzers[0].reportAnalyzes(lastMessage);\n }\n }\n console.log(\"\");\n}\n\nfunction processOp(\n message: ISequencedDocumentMessage,\n dataType: Map<string, string>,\n objectStats: Map<string, [number, number]>,\n msgSize: number,\n dataTypeStats: Map<string, [number, number]>,\n messageTypeStats: Map<string, [number, number]>,\n chunkMap: Map<string, { chunks: string[]; totalSize: number; }>) {\n let type = message.type;\n let recorded = false;\n let totalMsgSize = msgSize;\n let opCount = 1;\n if (isRuntimeMessage(message)) {\n let runtimeMessage = unpackRuntimeMessage(message);\n const messageType = runtimeMessage.type as RuntimeMessage;\n switch (messageType) {\n case RuntimeMessage.Attach: {\n const attachMessage = runtimeMessage.contents as IAttachMessage;\n processDataStoreAttachOp(attachMessage, dataType);\n break;\n }\n // skip for now because these ops do not have contents\n case RuntimeMessage.BlobAttach: {\n break;\n }\n case RuntimeMessage.ChunkedOp: {\n const chunk = runtimeMessage.contents as IChunkedOp;\n if (!chunkMap.has(runtimeMessage.clientId)) {\n chunkMap.set(\n runtimeMessage.clientId, {\n chunks: new Array<string>(chunk.totalChunks),\n totalSize: 0,\n });\n }\n const value = chunkMap.get(runtimeMessage.clientId);\n assert(value !== undefined, 0x2b8 /* \"Chunk should be set in map\" */);\n const chunks = value.chunks;\n const chunkIndex = chunk.chunkId - 1;\n if (chunks[chunkIndex] !== undefined) {\n throw new Error(\"Chunk already assigned\");\n }\n chunks[chunkIndex] = chunk.contents;\n value.totalSize += msgSize;\n if (chunk.chunkId === chunk.totalChunks) {\n opCount = chunk.totalChunks; // 1 op for each chunk.\n runtimeMessage = Object.create(runtimeMessage);\n runtimeMessage.contents = chunks.join(\"\");\n runtimeMessage.type = chunk.originalType;\n type = chunk.originalType;\n totalMsgSize = value.totalSize;\n chunkMap.delete(runtimeMessage.clientId);\n } else {\n return;\n }\n // eslint-disable-next-line no-fallthrough\n }\n case RuntimeMessage.FluidDataStoreOp:\n case RuntimeMessage.Alias:\n case RuntimeMessage.Rejoin:\n case RuntimeMessage.Operation:\n {\n let envelope = runtimeMessage.contents as IEnvelope;\n // TODO: Legacy?\n if (envelope && typeof envelope === \"string\") {\n envelope = JSON.parse(envelope);\n }\n const innerContent = envelope.contents as {\n content: any;\n type: string;\n };\n const address = envelope.address;\n type = `${type}/${innerContent.type}`;\n switch (innerContent.type) {\n case DataStoreMessageType.Attach: {\n const attachMessage = innerContent.content as IAttachMessage;\n let objectType = attachMessage.type;\n if (objectType.startsWith(objectTypePrefix)) {\n objectType = objectType.substring(objectTypePrefix.length);\n }\n dataType.set(getObjectId(address, attachMessage.id), objectType);\n break;\n }\n case DataStoreMessageType.ChannelOp:\n default: {\n const innerEnvelope = innerContent.content as IEnvelope;\n const innerContent2 = innerEnvelope.contents as {\n type?: string;\n value?: any;\n };\n\n const objectId = getObjectId(address, innerEnvelope.address);\n incr(objectStats, objectId, totalMsgSize, opCount);\n let objectType = dataType.get(objectId);\n if (objectType === undefined) {\n // Somehow we do not have data...\n dataType.set(objectId, objectId);\n objectType = objectId;\n }\n incr(dataTypeStats, objectType, totalMsgSize, opCount);\n recorded = true;\n\n let subType = innerContent2.type;\n if (innerContent2.type === \"set\" &&\n typeof innerContent2.value === \"object\" &&\n innerContent2.value !== null) {\n type = `${type}/${subType}`;\n subType = innerContent2.value.type;\n } else if (objectType === \"mergeTree\" && subType !== undefined) {\n const types = [\"insert\", \"remove\", \"annotate\", \"group\"];\n if (types[subType]) {\n subType = types[subType];\n }\n }\n if (subType !== undefined) {\n type = `${type}/${subType}`;\n }\n\n type = `${type} (${objectType})`;\n }\n }\n break;\n }\n default:\n unreachableCase(messageType, \"Message type not recognized!\");\n }\n }\n\n incr(messageTypeStats, type, totalMsgSize, opCount);\n if (!recorded) {\n // const objectId = `${type} (system)`;\n const objectId = `(system messages)`;\n const objectType = objectId;\n if (dataType.get(objectId) === undefined) {\n dataType.set(objectId, objectId);\n }\n incr(objectStats, objectId, totalMsgSize, opCount);\n incr(dataTypeStats, objectType, totalMsgSize, opCount);\n }\n}\n\nfunction processDataStoreAttachOp(\n attachMessage: IAttachMessage | string,\n dataType: Map<string, string>) {\n // dataType.set(getObjectId(attachMessage.id), attachMessage.type);\n\n // That's data store, and it brings a bunch of data structures.\n // Let's try to crack it.\n let parsedAttachMessage: IAttachMessage;\n if (typeof attachMessage === \"string\") {\n parsedAttachMessage = JSON.parse(attachMessage);\n } else {\n parsedAttachMessage = attachMessage;\n }\n for (const entry of parsedAttachMessage.snapshot.entries) {\n if (entry.type === TreeEntry.Tree) {\n for (const entry2 of entry.value.entries) {\n if (entry2.path === \".attributes\" && entry2.type === TreeEntry.Blob) {\n const attrib = JSON.parse(entry2.value.contents);\n let objectType = attrib.type;\n if (objectType.startsWith(objectTypePrefix)) {\n objectType = objectType.substring(objectTypePrefix.length);\n }\n dataType.set(getObjectId(parsedAttachMessage.id, entry.path), objectType);\n }\n }\n }\n }\n}\n\nfunction reportOpenSessions(\n lastOpTimestamp: number,\n sessionsInProgress: Map<string, ActiveSession>,\n sessions: Map<string, [number, number]>,\n users: Map<string, [number, number]>) {\n const activeSessions = new Map<string, [number, number]>();\n\n for (const [clientId, ses] of sessionsInProgress) {\n const sessionInfo = ses.leave(lastOpTimestamp);\n if (clientId !== noClientName) {\n const sessionName = `${clientId} (${sessionInfo.email})`;\n const sessionPayload: [number, number] = [durationFromTime(sessionInfo.duration), sessionInfo.opCount];\n sessions.set(sessionName, sessionPayload);\n activeSessions.set(sessionName, sessionPayload);\n } else {\n sessions.set(\n `Full file lifespan (noClient messages)`,\n [durationFromTime(sessionInfo.duration), sessionInfo.opCount]);\n }\n incr(users, sessionInfo.email, sessionInfo.opCount);\n }\n\n if (activeSessions.size > 0) {\n dumpStats(activeSessions, {\n title: \"Active sessions\",\n headers: [\"Duration\", \"Op count\"],\n lines: 6,\n orderByFirstColumn: true,\n removeTotals: true,\n });\n }\n}\n\nfunction calcChannelStats(dataType: Map<string, string>, objectStats: Map<string, [number, number]>) {\n const channelStats = new Map<string, [number, number]>();\n for (const [objectId, type] of dataType) {\n let value = objectStats.get(objectId);\n if (value === undefined) {\n value = [0, 0];\n }\n if (type === objectId) {\n channelStats.set(`${objectId}`, value);\n } else {\n channelStats.set(`${objectId} (${type})`, value);\n }\n }\n return channelStats;\n}\n\nfunction processQuorumMessages(\n message: ISequencedDocumentMessage,\n skipMessage: boolean,\n sessionsInProgress: Map<string, ActiveSession>,\n sessions: Map<string, [number, number]>,\n users: Map<string, [number, number]>) {\n let session: ActiveSession | undefined;\n const dataString = (message as any).data;\n if (message.type === \"join\") {\n const data = JSON.parse(dataString);\n session = ActiveSession.create(data.detail.user.id, message);\n sessionsInProgress.set(data.clientId, session);\n } else if (message.type === \"leave\") {\n const clientId = JSON.parse(dataString);\n session = sessionsInProgress.get(clientId);\n sessionsInProgress.delete(clientId);\n assert(!!session, 0x1b7 /* \"Bad session state for processing quorum messages\" */);\n if (session) {\n if (!skipMessage) {\n session.reportOp(message.timestamp);\n }\n const sessionInfo: ISessionInfo = session.leave(message.timestamp);\n sessions.set(\n `${clientId} (${sessionInfo.email})`,\n [durationFromTime(sessionInfo.duration), sessionInfo.opCount]);\n incr(users, sessionInfo.email, sessionInfo.opCount);\n session = undefined; // Do not record it second time\n }\n } else {\n // message.clientId can be null\n session = sessionsInProgress.get(message.clientId);\n if (session === undefined) {\n session = sessionsInProgress.get(noClientName);\n assert(!!session, 0x1b8 /* \"Bad session state for processing quorum messages\" */);\n }\n }\n return session;\n}\n\nconst durationFromTime = (time: number): number => Math.floor(time / 1000);\n"]}
@@ -16,7 +16,7 @@ const fluidFetchMessages_1 = require("./fluidFetchMessages");
16
16
  const fluidFetchSharePoint_1 = require("./fluidFetchSharePoint");
17
17
  const fluidFetchSnapshot_1 = require("./fluidFetchSnapshot");
18
18
  async function fluidFetchOneFile(urlStr, name) {
19
- const documentService = await fluidFetchInit_1.fluidFetchInit(urlStr);
19
+ const documentService = await (0, fluidFetchInit_1.fluidFetchInit)(urlStr);
20
20
  const saveDir = fluidFetchArgs_1.paramSaveDir ? (name ? `${fluidFetchArgs_1.paramSaveDir}/${name}` : fluidFetchArgs_1.paramSaveDir) : undefined;
21
21
  if (saveDir !== undefined) {
22
22
  const mkdir = util_1.default.promisify(fs_1.default.mkdir);
@@ -29,8 +29,8 @@ async function fluidFetchOneFile(urlStr, name) {
29
29
  };
30
30
  await writeFile(`${saveDir}/info.json`, JSON.stringify(info, undefined, 2));
31
31
  }
32
- await fluidFetchSnapshot_1.fluidFetchSnapshot(documentService, saveDir);
33
- await fluidFetchMessages_1.fluidFetchMessages(documentService, saveDir);
32
+ await (0, fluidFetchSnapshot_1.fluidFetchSnapshot)(documentService, saveDir);
33
+ await (0, fluidFetchMessages_1.fluidFetchMessages)(documentService, saveDir);
34
34
  }
35
35
  async function tryFluidFetchOneSharePointFile(server, driveItem) {
36
36
  const { path, name, driveId, itemId } = driveItem;
@@ -69,18 +69,18 @@ async function fluidFetchMain() {
69
69
  }
70
70
  const url = new URL(fluidFetchArgs_1.paramURL);
71
71
  const server = url.hostname;
72
- if (odsp_doclib_utils_1.isOdspHostname(server)) {
72
+ if ((0, odsp_doclib_utils_1.isOdspHostname)(server)) {
73
73
  // See if the url already has the specific item
74
74
  const driveItem = getSharePointSpecificDriveItem(url);
75
75
  if (driveItem) {
76
- const file = await fluidFetchSharePoint_1.getSingleSharePointFile(server, driveItem.driveId, driveItem.itemId);
76
+ const file = await (0, fluidFetchSharePoint_1.getSingleSharePointFile)(server, driveItem.driveId, driveItem.itemId);
77
77
  await tryFluidFetchOneSharePointFile(server, file);
78
78
  return;
79
79
  }
80
80
  // See if the url given represent a sharepoint directory
81
81
  const serverRelativePath = getSharepointServerRelativePathFromURL(url);
82
82
  if (serverRelativePath) {
83
- const files = await fluidFetchSharePoint_1.getSharepointFiles(server, serverRelativePath, false);
83
+ const files = await (0, fluidFetchSharePoint_1.getSharepointFiles)(server, serverRelativePath, false);
84
84
  for (const file of files) {
85
85
  if (file.name.endsWith(".b") || file.name.endsWith(".fluid")) {
86
86
  await tryFluidFetchOneSharePointFile(server, file);
@@ -91,7 +91,7 @@ async function fluidFetchMain() {
91
91
  }
92
92
  return fluidFetchOneFile(fluidFetchArgs_1.paramURL);
93
93
  }
94
- fluidFetchArgs_1.parseArguments();
94
+ (0, fluidFetchArgs_1.parseArguments)();
95
95
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
96
96
  fluidFetchMain()
97
97
  .catch((error) => {
@@ -1 +1 @@
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 ? (name ? `${paramSaveDir}/${name}` : paramSaveDir) : undefined;\n if (saveDir !== undefined) {\n const mkdir = util.promisify(fs.mkdir);\n const writeFile = util.promisify(fs.writeFile);\n await mkdir(saveDir, { recursive: true });\n const info = {\n creationDate: new Date().toString(),\n connectionInfo,\n url: urlStr,\n };\n await writeFile(`${saveDir}/info.json`, JSON.stringify(info, undefined, 2));\n }\n\n await fluidFetchSnapshot(documentService, saveDir);\n await fluidFetchMessages(documentService, saveDir);\n}\n\nasync function tryFluidFetchOneSharePointFile(server: string, driveItem: IOdspDriveItem) {\n const { path, name, driveId, itemId } = driveItem;\n console.log(`File: ${path}/${name}`);\n await fluidFetchOneFile(`https://${server}/_api/v2.1/drives/${driveId}/items/${itemId}`, name);\n}\n\nfunction getSharePointSpecificDriveItem(url: URL): { driveId: string; itemId: string } | undefined {\n if (url.searchParams.has(\"driveId\") && url.searchParams.has(\"itemId\")) {\n return {\n driveId: url.searchParams.get(\"driveId\") as string,\n itemId: url.searchParams.get(\"itemId\") as string,\n };\n }\n}\n\nfunction getSharepointServerRelativePathFromURL(url: URL) {\n if (url.pathname.startsWith(\"/_api/v2.1/drives/\")) {\n return undefined;\n }\n\n const hostnameParts = url.hostname.split(\".\");\n const suffix = hostnameParts[0].endsWith(\"-my\") ? \"/_layouts/15/onedrive.aspx\" : \"/forms/allitems.aspx\";\n\n let sitePath = url.pathname;\n if (url.searchParams.has(\"id\")) {\n sitePath = url.searchParams.get(\"id\") as string;\n } else if (url.searchParams.has(\"RootFolder\")) {\n sitePath = url.searchParams.get(\"RootFolder\") as string;\n } else if (url.pathname.toLowerCase().endsWith(suffix)) {\n sitePath = sitePath.substr(0, url.pathname.length - suffix.length);\n }\n\n return decodeURI(sitePath);\n}\n\nasync function fluidFetchMain() {\n if (!paramURL) {\n return;\n }\n\n const url = new URL(paramURL);\n const server = url.hostname;\n if (isOdspHostname(server)) {\n // See if the url already has the specific item\n const driveItem = getSharePointSpecificDriveItem(url);\n if (driveItem) {\n const file = await getSingleSharePointFile(server, driveItem.driveId, driveItem.itemId);\n await tryFluidFetchOneSharePointFile(server, file);\n return;\n }\n\n // See if the url given represent a sharepoint directory\n const serverRelativePath = getSharepointServerRelativePathFromURL(url);\n if (serverRelativePath) {\n const files = await getSharepointFiles(server, serverRelativePath, false);\n for (const file of files) {\n if (file.name.endsWith(\".b\") || file.name.endsWith(\".fluid\")) {\n await tryFluidFetchOneSharePointFile(server, file);\n }\n }\n return;\n }\n }\n\n return fluidFetchOneFile(paramURL);\n}\n\nparseArguments();\n\n// eslint-disable-next-line @typescript-eslint/no-floating-promises\nfluidFetchMain()\n .catch((error: Error) => {\n if (error instanceof Error) {\n let extraMsg = \"\";\n for (const key of Object.keys(error)) {\n // error[key] might have circular structure\n try {\n if (key !== \"message\" && key !== \"stack\") {\n extraMsg += `\\n${key}: ${JSON.stringify(error[key], undefined, 2)}`;\n }\n } catch (_) {}\n }\n console.error(`ERROR: ${error.stack}${extraMsg}`);\n } else if (typeof error === \"object\") {\n console.error(`ERROR: Unknown exception object\\n${JSON.stringify(error, undefined, 2)}`);\n } else {\n console.error(`ERROR: ${error}`);\n }\n })\n .then(() => process.exit(0));\n"]}
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 ? (name ? `${paramSaveDir}/${name}` : paramSaveDir) : undefined;\n if (saveDir !== undefined) {\n const mkdir = util.promisify(fs.mkdir);\n const writeFile = util.promisify(fs.writeFile);\n await mkdir(saveDir, { recursive: true });\n const info = {\n creationDate: new Date().toString(),\n connectionInfo,\n url: urlStr,\n };\n await writeFile(`${saveDir}/info.json`, JSON.stringify(info, undefined, 2));\n }\n\n await fluidFetchSnapshot(documentService, saveDir);\n await fluidFetchMessages(documentService, saveDir);\n}\n\nasync function tryFluidFetchOneSharePointFile(server: string, driveItem: IOdspDriveItem) {\n const { path, name, driveId, itemId } = driveItem;\n console.log(`File: ${path}/${name}`);\n await fluidFetchOneFile(`https://${server}/_api/v2.1/drives/${driveId}/items/${itemId}`, name);\n}\n\nfunction getSharePointSpecificDriveItem(url: URL): { driveId: string; itemId: string; } | undefined {\n if (url.searchParams.has(\"driveId\") && url.searchParams.has(\"itemId\")) {\n return {\n driveId: url.searchParams.get(\"driveId\") as string,\n itemId: url.searchParams.get(\"itemId\") as string,\n };\n }\n}\n\nfunction getSharepointServerRelativePathFromURL(url: URL) {\n if (url.pathname.startsWith(\"/_api/v2.1/drives/\")) {\n return undefined;\n }\n\n const hostnameParts = url.hostname.split(\".\");\n const suffix = hostnameParts[0].endsWith(\"-my\") ? \"/_layouts/15/onedrive.aspx\" : \"/forms/allitems.aspx\";\n\n let sitePath = url.pathname;\n if (url.searchParams.has(\"id\")) {\n sitePath = url.searchParams.get(\"id\") as string;\n } else if (url.searchParams.has(\"RootFolder\")) {\n sitePath = url.searchParams.get(\"RootFolder\") as string;\n } else if (url.pathname.toLowerCase().endsWith(suffix)) {\n sitePath = sitePath.substr(0, url.pathname.length - suffix.length);\n }\n\n return decodeURI(sitePath);\n}\n\nasync function fluidFetchMain() {\n if (!paramURL) {\n return;\n }\n\n const url = new URL(paramURL);\n const server = url.hostname;\n if (isOdspHostname(server)) {\n // See if the url already has the specific item\n const driveItem = getSharePointSpecificDriveItem(url);\n if (driveItem) {\n const file = await getSingleSharePointFile(server, driveItem.driveId, driveItem.itemId);\n await tryFluidFetchOneSharePointFile(server, file);\n return;\n }\n\n // See if the url given represent a sharepoint directory\n const serverRelativePath = getSharepointServerRelativePathFromURL(url);\n if (serverRelativePath) {\n const files = await getSharepointFiles(server, serverRelativePath, false);\n for (const file of files) {\n if (file.name.endsWith(\".b\") || file.name.endsWith(\".fluid\")) {\n await tryFluidFetchOneSharePointFile(server, file);\n }\n }\n return;\n }\n }\n\n return fluidFetchOneFile(paramURL);\n}\n\nparseArguments();\n\n// eslint-disable-next-line @typescript-eslint/no-floating-promises\nfluidFetchMain()\n .catch((error: Error) => {\n if (error instanceof Error) {\n let extraMsg = \"\";\n for (const key of Object.keys(error)) {\n // error[key] might have circular structure\n try {\n if (key !== \"message\" && key !== \"stack\") {\n extraMsg += `\\n${key}: ${JSON.stringify(error[key], undefined, 2)}`;\n }\n } catch (_) {}\n }\n console.error(`ERROR: ${error.stack}${extraMsg}`);\n } else if (typeof error === \"object\") {\n console.error(`ERROR: Unknown exception object\\n${JSON.stringify(error, undefined, 2)}`);\n } else {\n console.error(`ERROR: ${error}`);\n }\n })\n .then(() => process.exit(0));\n"]}
@@ -17,7 +17,6 @@ export declare let paramSaveDir: string | undefined;
17
17
  export declare const messageTypeFilter: Set<string>;
18
18
  export declare let paramURL: string | undefined;
19
19
  export declare let paramJWT: string;
20
- export declare let paramAzureKey: string;
21
20
  export declare let connectToWebSocket: boolean;
22
21
  export declare let localDataOnly: boolean;
23
22
  export declare let paramSite: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"fluidFetchArgs.d.ts","sourceRoot":"","sources":["../src/fluidFetchArgs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,eAAO,IAAI,YAAY,SAAQ,CAAC;AAChC,eAAO,IAAI,gBAAgB,SAAQ,CAAC;AACpC,eAAO,IAAI,iBAAiB,SAAQ,CAAC;AACrC,eAAO,IAAI,iBAAiB,SAAQ,CAAC;AACrC,eAAO,IAAI,oBAAoB,SAAQ,CAAC;AACxC,eAAO,IAAI,SAAS,SAAQ,CAAC;AAC7B,eAAO,IAAI,yBAAyB,EAAE,MAAM,GAAG,SAAS,CAAC;AACzD,eAAO,IAAI,wBAAwB,QAAK,CAAC;AACzC,eAAO,IAAI,0BAA0B,SAAO,CAAC;AAC7C,eAAO,IAAI,qBAAqB,SAAQ,CAAC;AAKzC,wBAAgB,mBAAmB,YAIlC;AAED,eAAO,IAAI,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;AAC5C,eAAO,MAAM,iBAAiB,aAAoB,CAAC;AAEnD,eAAO,IAAI,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;AACxC,eAAO,IAAI,QAAQ,EAAE,MAAM,CAAC;AAC5B,eAAO,IAAI,aAAa,EAAE,MAAM,CAAC;AAEjC,eAAO,IAAI,kBAAkB,SAAQ,CAAC;AAEtC,eAAO,IAAI,aAAa,SAAQ,CAAC;AAEjC,eAAO,IAAI,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;AAuBzC,wBAAgB,UAAU,SAOzB;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,QAQxB;AAED,wBAAgB,cAAc,SAsF7B"}
1
+ {"version":3,"file":"fluidFetchArgs.d.ts","sourceRoot":"","sources":["../src/fluidFetchArgs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,eAAO,IAAI,YAAY,SAAQ,CAAC;AAChC,eAAO,IAAI,gBAAgB,SAAQ,CAAC;AACpC,eAAO,IAAI,iBAAiB,SAAQ,CAAC;AACrC,eAAO,IAAI,iBAAiB,SAAQ,CAAC;AACrC,eAAO,IAAI,oBAAoB,SAAQ,CAAC;AACxC,eAAO,IAAI,SAAS,SAAQ,CAAC;AAC7B,eAAO,IAAI,yBAAyB,EAAE,MAAM,GAAG,SAAS,CAAC;AACzD,eAAO,IAAI,wBAAwB,QAAK,CAAC;AACzC,eAAO,IAAI,0BAA0B,SAAO,CAAC;AAC7C,eAAO,IAAI,qBAAqB,SAAQ,CAAC;AAKzC,wBAAgB,mBAAmB,YAIlC;AAED,eAAO,IAAI,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;AAC5C,eAAO,MAAM,iBAAiB,aAAoB,CAAC;AAEnD,eAAO,IAAI,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;AACxC,eAAO,IAAI,QAAQ,EAAE,MAAM,CAAC;AAE5B,eAAO,IAAI,kBAAkB,SAAQ,CAAC;AAEtC,eAAO,IAAI,aAAa,SAAQ,CAAC;AAEjC,eAAO,IAAI,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;AAsBzC,wBAAgB,UAAU,SAOzB;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;CAAE,QAQzB;AAED,wBAAgB,cAAc,SAkF7B"}
@@ -7,7 +7,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
7
7
  return (mod && mod.__esModule) ? mod : { "default": mod };
8
8
  };
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.parseArguments = exports.setArguments = exports.printUsage = exports.paramSite = exports.localDataOnly = exports.connectToWebSocket = exports.paramAzureKey = exports.paramJWT = exports.paramURL = exports.messageTypeFilter = exports.paramSaveDir = exports.getForceTokenReauth = exports.paramActualFormatting = exports.paramUnpackAggregatedBlobs = exports.paramNumSnapshotVersions = exports.paramSnapshotVersionIndex = exports.overWrite = exports.dumpSnapshotVersions = exports.dumpSnapshotTrees = exports.dumpSnapshotStats = exports.dumpMessageStats = exports.dumpMessages = void 0;
10
+ exports.parseArguments = exports.setArguments = exports.printUsage = exports.paramSite = exports.localDataOnly = exports.connectToWebSocket = exports.paramJWT = exports.paramURL = exports.messageTypeFilter = exports.paramSaveDir = exports.getForceTokenReauth = exports.paramActualFormatting = exports.paramUnpackAggregatedBlobs = exports.paramNumSnapshotVersions = exports.paramSnapshotVersionIndex = exports.overWrite = exports.dumpSnapshotVersions = exports.dumpSnapshotTrees = exports.dumpSnapshotStats = exports.dumpMessageStats = exports.dumpMessages = void 0;
11
11
  const fs_1 = __importDefault(require("fs"));
12
12
  const url_1 = require("url");
13
13
  exports.dumpMessages = false;
@@ -40,7 +40,6 @@ const optionsArray = [
40
40
  ["--stat", "Show both messages & snapshot stats"],
41
41
  ["--filter:messageType <type>", "filter message by <type>"],
42
42
  ["--jwt <token>", "token to be used for routerlicious URLs"],
43
- ["--azureKey <key>", "secret key for Azure Fluid Relay instance"],
44
43
  ["--numSnapshotVersions <number>", "Number of versions to load (default:10)"],
45
44
  ["--noUnpack", "Do not unpack aggregated blobs"],
46
45
  ["--actualPayload", "Do not format json payloads nicely, preserve actual bytes / formatting in storage"],
@@ -104,13 +103,9 @@ function parseArguments() {
104
103
  case "--help":
105
104
  printUsage();
106
105
  process.exit(0);
107
- // fallthrough
108
106
  case "--jwt":
109
107
  exports.paramJWT = parseStrArg(i++, "jwt token");
110
108
  break;
111
- case "--azureKey":
112
- exports.paramAzureKey = parseStrArg(i++, "Azure Fluid Relay key");
113
- break;
114
109
  case "--forceTokenReauth":
115
110
  paramForceTokenReauth = true;
116
111
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"fluidFetchArgs.js","sourceRoot":"","sources":["../src/fluidFetchArgs.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\nimport { URL } from \"url\";\n\nexport let dumpMessages = false;\nexport let dumpMessageStats = false;\nexport let dumpSnapshotStats = false;\nexport let dumpSnapshotTrees = false;\nexport let dumpSnapshotVersions = false;\nexport let overWrite = false;\nexport let paramSnapshotVersionIndex: number | undefined;\nexport let paramNumSnapshotVersions = 10;\nexport let paramUnpackAggregatedBlobs = true;\nexport let paramActualFormatting = false;\n\nlet paramForceTokenReauth = false;\n\n// Only return true once, to reauth on first call.\nexport function getForceTokenReauth() {\n const result = paramForceTokenReauth;\n paramForceTokenReauth = false;\n return result;\n}\n\nexport let paramSaveDir: string | undefined;\nexport const messageTypeFilter = new Set<string>();\n\nexport let paramURL: string | undefined;\nexport let paramJWT: string;\nexport let paramAzureKey: string;\n\nexport let connectToWebSocket = false;\n\nexport let localDataOnly = false;\n\nexport let paramSite: string | undefined;\n\nconst optionsArray =\n [\n [\"--dump:rawmessage\", \"dump all messages\"],\n [\"--dump:snapshotVersion\", \"dump a list of snapshot version\"],\n [\"--dump:snapshotTree\", \"dump the snapshot trees\"],\n [\"--forceTokenReauth\", \"Force reauthorize token (SPO only)\"],\n [\"--stat:message\", \"show message type, channel type, data type statistics\"],\n [\"--stat:snapshot\", \"show a table of snapshot path and blob size\"],\n [\"--stat\", \"Show both messages & snapshot stats\"],\n [\"--filter:messageType <type>\", \"filter message by <type>\"],\n [\"--jwt <token>\", \"token to be used for routerlicious URLs\"],\n [\"--azureKey <key>\", \"secret key for Azure Fluid Relay instance\"],\n [\"--numSnapshotVersions <number>\", \"Number of versions to load (default:10)\"],\n [\"--noUnpack\", \"Do not unpack aggregated blobs\"],\n [\"--actualPayload\", \"Do not format json payloads nicely, preserve actual bytes / formatting in storage\"],\n [\"--saveDir <outdir>\", \"Save data of the snapshots and messages\"],\n [\"--snapshotVersionIndex <number>\", \"Index of the version to dump\"],\n [\"--websocket\", \"Connect to web socket to download initial messages\"],\n [\"--local\", \"Do not connect to storage, use earlier downloaded data. Requires --saveDir.\"],\n ];\n\nexport function printUsage() {\n console.log(\"Usage: fluid-fetch [options] URL\");\n console.log(\"URL: <ODSP URL>|<Routerlicious URL>\");\n console.log(\"Options:\");\n for (const i of optionsArray) {\n console.log(` ${i[0].padEnd(32)}: ${i[1]}`);\n }\n}\n\n// Can be used in unit test to pass in customized argument values\n// More argument options can be added when needed\nexport function setArguments(values: {\n saveDir: string,\n paramURL: string\n dumpMessages?: boolean,\n dumpMessageStats?: boolean,\n dumpSnapshotStats?: boolean,\n dumpSnapshotTrees?: boolean,\n overWrite?: boolean }) {\n paramSaveDir = values.saveDir;\n paramURL = values.paramURL;\n dumpMessages = values.dumpMessages ?? dumpMessages;\n dumpMessageStats = values.dumpMessageStats ?? dumpMessageStats;\n dumpSnapshotStats = values.dumpSnapshotStats ?? dumpSnapshotStats;\n dumpSnapshotTrees = values.dumpSnapshotTrees ?? dumpSnapshotTrees;\n overWrite = values.overWrite ?? overWrite;\n}\n\nexport function parseArguments() {\n for (let i = 2; i < process.argv.length; i++) {\n const arg = process.argv[i];\n switch (arg) {\n case \"--dump:rawmessage\":\n dumpMessages = true;\n break;\n case \"--dump:rawmessage:overwrite\":\n dumpMessages = true;\n overWrite = true;\n break;\n case \"--stat:message\":\n dumpMessageStats = true;\n break;\n case \"--stat\":\n dumpMessageStats = true;\n dumpSnapshotStats = true;\n break;\n case \"--filter:messageType\":\n messageTypeFilter.add(parseStrArg(i++, \"type name for messageType filter\"));\n break;\n case \"--stat:snapshot\":\n dumpSnapshotStats = true;\n break;\n case \"--dump:snapshotVersion\":\n dumpSnapshotVersions = true;\n break;\n case \"--dump:snapshotTree\":\n dumpSnapshotTrees = true;\n break;\n case \"--help\":\n printUsage();\n process.exit(0);\n // fallthrough\n case \"--jwt\":\n paramJWT = parseStrArg(i++, \"jwt token\");\n break;\n case \"--azureKey\":\n paramAzureKey = parseStrArg(i++, \"Azure Fluid Relay key\");\n break;\n case \"--forceTokenReauth\":\n paramForceTokenReauth = true;\n break;\n case \"--snapshotVersionIndex\":\n paramSnapshotVersionIndex = parseIntArg(i++, \"version index\", true);\n break;\n case \"--numSnapshotVersions\":\n paramNumSnapshotVersions = parseIntArg(i++, \"number of versions\", false);\n break;\n case \"--noUnpack\":\n paramUnpackAggregatedBlobs = false;\n break;\n case \"--actualPayload\":\n paramActualFormatting = true;\n break;\n case \"--saveDir\":\n paramSaveDir = parseStrArg(i++, \"save data path\");\n break;\n case \"--websocket\":\n connectToWebSocket = true;\n break;\n case \"--local\":\n localDataOnly = true;\n break;\n default:\n try {\n const url = new URL(arg);\n if (url.protocol === \"https:\") {\n paramURL = arg;\n break;\n }\n if (url.protocol === \"http:\" && url.hostname === \"localhost\") {\n paramURL = arg;\n break;\n }\n } catch (e) {\n console.error(e);\n }\n\n console.error(`ERROR: Invalid argument ${arg}`);\n printUsage();\n process.exit(-1);\n break;\n }\n }\n checkArgs();\n}\n\nfunction parseStrArg(i: number, name: string) {\n if (i + 1 >= process.argv.length) {\n console.error(`ERROR: Missing ${name}`);\n printUsage();\n process.exit(-1);\n }\n return process.argv[i + 1];\n}\nfunction parseIntArg(i: number, name: string, allowZero: boolean) {\n if (i + 1 >= process.argv.length) {\n console.error(`ERROR: Missing ${name}`);\n printUsage();\n process.exit(-1);\n }\n const numStr = process.argv[i + 1];\n const paramNumber = parseInt(numStr, 10);\n if (isNaN(paramNumber) || (allowZero ? paramNumber < 0 : paramNumber <= 0)) {\n console.error(`ERROR: Invalid ${name} ${numStr}`);\n printUsage();\n process.exit(-1);\n }\n return paramNumber;\n}\n\nfunction checkArgs() {\n if (paramSnapshotVersionIndex !== undefined) {\n paramNumSnapshotVersions = Math.max(paramSnapshotVersionIndex + 1, paramNumSnapshotVersions);\n }\n\n if (!paramURL) {\n if (paramSaveDir) {\n const file = `${paramSaveDir}/info.json`;\n if (fs.existsSync(file)) {\n const info = JSON.parse(fs.readFileSync(file, { encoding: \"utf-8\" }));\n paramURL = info.url;\n } else {\n console.log(`Can't find file ${file}`);\n }\n }\n\n if (!paramURL) {\n console.error(\"ERROR: Missing URL\");\n printUsage();\n process.exit(-1);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"fluidFetchArgs.js","sourceRoot":"","sources":["../src/fluidFetchArgs.ts"],"names":[],"mappings":"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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 +1 @@
1
- {"version":3,"file":"fluidFetchInit.d.ts","sourceRoot":"","sources":["../src/fluidFetchInit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsBH,eAAO,IAAI,gBAAgB,EAAE,MAAW,CAAC;AACzC,eAAO,IAAI,cAAc,EAAE,GAAG,CAAC;AAE/B,eAAO,MAAM,sBAAsB,QAAS,MAAM,SAOjD,CAAC;AA0HF,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,sFAsBlD"}
1
+ {"version":3,"file":"fluidFetchInit.d.ts","sourceRoot":"","sources":["../src/fluidFetchInit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,eAAO,IAAI,gBAAgB,EAAE,MAAW,CAAC;AACzC,eAAO,IAAI,cAAc,EAAE,GAAG,CAAC;AAE/B,eAAO,MAAM,sBAAsB,QAAS,MAAM,SAOjD,CAAC;AAgGF,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,sFAelD"}