@fluid-tools/fetch-tool 2.0.0-dev-rc.2.0.0.246488 → 2.0.0-dev-rc.3.0.0.250606

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/fluidAnalyzeMessages.js +6 -3
  2. package/dist/fluidAnalyzeMessages.js.map +1 -1
  3. package/dist/fluidFetch.js +18 -18
  4. package/dist/fluidFetch.js.map +1 -1
  5. package/dist/fluidFetchInit.js +7 -7
  6. package/dist/fluidFetchInit.js.map +1 -1
  7. package/dist/fluidFetchMessages.js +7 -7
  8. package/dist/fluidFetchMessages.js.map +1 -1
  9. package/dist/fluidFetchSharePoint.d.ts +1 -1
  10. package/dist/fluidFetchSharePoint.d.ts.map +1 -1
  11. package/dist/fluidFetchSharePoint.js +2 -2
  12. package/dist/fluidFetchSharePoint.js.map +1 -1
  13. package/dist/fluidFetchSnapshot.js +20 -20
  14. package/dist/fluidFetchSnapshot.js.map +1 -1
  15. package/dist/package.json +3 -0
  16. package/lib/fluidAnalyzeMessages.d.ts +8 -0
  17. package/lib/fluidAnalyzeMessages.d.ts.map +1 -0
  18. package/lib/fluidAnalyzeMessages.js +629 -0
  19. package/lib/fluidAnalyzeMessages.js.map +1 -0
  20. package/lib/fluidFetch.d.ts +6 -0
  21. package/lib/fluidFetch.d.ts.map +1 -0
  22. package/lib/fluidFetch.js +120 -0
  23. package/lib/fluidFetch.js.map +1 -0
  24. package/lib/fluidFetchArgs.d.ts +31 -0
  25. package/lib/fluidFetchArgs.d.ts.map +1 -0
  26. package/lib/fluidFetchArgs.js +192 -0
  27. package/lib/fluidFetchArgs.js.map +1 -0
  28. package/lib/fluidFetchInit.d.ts +8 -0
  29. package/lib/fluidFetchInit.d.ts.map +1 -0
  30. package/lib/fluidFetchInit.js +117 -0
  31. package/lib/fluidFetchInit.js.map +1 -0
  32. package/lib/fluidFetchMessages.d.ts +7 -0
  33. package/lib/fluidFetchMessages.d.ts.map +1 -0
  34. package/lib/fluidFetchMessages.js +225 -0
  35. package/lib/fluidFetchMessages.js.map +1 -0
  36. package/lib/fluidFetchSharePoint.d.ts +9 -0
  37. package/lib/fluidFetchSharePoint.d.ts.map +1 -0
  38. package/lib/fluidFetchSharePoint.js +100 -0
  39. package/lib/fluidFetchSharePoint.js.map +1 -0
  40. package/lib/fluidFetchSnapshot.d.ts +7 -0
  41. package/lib/fluidFetchSnapshot.d.ts.map +1 -0
  42. package/lib/fluidFetchSnapshot.js +261 -0
  43. package/lib/fluidFetchSnapshot.js.map +1 -0
  44. package/package.json +28 -26
  45. package/src/fluidAnalyzeMessages.ts +11 -8
  46. package/src/fluidFetch.ts +6 -6
  47. package/src/fluidFetchInit.ts +2 -2
  48. package/src/fluidFetchMessages.ts +4 -4
  49. package/src/fluidFetchSharePoint.ts +7 -7
  50. package/src/fluidFetchSnapshot.ts +3 -3
  51. package/tsconfig.cjs.json +7 -0
  52. package/tsconfig.json +2 -5
