@fluid-tools/fetch-tool 0.53.0-46105

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 (41) hide show
  1. package/.eslintrc.js +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +114 -0
  4. package/bin/fluid-fetch +2 -0
  5. package/dist/fluidAnalyzeMessages.d.ts +8 -0
  6. package/dist/fluidAnalyzeMessages.d.ts.map +1 -0
  7. package/dist/fluidAnalyzeMessages.js +598 -0
  8. package/dist/fluidAnalyzeMessages.js.map +1 -0
  9. package/dist/fluidFetch.d.ts +6 -0
  10. package/dist/fluidFetch.d.ts.map +1 -0
  11. package/dist/fluidFetch.js +119 -0
  12. package/dist/fluidFetch.js.map +1 -0
  13. package/dist/fluidFetchArgs.d.ts +35 -0
  14. package/dist/fluidFetchArgs.d.ts.map +1 -0
  15. package/dist/fluidFetchArgs.js +206 -0
  16. package/dist/fluidFetchArgs.js.map +1 -0
  17. package/dist/fluidFetchInit.d.ts +9 -0
  18. package/dist/fluidFetchInit.d.ts.map +1 -0
  19. package/dist/fluidFetchInit.js +161 -0
  20. package/dist/fluidFetchInit.js.map +1 -0
  21. package/dist/fluidFetchMessages.d.ts +7 -0
  22. package/dist/fluidFetchMessages.d.ts.map +1 -0
  23. package/dist/fluidFetchMessages.js +264 -0
  24. package/dist/fluidFetchMessages.js.map +1 -0
  25. package/dist/fluidFetchSharePoint.d.ts +10 -0
  26. package/dist/fluidFetchSharePoint.d.ts.map +1 -0
  27. package/dist/fluidFetchSharePoint.js +95 -0
  28. package/dist/fluidFetchSharePoint.js.map +1 -0
  29. package/dist/fluidFetchSnapshot.d.ts +7 -0
  30. package/dist/fluidFetchSnapshot.d.ts.map +1 -0
  31. package/dist/fluidFetchSnapshot.js +289 -0
  32. package/dist/fluidFetchSnapshot.js.map +1 -0
  33. package/package.json +65 -0
  34. package/src/fluidAnalyzeMessages.ts +687 -0
  35. package/src/fluidFetch.ts +123 -0
  36. package/src/fluidFetchArgs.ts +224 -0
  37. package/src/fluidFetchInit.ts +168 -0
  38. package/src/fluidFetchMessages.ts +280 -0
  39. package/src/fluidFetchSharePoint.ts +141 -0
  40. package/src/fluidFetchSnapshot.ts +383 -0
  41. package/tsconfig.json +17 -0
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.fluidFetchInit = exports.fluidFetchWebNavigator = exports.connectionInfo = exports.latestVersionsId = void 0;
30
+ const url_1 = require("url");
31
+ const child_process_1 = __importDefault(require("child_process"));
32
+ const AzureUrlResolver_1 = require("@fluidframework/azure-client/dist/AzureUrlResolver");
33
+ const test_client_utils_1 = require("@fluidframework/test-client-utils");
34
+ const driver_utils_1 = require("@fluidframework/driver-utils");
35
+ const fluidapp_odsp_urlresolver_1 = require("@fluid-tools/fluidapp-odsp-urlresolver");
36
+ const odsp = __importStar(require("@fluidframework/odsp-driver"));
37
+ const odsp_urlresolver_1 = require("@fluidframework/odsp-urlresolver");
38
+ const r11s = __importStar(require("@fluidframework/routerlicious-driver"));
39
+ const routerlicious_urlresolver_1 = require("@fluidframework/routerlicious-urlresolver");
40
+ const tool_utils_1 = require("@fluidframework/tool-utils");
41
+ const fluidFetchArgs_1 = require("./fluidFetchArgs");
42
+ const fluidFetchSharePoint_1 = require("./fluidFetchSharePoint");
43
+ exports.latestVersionsId = "";
44
+ const fluidFetchWebNavigator = (url) => {
45
+ let message = "Please open browser and navigate to this URL:";
46
+ if (process.platform === "win32") {
47
+ child_process_1.default.exec(`start "fluid-fetch" /B "${url}"`);
48
+ message = "Opening browser to get authorization code. If that doesn't open, please go to this URL manually";
49
+ }
50
+ console.log(`${message}\n ${url}`);
51
+ };
52
+ exports.fluidFetchWebNavigator = fluidFetchWebNavigator;
53
+ async function initializeODSPCore(odspResolvedUrl, server, clientConfig) {
54
+ const { driveId, itemId } = odspResolvedUrl;
55
+ exports.connectionInfo = {
56
+ server,
57
+ drive: driveId,
58
+ item: itemId,
59
+ };
60
+ if (fluidFetchArgs_1.localDataOnly) {
61
+ return;
62
+ }
63
+ const docId = await odsp.getHashedDocumentId(driveId, itemId);
64
+ console.log(`Connecting to ODSP:
65
+ server: ${server}
66
+ drive: ${driveId}
67
+ item: ${itemId}
68
+ docId: ${docId}`);
69
+ const getStorageTokenStub = async (options) => {
70
+ return fluidFetchSharePoint_1.resolveWrapper(async (authRequestInfo) => {
71
+ if ((options.refresh || !authRequestInfo.accessToken) && authRequestInfo.refreshTokenFn) {
72
+ return authRequestInfo.refreshTokenFn();
73
+ }
74
+ return authRequestInfo.accessToken;
75
+ }, server, clientConfig, undefined, true);
76
+ };
77
+ // eslint-disable-next-line @typescript-eslint/promise-function-async
78
+ const getWebsocketTokenStub = (_options) => Promise.resolve("");
79
+ const odspDocumentServiceFactory = new odsp.OdspDocumentServiceFactory(getStorageTokenStub, getWebsocketTokenStub, undefined, {
80
+ opsBatchSize: 20000,
81
+ concurrentOpsBatches: 4,
82
+ });
83
+ return odspDocumentServiceFactory.createDocumentService(odspResolvedUrl);
84
+ }
85
+ async function initializeR11s(server, pathname, r11sResolvedUrl) {
86
+ const path = pathname.split("/");
87
+ let tenantId;
88
+ let documentId;
89
+ if (server === "localhost" && path.length < 4) {
90
+ tenantId = "fluid";
91
+ documentId = path[2];
92
+ }
93
+ else {
94
+ tenantId = path[2];
95
+ documentId = path[3];
96
+ }
97
+ // Latest version id is the documentId for r11s
98
+ exports.latestVersionsId = documentId;
99
+ exports.connectionInfo = {
100
+ server,
101
+ tenantId,
102
+ id: documentId,
103
+ };
104
+ if (fluidFetchArgs_1.localDataOnly) {
105
+ return;
106
+ }
107
+ console.log(`Connecting to r11s: tenantId=${tenantId} id:${documentId}`);
108
+ const tokenProvider = new r11s.DefaultTokenProvider(fluidFetchArgs_1.paramJWT);
109
+ const r11sDocumentServiceFactory = new r11s.RouterliciousDocumentServiceFactory(tokenProvider);
110
+ return r11sDocumentServiceFactory.createDocumentService(r11sResolvedUrl);
111
+ }
112
+ async function initializeAzure(resolvedUrl, tenantId) {
113
+ exports.connectionInfo = {
114
+ server: resolvedUrl.endpoints.ordererUrl,
115
+ tenantId,
116
+ id: resolvedUrl.id,
117
+ };
118
+ console.log(`Connecting to Azure Fluid Relay: tenantId=${tenantId} id:${resolvedUrl.id}`);
119
+ const user = test_client_utils_1.generateTestUser();
120
+ const tokenProvider = new test_client_utils_1.InsecureTokenProvider(fluidFetchArgs_1.paramAzureKey, user);
121
+ const r11sDocumentServiceFactory = new r11s.RouterliciousDocumentServiceFactory(tokenProvider);
122
+ return r11sDocumentServiceFactory.createDocumentService(resolvedUrl);
123
+ }
124
+ async function resolveUrl(url) {
125
+ const resolversList = [
126
+ new odsp_urlresolver_1.OdspUrlResolver(),
127
+ new fluidapp_odsp_urlresolver_1.FluidAppOdspUrlResolver(),
128
+ // eslint-disable-next-line @typescript-eslint/promise-function-async
129
+ new routerlicious_urlresolver_1.RouterliciousUrlResolver(undefined, () => Promise.resolve(fluidFetchArgs_1.paramJWT), ""),
130
+ new AzureUrlResolver_1.AzureUrlResolver(),
131
+ ];
132
+ const resolved = await driver_utils_1.configurableUrlResolver(resolversList, { url });
133
+ return resolved;
134
+ }
135
+ async function fluidFetchInit(urlStr) {
136
+ const resolvedUrl = await resolveUrl(urlStr);
137
+ if (!resolvedUrl) {
138
+ return Promise.reject(new Error(`Unknown URL ${urlStr}`));
139
+ }
140
+ const protocol = new url_1.URL(resolvedUrl.url).protocol;
141
+ if (protocol === "fluid-odsp:") {
142
+ const odspResolvedUrl = resolvedUrl;
143
+ return initializeODSPCore(odspResolvedUrl, new url_1.URL(odspResolvedUrl.siteUrl).host, tool_utils_1.getMicrosoftConfiguration());
144
+ }
145
+ else if (protocol === "fluid:") {
146
+ const url = new url_1.URL(urlStr);
147
+ const server = url.hostname.toLowerCase();
148
+ return initializeR11s(server, url.pathname, resolvedUrl);
149
+ }
150
+ else if (resolvedUrl.url.includes("fluidrelay.azure.com")) {
151
+ const url = new url_1.URL(urlStr);
152
+ const tenantId = url.searchParams.get("tenantId");
153
+ if (tenantId === null) {
154
+ throw new Error("Azure URL did not contain tenantId");
155
+ }
156
+ return initializeAzure(resolvedUrl, tenantId);
157
+ }
158
+ return Promise.reject(new Error(`Unknown resolved protocol ${protocol}`));
159
+ }
160
+ exports.fluidFetchInit = fluidFetchInit;
161
+ //# sourceMappingURL=fluidFetchInit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluidFetchInit.js","sourceRoot":"","sources":["../src/fluidFetchInit.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { URL } from \"url\";\nimport child_process from \"child_process\";\nimport { AzureUrlResolver } from \"@fluidframework/azure-client/dist/AzureUrlResolver\";\nimport {\n generateTestUser,\n InsecureTokenProvider,\n} from \"@fluidframework/test-client-utils\";\nimport { IFluidResolvedUrl, IResolvedUrl, IUrlResolver } from \"@fluidframework/driver-definitions\";\nimport { configurableUrlResolver } from \"@fluidframework/driver-utils\";\nimport { FluidAppOdspUrlResolver } from \"@fluid-tools/fluidapp-odsp-urlresolver\";\nimport { IClientConfig, IOdspAuthRequestInfo } from \"@fluidframework/odsp-doclib-utils\";\nimport * as odsp from \"@fluidframework/odsp-driver\";\nimport { IOdspResolvedUrl, OdspResourceTokenFetchOptions } from \"@fluidframework/odsp-driver-definitions\";\nimport { OdspUrlResolver } from \"@fluidframework/odsp-urlresolver\";\nimport * as r11s from \"@fluidframework/routerlicious-driver\";\nimport { RouterliciousUrlResolver } from \"@fluidframework/routerlicious-urlresolver\";\nimport { getMicrosoftConfiguration } from \"@fluidframework/tool-utils\";\nimport { localDataOnly, paramAzureKey, paramJWT } from \"./fluidFetchArgs\";\nimport { resolveWrapper } from \"./fluidFetchSharePoint\";\n\nexport let latestVersionsId: string = \"\";\nexport let connectionInfo: any;\n\nexport const fluidFetchWebNavigator = (url: string) => {\n let message = \"Please open browser and navigate to this URL:\";\n if (process.platform === \"win32\") {\n child_process.exec(`start \"fluid-fetch\" /B \"${url}\"`);\n message = \"Opening browser to get authorization code. If that doesn't open, please go to this URL manually\";\n }\n console.log(`${message}\\n ${url}`);\n};\n\nasync function initializeODSPCore(\n odspResolvedUrl: IOdspResolvedUrl,\n server: string,\n clientConfig: IClientConfig,\n) {\n const { driveId, itemId } = odspResolvedUrl;\n\n connectionInfo = {\n server,\n drive: driveId,\n item: itemId,\n };\n\n if (localDataOnly) {\n return;\n }\n\n const docId = await odsp.getHashedDocumentId(driveId, itemId);\n\n console.log(`Connecting to ODSP:\n server: ${server}\n drive: ${driveId}\n item: ${itemId}\n docId: ${docId}`);\n\n const getStorageTokenStub = async (options: OdspResourceTokenFetchOptions) => {\n return resolveWrapper(\n async (authRequestInfo: IOdspAuthRequestInfo) => {\n if ((options.refresh || !authRequestInfo.accessToken) && authRequestInfo.refreshTokenFn) {\n return authRequestInfo.refreshTokenFn();\n }\n return authRequestInfo.accessToken;\n },\n server,\n clientConfig,\n undefined,\n true,\n );\n };\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n const getWebsocketTokenStub = (_options: OdspResourceTokenFetchOptions) => Promise.resolve(\"\");\n const odspDocumentServiceFactory = new odsp.OdspDocumentServiceFactory(\n getStorageTokenStub,\n getWebsocketTokenStub,\n undefined,\n {\n opsBatchSize: 20000,\n concurrentOpsBatches: 4,\n });\n return odspDocumentServiceFactory.createDocumentService(odspResolvedUrl);\n}\n\nasync function initializeR11s(server: string, pathname: string, r11sResolvedUrl: IFluidResolvedUrl) {\n const path = pathname.split(\"/\");\n let tenantId: string;\n let documentId: string;\n if (server === \"localhost\" && path.length < 4) {\n tenantId = \"fluid\";\n documentId = path[2];\n } else {\n tenantId = path[2];\n documentId = path[3];\n }\n\n // Latest version id is the documentId for r11s\n latestVersionsId = documentId;\n\n connectionInfo = {\n server,\n tenantId,\n id: documentId,\n };\n\n if (localDataOnly) {\n return;\n }\n\n console.log(`Connecting to r11s: tenantId=${tenantId} id:${documentId}`);\n const tokenProvider = new r11s.DefaultTokenProvider(paramJWT);\n const r11sDocumentServiceFactory = new r11s.RouterliciousDocumentServiceFactory(tokenProvider);\n return r11sDocumentServiceFactory.createDocumentService(r11sResolvedUrl);\n}\n\nasync function initializeAzure(resolvedUrl: IFluidResolvedUrl, tenantId: string) {\n connectionInfo = {\n server: resolvedUrl.endpoints.ordererUrl,\n tenantId,\n id: resolvedUrl.id,\n };\n console.log(`Connecting to Azure Fluid Relay: tenantId=${tenantId} id:${resolvedUrl.id}`);\n const user = generateTestUser();\n const tokenProvider = new InsecureTokenProvider(paramAzureKey, user);\n const r11sDocumentServiceFactory = new r11s.RouterliciousDocumentServiceFactory(tokenProvider);\n return r11sDocumentServiceFactory.createDocumentService(resolvedUrl);\n}\n\nasync function resolveUrl(url: string): Promise<IResolvedUrl | undefined> {\n const resolversList: IUrlResolver[] = [\n new OdspUrlResolver(),\n new FluidAppOdspUrlResolver(),\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n new RouterliciousUrlResolver(undefined, () => Promise.resolve(paramJWT), \"\"),\n new AzureUrlResolver(),\n ];\n const resolved = await configurableUrlResolver(resolversList, { url });\n return resolved;\n}\n\nexport async function fluidFetchInit(urlStr: string) {\n const resolvedUrl = await resolveUrl(urlStr) as IFluidResolvedUrl;\n if (!resolvedUrl) {\n return Promise.reject(new Error(`Unknown URL ${urlStr}`));\n }\n const protocol = new URL(resolvedUrl.url).protocol;\n if (protocol === \"fluid-odsp:\") {\n const odspResolvedUrl = resolvedUrl as IOdspResolvedUrl;\n return initializeODSPCore(odspResolvedUrl, new URL(odspResolvedUrl.siteUrl).host, getMicrosoftConfiguration());\n } else if (protocol === \"fluid:\") {\n const url = new URL(urlStr);\n const server = url.hostname.toLowerCase();\n return initializeR11s(server, url.pathname, resolvedUrl);\n } else if (resolvedUrl.url.includes(\"fluidrelay.azure.com\")) {\n const url = new URL(urlStr);\n const tenantId = url.searchParams.get(\"tenantId\");\n if (tenantId === null) {\n throw new Error(\"Azure URL did not contain tenantId\");\n }\n return initializeAzure(resolvedUrl, tenantId);\n }\n return Promise.reject(new Error(`Unknown resolved protocol ${protocol}`));\n}\n"]}
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { IDocumentService } from "@fluidframework/driver-definitions";
6
+ export declare function fluidFetchMessages(documentService?: IDocumentService, saveDir?: string): Promise<void>;
7
+ //# sourceMappingURL=fluidFetchMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluidFetchMessages.d.ts","sourceRoot":"","sources":["../src/fluidFetchMessages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACH,gBAAgB,EACnB,MAAM,oCAAoC,CAAC;AA6O5C,wBAAsB,kBAAkB,CAAC,eAAe,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,iBAiC5F"}
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
7
+ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
8
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
9
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
10
+ return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
11
+ function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
12
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
13
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
14
+ function fulfill(value) { resume("next", value); }
15
+ function reject(value) { resume("throw", value); }
16
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
17
+ };
18
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
19
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
20
+ var m = o[Symbol.asyncIterator], i;
21
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
22
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
23
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.fluidFetchMessages = void 0;
30
+ const fs_1 = __importDefault(require("fs"));
31
+ const common_utils_1 = require("@fluidframework/common-utils");
32
+ const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
33
+ const fluidAnalyzeMessages_1 = require("./fluidAnalyzeMessages");
34
+ const fluidFetchArgs_1 = require("./fluidFetchArgs");
35
+ function filenameFromIndex(index) {
36
+ return index === 0 ? "" : index.toString(); // support old tools...
37
+ }
38
+ let firstAvailableDelta = 1;
39
+ function loadAllSequencedMessages(documentService, dir, files) {
40
+ return __asyncGenerator(this, arguments, function* loadAllSequencedMessages_1() {
41
+ let lastSeq = 0;
42
+ // flag for mismatch between last sequence number read and new one to be read
43
+ let seqNumMismatch = false;
44
+ // If we have local save, read ops from there first
45
+ if (files !== undefined) {
46
+ for (let i = 0; i < files.length; i++) {
47
+ const file = filenameFromIndex(i);
48
+ try {
49
+ console.log(`reading messages${file}.json`);
50
+ const fileContent = fs_1.default.readFileSync(`${dir}/messages${file}.json`, { encoding: "utf-8" });
51
+ const messages = JSON.parse(fileContent);
52
+ // check if there is mismatch
53
+ seqNumMismatch = messages[0].sequenceNumber !== lastSeq + 1;
54
+ common_utils_1.assert(!seqNumMismatch, 0x1b9 /* "Unexpected value for sequence number of first message in file" */);
55
+ lastSeq = messages[messages.length - 1].sequenceNumber;
56
+ yield yield __await(messages);
57
+ }
58
+ catch (e) {
59
+ if (seqNumMismatch) {
60
+ if (fluidFetchArgs_1.overWrite) {
61
+ // with overWrite option on, we will delete all exisintg message.json files
62
+ for (let index = 0; index < files.length; index++) {
63
+ const name = filenameFromIndex(index);
64
+ fs_1.default.unlinkSync(`${dir}/messages${name}.json`);
65
+ }
66
+ break;
67
+ }
68
+ // prompt user to back up and delete existing files
69
+ console.error("There are deleted ops in the document being requested," +
70
+ " please back up the existing messages.json file and delete it from its directory." +
71
+ " Then try fetch tool again.");
72
+ console.error(e);
73
+ return yield __await(void 0);
74
+ }
75
+ else {
76
+ console.error(`Error reading / parsing messages from ${files}`);
77
+ console.error(e);
78
+ return yield __await(void 0);
79
+ }
80
+ }
81
+ }
82
+ if (lastSeq !== 0) {
83
+ console.log(`Read ${lastSeq} ops from local cache`);
84
+ }
85
+ }
86
+ if (!documentService) {
87
+ return yield __await(void 0);
88
+ }
89
+ const deltaStorage = yield __await(documentService.connectToDeltaStorage());
90
+ let timeStart = Date.now();
91
+ let requests = 0;
92
+ let opsStorage = 0;
93
+ // reading only 1 op to test if there is mismatch
94
+ const teststream = deltaStorage.fetchMessages(lastSeq + 1, lastSeq + 2);
95
+ let statusCode;
96
+ let innerMostErrorCode;
97
+ let response;
98
+ try {
99
+ yield __await(teststream.read());
100
+ }
101
+ catch (error) {
102
+ statusCode = error.getTelemetryProperties().statusCode;
103
+ innerMostErrorCode = error.getTelemetryProperties().innerMostErrorCode;
104
+ // if there is gap between ops, catch the error and check it is the error we need
105
+ if (statusCode !== 410 || innerMostErrorCode !== "fluidDeltaDataNotAvailable") {
106
+ throw error;
107
+ }
108
+ // get firstAvailableDelta from the error response, and set current sequence number to that
109
+ response = JSON.parse(error.getTelemetryProperties().response);
110
+ firstAvailableDelta = response.error.firstAvailableDelta;
111
+ lastSeq = firstAvailableDelta - 1;
112
+ }
113
+ // continue reading rest of the ops
114
+ const stream = deltaStorage.fetchMessages(lastSeq + 1, // inclusive left
115
+ undefined);
116
+ while (true) {
117
+ const result = yield __await(stream.read());
118
+ if (result.done) {
119
+ break;
120
+ }
121
+ requests++;
122
+ const messages = result.value;
123
+ // Empty buckets should never be returned
124
+ common_utils_1.assert(messages.length !== 0, 0x1ba /* "should not return empty buckets" */);
125
+ // console.log(`Loaded ops at ${messages[0].sequenceNumber}`);
126
+ // This parsing of message contents happens in delta manager. But when we analyze messages
127
+ // for message stats, we skip that path. So parsing of json contents needs to happen here.
128
+ for (const message of messages) {
129
+ if (typeof message.contents === "string"
130
+ && message.contents !== ""
131
+ && message.type !== protocol_definitions_1.MessageType.ClientLeave) {
132
+ message.contents = JSON.parse(message.contents);
133
+ }
134
+ }
135
+ opsStorage += messages.length;
136
+ lastSeq = messages[messages.length - 1].sequenceNumber;
137
+ yield yield __await(messages);
138
+ }
139
+ // eslint-disable-next-line max-len
140
+ console.log(`\n${Math.floor((Date.now() - timeStart) / 1000)} seconds to retrieve ${opsStorage} ops in ${requests} requests`);
141
+ if (fluidFetchArgs_1.connectToWebSocket) {
142
+ let logMsg = "";
143
+ const client = {
144
+ mode: "write",
145
+ permission: [],
146
+ scopes: [protocol_definitions_1.ScopeType.DocRead, protocol_definitions_1.ScopeType.DocWrite, protocol_definitions_1.ScopeType.SummaryWrite],
147
+ details: {
148
+ capabilities: { interactive: true },
149
+ },
150
+ user: { id: "blah" },
151
+ };
152
+ console.log("Retrieving messages from web socket");
153
+ timeStart = Date.now();
154
+ const deltaStream = yield __await(documentService.connectToDeltaStream(client));
155
+ const initialMessages = deltaStream.initialMessages;
156
+ deltaStream.dispose();
157
+ console.log(`${Math.floor((Date.now() - timeStart) / 1000)} seconds to connect to web socket`);
158
+ if (initialMessages) {
159
+ const lastSequenceNumber = lastSeq;
160
+ const filtered = initialMessages.filter((a) => a.sequenceNumber > lastSequenceNumber);
161
+ const sorted = filtered.sort((a, b) => a.sequenceNumber - b.sequenceNumber);
162
+ lastSeq = sorted[sorted.length - 1].sequenceNumber;
163
+ // eslint-disable-next-line max-len
164
+ logMsg = ` (${opsStorage} delta storage, ${initialMessages.length} initial ws messages, ${initialMessages.length - sorted.length} dup)`;
165
+ yield yield __await(sorted);
166
+ }
167
+ console.log(`${lastSeq} total messages${logMsg}`);
168
+ }
169
+ });
170
+ }
171
+ function saveOps(gen, // AsyncGenerator<ISequencedDocumentMessage[]>,
172
+ dir, files) {
173
+ return __asyncGenerator(this, arguments, function* saveOps_1() {
174
+ // Split into 100K ops
175
+ const chunk = 100 * 1000;
176
+ let sequencedMessages = [];
177
+ // Figure out first file we want to write to
178
+ let index = 0;
179
+ let curr = 1;
180
+ if (files.length !== 0) {
181
+ index = files.length - 1;
182
+ const name = filenameFromIndex(index);
183
+ const fileContent = fs_1.default.readFileSync(`${dir}/messages${name}.json`, { encoding: "utf-8" });
184
+ const messages = JSON.parse(fileContent);
185
+ curr = messages[0].sequenceNumber;
186
+ }
187
+ while (true) {
188
+ const result = yield __await(gen.next());
189
+ if (files.length === 0) {
190
+ curr = firstAvailableDelta;
191
+ }
192
+ if (!result.done) {
193
+ let messages = result.value;
194
+ yield yield __await(messages);
195
+ if (messages[messages.length - 1].sequenceNumber < curr) {
196
+ // Nothing interesting.
197
+ continue;
198
+ }
199
+ if (messages[0].sequenceNumber < curr) {
200
+ messages = messages.filter((msg) => msg.sequenceNumber >= curr);
201
+ }
202
+ sequencedMessages = sequencedMessages.concat(messages);
203
+ common_utils_1.assert(sequencedMessages[0].sequenceNumber === curr, 0x1bb /* "Unexpected sequence number on first of messages to save" */);
204
+ common_utils_1.assert(sequencedMessages[sequencedMessages.length - 1].sequenceNumber
205
+ === curr + sequencedMessages.length - 1, 0x1bc /* "Unexpected sequence number on last of messages to save" */);
206
+ }
207
+ // Time to write it out?
208
+ while (sequencedMessages.length >= chunk || (result.done && sequencedMessages.length !== 0)) {
209
+ const name = filenameFromIndex(index);
210
+ const write = sequencedMessages.splice(0, chunk);
211
+ console.log(`writing messages${name}.json`);
212
+ fs_1.default.writeFileSync(`${dir}/messages${name}.json`, JSON.stringify(write, undefined, fluidFetchArgs_1.paramActualFormatting ? 0 : 2));
213
+ // increment curr by chunk
214
+ curr += chunk;
215
+ common_utils_1.assert(sequencedMessages.length === 0 || sequencedMessages[0].sequenceNumber === curr, 0x1bd /* "Stopped writing at unexpected sequence number" */);
216
+ index++;
217
+ }
218
+ if (result.done) {
219
+ break;
220
+ }
221
+ }
222
+ });
223
+ }
224
+ async function fluidFetchMessages(documentService, saveDir) {
225
+ var e_1, _a;
226
+ const messageStats = fluidFetchArgs_1.dumpMessageStats || fluidFetchArgs_1.dumpMessages;
227
+ if (!messageStats && (saveDir === undefined || documentService === undefined)) {
228
+ return;
229
+ }
230
+ const files = !saveDir ?
231
+ undefined :
232
+ fs_1.default.readdirSync(saveDir)
233
+ .filter((file) => {
234
+ if (!file.startsWith("messages")) {
235
+ return false;
236
+ }
237
+ return true;
238
+ })
239
+ .sort((a, b) => a.localeCompare(b));
240
+ let generator = loadAllSequencedMessages(documentService, saveDir, files);
241
+ if (saveDir && files !== undefined && documentService) {
242
+ generator = saveOps(generator, saveDir, files);
243
+ }
244
+ if (messageStats) {
245
+ return fluidAnalyzeMessages_1.printMessageStats(generator, fluidFetchArgs_1.dumpMessageStats, fluidFetchArgs_1.dumpMessages, fluidFetchArgs_1.messageTypeFilter);
246
+ }
247
+ else {
248
+ let item;
249
+ try {
250
+ for (var generator_1 = __asyncValues(generator), generator_1_1; generator_1_1 = await generator_1.next(), !generator_1_1.done;) {
251
+ item = generator_1_1.value;
252
+ }
253
+ }
254
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
255
+ finally {
256
+ try {
257
+ if (generator_1_1 && !generator_1_1.done && (_a = generator_1.return)) await _a.call(generator_1);
258
+ }
259
+ finally { if (e_1) throw e_1.error; }
260
+ }
261
+ }
262
+ }
263
+ exports.fluidFetchMessages = fluidFetchMessages;
264
+ //# sourceMappingURL=fluidFetchMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluidFetchMessages.js","sourceRoot":"","sources":["../src/fluidFetchMessages.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,4CAAoB;AACpB,+DAAsD;AAItD,+EAK8C;AAC9C,iEAA2D;AAC3D,qDAO0B;AAE1B,SAAS,iBAAiB,CAAC,KAAa;IACpC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,uBAAuB;AACvE,CAAC;AAED,IAAI,mBAAmB,GAAG,CAAC,CAAC;AAC5B,SAAgB,wBAAwB,CACpC,eAAkC,EAClC,GAAY,EACZ,KAAgB;;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,6EAA6E;QAC7E,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,mDAAmD;QACnD,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACnC,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI;oBACA,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,CAAC;oBAC5C,MAAM,WAAW,GAAG,YAAE,CAAC,YAAY,CAAC,GAAG,GAAG,YAAY,IAAI,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC1F,MAAM,QAAQ,GAAgC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;oBACtE,6BAA6B;oBAC7B,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,OAAO,GAAG,CAAC,CAAC;oBAC5D,qBAAM,CAAC,CAAC,cAAc,EAAE,KAAK,CAAC,qEAAqE,CAAC,CAAC;oBACrG,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;oBACvD,oBAAM,QAAQ,CAAA,CAAC;iBAClB;gBAAC,OAAO,CAAC,EAAE;oBACR,IAAI,cAAc,EAAE;wBAChB,IAAI,0BAAS,EAAE;4BACX,2EAA2E;4BAC3E,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gCAC/C,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;gCACtC,YAAE,CAAC,UAAU,CAAC,GAAG,GAAG,YAAY,IAAI,OAAO,CAAC,CAAC;6BAChD;4BACD,MAAM;yBACT;wBACD,mDAAmD;wBACnD,OAAO,CAAC,KAAK,CAAC,wDAAwD;4BAClE,mFAAmF;4BACnF,6BAA6B,CAAC,CAAC;wBACnC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBACjB,6BAAO;qBACV;yBAAM;wBACH,OAAO,CAAC,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;wBAChE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBACjB,6BAAO;qBACV;iBACJ;aACJ;YACD,IAAI,OAAO,KAAK,CAAC,EAAE;gBACf,OAAO,CAAC,GAAG,CAAC,QAAQ,OAAO,uBAAuB,CAAC,CAAC;aACvD;SACJ;QAED,IAAI,CAAC,eAAe,EAAE;YAClB,6BAAO;SACV;QAED,MAAM,YAAY,GAAG,cAAM,eAAe,CAAC,qBAAqB,EAAE,CAAA,CAAC;QAEnE,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,iDAAiD;QACjD,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,CACzC,OAAO,GAAG,CAAC,EACX,OAAO,GAAG,CAAC,CAAC,CAAC;QAEjB,IAAI,UAAU,CAAC;QACf,IAAI,kBAAkB,CAAC;QACvB,IAAI,QAAQ,CAAC;QAEb,IAAI;YACA,cAAM,UAAU,CAAC,IAAI,EAAE,CAAA,CAAC;SAC3B;QAAC,OAAO,KAAK,EAAE;YACZ,UAAU,GAAG,KAAK,CAAC,sBAAsB,EAAE,CAAC,UAAU,CAAC;YACvD,kBAAkB,GAAG,KAAK,CAAC,sBAAsB,EAAE,CAAC,kBAAkB,CAAC;YACvE,iFAAiF;YACjF,IAAI,UAAU,KAAK,GAAG,IAAI,kBAAkB,KAAK,4BAA4B,EAAE;gBAC3E,MAAM,KAAK,CAAC;aACf;YACD,2FAA2F;YAC3F,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC/D,mBAAmB,GAAG,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC;YACzD,OAAO,GAAG,mBAAmB,GAAG,CAAC,CAAC;SACrC;QAED,mCAAmC;QACnC,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CACrC,OAAO,GAAG,CAAC,EAAE,iBAAiB;QAC9B,SAAS,CACZ,CAAC;QAEF,OAAO,IAAI,EAAE;YACT,MAAM,MAAM,GAAG,cAAM,MAAM,CAAC,IAAI,EAAE,CAAA,CAAC;YACnC,IAAI,MAAM,CAAC,IAAI,EAAE;gBACb,MAAM;aACT;YACD,QAAQ,EAAE,CAAC;YACX,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;YAE9B,yCAAyC;YACzC,qBAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC7E,8DAA8D;YAE9D,0FAA0F;YAC1F,0FAA0F;YAC1F,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC5B,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;uBACjC,OAAO,CAAC,QAAQ,KAAK,EAAE;uBACvB,OAAO,CAAC,IAAI,KAAK,kCAAW,CAAC,WAAW,EAC7C;oBACE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;iBACnD;aACJ;YAED,UAAU,IAAI,QAAQ,CAAC,MAAM,CAAC;YAC9B,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;YACvD,oBAAM,QAAQ,CAAA,CAAC;SAClB;QAED,mCAAmC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,wBAAwB,UAAU,WAAW,QAAQ,WAAW,CAAC,CAAC;QAE9H,IAAI,mCAAkB,EAAE;YACpB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,MAAM,MAAM,GAAY;gBACpB,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE,CAAC,gCAAS,CAAC,OAAO,EAAE,gCAAS,CAAC,QAAQ,EAAE,gCAAS,CAAC,YAAY,CAAC;gBACvE,OAAO,EAAE;oBACL,YAAY,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;iBACtC;gBACD,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;aACvB,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,cAAM,eAAe,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAA,CAAC;YACvE,MAAM,eAAe,GAAG,WAAW,CAAC,eAAe,CAAC;YACpD,WAAW,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAE/F,IAAI,eAAe,EAAE;gBACjB,MAAM,kBAAkB,GAAG,OAAO,CAAC;gBACnC,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,kBAAkB,CAAC,CAAC;gBACtF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;gBAC5E,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;gBACnD,mCAAmC;gBACnC,MAAM,GAAG,KAAK,UAAU,mBAAmB,eAAe,CAAC,MAAM,yBAAyB,eAAe,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,OAAO,CAAC;gBACxI,oBAAM,MAAM,CAAA,CAAC;aAChB;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,kBAAkB,MAAM,EAAE,CAAC,CAAC;SACrD;IACL,CAAC;CAAA;AAED,SAAgB,OAAO,CACnB,GAAG,EAAE,+CAA+C;AACpD,GAAW,EACX,KAAe;;QACf,sBAAsB;QACtB,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;QAEzB,IAAI,iBAAiB,GAAgC,EAAE,CAAC;QAExD,4CAA4C;QAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,IAAI,GAAW,CAAC,CAAC;QACrB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YACpB,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,YAAE,CAAC,YAAY,CAAC,GAAG,GAAG,YAAY,IAAI,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1F,MAAM,QAAQ,GAAgC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACtE,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;SACrC;QAED,OAAO,IAAI,EAAE;YACT,MAAM,MAAM,GAAgD,cAAM,GAAG,CAAC,IAAI,EAAE,CAAA,CAAC;YAC7E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;gBACpB,IAAI,GAAG,mBAAmB,CAAC;aAC9B;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;gBACd,IAAI,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC5B,oBAAM,QAAQ,CAAA,CAAC;gBACf,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,GAAG,IAAI,EAAE;oBACrD,uBAAuB;oBACvB,SAAS;iBACZ;gBACD,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,IAAI,EAAE;oBACnC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC;iBACnE;gBACD,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvD,qBAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,EAC/C,KAAK,CAAC,+DAA+D,CAAC,CAAC;gBAC3E,qBAAM,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc;wBAC7D,IAAI,GAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,EACvC,KAAK,CAAC,8DAA8D,CAAC,CAAC;aAC7E;YAED,wBAAwB;YACxB,OAAO,iBAAiB,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE;gBACzF,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBACtC,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,CAAC;gBAC5C,YAAE,CAAC,aAAa,CACZ,GAAG,GAAG,YAAY,IAAI,OAAO,EAC7B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,sCAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrE,0BAA0B;gBAC1B,IAAI,IAAI,KAAK,CAAC;gBACd,qBAAM,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,EACjF,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACjE,KAAK,EAAE,CAAC;aACX;YAED,IAAI,MAAM,CAAC,IAAI,EAAE;gBACb,MAAM;aACT;SACJ;IACL,CAAC;CAAA;AAEM,KAAK,UAAU,kBAAkB,CAAC,eAAkC,EAAE,OAAgB;;IACzF,MAAM,YAAY,GAAG,iCAAgB,IAAI,6BAAY,CAAC;IACtD,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,eAAe,KAAK,SAAS,CAAC,EAAE;QAC3E,OAAO;KACV;IAED,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC;QACpB,SAAS,CAAC,CAAC;QACX,YAAE,CAAC,WAAW,CAAC,OAAO,CAAC;aAClB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;gBAC9B,OAAO,KAAK,CAAC;aAChB;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5C,IAAI,SAAS,GAAG,wBAAwB,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAE1E,IAAI,OAAO,IAAI,KAAK,KAAK,SAAS,IAAI,eAAe,EAAE;QACnD,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;KAClD;IAED,IAAI,YAAY,EAAE;QACd,OAAO,wCAAiB,CACpB,SAAS,EACT,iCAAgB,EAChB,6BAAY,EACZ,kCAAiB,CAAC,CAAC;KAC1B;SAAM;QACH,IAAI,IAAI,CAAC;;YACT,KAAmB,IAAA,cAAA,cAAA,SAAS,CAAA,eAAA;gBAAjB,IAAI,sBAAA,CAAA;aAAkB;;;;;;;;;KACpC;AACL,CAAC;AAjCD,gDAiCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport {\n IDocumentService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n IClient,\n ISequencedDocumentMessage,\n MessageType,\n ScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport { printMessageStats } from \"./fluidAnalyzeMessages\";\nimport {\n connectToWebSocket,\n dumpMessages,\n dumpMessageStats,\n overWrite,\n paramActualFormatting,\n messageTypeFilter,\n} from \"./fluidFetchArgs\";\n\nfunction filenameFromIndex(index: number): string {\n return index === 0 ? \"\" : index.toString(); // support old tools...\n}\n\nlet firstAvailableDelta = 1;\nasync function* loadAllSequencedMessages(\n documentService?: IDocumentService,\n dir?: string,\n files?: string[]) {\n let lastSeq = 0;\n // flag for mismatch between last sequence number read and new one to be read\n let seqNumMismatch = false;\n\n // If we have local save, read ops from there first\n if (files !== undefined) {\n for (let i = 0; i < files.length; i++) {\n const file = filenameFromIndex(i);\n try {\n console.log(`reading messages${file}.json`);\n const fileContent = fs.readFileSync(`${dir}/messages${file}.json`, { encoding: \"utf-8\" });\n const messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n // check if there is mismatch\n seqNumMismatch = messages[0].sequenceNumber !== lastSeq + 1;\n assert(!seqNumMismatch, 0x1b9 /* \"Unexpected value for sequence number of first message in file\" */);\n lastSeq = messages[messages.length - 1].sequenceNumber;\n yield messages;\n } catch (e) {\n if (seqNumMismatch) {\n if (overWrite) {\n // with overWrite option on, we will delete all exisintg message.json files\n for (let index = 0; index < files.length; index++) {\n const name = filenameFromIndex(index);\n fs.unlinkSync(`${dir}/messages${name}.json`);\n }\n break;\n }\n // prompt user to back up and delete existing files\n console.error(\"There are deleted ops in the document being requested,\" +\n \" please back up the existing messages.json file and delete it from its directory.\" +\n \" Then try fetch tool again.\");\n console.error(e);\n return;\n } else {\n console.error(`Error reading / parsing messages from ${files}`);\n console.error(e);\n return;\n }\n }\n }\n if (lastSeq !== 0) {\n console.log(`Read ${lastSeq} ops from local cache`);\n }\n }\n\n if (!documentService) {\n return;\n }\n\n const deltaStorage = await documentService.connectToDeltaStorage();\n\n let timeStart = Date.now();\n let requests = 0;\n let opsStorage = 0;\n\n // reading only 1 op to test if there is mismatch\n const teststream = deltaStorage.fetchMessages(\n lastSeq + 1,\n lastSeq + 2);\n\n let statusCode;\n let innerMostErrorCode;\n let response;\n\n try {\n await teststream.read();\n } catch (error) {\n statusCode = error.getTelemetryProperties().statusCode;\n innerMostErrorCode = error.getTelemetryProperties().innerMostErrorCode;\n // if there is gap between ops, catch the error and check it is the error we need\n if (statusCode !== 410 || innerMostErrorCode !== \"fluidDeltaDataNotAvailable\") {\n throw error;\n }\n // get firstAvailableDelta from the error response, and set current sequence number to that\n response = JSON.parse(error.getTelemetryProperties().response);\n firstAvailableDelta = response.error.firstAvailableDelta;\n lastSeq = firstAvailableDelta - 1;\n }\n\n // continue reading rest of the ops\n const stream = deltaStorage.fetchMessages(\n lastSeq + 1, // inclusive left\n undefined, // to\n );\n\n while (true) {\n const result = await stream.read();\n if (result.done) {\n break;\n }\n requests++;\n const messages = result.value;\n\n // Empty buckets should never be returned\n assert(messages.length !== 0, 0x1ba /* \"should not return empty buckets\" */);\n // console.log(`Loaded ops at ${messages[0].sequenceNumber}`);\n\n // This parsing of message contents happens in delta manager. But when we analyze messages\n // for message stats, we skip that path. So parsing of json contents needs to happen here.\n for (const message of messages) {\n if (typeof message.contents === \"string\"\n && message.contents !== \"\"\n && message.type !== MessageType.ClientLeave\n ) {\n message.contents = JSON.parse(message.contents);\n }\n }\n\n opsStorage += messages.length;\n lastSeq = messages[messages.length - 1].sequenceNumber;\n yield messages;\n }\n\n // eslint-disable-next-line max-len\n console.log(`\\n${Math.floor((Date.now() - timeStart) / 1000)} seconds to retrieve ${opsStorage} ops in ${requests} requests`);\n\n if (connectToWebSocket) {\n let logMsg = \"\";\n const client: IClient = {\n mode: \"write\",\n permission: [],\n scopes: [ScopeType.DocRead, ScopeType.DocWrite, ScopeType.SummaryWrite],\n details: {\n capabilities: { interactive: true },\n },\n user: { id: \"blah\" },\n };\n console.log(\"Retrieving messages from web socket\");\n timeStart = Date.now();\n const deltaStream = await documentService.connectToDeltaStream(client);\n const initialMessages = deltaStream.initialMessages;\n deltaStream.dispose();\n console.log(`${Math.floor((Date.now() - timeStart) / 1000)} seconds to connect to web socket`);\n\n if (initialMessages) {\n const lastSequenceNumber = lastSeq;\n const filtered = initialMessages.filter((a) => a.sequenceNumber > lastSequenceNumber);\n const sorted = filtered.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n lastSeq = sorted[sorted.length - 1].sequenceNumber;\n // eslint-disable-next-line max-len\n logMsg = ` (${opsStorage} delta storage, ${initialMessages.length} initial ws messages, ${initialMessages.length - sorted.length} dup)`;\n yield sorted;\n }\n console.log(`${lastSeq} total messages${logMsg}`);\n }\n}\n\nasync function* saveOps(\n gen, // AsyncGenerator<ISequencedDocumentMessage[]>,\n dir: string,\n files: string[]) {\n // Split into 100K ops\n const chunk = 100 * 1000;\n\n let sequencedMessages: ISequencedDocumentMessage[] = [];\n\n // Figure out first file we want to write to\n let index = 0;\n let curr: number = 1;\n if (files.length !== 0) {\n index = files.length - 1;\n const name = filenameFromIndex(index);\n const fileContent = fs.readFileSync(`${dir}/messages${name}.json`, { encoding: \"utf-8\" });\n const messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n curr = messages[0].sequenceNumber;\n }\n\n while (true) {\n const result: IteratorResult<ISequencedDocumentMessage[]> = await gen.next();\n if (files.length === 0) {\n curr = firstAvailableDelta;\n }\n if (!result.done) {\n let messages = result.value;\n yield messages;\n if (messages[messages.length - 1].sequenceNumber < curr) {\n // Nothing interesting.\n continue;\n }\n if (messages[0].sequenceNumber < curr) {\n messages = messages.filter((msg) => msg.sequenceNumber >= curr);\n }\n sequencedMessages = sequencedMessages.concat(messages);\n assert(sequencedMessages[0].sequenceNumber === curr,\n 0x1bb /* \"Unexpected sequence number on first of messages to save\" */);\n assert(sequencedMessages[sequencedMessages.length - 1].sequenceNumber\n === curr + sequencedMessages.length - 1,\n 0x1bc /* \"Unexpected sequence number on last of messages to save\" */);\n }\n\n // Time to write it out?\n while (sequencedMessages.length >= chunk || (result.done && sequencedMessages.length !== 0)) {\n const name = filenameFromIndex(index);\n const write = sequencedMessages.splice(0, chunk);\n console.log(`writing messages${name}.json`);\n fs.writeFileSync(\n `${dir}/messages${name}.json`,\n JSON.stringify(write, undefined, paramActualFormatting ? 0 : 2));\n // increment curr by chunk\n curr += chunk;\n assert(sequencedMessages.length === 0 || sequencedMessages[0].sequenceNumber === curr,\n 0x1bd /* \"Stopped writing at unexpected sequence number\" */);\n index++;\n }\n\n if (result.done) {\n break;\n }\n }\n}\n\nexport async function fluidFetchMessages(documentService?: IDocumentService, saveDir?: string) {\n const messageStats = dumpMessageStats || dumpMessages;\n if (!messageStats && (saveDir === undefined || documentService === undefined)) {\n return;\n }\n\n const files = !saveDir ?\n undefined :\n fs.readdirSync(saveDir)\n .filter((file) => {\n if (!file.startsWith(\"messages\")) {\n return false;\n }\n return true;\n })\n .sort((a, b) => a.localeCompare(b));\n\n let generator = loadAllSequencedMessages(documentService, saveDir, files);\n\n if (saveDir && files !== undefined && documentService) {\n generator = saveOps(generator, saveDir, files);\n }\n\n if (messageStats) {\n return printMessageStats(\n generator,\n dumpMessageStats,\n dumpMessages,\n messageTypeFilter);\n } else {\n let item;\n for await (item of generator) { }\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { IClientConfig, IOdspDriveItem, IOdspAuthRequestInfo } from "@fluidframework/odsp-doclib-utils";
6
+ export declare function resolveWrapper<T>(callback: (authRequestInfo: IOdspAuthRequestInfo) => Promise<T>, server: string, clientConfig: IClientConfig, forceTokenReauth?: boolean, forToken?: boolean): Promise<T>;
7
+ export declare function resolveDriveItemByServerRelativePath(server: string, serverRelativePath: string, clientConfig: IClientConfig): Promise<IOdspDriveItem>;
8
+ export declare function getSharepointFiles(server: string, serverRelativePath: string, recurse: boolean): Promise<IOdspDriveItem[]>;
9
+ export declare function getSingleSharePointFile(server: string, drive: string, item: string): Promise<IOdspDriveItem>;
10
+ //# sourceMappingURL=fluidFetchSharePoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluidFetchSharePoint.d.ts","sourceRoot":"","sources":["../src/fluidFetchSharePoint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAIH,aAAa,EACb,cAAc,EAEd,oBAAoB,EACvB,MAAM,mCAAmC,CAAC;AAW3C,wBAAsB,cAAc,CAAC,CAAC,EAClC,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,GACjB,OAAO,CAAC,CAAC,CAAC,CAkCZ;AAED,wBAAsB,oCAAoC,CACtD,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,EAC1B,YAAY,EAAE,aAAa,2BAW9B;AAaD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,6BA+BpG;AAED,wBAAsB,uBAAuB,CACzC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,2BAUf"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getSingleSharePointFile = exports.getSharepointFiles = exports.resolveDriveItemByServerRelativePath = exports.resolveWrapper = void 0;
8
+ const driver_definitions_1 = require("@fluidframework/driver-definitions");
9
+ const odsp_doclib_utils_1 = require("@fluidframework/odsp-doclib-utils");
10
+ const tool_utils_1 = require("@fluidframework/tool-utils");
11
+ const fluidFetchInit_1 = require("./fluidFetchInit");
12
+ const fluidFetchArgs_1 = require("./fluidFetchArgs");
13
+ async function resolveWrapper(callback, server, clientConfig, forceTokenReauth = false, forToken = false) {
14
+ try {
15
+ const odspTokenManager = new tool_utils_1.OdspTokenManager(tool_utils_1.odspTokensCache);
16
+ const tokenConfig = {
17
+ type: "browserLogin",
18
+ navigator: fluidFetchInit_1.fluidFetchWebNavigator,
19
+ };
20
+ const tokens = await odspTokenManager.getOdspTokens(server, clientConfig, tokenConfig, undefined /* forceRefresh */, forceTokenReauth || fluidFetchArgs_1.getForceTokenReauth());
21
+ const result = await callback({
22
+ accessToken: tokens.accessToken,
23
+ refreshTokenFn: odsp_doclib_utils_1.getOdspRefreshTokenFn(server, clientConfig, tokens),
24
+ });
25
+ // If this is used for getting a token, then refresh the cache with new token.
26
+ if (forToken) {
27
+ const key = { isPush: false, userOrServer: server };
28
+ await odspTokenManager.updateTokensCache(key, { accessToken: result, refreshToken: tokens.refreshToken });
29
+ return result;
30
+ }
31
+ return result;
32
+ }
33
+ catch (e) {
34
+ if (e.errorType === driver_definitions_1.DriverErrorType.authorizationError && !forceTokenReauth) {
35
+ // Re-auth
36
+ return resolveWrapper(callback, server, clientConfig, true, forToken);
37
+ }
38
+ throw e;
39
+ }
40
+ }
41
+ exports.resolveWrapper = resolveWrapper;
42
+ async function resolveDriveItemByServerRelativePath(server, serverRelativePath, clientConfig) {
43
+ return resolveWrapper(
44
+ // eslint-disable-next-line @typescript-eslint/promise-function-async
45
+ (authRequestInfo) => odsp_doclib_utils_1.getDriveItemByServerRelativePath(server, serverRelativePath, authRequestInfo, false), server, clientConfig);
46
+ }
47
+ exports.resolveDriveItemByServerRelativePath = resolveDriveItemByServerRelativePath;
48
+ async function resolveChildrenByDriveItem(server, folderDriveItem, clientConfig) {
49
+ return resolveWrapper(
50
+ // eslint-disable-next-line @typescript-eslint/promise-function-async
51
+ (authRequestInfo) => odsp_doclib_utils_1.getChildrenByDriveItem(folderDriveItem, server, authRequestInfo), server, clientConfig);
52
+ }
53
+ async function getSharepointFiles(server, serverRelativePath, recurse) {
54
+ const clientConfig = tool_utils_1.getMicrosoftConfiguration();
55
+ const fileInfo = await resolveDriveItemByServerRelativePath(server, serverRelativePath, clientConfig);
56
+ console.log(fileInfo);
57
+ const pendingFolder = [];
58
+ const files = [];
59
+ if (fileInfo.isFolder) {
60
+ pendingFolder.push({ path: serverRelativePath, folder: fileInfo });
61
+ }
62
+ else {
63
+ files.push(fileInfo);
64
+ }
65
+ // eslint-disable-next-line no-constant-condition
66
+ while (true) {
67
+ const folderInfo = pendingFolder.shift();
68
+ if (!folderInfo) {
69
+ break;
70
+ }
71
+ const { path, folder } = folderInfo;
72
+ const children = await resolveChildrenByDriveItem(server, folder, clientConfig);
73
+ for (const child of children) {
74
+ const childPath = `${path}/${child.name}`;
75
+ if (child.isFolder) {
76
+ if (recurse) {
77
+ pendingFolder.push({ path: childPath, folder: child });
78
+ }
79
+ }
80
+ else {
81
+ files.push(child);
82
+ }
83
+ }
84
+ }
85
+ return files;
86
+ }
87
+ exports.getSharepointFiles = getSharepointFiles;
88
+ async function getSingleSharePointFile(server, drive, item) {
89
+ const clientConfig = tool_utils_1.getMicrosoftConfiguration();
90
+ return resolveWrapper(
91
+ // eslint-disable-next-line @typescript-eslint/promise-function-async
92
+ (authRequestInfo) => odsp_doclib_utils_1.getDriveItemFromDriveAndItem(server, drive, item, authRequestInfo), server, clientConfig);
93
+ }
94
+ exports.getSingleSharePointFile = getSingleSharePointFile;
95
+ //# sourceMappingURL=fluidFetchSharePoint.js.map
@@ -0,0 +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 { DriverErrorType } from \"@fluidframework/driver-definitions\";\nimport {\n getChildrenByDriveItem,\n getDriveItemByServerRelativePath,\n getDriveItemFromDriveAndItem,\n IClientConfig,\n IOdspDriveItem,\n getOdspRefreshTokenFn,\n IOdspAuthRequestInfo,\n} from \"@fluidframework/odsp-doclib-utils\";\nimport {\n getMicrosoftConfiguration,\n OdspTokenManager,\n odspTokensCache,\n OdspTokenConfig,\n IOdspTokenManagerCacheKey,\n} from \"@fluidframework/tool-utils\";\nimport { fluidFetchWebNavigator } from \"./fluidFetchInit\";\nimport { getForceTokenReauth } from \"./fluidFetchArgs\";\n\nexport async function resolveWrapper<T>(\n callback: (authRequestInfo: IOdspAuthRequestInfo) => Promise<T>,\n server: string,\n clientConfig: IClientConfig,\n forceTokenReauth = false,\n forToken = false,\n): Promise<T> {\n try {\n const odspTokenManager = new OdspTokenManager(odspTokensCache);\n const tokenConfig: OdspTokenConfig = {\n type: \"browserLogin\",\n navigator: fluidFetchWebNavigator,\n };\n const tokens = await odspTokenManager.getOdspTokens(\n server,\n clientConfig,\n tokenConfig,\n undefined /* forceRefresh */,\n forceTokenReauth || getForceTokenReauth(),\n );\n\n const result = await callback({\n accessToken: tokens.accessToken,\n refreshTokenFn: getOdspRefreshTokenFn(server, clientConfig, tokens),\n });\n // If this is used for getting a token, then refresh the cache with new token.\n if (forToken) {\n const key: IOdspTokenManagerCacheKey = { isPush: false, userOrServer: server };\n await odspTokenManager.updateTokensCache(\n key, { accessToken: result as any as string, refreshToken: tokens.refreshToken });\n return result;\n }\n return result;\n } catch (e) {\n if (e.errorType === DriverErrorType.authorizationError && !forceTokenReauth) {\n // Re-auth\n return resolveWrapper<T>(callback, server, clientConfig, true, forToken);\n }\n throw e;\n }\n}\n\nexport async function resolveDriveItemByServerRelativePath(\n server: string,\n serverRelativePath: string,\n clientConfig: IClientConfig,\n) {\n return resolveWrapper<IOdspDriveItem>(\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n (authRequestInfo) => getDriveItemByServerRelativePath(\n server,\n serverRelativePath,\n authRequestInfo,\n false,\n ),\n server, clientConfig);\n}\n\nasync function resolveChildrenByDriveItem(\n server: string,\n folderDriveItem: IOdspDriveItem,\n clientConfig: IClientConfig,\n) {\n return resolveWrapper<IOdspDriveItem[]>(\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n (authRequestInfo) => getChildrenByDriveItem(folderDriveItem, server, authRequestInfo),\n server, clientConfig);\n}\n\nexport async function getSharepointFiles(server: string, serverRelativePath: string, recurse: boolean) {\n const clientConfig = getMicrosoftConfiguration();\n\n const fileInfo = await resolveDriveItemByServerRelativePath(server, serverRelativePath, clientConfig);\n console.log(fileInfo);\n const pendingFolder: { path: string, folder: IOdspDriveItem }[] = [];\n const files: IOdspDriveItem[] = [];\n if (fileInfo.isFolder) {\n pendingFolder.push({ path: serverRelativePath, folder: fileInfo });\n } else {\n files.push(fileInfo);\n }\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const folderInfo = pendingFolder.shift();\n if (!folderInfo) { break; }\n const { path, folder } = folderInfo;\n const children = await resolveChildrenByDriveItem(server, folder, clientConfig);\n for (const child of children) {\n const childPath = `${path}/${child.name}`;\n if (child.isFolder) {\n if (recurse) {\n pendingFolder.push({ path: childPath, folder: child });\n }\n } else {\n files.push(child);\n }\n }\n }\n return files;\n}\n\nexport async function getSingleSharePointFile(\n server: string,\n drive: string,\n item: string,\n) {\n const clientConfig = getMicrosoftConfiguration();\n\n return resolveWrapper<IOdspDriveItem>(\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n (authRequestInfo) => getDriveItemFromDriveAndItem(server, drive, item, authRequestInfo),\n server,\n clientConfig,\n );\n}\n"]}
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { IDocumentService } from "@fluidframework/driver-definitions";
6
+ export declare function fluidFetchSnapshot(documentService?: IDocumentService, saveDir?: string): Promise<void>;
7
+ //# sourceMappingURL=fluidFetchSnapshot.d.ts.map