@@ -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/core-utils\";\nimport { IDocumentService } from \"@fluidframework/driver-definitions\";\nimport {\n\tIClient,\n\tISequencedDocumentMessage,\n\tMessageType,\n\tScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport { printMessageStats } from \"./fluidAnalyzeMessages\";\nimport {\n\tconnectToWebSocket,\n\tdumpMessages,\n\tdumpMessageStats,\n\toverWrite,\n\tparamActualFormatting,\n\tmessageTypeFilter,\n} from \"./fluidFetchArgs\";\n\nfunction filenameFromIndex(index: number): string {\n\treturn index === 0 ? \"\" : index.toString(); // support old tools...\n}\n\nlet firstAvailableDelta = 1;\nasync function* loadAllSequencedMessages(\n\tdocumentService?: IDocumentService,\n\tdir?: string,\n\tfiles?: string[],\n) {\n\tlet lastSeq = 0;\n\t// flag for mismatch between last sequence number read and new one to be read\n\tlet seqNumMismatch = false;\n\n\t// If we have local save, read ops from there first\n\tif (files !== undefined) {\n\t\tfor (let i = 0; i < files.length; i++) {\n\t\t\tconst file = filenameFromIndex(i);\n\t\t\ttry {\n\t\t\t\tconsole.log(`reading messages${file}.json`);\n\t\t\t\tconst fileContent = fs.readFileSync(`${dir}/messages${file}.json`, {\n\t\t\t\t\tencoding: \"utf-8\",\n\t\t\t\t});\n\t\t\t\tconst messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n\t\t\t\t// check if there is mismatch\n\t\t\t\tseqNumMismatch = messages[0].sequenceNumber !== lastSeq + 1;\n\t\t\t\tassert(\n\t\t\t\t\t!seqNumMismatch,\n\t\t\t\t\t0x1b9 /* \"Unexpected value for sequence number of first message in file\" */,\n\t\t\t\t);\n\t\t\t\tlastSeq = messages[messages.length - 1].sequenceNumber;\n\t\t\t\tyield messages;\n\t\t\t} catch (e) {\n\t\t\t\tif (seqNumMismatch) {\n\t\t\t\t\tif (overWrite) {\n\t\t\t\t\t\t// with overWrite option on, we will delete all exisintg message.json files\n\t\t\t\t\t\tfor (let index = 0; index < files.length; index++) {\n\t\t\t\t\t\t\tconst name = filenameFromIndex(index);\n\t\t\t\t\t\t\tfs.unlinkSync(`${dir}/messages${name}.json`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// prompt user to back up and delete existing files\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"There are deleted ops in the document being requested,\" +\n\t\t\t\t\t\t\t\" please back up the existing messages.json file and delete it from its directory.\" +\n\t\t\t\t\t\t\t\" Then try fetch tool again.\",\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t\treturn;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`Error reading / parsing messages from ${files}`);\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (lastSeq !== 0) {\n\t\t\tconsole.log(`Read ${lastSeq} ops from local cache`);\n\t\t}\n\t}\n\n\tif (!documentService) {\n\t\treturn;\n\t}\n\n\tconst deltaStorage = await documentService.connectToDeltaStorage();\n\n\tlet timeStart = Date.now();\n\tlet requests = 0;\n\tlet opsStorage = 0;\n\n\t// reading only 1 op to test if there is mismatch\n\tconst teststream = deltaStorage.fetchMessages(lastSeq + 1, lastSeq + 2);\n\n\tlet statusCode;\n\tlet innerMostErrorCode;\n\tlet response;\n\n\ttry {\n\t\tawait teststream.read();\n\t} catch (error: any) {\n\t\tstatusCode = error.getTelemetryProperties().statusCode;\n\t\tinnerMostErrorCode = error.getTelemetryProperties().innerMostErrorCode;\n\t\t// if there is gap between ops, catch the error and check it is the error we need\n\t\tif (statusCode !== 410 || innerMostErrorCode !== \"fluidDeltaDataNotAvailable\") {\n\t\t\tthrow error;\n\t\t}\n\t\t// get firstAvailableDelta from the error response, and set current sequence number to that\n\t\tresponse = JSON.parse(error.getTelemetryProperties().response);\n\t\tfirstAvailableDelta = response.error.firstAvailableDelta;\n\t\tlastSeq = firstAvailableDelta - 1;\n\t}\n\n\t// continue reading rest of the ops\n\tconst stream = deltaStorage.fetchMessages(\n\t\tlastSeq + 1, // inclusive left\n\t\tundefined, // to\n\t);\n\n\twhile (true) {\n\t\tconst result = await stream.read();\n\t\tif (result.done) {\n\t\t\tbreak;\n\t\t}\n\t\trequests++;\n\t\tconst messages = result.value;\n\n\t\t// Empty buckets should never be returned\n\t\tassert(messages.length !== 0, 0x1ba /* \"should not return empty buckets\" */);\n\t\t// console.log(`Loaded ops at ${messages[0].sequenceNumber}`);\n\n\t\t// This parsing of message contents happens in delta manager. But when we analyze messages\n\t\t// for message stats, we skip that path. So parsing of json contents needs to happen here.\n\t\tfor (const message of messages) {\n\t\t\tif (\n\t\t\t\ttypeof message.contents === \"string\" &&\n\t\t\t\tmessage.contents !== \"\" &&\n\t\t\t\tmessage.type !== MessageType.ClientLeave\n\t\t\t) {\n\t\t\t\tmessage.contents = JSON.parse(message.contents);\n\t\t\t}\n\t\t}\n\n\t\topsStorage += messages.length;\n\t\tlastSeq = messages[messages.length - 1].sequenceNumber;\n\t\tyield messages;\n\t}\n\n\tconsole.log(\n\t\t`\\n${Math.floor(\n\t\t\t(Date.now() - timeStart) / 1000,\n\t\t)} seconds to retrieve ${opsStorage} ops in ${requests} requests`,\n\t);\n\n\tif (connectToWebSocket) {\n\t\tlet logMsg = \"\";\n\t\tconst client: IClient = {\n\t\t\tmode: \"write\",\n\t\t\tpermission: [],\n\t\t\tscopes: [ScopeType.DocRead, ScopeType.DocWrite, ScopeType.SummaryWrite],\n\t\t\tdetails: {\n\t\t\t\tcapabilities: { interactive: true },\n\t\t\t},\n\t\t\tuser: { id: \"blah\" },\n\t\t};\n\t\tconsole.log(\"Retrieving messages from web socket\");\n\t\ttimeStart = Date.now();\n\t\tconst deltaStream = await documentService.connectToDeltaStream(client);\n\t\tconst initialMessages = deltaStream.initialMessages;\n\t\tdeltaStream.dispose();\n\t\tconsole.log(\n\t\t\t`${Math.floor((Date.now() - timeStart) / 1000)} seconds to connect to web socket`,\n\t\t);\n\n\t\tif (initialMessages !== undefined) {\n\t\t\tconst lastSequenceNumber = lastSeq;\n\t\t\tconst filtered = initialMessages.filter((a) => a.sequenceNumber > lastSequenceNumber);\n\t\t\tconst sorted = filtered.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\t\t\tlastSeq = sorted[sorted.length - 1].sequenceNumber;\n\t\t\tlogMsg = ` (${opsStorage} delta storage, ${\n\t\t\t\tinitialMessages.length\n\t\t\t} initial ws messages, ${initialMessages.length - sorted.length} dup)`;\n\t\t\tyield sorted;\n\t\t}\n\t\tconsole.log(`${lastSeq} total messages${logMsg}`);\n\t}\n}\n\nasync function* saveOps(\n\tgen, // AsyncGenerator<ISequencedDocumentMessage[]>,\n\tdir: string,\n\tfiles: string[],\n) {\n\t// Split into 100K ops\n\tconst chunk = 100 * 1000;\n\n\tlet sequencedMessages: ISequencedDocumentMessage[] = [];\n\n\t// Figure out first file we want to write to\n\tlet index = 0;\n\tlet curr: number = 1;\n\tif (files.length !== 0) {\n\t\tindex = files.length - 1;\n\t\tconst name = filenameFromIndex(index);\n\t\tconst fileContent = fs.readFileSync(`${dir}/messages${name}.json`, { encoding: \"utf-8\" });\n\t\tconst messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n\t\tcurr = messages[0].sequenceNumber;\n\t}\n\n\twhile (true) {\n\t\tconst result: IteratorResult<ISequencedDocumentMessage[]> = await gen.next();\n\t\tif (files.length === 0) {\n\t\t\tcurr = firstAvailableDelta;\n\t\t}\n\t\tif (result.done !== true) {\n\t\t\tlet messages = result.value;\n\t\t\tyield messages;\n\t\t\tif (messages[messages.length - 1].sequenceNumber < curr) {\n\t\t\t\t// Nothing interesting.\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (messages[0].sequenceNumber < curr) {\n\t\t\t\tmessages = messages.filter((msg) => msg.sequenceNumber >= curr);\n\t\t\t}\n\t\t\tsequencedMessages = sequencedMessages.concat(messages);\n\t\t\tassert(\n\t\t\t\tsequencedMessages[0].sequenceNumber === curr,\n\t\t\t\t0x1bb /* \"Unexpected sequence number on first of messages to save\" */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsequencedMessages[sequencedMessages.length - 1].sequenceNumber ===\n\t\t\t\t\tcurr + sequencedMessages.length - 1,\n\t\t\t\t0x1bc /* \"Unexpected sequence number on last of messages to save\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Time to write it out?\n\t\twhile (\n\t\t\tsequencedMessages.length >= chunk ||\n\t\t\t(result.done === true && sequencedMessages.length !== 0)\n\t\t) {\n\t\t\tconst name = filenameFromIndex(index);\n\t\t\tconst write = sequencedMessages.splice(0, chunk);\n\t\t\tconsole.log(`writing messages${name}.json`);\n\t\t\tfs.writeFileSync(\n\t\t\t\t`${dir}/messages${name}.json`,\n\t\t\t\tJSON.stringify(write, undefined, paramActualFormatting ? 0 : 2),\n\t\t\t);\n\t\t\t// increment curr by chunk\n\t\t\tcurr += chunk;\n\t\t\tassert(\n\t\t\t\tsequencedMessages.length === 0 || sequencedMessages[0].sequenceNumber === curr,\n\t\t\t\t0x1bd /* \"Stopped writing at unexpected sequence number\" */,\n\t\t\t);\n\t\t\tindex++;\n\t\t}\n\n\t\tif (result.done === true) {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nexport async function fluidFetchMessages(documentService?: IDocumentService, saveDir?: string) {\n\tconst messageStats = dumpMessageStats || dumpMessages;\n\tif (!messageStats && (saveDir === undefined || documentService === undefined)) {\n\t\treturn;\n\t}\n\n\tconst files =\n\t\tsaveDir === undefined\n\t\t\t? undefined\n\t\t\t: fs\n\t\t\t\t\t.readdirSync(saveDir)\n\t\t\t\t\t.filter((file) => {\n\t\t\t\t\t\tif (!file.startsWith(\"messages\")) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t})\n\t\t\t\t\t.sort((a, b) => a.localeCompare(b));\n\n\tlet generator = loadAllSequencedMessages(documentService, saveDir, files);\n\n\tif (saveDir !== undefined && files !== undefined && documentService) {\n\t\tgenerator = saveOps(generator, saveDir, files);\n\t}\n\n\tif (messageStats) {\n\t\treturn printMessageStats(generator, dumpMessageStats, dumpMessages, messageTypeFilter);\n\t} else {\n\t\tlet item;\n\t\tfor await (item of generator) {\n\t\t}\n\t}\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/core-utils\";\nimport { IDocumentService } from \"@fluidframework/driver-definitions\";\nimport {\n\tIClient,\n\tISequencedDocumentMessage,\n\tMessageType,\n\tScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport { printMessageStats } from \"./fluidAnalyzeMessages.js\";\nimport {\n\tconnectToWebSocket,\n\tdumpMessageStats,\n\tdumpMessages,\n\tmessageTypeFilter,\n\toverWrite,\n\tparamActualFormatting,\n} from \"./fluidFetchArgs.js\";\n\nfunction filenameFromIndex(index: number): string {\n\treturn index === 0 ? \"\" : index.toString(); // support old tools...\n}\n\nlet firstAvailableDelta = 1;\nasync function* loadAllSequencedMessages(\n\tdocumentService?: IDocumentService,\n\tdir?: string,\n\tfiles?: string[],\n) {\n\tlet lastSeq = 0;\n\t// flag for mismatch between last sequence number read and new one to be read\n\tlet seqNumMismatch = false;\n\n\t// If we have local save, read ops from there first\n\tif (files !== undefined) {\n\t\tfor (let i = 0; i < files.length; i++) {\n\t\t\tconst file = filenameFromIndex(i);\n\t\t\ttry {\n\t\t\t\tconsole.log(`reading messages${file}.json`);\n\t\t\t\tconst fileContent = fs.readFileSync(`${dir}/messages${file}.json`, {\n\t\t\t\t\tencoding: \"utf-8\",\n\t\t\t\t});\n\t\t\t\tconst messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n\t\t\t\t// check if there is mismatch\n\t\t\t\tseqNumMismatch = messages[0].sequenceNumber !== lastSeq + 1;\n\t\t\t\tassert(\n\t\t\t\t\t!seqNumMismatch,\n\t\t\t\t\t0x1b9 /* \"Unexpected value for sequence number of first message in file\" */,\n\t\t\t\t);\n\t\t\t\tlastSeq = messages[messages.length - 1].sequenceNumber;\n\t\t\t\tyield messages;\n\t\t\t} catch (e) {\n\t\t\t\tif (seqNumMismatch) {\n\t\t\t\t\tif (overWrite) {\n\t\t\t\t\t\t// with overWrite option on, we will delete all exisintg message.json files\n\t\t\t\t\t\tfor (let index = 0; index < files.length; index++) {\n\t\t\t\t\t\t\tconst name = filenameFromIndex(index);\n\t\t\t\t\t\t\tfs.unlinkSync(`${dir}/messages${name}.json`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// prompt user to back up and delete existing files\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"There are deleted ops in the document being requested,\" +\n\t\t\t\t\t\t\t\" please back up the existing messages.json file and delete it from its directory.\" +\n\t\t\t\t\t\t\t\" Then try fetch tool again.\",\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t\treturn;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`Error reading / parsing messages from ${files}`);\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (lastSeq !== 0) {\n\t\t\tconsole.log(`Read ${lastSeq} ops from local cache`);\n\t\t}\n\t}\n\n\tif (!documentService) {\n\t\treturn;\n\t}\n\n\tconst deltaStorage = await documentService.connectToDeltaStorage();\n\n\tlet timeStart = Date.now();\n\tlet requests = 0;\n\tlet opsStorage = 0;\n\n\t// reading only 1 op to test if there is mismatch\n\tconst teststream = deltaStorage.fetchMessages(lastSeq + 1, lastSeq + 2);\n\n\tlet statusCode;\n\tlet innerMostErrorCode;\n\tlet response;\n\n\ttry {\n\t\tawait teststream.read();\n\t} catch (error: any) {\n\t\tstatusCode = error.getTelemetryProperties().statusCode;\n\t\tinnerMostErrorCode = error.getTelemetryProperties().innerMostErrorCode;\n\t\t// if there is gap between ops, catch the error and check it is the error we need\n\t\tif (statusCode !== 410 || innerMostErrorCode !== \"fluidDeltaDataNotAvailable\") {\n\t\t\tthrow error;\n\t\t}\n\t\t// get firstAvailableDelta from the error response, and set current sequence number to that\n\t\tresponse = JSON.parse(error.getTelemetryProperties().response);\n\t\tfirstAvailableDelta = response.error.firstAvailableDelta;\n\t\tlastSeq = firstAvailableDelta - 1;\n\t}\n\n\t// continue reading rest of the ops\n\tconst stream = deltaStorage.fetchMessages(\n\t\tlastSeq + 1, // inclusive left\n\t\tundefined, // to\n\t);\n\n\twhile (true) {\n\t\tconst result = await stream.read();\n\t\tif (result.done) {\n\t\t\tbreak;\n\t\t}\n\t\trequests++;\n\t\tconst messages = result.value;\n\n\t\t// Empty buckets should never be returned\n\t\tassert(messages.length !== 0, 0x1ba /* \"should not return empty buckets\" */);\n\t\t// console.log(`Loaded ops at ${messages[0].sequenceNumber}`);\n\n\t\t// This parsing of message contents happens in delta manager. But when we analyze messages\n\t\t// for message stats, we skip that path. So parsing of json contents needs to happen here.\n\t\tfor (const message of messages) {\n\t\t\tif (\n\t\t\t\ttypeof message.contents === \"string\" &&\n\t\t\t\tmessage.contents !== \"\" &&\n\t\t\t\tmessage.type !== MessageType.ClientLeave\n\t\t\t) {\n\t\t\t\tmessage.contents = JSON.parse(message.contents);\n\t\t\t}\n\t\t}\n\n\t\topsStorage += messages.length;\n\t\tlastSeq = messages[messages.length - 1].sequenceNumber;\n\t\tyield messages;\n\t}\n\n\tconsole.log(\n\t\t`\\n${Math.floor(\n\t\t\t(Date.now() - timeStart) / 1000,\n\t\t)} seconds to retrieve ${opsStorage} ops in ${requests} requests`,\n\t);\n\n\tif (connectToWebSocket) {\n\t\tlet logMsg = \"\";\n\t\tconst client: IClient = {\n\t\t\tmode: \"write\",\n\t\t\tpermission: [],\n\t\t\tscopes: [ScopeType.DocRead, ScopeType.DocWrite, ScopeType.SummaryWrite],\n\t\t\tdetails: {\n\t\t\t\tcapabilities: { interactive: true },\n\t\t\t},\n\t\t\tuser: { id: \"blah\" },\n\t\t};\n\t\tconsole.log(\"Retrieving messages from web socket\");\n\t\ttimeStart = Date.now();\n\t\tconst deltaStream = await documentService.connectToDeltaStream(client);\n\t\tconst initialMessages = deltaStream.initialMessages;\n\t\tdeltaStream.dispose();\n\t\tconsole.log(\n\t\t\t`${Math.floor((Date.now() - timeStart) / 1000)} seconds to connect to web socket`,\n\t\t);\n\n\t\tif (initialMessages !== undefined) {\n\t\t\tconst lastSequenceNumber = lastSeq;\n\t\t\tconst filtered = initialMessages.filter((a) => a.sequenceNumber > lastSequenceNumber);\n\t\t\tconst sorted = filtered.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\t\t\tlastSeq = sorted[sorted.length - 1].sequenceNumber;\n\t\t\tlogMsg = ` (${opsStorage} delta storage, ${\n\t\t\t\tinitialMessages.length\n\t\t\t} initial ws messages, ${initialMessages.length - sorted.length} dup)`;\n\t\t\tyield sorted;\n\t\t}\n\t\tconsole.log(`${lastSeq} total messages${logMsg}`);\n\t}\n}\n\nasync function* saveOps(\n\tgen, // AsyncGenerator<ISequencedDocumentMessage[]>,\n\tdir: string,\n\tfiles: string[],\n) {\n\t// Split into 100K ops\n\tconst chunk = 100 * 1000;\n\n\tlet sequencedMessages: ISequencedDocumentMessage[] = [];\n\n\t// Figure out first file we want to write to\n\tlet index = 0;\n\tlet curr: number = 1;\n\tif (files.length !== 0) {\n\t\tindex = files.length - 1;\n\t\tconst name = filenameFromIndex(index);\n\t\tconst fileContent = fs.readFileSync(`${dir}/messages${name}.json`, { encoding: \"utf-8\" });\n\t\tconst messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n\t\tcurr = messages[0].sequenceNumber;\n\t}\n\n\twhile (true) {\n\t\tconst result: IteratorResult<ISequencedDocumentMessage[]> = await gen.next();\n\t\tif (files.length === 0) {\n\t\t\tcurr = firstAvailableDelta;\n\t\t}\n\t\tif (result.done !== true) {\n\t\t\tlet messages = result.value;\n\t\t\tyield messages;\n\t\t\tif (messages[messages.length - 1].sequenceNumber < curr) {\n\t\t\t\t// Nothing interesting.\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (messages[0].sequenceNumber < curr) {\n\t\t\t\tmessages = messages.filter((msg) => msg.sequenceNumber >= curr);\n\t\t\t}\n\t\t\tsequencedMessages = sequencedMessages.concat(messages);\n\t\t\tassert(\n\t\t\t\tsequencedMessages[0].sequenceNumber === curr,\n\t\t\t\t0x1bb /* \"Unexpected sequence number on first of messages to save\" */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsequencedMessages[sequencedMessages.length - 1].sequenceNumber ===\n\t\t\t\t\tcurr + sequencedMessages.length - 1,\n\t\t\t\t0x1bc /* \"Unexpected sequence number on last of messages to save\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Time to write it out?\n\t\twhile (\n\t\t\tsequencedMessages.length >= chunk ||\n\t\t\t(result.done === true && sequencedMessages.length !== 0)\n\t\t) {\n\t\t\tconst name = filenameFromIndex(index);\n\t\t\tconst write = sequencedMessages.splice(0, chunk);\n\t\t\tconsole.log(`writing messages${name}.json`);\n\t\t\tfs.writeFileSync(\n\t\t\t\t`${dir}/messages${name}.json`,\n\t\t\t\tJSON.stringify(write, undefined, paramActualFormatting ? 0 : 2),\n\t\t\t);\n\t\t\t// increment curr by chunk\n\t\t\tcurr += chunk;\n\t\t\tassert(\n\t\t\t\tsequencedMessages.length === 0 || sequencedMessages[0].sequenceNumber === curr,\n\t\t\t\t0x1bd /* \"Stopped writing at unexpected sequence number\" */,\n\t\t\t);\n\t\t\tindex++;\n\t\t}\n\n\t\tif (result.done === true) {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nexport async function fluidFetchMessages(documentService?: IDocumentService, saveDir?: string) {\n\tconst messageStats = dumpMessageStats || dumpMessages;\n\tif (!messageStats && (saveDir === undefined || documentService === undefined)) {\n\t\treturn;\n\t}\n\n\tconst files =\n\t\tsaveDir === undefined\n\t\t\t? undefined\n\t\t\t: fs\n\t\t\t\t\t.readdirSync(saveDir)\n\t\t\t\t\t.filter((file) => {\n\t\t\t\t\t\tif (!file.startsWith(\"messages\")) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t})\n\t\t\t\t\t.sort((a, b) => a.localeCompare(b));\n\n\tlet generator = loadAllSequencedMessages(documentService, saveDir, files);\n\n\tif (saveDir !== undefined && files !== undefined && documentService) {\n\t\tgenerator = saveOps(generator, saveDir, files);\n\t}\n\n\tif (messageStats) {\n\t\treturn printMessageStats(generator, dumpMessageStats, dumpMessages, messageTypeFilter);\n\t} else {\n\t\tlet item;\n\t\tfor await (item of generator) {\n\t\t}\n\t}\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IClientConfig, IOdspDriveItem, IOdspAuthRequestInfo } from "@fluidframework/odsp-doclib-utils/internal";
5
+ import { IClientConfig, IOdspAuthRequestInfo, IOdspDriveItem } from "@fluidframework/odsp-doclib-utils/internal";
6
6
  export declare function resolveWrapper<T>(callback: (authRequestInfo: IOdspAuthRequestInfo) => Promise<T>, server: string, clientConfig: IClientConfig, forceTokenReauth?: boolean, forToken?: boolean): Promise<T>;
7
7
  export declare function getSharepointFiles(server: string, serverRelativePath: string, recurse: boolean): Promise<IOdspDriveItem[]>;
8
8
  export declare function getSingleSharePointFile(server: string, drive: string, item: string): Promise<IOdspDriveItem>;
@@ -1 +1 @@
1
- {"version":3,"file":"fluidFetchSharePoint.d.ts","sourceRoot":"","sources":["../src/fluidFetchSharePoint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAIN,aAAa,EACb,cAAc,EAEd,oBAAoB,EACpB,MAAM,4CAA4C,CAAC;AAUpD,wBAAsB,cAAc,CAAC,CAAC,EACrC,QAAQ,EAAE,CAAC,eAAe,EAAE,oBAAoB,KAAK,OAAO,CAAC,CAAC,CAAC,EAC/D,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,aAAa,EAC3B,gBAAgB,UAAQ,EACxB,QAAQ,UAAQ,GACd,OAAO,CAAC,CAAC,CAAC,CAoCZ;AA6BD,wBAAsB,kBAAkB,CACvC,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,OAAO,6BAsChB;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,2BASxF"}
1
+ {"version":3,"file":"fluidFetchSharePoint.d.ts","sourceRoot":"","sources":["../src/fluidFetchSharePoint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACN,aAAa,EACb,oBAAoB,EACpB,cAAc,EAKd,MAAM,4CAA4C,CAAC;AAUpD,wBAAsB,cAAc,CAAC,CAAC,EACrC,QAAQ,EAAE,CAAC,eAAe,EAAE,oBAAoB,KAAK,OAAO,CAAC,CAAC,CAAC,EAC/D,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,aAAa,EAC3B,gBAAgB,UAAQ,EACxB,QAAQ,UAAQ,GACd,OAAO,CAAC,CAAC,CAAC,CAoCZ;AA6BD,wBAAsB,kBAAkB,CACvC,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,OAAO,6BAsChB;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,2BASxF"}
@@ -12,7 +12,7 @@ const child_process_1 = __importDefault(require("child_process"));
12
12
  const driver_definitions_1 = require("@fluidframework/driver-definitions");
13
13
  const internal_1 = require("@fluidframework/odsp-doclib-utils/internal");
14
14
  const tool_utils_1 = require("@fluidframework/tool-utils");
15
- const fluidFetchArgs_1 = require("./fluidFetchArgs");
15
+ const fluidFetchArgs_js_1 = require("./fluidFetchArgs.js");
16
16
  async function resolveWrapper(callback, server, clientConfig, forceTokenReauth = false, forToken = false) {
17
17
  try {
18
18
  const odspTokenManager = new tool_utils_1.OdspTokenManager(tool_utils_1.odspTokensCache);
@@ -20,7 +20,7 @@ async function resolveWrapper(callback, server, clientConfig, forceTokenReauth =
20
20
  type: "browserLogin",
21
21
  navigator: fluidFetchWebNavigator,
22
22
  };
23
- const tokens = await odspTokenManager.getOdspTokens(server, clientConfig, tokenConfig, undefined /* forceRefresh */, forceTokenReauth || (0, fluidFetchArgs_1.getForceTokenReauth)());
23
+ const tokens = await odspTokenManager.getOdspTokens(server, clientConfig, tokenConfig, undefined /* forceRefresh */, forceTokenReauth || (0, fluidFetchArgs_js_1.getForceTokenReauth)());
24
24
  const result = await callback({
25
25
  accessToken: tokens.accessToken,
26
26
  refreshTokenFn: (0, internal_1.getOdspRefreshTokenFn)(server, clientConfig, tokens),
@@ -1 +1 @@
1
- {"version":3,"file":"fluidFetchSharePoint.js","sourceRoot":"","sources":["../src/fluidFetchSharePoint.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 child_process from \"child_process\";\nimport { DriverErrorTypes } from \"@fluidframework/driver-definitions\";\nimport {\n\tgetChildrenByDriveItem,\n\tgetDriveItemByServerRelativePath,\n\tgetDriveItemFromDriveAndItem,\n\tIClientConfig,\n\tIOdspDriveItem,\n\tgetOdspRefreshTokenFn,\n\tIOdspAuthRequestInfo,\n} from \"@fluidframework/odsp-doclib-utils/internal\";\nimport {\n\tgetMicrosoftConfiguration,\n\tOdspTokenManager,\n\todspTokensCache,\n\tOdspTokenConfig,\n\tIOdspTokenManagerCacheKey,\n} from \"@fluidframework/tool-utils\";\nimport { getForceTokenReauth } from \"./fluidFetchArgs\";\n\nexport async function resolveWrapper<T>(\n\tcallback: (authRequestInfo: IOdspAuthRequestInfo) => Promise<T>,\n\tserver: string,\n\tclientConfig: IClientConfig,\n\tforceTokenReauth = false,\n\tforToken = false,\n): Promise<T> {\n\ttry {\n\t\tconst odspTokenManager = new OdspTokenManager(odspTokensCache);\n\t\tconst tokenConfig: OdspTokenConfig = {\n\t\t\ttype: \"browserLogin\",\n\t\t\tnavigator: fluidFetchWebNavigator,\n\t\t};\n\t\tconst tokens = await odspTokenManager.getOdspTokens(\n\t\t\tserver,\n\t\t\tclientConfig,\n\t\t\ttokenConfig,\n\t\t\tundefined /* forceRefresh */,\n\t\t\tforceTokenReauth || getForceTokenReauth(),\n\t\t);\n\n\t\tconst result = await callback({\n\t\t\taccessToken: tokens.accessToken,\n\t\t\trefreshTokenFn: getOdspRefreshTokenFn(server, clientConfig, tokens),\n\t\t});\n\t\t// If this is used for getting a token, then refresh the cache with new token.\n\t\tif (forToken) {\n\t\t\tconst key: IOdspTokenManagerCacheKey = { isPush: false, userOrServer: server };\n\t\t\tawait odspTokenManager.updateTokensCache(key, {\n\t\t\t\taccessToken: result as any as string,\n\t\t\t\trefreshToken: tokens.refreshToken,\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\treturn result;\n\t} catch (e: any) {\n\t\tif (e.errorType === DriverErrorTypes.authorizationError && !forceTokenReauth) {\n\t\t\t// Re-auth\n\t\t\treturn resolveWrapper<T>(callback, server, clientConfig, true, forToken);\n\t\t}\n\t\tthrow e;\n\t}\n}\n\nasync function resolveDriveItemByServerRelativePath(\n\tserver: string,\n\tserverRelativePath: string,\n\tclientConfig: IClientConfig,\n) {\n\treturn resolveWrapper<IOdspDriveItem>(\n\t\t// eslint-disable-next-line @typescript-eslint/promise-function-async\n\t\t(authRequestInfo) =>\n\t\t\tgetDriveItemByServerRelativePath(server, serverRelativePath, authRequestInfo, false),\n\t\tserver,\n\t\tclientConfig,\n\t);\n}\n\nasync function resolveChildrenByDriveItem(\n\tserver: string,\n\tfolderDriveItem: IOdspDriveItem,\n\tclientConfig: IClientConfig,\n) {\n\treturn resolveWrapper<IOdspDriveItem[]>(\n\t\t// eslint-disable-next-line @typescript-eslint/promise-function-async\n\t\t(authRequestInfo) => getChildrenByDriveItem(folderDriveItem, server, authRequestInfo),\n\t\tserver,\n\t\tclientConfig,\n\t);\n}\n\nexport async function getSharepointFiles(\n\tserver: string,\n\tserverRelativePath: string,\n\trecurse: boolean,\n) {\n\tconst clientConfig = getMicrosoftConfiguration();\n\n\tconst fileInfo = await resolveDriveItemByServerRelativePath(\n\t\tserver,\n\t\tserverRelativePath,\n\t\tclientConfig,\n\t);\n\tconsole.log(fileInfo);\n\tconst pendingFolder: { path: string; folder: IOdspDriveItem }[] = [];\n\tconst files: IOdspDriveItem[] = [];\n\tif (fileInfo.isFolder) {\n\t\tpendingFolder.push({ path: serverRelativePath, folder: fileInfo });\n\t} else {\n\t\tfiles.push(fileInfo);\n\t}\n\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\tconst folderInfo = pendingFolder.shift();\n\t\tif (!folderInfo) {\n\t\t\tbreak;\n\t\t}\n\t\tconst { path, folder } = folderInfo;\n\t\tconst children = await resolveChildrenByDriveItem(server, folder, clientConfig);\n\t\tfor (const child of children) {\n\t\t\tconst childPath = `${path}/${child.name}`;\n\t\t\tif (child.isFolder) {\n\t\t\t\tif (recurse) {\n\t\t\t\t\tpendingFolder.push({ path: childPath, folder: child });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfiles.push(child);\n\t\t\t}\n\t\t}\n\t}\n\treturn files;\n}\n\nexport async function getSingleSharePointFile(server: string, drive: string, item: string) {\n\tconst clientConfig = getMicrosoftConfiguration();\n\n\treturn resolveWrapper<IOdspDriveItem>(\n\t\t// eslint-disable-next-line @typescript-eslint/promise-function-async\n\t\t(authRequestInfo) => getDriveItemFromDriveAndItem(server, drive, item, authRequestInfo),\n\t\tserver,\n\t\tclientConfig,\n\t);\n}\n\nconst fluidFetchWebNavigator = (url: string) => {\n\tlet message = \"Please open browser and navigate to this URL:\";\n\tif (process.platform === \"win32\") {\n\t\tchild_process.exec(`start \"fluid-fetch\" /B \"${url}\"`);\n\t\tmessage =\n\t\t\t\"Opening browser to get authorization code. If that doesn't open, please go to this URL manually\";\n\t}\n\tconsole.log(`${message}\\n ${url}`);\n};\n"]}
1
+ {"version":3,"file":"fluidFetchSharePoint.js","sourceRoot":"","sources":["../src/fluidFetchSharePoint.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,kEAA0C;AAC1C,2EAAsE;AACtE,yEAQoD;AACpD,2DAMoC;AACpC,2DAA0D;AAEnD,KAAK,UAAU,cAAc,CACnC,QAA+D,EAC/D,MAAc,EACd,YAA2B,EAC3B,gBAAgB,GAAG,KAAK,EACxB,QAAQ,GAAG,KAAK;IAEhB,IAAI;QACH,MAAM,gBAAgB,GAAG,IAAI,6BAAgB,CAAC,4BAAe,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAoB;YACpC,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,sBAAsB;SACjC,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAClD,MAAM,EACN,YAAY,EACZ,WAAW,EACX,SAAS,CAAC,kBAAkB,EAC5B,gBAAgB,IAAI,IAAA,uCAAmB,GAAE,CACzC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;YAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,cAAc,EAAE,IAAA,gCAAqB,EAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC;SACnE,CAAC,CAAC;QACH,8EAA8E;QAC9E,IAAI,QAAQ,EAAE;YACb,MAAM,GAAG,GAA8B,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;YAC/E,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,EAAE;gBAC7C,WAAW,EAAE,MAAuB;gBACpC,YAAY,EAAE,MAAM,CAAC,YAAY;aACjC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;SACd;QACD,OAAO,MAAM,CAAC;KACd;IAAC,OAAO,CAAM,EAAE;QAChB,IAAI,CAAC,CAAC,SAAS,KAAK,qCAAgB,CAAC,kBAAkB,IAAI,CAAC,gBAAgB,EAAE;YAC7E,UAAU;YACV,OAAO,cAAc,CAAI,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;SACzE;QACD,MAAM,CAAC,CAAC;KACR;AACF,CAAC;AA1CD,wCA0CC;AAED,KAAK,UAAU,oCAAoC,CAClD,MAAc,EACd,kBAA0B,EAC1B,YAA2B;IAE3B,OAAO,cAAc;IACpB,qEAAqE;IACrE,CAAC,eAAe,EAAE,EAAE,CACnB,IAAA,2CAAgC,EAAC,MAAM,EAAE,kBAAkB,EAAE,eAAe,EAAE,KAAK,CAAC,EACrF,MAAM,EACN,YAAY,CACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B,CACxC,MAAc,EACd,eAA+B,EAC/B,YAA2B;IAE3B,OAAO,cAAc;IACpB,qEAAqE;IACrE,CAAC,eAAe,EAAE,EAAE,CAAC,IAAA,iCAAsB,EAAC,eAAe,EAAE,MAAM,EAAE,eAAe,CAAC,EACrF,MAAM,EACN,YAAY,CACZ,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,kBAAkB,CACvC,MAAc,EACd,kBAA0B,EAC1B,OAAgB;IAEhB,MAAM,YAAY,GAAG,IAAA,sCAAyB,GAAE,CAAC;IAEjD,MAAM,QAAQ,GAAG,MAAM,oCAAoC,CAC1D,MAAM,EACN,kBAAkB,EAClB,YAAY,CACZ,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,MAAM,aAAa,GAA+C,EAAE,CAAC;IACrE,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,IAAI,QAAQ,CAAC,QAAQ,EAAE;QACtB,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;KACnE;SAAM;QACN,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACrB;IAED,iDAAiD;IACjD,OAAO,IAAI,EAAE;QACZ,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC;QACzC,IAAI,CAAC,UAAU,EAAE;YAChB,MAAM;SACN;QACD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QAChF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;YAC7B,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,QAAQ,EAAE;gBACnB,IAAI,OAAO,EAAE;oBACZ,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;iBACvD;aACD;iBAAM;gBACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAClB;SACD;KACD;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAzCD,gDAyCC;AAEM,KAAK,UAAU,uBAAuB,CAAC,MAAc,EAAE,KAAa,EAAE,IAAY;IACxF,MAAM,YAAY,GAAG,IAAA,sCAAyB,GAAE,CAAC;IAEjD,OAAO,cAAc;IACpB,qEAAqE;IACrE,CAAC,eAAe,EAAE,EAAE,CAAC,IAAA,uCAA4B,EAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,CAAC,EACvF,MAAM,EACN,YAAY,CACZ,CAAC;AACH,CAAC;AATD,0DASC;AAED,MAAM,sBAAsB,GAAG,CAAC,GAAW,EAAE,EAAE;IAC9C,IAAI,OAAO,GAAG,+CAA+C,CAAC;IAC9D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE;QACjC,uBAAa,CAAC,IAAI,CAAC,2BAA2B,GAAG,GAAG,CAAC,CAAC;QACtD,OAAO;YACN,kGAAkG,CAAC;KACpG;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,OAAO,GAAG,EAAE,CAAC,CAAC;AACrC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport child_process from \"child_process\";\nimport { DriverErrorTypes } from \"@fluidframework/driver-definitions\";\nimport {\n\tIClientConfig,\n\tIOdspAuthRequestInfo,\n\tIOdspDriveItem,\n\tgetChildrenByDriveItem,\n\tgetDriveItemByServerRelativePath,\n\tgetDriveItemFromDriveAndItem,\n\tgetOdspRefreshTokenFn,\n} from \"@fluidframework/odsp-doclib-utils/internal\";\nimport {\n\tIOdspTokenManagerCacheKey,\n\tOdspTokenConfig,\n\tOdspTokenManager,\n\tgetMicrosoftConfiguration,\n\todspTokensCache,\n} from \"@fluidframework/tool-utils\";\nimport { getForceTokenReauth } from \"./fluidFetchArgs.js\";\n\nexport async function resolveWrapper<T>(\n\tcallback: (authRequestInfo: IOdspAuthRequestInfo) => Promise<T>,\n\tserver: string,\n\tclientConfig: IClientConfig,\n\tforceTokenReauth = false,\n\tforToken = false,\n): Promise<T> {\n\ttry {\n\t\tconst odspTokenManager = new OdspTokenManager(odspTokensCache);\n\t\tconst tokenConfig: OdspTokenConfig = {\n\t\t\ttype: \"browserLogin\",\n\t\t\tnavigator: fluidFetchWebNavigator,\n\t\t};\n\t\tconst tokens = await odspTokenManager.getOdspTokens(\n\t\t\tserver,\n\t\t\tclientConfig,\n\t\t\ttokenConfig,\n\t\t\tundefined /* forceRefresh */,\n\t\t\tforceTokenReauth || getForceTokenReauth(),\n\t\t);\n\n\t\tconst result = await callback({\n\t\t\taccessToken: tokens.accessToken,\n\t\t\trefreshTokenFn: getOdspRefreshTokenFn(server, clientConfig, tokens),\n\t\t});\n\t\t// If this is used for getting a token, then refresh the cache with new token.\n\t\tif (forToken) {\n\t\t\tconst key: IOdspTokenManagerCacheKey = { isPush: false, userOrServer: server };\n\t\t\tawait odspTokenManager.updateTokensCache(key, {\n\t\t\t\taccessToken: result as any as string,\n\t\t\t\trefreshToken: tokens.refreshToken,\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\treturn result;\n\t} catch (e: any) {\n\t\tif (e.errorType === DriverErrorTypes.authorizationError && !forceTokenReauth) {\n\t\t\t// Re-auth\n\t\t\treturn resolveWrapper<T>(callback, server, clientConfig, true, forToken);\n\t\t}\n\t\tthrow e;\n\t}\n}\n\nasync function resolveDriveItemByServerRelativePath(\n\tserver: string,\n\tserverRelativePath: string,\n\tclientConfig: IClientConfig,\n) {\n\treturn resolveWrapper<IOdspDriveItem>(\n\t\t// eslint-disable-next-line @typescript-eslint/promise-function-async\n\t\t(authRequestInfo) =>\n\t\t\tgetDriveItemByServerRelativePath(server, serverRelativePath, authRequestInfo, false),\n\t\tserver,\n\t\tclientConfig,\n\t);\n}\n\nasync function resolveChildrenByDriveItem(\n\tserver: string,\n\tfolderDriveItem: IOdspDriveItem,\n\tclientConfig: IClientConfig,\n) {\n\treturn resolveWrapper<IOdspDriveItem[]>(\n\t\t// eslint-disable-next-line @typescript-eslint/promise-function-async\n\t\t(authRequestInfo) => getChildrenByDriveItem(folderDriveItem, server, authRequestInfo),\n\t\tserver,\n\t\tclientConfig,\n\t);\n}\n\nexport async function getSharepointFiles(\n\tserver: string,\n\tserverRelativePath: string,\n\trecurse: boolean,\n) {\n\tconst clientConfig = getMicrosoftConfiguration();\n\n\tconst fileInfo = await resolveDriveItemByServerRelativePath(\n\t\tserver,\n\t\tserverRelativePath,\n\t\tclientConfig,\n\t);\n\tconsole.log(fileInfo);\n\tconst pendingFolder: { path: string; folder: IOdspDriveItem }[] = [];\n\tconst files: IOdspDriveItem[] = [];\n\tif (fileInfo.isFolder) {\n\t\tpendingFolder.push({ path: serverRelativePath, folder: fileInfo });\n\t} else {\n\t\tfiles.push(fileInfo);\n\t}\n\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\tconst folderInfo = pendingFolder.shift();\n\t\tif (!folderInfo) {\n\t\t\tbreak;\n\t\t}\n\t\tconst { path, folder } = folderInfo;\n\t\tconst children = await resolveChildrenByDriveItem(server, folder, clientConfig);\n\t\tfor (const child of children) {\n\t\t\tconst childPath = `${path}/${child.name}`;\n\t\t\tif (child.isFolder) {\n\t\t\t\tif (recurse) {\n\t\t\t\t\tpendingFolder.push({ path: childPath, folder: child });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfiles.push(child);\n\t\t\t}\n\t\t}\n\t}\n\treturn files;\n}\n\nexport async function getSingleSharePointFile(server: string, drive: string, item: string) {\n\tconst clientConfig = getMicrosoftConfiguration();\n\n\treturn resolveWrapper<IOdspDriveItem>(\n\t\t// eslint-disable-next-line @typescript-eslint/promise-function-async\n\t\t(authRequestInfo) => getDriveItemFromDriveAndItem(server, drive, item, authRequestInfo),\n\t\tserver,\n\t\tclientConfig,\n\t);\n}\n\nconst fluidFetchWebNavigator = (url: string) => {\n\tlet message = \"Please open browser and navigate to this URL:\";\n\tif (process.platform === \"win32\") {\n\t\tchild_process.exec(`start \"fluid-fetch\" /B \"${url}\"`);\n\t\tmessage =\n\t\t\t\"Opening browser to get authorization code. If that doesn't open, please go to this URL manually\";\n\t}\n\tconsole.log(`${message}\\n ${url}`);\n};\n"]}
@@ -11,9 +11,9 @@ exports.fluidFetchSnapshot = void 0;
11
11
  const fs_1 = __importDefault(require("fs"));
12
12
  const util_1 = __importDefault(require("util"));
13
13
  const client_utils_1 = require("@fluid-internal/client-utils");
14
- const fluidAnalyzeMessages_1 = require("./fluidAnalyzeMessages");
15
- const fluidFetchArgs_1 = require("./fluidFetchArgs");
16
- const fluidFetchInit_1 = require("./fluidFetchInit");
14
+ const fluidAnalyzeMessages_js_1 = require("./fluidAnalyzeMessages.js");
15
+ const fluidFetchArgs_js_1 = require("./fluidFetchArgs.js");
16
+ const fluidFetchInit_js_1 = require("./fluidFetchInit.js");
17
17
  function isFetchedTree(fetchedData) {
18
18
  return "patched" in fetchedData;
19
19
  }
@@ -61,7 +61,7 @@ function createTreeBlob(tree, prefix, patched) {
61
61
  }
62
62
  async function fetchBlobsFromSnapshotTree(storage, tree, prefix = "/", parentBlobIdMap) {
63
63
  const isTopLevel = !parentBlobIdMap;
64
- if (isTopLevel && fluidFetchArgs_1.dumpSnapshotTrees) {
64
+ if (isTopLevel && fluidFetchArgs_js_1.dumpSnapshotTrees) {
65
65
  console.log(tree);
66
66
  }
67
67
  if (prefix === "/") {
@@ -106,11 +106,11 @@ async function dumpSnapshotTreeVerbose(name, fetchedData) {
106
106
  continue;
107
107
  }
108
108
  const blob = (0, client_utils_1.bufferToString)(buffer, "utf8");
109
- console.log(`${item.treePath.padEnd(nameLength)} | ${item.reused ? "X" : " "} | ${(0, fluidAnalyzeMessages_1.formatNumber)(blob.length).padStart(10)}`);
109
+ console.log(`${item.treePath.padEnd(nameLength)} | ${item.reused ? "X" : " "} | ${(0, fluidAnalyzeMessages_js_1.formatNumber)(blob.length).padStart(10)}`);
110
110
  size += blob.length;
111
111
  }
112
112
  console.log("-".repeat(nameLength + 26));
113
- console.log(`${"Total snapshot size".padEnd(nameLength)} | | ${(0, fluidAnalyzeMessages_1.formatNumber)(size).padStart(10)}`);
113
+ console.log(`${"Total snapshot size".padEnd(nameLength)} | | ${(0, fluidAnalyzeMessages_js_1.formatNumber)(size).padStart(10)}`);
114
114
  }
115
115
  async function dumpSnapshotTree(name, fetchedData) {
116
116
  let size = 0;
@@ -148,7 +148,7 @@ async function saveSnapshot(name, fetchedData, saveDir) {
148
148
  // all of our snapshot blobs. It doesn't necessary be true in the future
149
149
  let decoded = (0, client_utils_1.bufferToString)(buffer, "utf8");
150
150
  try {
151
- if (!fluidFetchArgs_1.paramActualFormatting) {
151
+ if (!fluidFetchArgs_js_1.paramActualFormatting) {
152
152
  decoded = JSON.stringify(JSON.parse(decoded), undefined, 2);
153
153
  }
154
154
  }
@@ -159,7 +159,7 @@ async function saveSnapshot(name, fetchedData, saveDir) {
159
159
  // Write out same data for tree decoded or not, except for formatting
160
160
  const treeString = (0, client_utils_1.bufferToString)(buffer, "utf8");
161
161
  fs_1.default.writeFileSync(`${outDir}/${item.filename}.json`, treeString);
162
- fs_1.default.writeFileSync(`${outDir}/decoded/${item.filename}.json`, fluidFetchArgs_1.paramActualFormatting
162
+ fs_1.default.writeFileSync(`${outDir}/decoded/${item.filename}.json`, fluidFetchArgs_js_1.paramActualFormatting
163
163
  ? treeString
164
164
  : JSON.stringify(JSON.parse(treeString), undefined, 2));
165
165
  }
@@ -182,9 +182,9 @@ async function reportErrors(message, res) {
182
182
  }
183
183
  }
184
184
  async function fluidFetchSnapshot(documentService, saveDir) {
185
- if (!fluidFetchArgs_1.dumpSnapshotStats &&
186
- !fluidFetchArgs_1.dumpSnapshotTrees &&
187
- !fluidFetchArgs_1.dumpSnapshotVersions &&
185
+ if (!fluidFetchArgs_js_1.dumpSnapshotStats &&
186
+ !fluidFetchArgs_js_1.dumpSnapshotTrees &&
187
+ !fluidFetchArgs_js_1.dumpSnapshotVersions &&
188
188
  saveDir === undefined) {
189
189
  return;
190
190
  }
@@ -197,14 +197,14 @@ async function fluidFetchSnapshot(documentService, saveDir) {
197
197
  console.log("\n");
198
198
  const storage = await documentService.connectToStorage();
199
199
  let version;
200
- const versions = await reportErrors(`getVersions ${fluidFetchInit_1.latestVersionsId}`, storage.getVersions(fluidFetchInit_1.latestVersionsId, fluidFetchArgs_1.paramNumSnapshotVersions));
201
- if (fluidFetchArgs_1.dumpSnapshotVersions) {
200
+ const versions = await reportErrors(`getVersions ${fluidFetchInit_js_1.latestVersionsId}`, storage.getVersions(fluidFetchInit_js_1.latestVersionsId, fluidFetchArgs_js_1.paramNumSnapshotVersions));
201
+ if (fluidFetchArgs_js_1.dumpSnapshotVersions) {
202
202
  console.log("Snapshot versions");
203
203
  console.log(versions);
204
204
  }
205
205
  let blobsToDump;
206
- if (fluidFetchArgs_1.paramSnapshotVersionIndex !== undefined) {
207
- version = versions[fluidFetchArgs_1.paramSnapshotVersionIndex];
206
+ if (fluidFetchArgs_js_1.paramSnapshotVersionIndex !== undefined) {
207
+ version = versions[fluidFetchArgs_js_1.paramSnapshotVersionIndex];
208
208
  if (version === undefined) {
209
209
  console.log(`There are only ${versions.length} snapshots, --snapshotVersionIndex is too large`);
210
210
  return;
@@ -242,16 +242,16 @@ async function fluidFetchSnapshot(documentService, saveDir) {
242
242
  }
243
243
  }
244
244
  date = date.padStart(23);
245
- const size = (0, fluidAnalyzeMessages_1.formatNumber)(res.size).padStart(10);
246
- const sizeNew = (0, fluidAnalyzeMessages_1.formatNumber)(res.sizeNew).padStart(10);
247
- const blobCount = (0, fluidAnalyzeMessages_1.formatNumber)(res.blobCount).padStart(6);
248
- const blobCountNew = (0, fluidAnalyzeMessages_1.formatNumber)(res.blobCountNew).padStart(9);
245
+ const size = (0, fluidAnalyzeMessages_js_1.formatNumber)(res.size).padStart(10);
246
+ const sizeNew = (0, fluidAnalyzeMessages_js_1.formatNumber)(res.sizeNew).padStart(10);
247
+ const blobCount = (0, fluidAnalyzeMessages_js_1.formatNumber)(res.blobCount).padStart(6);
248
+ const blobCountNew = (0, fluidAnalyzeMessages_js_1.formatNumber)(res.blobCountNew).padStart(9);
249
249
  console.log(`${name.padEnd(15)} | ${date} | ${size} | ${sizeNew} | ${blobCount} | ${blobCountNew}`);
250
250
  await saveSnapshot(name, blobs, saveDir);
251
251
  }
252
252
  }
253
253
  }
254
- if (fluidFetchArgs_1.dumpSnapshotStats || fluidFetchArgs_1.dumpSnapshotTrees) {
254
+ if (fluidFetchArgs_js_1.dumpSnapshotStats || fluidFetchArgs_js_1.dumpSnapshotTrees) {
255
255
  if (version === undefined) {
256
256
  console.log("No snapshot tree");
257
257
  }
@@ -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\";\n\nimport { bufferToString, stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { IDocumentService, IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { ISnapshotTree, IVersion } from \"@fluidframework/protocol-definitions\";\n\nimport { formatNumber } from \"./fluidAnalyzeMessages\";\nimport {\n\tdumpSnapshotStats,\n\tdumpSnapshotTrees,\n\tdumpSnapshotVersions,\n\tparamActualFormatting,\n\tparamNumSnapshotVersions,\n\tparamSnapshotVersionIndex,\n} from \"./fluidFetchArgs\";\nimport { latestVersionsId } from \"./fluidFetchInit\";\n\ninterface ISnapshotInfo {\n\tblobCountNew: number;\n\tblobCount: number;\n\tsize: number;\n\tsizeNew: number;\n}\n\ntype IFetchedData = IFetchedBlob | IFetchedTree;\n\ninterface IFetchedBlob {\n\ttreePath: string;\n\tfilename: string;\n\tblobId: string;\n\tblob: Promise<ArrayBufferLike | undefined>;\n\treused: boolean;\n}\n\ninterface IFetchedTree {\n\ttreePath: string;\n\tblobId: string;\n\tfilename: string;\n\tblob: ArrayBufferLike;\n\n\treused: false;\n\n\tpatched: boolean;\n}\n\nfunction isFetchedTree(fetchedData: IFetchedData): fetchedData is IFetchedTree {\n\treturn \"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(\n\tprefix: string,\n\ttree: ISnapshotTree,\n\tstorage: IDocumentStorageService,\n\tblobIdMap: Map<string, number>,\n) {\n\tconst result: IFetchedBlob[] = [];\n\tfor (const item of Object.keys(tree.blobs)) {\n\t\tconst treePath = `${prefix}${item}`;\n\t\tconst blobId = tree.blobs[item];\n\t\tif (blobId !== null) {\n\t\t\tlet reused = true;\n\t\t\tlet blob = blobCachePrevious.get(blobId);\n\t\t\tif (!blob) {\n\t\t\t\treused = false;\n\t\t\t\tblob = blobCache.get(blobId);\n\t\t\t\tif (blob === undefined) {\n\t\t\t\t\tblob = storage.readBlob(blobId);\n\t\t\t\t\tblobCache.set(blobId, blob);\n\t\t\t\t}\n\t\t\t}\n\t\t\tblobCacheCurrent.set(blobId, blob);\n\n\t\t\t// Use the blobIdMap to assign a number for each unique blob\n\t\t\t// and use it as a prefix for files to avoid case-insensitive fs\n\t\t\tlet index = blobIdMap.get(blobId);\n\t\t\tif (index === undefined) {\n\t\t\t\tindex = blobIdMap.size;\n\t\t\t\tblobIdMap.set(blobId, index);\n\t\t\t}\n\t\t\tconst filename = `${index}-${blobId}`;\n\t\t\tresult.push({ treePath, blobId, blob, reused, filename });\n\n\t\t\t// patch the tree so that we can write it out to reference the file\n\t\t\ttree.blobs[item] = filename;\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction createTreeBlob(tree: ISnapshotTree, prefix: string, patched: boolean): IFetchedTree {\n\tconst id = tree.id ?? \"original\";\n\tconst blob = stringToBuffer(JSON.stringify(tree), \"utf8\");\n\tconst filename = patched ? \"tree\" : `tree-${id}`;\n\tconst treePath = `${prefix}${filename}`;\n\treturn { treePath, blobId: \"original tree $id\", filename, blob, patched, reused: false };\n}\n\nasync function fetchBlobsFromSnapshotTree(\n\tstorage: IDocumentStorageService,\n\ttree: ISnapshotTree,\n\tprefix: string = \"/\",\n\tparentBlobIdMap?: Map<string, number>,\n): Promise<IFetchedData[]> {\n\tconst isTopLevel = !parentBlobIdMap;\n\tif (isTopLevel && dumpSnapshotTrees) {\n\t\tconsole.log(tree);\n\t}\n\n\tif (prefix === \"/\") {\n\t\tblobCachePrevious = blobCacheCurrent;\n\t\tblobCacheCurrent = new Map<string, Promise<ArrayBufferLike>>();\n\t}\n\n\t// Create the tree info before fetching blobs (which will modify it)\n\tlet topLevelBlob: IFetchedTree | undefined;\n\tif (isTopLevel) {\n\t\ttopLevelBlob = createTreeBlob(tree, prefix, false);\n\t}\n\n\tconst blobIdMap = parentBlobIdMap ?? new Map<string, number>();\n\tlet result: IFetchedData[] = fetchBlobs(prefix, tree, storage, blobIdMap);\n\n\tfor (const subtreeId of Object.keys(tree.trees)) {\n\t\tconst subtree = tree.trees[subtreeId];\n\t\tconst dataStoreBlobs = await fetchBlobsFromSnapshotTree(\n\t\t\tstorage,\n\t\t\tsubtree,\n\t\t\t`${prefix}${subtreeId}/`,\n\t\t\tblobIdMap,\n\t\t);\n\t\tresult = result.concat(dataStoreBlobs);\n\t}\n\n\tif (topLevelBlob) {\n\t\tresult.push(topLevelBlob);\n\t\tresult.push(createTreeBlob(tree, prefix, true));\n\t}\n\treturn result;\n}\n\nfunction getDumpFetchedData(fetchedData: IFetchedData[]) {\n\tconst sorted = fetchedData.sort((a, b) => a.treePath.localeCompare(b.treePath));\n\treturn sorted.filter((item) => !isFetchedTree(item) || !item.patched);\n}\n\nasync function dumpSnapshotTreeVerbose(name: string, fetchedData: IFetchedData[]) {\n\tlet size = 0;\n\tconst sorted = getDumpFetchedData(fetchedData);\n\n\tlet nameLength = 10;\n\tfor (const item of sorted) {\n\t\tnameLength = Math.max(nameLength, item.treePath.length);\n\t}\n\n\tconsole.log(\"\");\n\tconsole.log(`${\"Blob Path\".padEnd(nameLength)} | Reused | Bytes`);\n\tconsole.log(\"-\".repeat(nameLength + 26));\n\tfor (const item of sorted) {\n\t\tconst buffer = await item.blob;\n\t\tif (buffer === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst blob = bufferToString(buffer, \"utf8\");\n\t\tconsole.log(\n\t\t\t`${item.treePath.padEnd(nameLength)} | ${item.reused ? \"X\" : \" \"} | ${formatNumber(\n\t\t\t\tblob.length,\n\t\t\t).padStart(10)}`,\n\t\t);\n\t\tsize += blob.length;\n\t}\n\n\tconsole.log(\"-\".repeat(nameLength + 26));\n\tconsole.log(\n\t\t`${\"Total snapshot size\".padEnd(nameLength)} | | ${formatNumber(size).padStart(10)}`,\n\t);\n}\n\nasync function dumpSnapshotTree(name: string, fetchedData: IFetchedData[]): Promise<ISnapshotInfo> {\n\tlet size = 0;\n\tlet sizeNew = 0;\n\tlet blobCountNew = 0;\n\tconst sorted = getDumpFetchedData(fetchedData);\n\n\tfor (const item of sorted) {\n\t\tconst buffer = await item.blob;\n\t\tif (buffer === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst blob = bufferToString(buffer, \"utf8\");\n\t\tif (!item.reused) {\n\t\t\tsizeNew += blob.length;\n\t\t\tblobCountNew++;\n\t\t}\n\t\tsize += blob.length;\n\t}\n\n\treturn { blobCountNew, blobCount: sorted.length, size, sizeNew };\n}\n\nasync function saveSnapshot(name: string, fetchedData: IFetchedData[], saveDir: string) {\n\tconst outDir = `${saveDir}/${name}/`;\n\tconst mkdir = util.promisify(fs.mkdir);\n\n\tawait mkdir(`${outDir}/decoded`, { recursive: true });\n\tawait Promise.all(\n\t\tfetchedData.map(async (item) => {\n\t\t\tconst buffer = await item.blob;\n\t\t\tif (buffer === undefined) {\n\t\t\t\tconsole.error(`ERROR: Unable to get data for blob ${item.blobId}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!isFetchedTree(item)) {\n\t\t\t\t// Just write the data as is.\n\t\t\t\tfs.writeFileSync(`${outDir}/${item.filename}`, Buffer.from(buffer));\n\n\t\t\t\t// we assume that the buffer is utf8 here, which currently is true for\n\t\t\t\t// all of our snapshot blobs. It doesn't necessary be true in the future\n\t\t\t\tlet decoded = bufferToString(buffer, \"utf8\");\n\t\t\t\ttry {\n\t\t\t\t\tif (!paramActualFormatting) {\n\t\t\t\t\t\tdecoded = JSON.stringify(JSON.parse(decoded), undefined, 2);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t\tfs.writeFileSync(`${outDir}/decoded/${item.filename}.json`, decoded);\n\t\t\t} else {\n\t\t\t\t// Write out same data for tree decoded or not, except for formatting\n\t\t\t\tconst treeString = bufferToString(buffer, \"utf8\");\n\t\t\t\tfs.writeFileSync(`${outDir}/${item.filename}.json`, treeString);\n\t\t\t\tfs.writeFileSync(\n\t\t\t\t\t`${outDir}/decoded/${item.filename}.json`,\n\t\t\t\t\tparamActualFormatting\n\t\t\t\t\t\t? treeString\n\t\t\t\t\t\t: JSON.stringify(JSON.parse(treeString), undefined, 2),\n\t\t\t\t);\n\t\t\t}\n\t\t}),\n\t);\n}\n\nasync function fetchBlobsFromVersion(storage: IDocumentStorageService, version: IVersion) {\n\tconst tree = await reportErrors(\n\t\t`getSnapshotTree ${version.id}`,\n\t\tstorage.getSnapshotTree(version),\n\t);\n\tif (!tree) {\n\t\tthrow new Error(\"Failed to load snapshot tree\");\n\t}\n\treturn fetchBlobsFromSnapshotTree(storage, tree);\n}\n\nasync function reportErrors<T>(message: string, res: Promise<T>) {\n\ttry {\n\t\treturn await res;\n\t} catch (error) {\n\t\tconsole.error(`Error calling ${message}`);\n\t\tthrow error;\n\t}\n}\n\nexport async function fluidFetchSnapshot(documentService?: IDocumentService, saveDir?: string) {\n\tif (\n\t\t!dumpSnapshotStats &&\n\t\t!dumpSnapshotTrees &&\n\t\t!dumpSnapshotVersions &&\n\t\tsaveDir === undefined\n\t) {\n\t\treturn;\n\t}\n\n\t// --local mode - do not connect to storage.\n\t// For now, bail out early.\n\t// In future, separate download from analyzes parts and allow offline analyzes\n\tif (!documentService) {\n\t\treturn;\n\t}\n\n\tconsole.log(\"\\n\");\n\n\tconst storage = await documentService.connectToStorage();\n\n\tlet version: IVersion | undefined;\n\tconst versions = await reportErrors(\n\t\t`getVersions ${latestVersionsId}`,\n\t\tstorage.getVersions(latestVersionsId, paramNumSnapshotVersions),\n\t);\n\tif (dumpSnapshotVersions) {\n\t\tconsole.log(\"Snapshot versions\");\n\t\tconsole.log(versions);\n\t}\n\n\tlet blobsToDump: IFetchedData[] | undefined;\n\tif (paramSnapshotVersionIndex !== undefined) {\n\t\tversion = versions[paramSnapshotVersionIndex];\n\t\tif (version === undefined) {\n\t\t\tconsole.log(\n\t\t\t\t`There are only ${versions.length} snapshots, --snapshotVersionIndex is too large`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (saveDir !== undefined) {\n\t\t\tblobsToDump = await fetchBlobsFromVersion(storage, version);\n\t\t\tconst name = version.id;\n\t\t\tconsole.log(`Saving snapshot ${name}`);\n\t\t\tawait saveSnapshot(name, blobsToDump, saveDir);\n\t\t}\n\t} else {\n\t\tversion = versions[0];\n\t\tif (saveDir !== undefined && versions.length > 0) {\n\t\t\tconsole.log(\n\t\t\t\t\" Name | Date | Size | New Size | Blobs | New Blobs\",\n\t\t\t);\n\t\t\tconsole.log(\"-\".repeat(86));\n\n\t\t\t// Go in reverse order, to correctly calculate blob reuse - from oldest to newest snapshots\n\t\t\tfor (let i = versions.length - 1; i >= 0; i--) {\n\t\t\t\tconst v = versions[i];\n\t\t\t\tconst blobs = await fetchBlobsFromVersion(storage, v);\n\t\t\t\tblobsToDump = blobs;\n\t\t\t\tconst name = `${i}-${v.id}`;\n\t\t\t\tconst res = await dumpSnapshotTree(name, blobs);\n\n\t\t\t\tlet date = \"\";\n\t\t\t\tif (v.date !== undefined) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tdate = new Date(v.date).toLocaleString();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tdate = v.date.replace(\"T\", \" \");\n\t\t\t\t\t\tconst index = date.lastIndexOf(\".\");\n\t\t\t\t\t\tif (index > 0) {\n\t\t\t\t\t\t\tdate = `${date.substr(0, index)} Z`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdate = date.padStart(23);\n\t\t\t\tconst size = formatNumber(res.size).padStart(10);\n\t\t\t\tconst sizeNew = formatNumber(res.sizeNew).padStart(10);\n\t\t\t\tconst blobCount = formatNumber(res.blobCount).padStart(6);\n\t\t\t\tconst blobCountNew = formatNumber(res.blobCountNew).padStart(9);\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t`${name.padEnd(\n\t\t\t\t\t\t15,\n\t\t\t\t\t)} | ${date} | ${size} | ${sizeNew} | ${blobCount} | ${blobCountNew}`,\n\t\t\t\t);\n\n\t\t\t\tawait saveSnapshot(name, blobs, saveDir);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (dumpSnapshotStats || dumpSnapshotTrees) {\n\t\tif (version === undefined) {\n\t\t\tconsole.log(\"No snapshot tree\");\n\t\t} else {\n\t\t\tif (blobsToDump === undefined) {\n\t\t\t\tblobsToDump = await fetchBlobsFromVersion(storage, version);\n\t\t\t}\n\t\t\tconsole.log(`\\n\\nSnapshot version ${version.id}`);\n\t\t\tawait dumpSnapshotTreeVerbose(version.id, blobsToDump);\n\t\t}\n\t}\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\";\n\nimport { bufferToString, stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { IDocumentService, IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { ISnapshotTree, IVersion } from \"@fluidframework/protocol-definitions\";\n\nimport { formatNumber } from \"./fluidAnalyzeMessages.js\";\nimport {\n\tdumpSnapshotStats,\n\tdumpSnapshotTrees,\n\tdumpSnapshotVersions,\n\tparamActualFormatting,\n\tparamNumSnapshotVersions,\n\tparamSnapshotVersionIndex,\n} from \"./fluidFetchArgs.js\";\nimport { latestVersionsId } from \"./fluidFetchInit.js\";\n\ninterface ISnapshotInfo {\n\tblobCountNew: number;\n\tblobCount: number;\n\tsize: number;\n\tsizeNew: number;\n}\n\ntype IFetchedData = IFetchedBlob | IFetchedTree;\n\ninterface IFetchedBlob {\n\ttreePath: string;\n\tfilename: string;\n\tblobId: string;\n\tblob: Promise<ArrayBufferLike | undefined>;\n\treused: boolean;\n}\n\ninterface IFetchedTree {\n\ttreePath: string;\n\tblobId: string;\n\tfilename: string;\n\tblob: ArrayBufferLike;\n\n\treused: false;\n\n\tpatched: boolean;\n}\n\nfunction isFetchedTree(fetchedData: IFetchedData): fetchedData is IFetchedTree {\n\treturn \"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(\n\tprefix: string,\n\ttree: ISnapshotTree,\n\tstorage: IDocumentStorageService,\n\tblobIdMap: Map<string, number>,\n) {\n\tconst result: IFetchedBlob[] = [];\n\tfor (const item of Object.keys(tree.blobs)) {\n\t\tconst treePath = `${prefix}${item}`;\n\t\tconst blobId = tree.blobs[item];\n\t\tif (blobId !== null) {\n\t\t\tlet reused = true;\n\t\t\tlet blob = blobCachePrevious.get(blobId);\n\t\t\tif (!blob) {\n\t\t\t\treused = false;\n\t\t\t\tblob = blobCache.get(blobId);\n\t\t\t\tif (blob === undefined) {\n\t\t\t\t\tblob = storage.readBlob(blobId);\n\t\t\t\t\tblobCache.set(blobId, blob);\n\t\t\t\t}\n\t\t\t}\n\t\t\tblobCacheCurrent.set(blobId, blob);\n\n\t\t\t// Use the blobIdMap to assign a number for each unique blob\n\t\t\t// and use it as a prefix for files to avoid case-insensitive fs\n\t\t\tlet index = blobIdMap.get(blobId);\n\t\t\tif (index === undefined) {\n\t\t\t\tindex = blobIdMap.size;\n\t\t\t\tblobIdMap.set(blobId, index);\n\t\t\t}\n\t\t\tconst filename = `${index}-${blobId}`;\n\t\t\tresult.push({ treePath, blobId, blob, reused, filename });\n\n\t\t\t// patch the tree so that we can write it out to reference the file\n\t\t\ttree.blobs[item] = filename;\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction createTreeBlob(tree: ISnapshotTree, prefix: string, patched: boolean): IFetchedTree {\n\tconst id = tree.id ?? \"original\";\n\tconst blob = stringToBuffer(JSON.stringify(tree), \"utf8\");\n\tconst filename = patched ? \"tree\" : `tree-${id}`;\n\tconst treePath = `${prefix}${filename}`;\n\treturn { treePath, blobId: \"original tree $id\", filename, blob, patched, reused: false };\n}\n\nasync function fetchBlobsFromSnapshotTree(\n\tstorage: IDocumentStorageService,\n\ttree: ISnapshotTree,\n\tprefix: string = \"/\",\n\tparentBlobIdMap?: Map<string, number>,\n): Promise<IFetchedData[]> {\n\tconst isTopLevel = !parentBlobIdMap;\n\tif (isTopLevel && dumpSnapshotTrees) {\n\t\tconsole.log(tree);\n\t}\n\n\tif (prefix === \"/\") {\n\t\tblobCachePrevious = blobCacheCurrent;\n\t\tblobCacheCurrent = new Map<string, Promise<ArrayBufferLike>>();\n\t}\n\n\t// Create the tree info before fetching blobs (which will modify it)\n\tlet topLevelBlob: IFetchedTree | undefined;\n\tif (isTopLevel) {\n\t\ttopLevelBlob = createTreeBlob(tree, prefix, false);\n\t}\n\n\tconst blobIdMap = parentBlobIdMap ?? new Map<string, number>();\n\tlet result: IFetchedData[] = fetchBlobs(prefix, tree, storage, blobIdMap);\n\n\tfor (const subtreeId of Object.keys(tree.trees)) {\n\t\tconst subtree = tree.trees[subtreeId];\n\t\tconst dataStoreBlobs = await fetchBlobsFromSnapshotTree(\n\t\t\tstorage,\n\t\t\tsubtree,\n\t\t\t`${prefix}${subtreeId}/`,\n\t\t\tblobIdMap,\n\t\t);\n\t\tresult = result.concat(dataStoreBlobs);\n\t}\n\n\tif (topLevelBlob) {\n\t\tresult.push(topLevelBlob);\n\t\tresult.push(createTreeBlob(tree, prefix, true));\n\t}\n\treturn result;\n}\n\nfunction getDumpFetchedData(fetchedData: IFetchedData[]) {\n\tconst sorted = fetchedData.sort((a, b) => a.treePath.localeCompare(b.treePath));\n\treturn sorted.filter((item) => !isFetchedTree(item) || !item.patched);\n}\n\nasync function dumpSnapshotTreeVerbose(name: string, fetchedData: IFetchedData[]) {\n\tlet size = 0;\n\tconst sorted = getDumpFetchedData(fetchedData);\n\n\tlet nameLength = 10;\n\tfor (const item of sorted) {\n\t\tnameLength = Math.max(nameLength, item.treePath.length);\n\t}\n\n\tconsole.log(\"\");\n\tconsole.log(`${\"Blob Path\".padEnd(nameLength)} | Reused | Bytes`);\n\tconsole.log(\"-\".repeat(nameLength + 26));\n\tfor (const item of sorted) {\n\t\tconst buffer = await item.blob;\n\t\tif (buffer === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst blob = bufferToString(buffer, \"utf8\");\n\t\tconsole.log(\n\t\t\t`${item.treePath.padEnd(nameLength)} | ${item.reused ? \"X\" : \" \"} | ${formatNumber(\n\t\t\t\tblob.length,\n\t\t\t).padStart(10)}`,\n\t\t);\n\t\tsize += blob.length;\n\t}\n\n\tconsole.log(\"-\".repeat(nameLength + 26));\n\tconsole.log(\n\t\t`${\"Total snapshot size\".padEnd(nameLength)} | | ${formatNumber(size).padStart(10)}`,\n\t);\n}\n\nasync function dumpSnapshotTree(name: string, fetchedData: IFetchedData[]): Promise<ISnapshotInfo> {\n\tlet size = 0;\n\tlet sizeNew = 0;\n\tlet blobCountNew = 0;\n\tconst sorted = getDumpFetchedData(fetchedData);\n\n\tfor (const item of sorted) {\n\t\tconst buffer = await item.blob;\n\t\tif (buffer === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst blob = bufferToString(buffer, \"utf8\");\n\t\tif (!item.reused) {\n\t\t\tsizeNew += blob.length;\n\t\t\tblobCountNew++;\n\t\t}\n\t\tsize += blob.length;\n\t}\n\n\treturn { blobCountNew, blobCount: sorted.length, size, sizeNew };\n}\n\nasync function saveSnapshot(name: string, fetchedData: IFetchedData[], saveDir: string) {\n\tconst outDir = `${saveDir}/${name}/`;\n\tconst mkdir = util.promisify(fs.mkdir);\n\n\tawait mkdir(`${outDir}/decoded`, { recursive: true });\n\tawait Promise.all(\n\t\tfetchedData.map(async (item) => {\n\t\t\tconst buffer = await item.blob;\n\t\t\tif (buffer === undefined) {\n\t\t\t\tconsole.error(`ERROR: Unable to get data for blob ${item.blobId}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!isFetchedTree(item)) {\n\t\t\t\t// Just write the data as is.\n\t\t\t\tfs.writeFileSync(`${outDir}/${item.filename}`, Buffer.from(buffer));\n\n\t\t\t\t// we assume that the buffer is utf8 here, which currently is true for\n\t\t\t\t// all of our snapshot blobs. It doesn't necessary be true in the future\n\t\t\t\tlet decoded = bufferToString(buffer, \"utf8\");\n\t\t\t\ttry {\n\t\t\t\t\tif (!paramActualFormatting) {\n\t\t\t\t\t\tdecoded = JSON.stringify(JSON.parse(decoded), undefined, 2);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t\tfs.writeFileSync(`${outDir}/decoded/${item.filename}.json`, decoded);\n\t\t\t} else {\n\t\t\t\t// Write out same data for tree decoded or not, except for formatting\n\t\t\t\tconst treeString = bufferToString(buffer, \"utf8\");\n\t\t\t\tfs.writeFileSync(`${outDir}/${item.filename}.json`, treeString);\n\t\t\t\tfs.writeFileSync(\n\t\t\t\t\t`${outDir}/decoded/${item.filename}.json`,\n\t\t\t\t\tparamActualFormatting\n\t\t\t\t\t\t? treeString\n\t\t\t\t\t\t: JSON.stringify(JSON.parse(treeString), undefined, 2),\n\t\t\t\t);\n\t\t\t}\n\t\t}),\n\t);\n}\n\nasync function fetchBlobsFromVersion(storage: IDocumentStorageService, version: IVersion) {\n\tconst tree = await reportErrors(\n\t\t`getSnapshotTree ${version.id}`,\n\t\tstorage.getSnapshotTree(version),\n\t);\n\tif (!tree) {\n\t\tthrow new Error(\"Failed to load snapshot tree\");\n\t}\n\treturn fetchBlobsFromSnapshotTree(storage, tree);\n}\n\nasync function reportErrors<T>(message: string, res: Promise<T>) {\n\ttry {\n\t\treturn await res;\n\t} catch (error) {\n\t\tconsole.error(`Error calling ${message}`);\n\t\tthrow error;\n\t}\n}\n\nexport async function fluidFetchSnapshot(documentService?: IDocumentService, saveDir?: string) {\n\tif (\n\t\t!dumpSnapshotStats &&\n\t\t!dumpSnapshotTrees &&\n\t\t!dumpSnapshotVersions &&\n\t\tsaveDir === undefined\n\t) {\n\t\treturn;\n\t}\n\n\t// --local mode - do not connect to storage.\n\t// For now, bail out early.\n\t// In future, separate download from analyzes parts and allow offline analyzes\n\tif (!documentService) {\n\t\treturn;\n\t}\n\n\tconsole.log(\"\\n\");\n\n\tconst storage = await documentService.connectToStorage();\n\n\tlet version: IVersion | undefined;\n\tconst versions = await reportErrors(\n\t\t`getVersions ${latestVersionsId}`,\n\t\tstorage.getVersions(latestVersionsId, paramNumSnapshotVersions),\n\t);\n\tif (dumpSnapshotVersions) {\n\t\tconsole.log(\"Snapshot versions\");\n\t\tconsole.log(versions);\n\t}\n\n\tlet blobsToDump: IFetchedData[] | undefined;\n\tif (paramSnapshotVersionIndex !== undefined) {\n\t\tversion = versions[paramSnapshotVersionIndex];\n\t\tif (version === undefined) {\n\t\t\tconsole.log(\n\t\t\t\t`There are only ${versions.length} snapshots, --snapshotVersionIndex is too large`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (saveDir !== undefined) {\n\t\t\tblobsToDump = await fetchBlobsFromVersion(storage, version);\n\t\t\tconst name = version.id;\n\t\t\tconsole.log(`Saving snapshot ${name}`);\n\t\t\tawait saveSnapshot(name, blobsToDump, saveDir);\n\t\t}\n\t} else {\n\t\tversion = versions[0];\n\t\tif (saveDir !== undefined && versions.length > 0) {\n\t\t\tconsole.log(\n\t\t\t\t\" Name | Date | Size | New Size | Blobs | New Blobs\",\n\t\t\t);\n\t\t\tconsole.log(\"-\".repeat(86));\n\n\t\t\t// Go in reverse order, to correctly calculate blob reuse - from oldest to newest snapshots\n\t\t\tfor (let i = versions.length - 1; i >= 0; i--) {\n\t\t\t\tconst v = versions[i];\n\t\t\t\tconst blobs = await fetchBlobsFromVersion(storage, v);\n\t\t\t\tblobsToDump = blobs;\n\t\t\t\tconst name = `${i}-${v.id}`;\n\t\t\t\tconst res = await dumpSnapshotTree(name, blobs);\n\n\t\t\t\tlet date = \"\";\n\t\t\t\tif (v.date !== undefined) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tdate = new Date(v.date).toLocaleString();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tdate = v.date.replace(\"T\", \" \");\n\t\t\t\t\t\tconst index = date.lastIndexOf(\".\");\n\t\t\t\t\t\tif (index > 0) {\n\t\t\t\t\t\t\tdate = `${date.substr(0, index)} Z`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdate = date.padStart(23);\n\t\t\t\tconst size = formatNumber(res.size).padStart(10);\n\t\t\t\tconst sizeNew = formatNumber(res.sizeNew).padStart(10);\n\t\t\t\tconst blobCount = formatNumber(res.blobCount).padStart(6);\n\t\t\t\tconst blobCountNew = formatNumber(res.blobCountNew).padStart(9);\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t`${name.padEnd(\n\t\t\t\t\t\t15,\n\t\t\t\t\t)} | ${date} | ${size} | ${sizeNew} | ${blobCount} | ${blobCountNew}`,\n\t\t\t\t);\n\n\t\t\t\tawait saveSnapshot(name, blobs, saveDir);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (dumpSnapshotStats || dumpSnapshotTrees) {\n\t\tif (version === undefined) {\n\t\t\tconsole.log(\"No snapshot tree\");\n\t\t} else {\n\t\t\tif (blobsToDump === undefined) {\n\t\t\t\tblobsToDump = await fetchBlobsFromVersion(storage, version);\n\t\t\t}\n\t\t\tconsole.log(`\\n\\nSnapshot version ${version.id}`);\n\t\t\tawait dumpSnapshotTreeVerbose(version.id, blobsToDump);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,8 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ export declare const formatNumber: (num: number) => string;
6
+ export declare function printMessageStats(generator: any, // AsyncGenerator<ISequencedDocumentMessage[]>,
7
+ dumpMessageStats: boolean, dumpMessages: boolean, messageTypeFilter?: Set<string>): Promise<void>;
8
+ //# sourceMappingURL=fluidAnalyzeMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluidAnalyzeMessages.d.ts","sourceRoot":"","sources":["../src/fluidAnalyzeMessages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2EH,eAAO,MAAM,YAAY,QAAS,MAAM,KAAG,MAEU,CAAC;AAgZtD,wBAAsB,iBAAiB,CACtC,SAAS,KAAA,EAAE,+CAA+C;AAC1D,gBAAgB,EAAE,OAAO,EACzB,YAAY,EAAE,OAAO,EACrB,iBAAiB,GAAE,GAAG,CAAC,MAAM,CAAqB,iBA0ClD"}