@fluid-tools/fetch-tool 0.59.2001 → 0.59.3000

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -29,8 +29,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.fluidFetchInit = exports.fluidFetchWebNavigator = exports.connectionInfo = exports.latestVersionsId = void 0;
30
30
  const url_1 = require("url");
31
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
32
  const driver_utils_1 = require("@fluidframework/driver-utils");
35
33
  const fluidapp_odsp_urlresolver_1 = require("@fluid-tools/fluidapp-odsp-urlresolver");
36
34
  const odsp = __importStar(require("@fluidframework/odsp-driver"));
@@ -67,7 +65,7 @@ async function initializeODSPCore(odspResolvedUrl, server, clientConfig) {
67
65
  item: ${itemId}
68
66
  docId: ${docId}`);
69
67
  const getStorageTokenStub = async (options) => {
70
- return fluidFetchSharePoint_1.resolveWrapper(async (authRequestInfo) => {
68
+ return (0, fluidFetchSharePoint_1.resolveWrapper)(async (authRequestInfo) => {
71
69
  if ((options.refresh || !authRequestInfo.accessToken) && authRequestInfo.refreshTokenFn) {
72
70
  return authRequestInfo.refreshTokenFn();
73
71
  }
@@ -80,8 +78,7 @@ async function initializeODSPCore(odspResolvedUrl, server, clientConfig) {
80
78
  opsBatchSize: 20000,
81
79
  concurrentOpsBatches: 4,
82
80
  });
83
- return odspDocumentServiceFactory.createDocumentService(odspResolvedUrl, undefined, // logger
84
- false);
81
+ return odspDocumentServiceFactory.createDocumentService(odspResolvedUrl);
85
82
  }
86
83
  async function initializeR11s(server, pathname, r11sResolvedUrl) {
87
84
  const path = pathname.split("/");
@@ -108,21 +105,7 @@ async function initializeR11s(server, pathname, r11sResolvedUrl) {
108
105
  console.log(`Connecting to r11s: tenantId=${tenantId} id:${documentId}`);
109
106
  const tokenProvider = new r11s.DefaultTokenProvider(fluidFetchArgs_1.paramJWT);
110
107
  const r11sDocumentServiceFactory = new r11s.RouterliciousDocumentServiceFactory(tokenProvider);
111
- return r11sDocumentServiceFactory.createDocumentService(r11sResolvedUrl, undefined, // logger
112
- false);
113
- }
114
- async function initializeAzure(resolvedUrl, tenantId) {
115
- exports.connectionInfo = {
116
- server: resolvedUrl.endpoints.ordererUrl,
117
- tenantId,
118
- id: resolvedUrl.id,
119
- };
120
- console.log(`Connecting to Azure Fluid Relay: tenantId=${tenantId} id:${resolvedUrl.id}`);
121
- const user = test_client_utils_1.generateTestUser();
122
- const tokenProvider = new test_client_utils_1.InsecureTokenProvider(fluidFetchArgs_1.paramAzureKey, user);
123
- const r11sDocumentServiceFactory = new r11s.RouterliciousDocumentServiceFactory(tokenProvider);
124
- return r11sDocumentServiceFactory.createDocumentService(resolvedUrl, undefined, // logger
125
- false);
108
+ return r11sDocumentServiceFactory.createDocumentService(r11sResolvedUrl);
126
109
  }
127
110
  async function resolveUrl(url) {
128
111
  const resolversList = [
@@ -130,9 +113,8 @@ async function resolveUrl(url) {
130
113
  new fluidapp_odsp_urlresolver_1.FluidAppOdspUrlResolver(),
131
114
  // eslint-disable-next-line @typescript-eslint/promise-function-async
132
115
  new routerlicious_urlresolver_1.RouterliciousUrlResolver(undefined, () => Promise.resolve(fluidFetchArgs_1.paramJWT), ""),
133
- new AzureUrlResolver_1.AzureUrlResolver(),
134
116
  ];
135
- const resolved = await driver_utils_1.configurableUrlResolver(resolversList, { url });
117
+ const resolved = await (0, driver_utils_1.configurableUrlResolver)(resolversList, { url });
136
118
  return resolved;
137
119
  }
138
120
  async function fluidFetchInit(urlStr) {
@@ -143,21 +125,13 @@ async function fluidFetchInit(urlStr) {
143
125
  const protocol = new url_1.URL(resolvedUrl.url).protocol;
144
126
  if (protocol === "fluid-odsp:") {
145
127
  const odspResolvedUrl = resolvedUrl;
146
- return initializeODSPCore(odspResolvedUrl, new url_1.URL(odspResolvedUrl.siteUrl).host, tool_utils_1.getMicrosoftConfiguration());
128
+ return initializeODSPCore(odspResolvedUrl, new url_1.URL(odspResolvedUrl.siteUrl).host, (0, tool_utils_1.getMicrosoftConfiguration)());
147
129
  }
148
130
  else if (protocol === "fluid:") {
149
131
  const url = new url_1.URL(urlStr);
150
132
  const server = url.hostname.toLowerCase();
151
133
  return initializeR11s(server, url.pathname, resolvedUrl);
152
134
  }
153
- else if (resolvedUrl.url.includes("fluidrelay.azure.com")) {
154
- const url = new url_1.URL(urlStr);
155
- const tenantId = url.searchParams.get("tenantId");
156
- if (tenantId === null) {
157
- throw new Error("Azure URL did not contain tenantId");
158
- }
159
- return initializeAzure(resolvedUrl, tenantId);
160
- }
161
135
  return Promise.reject(new Error(`Unknown resolved protocol ${protocol}`));
162
136
  }
163
137
  exports.fluidFetchInit = fluidFetchInit;
@@ -1 +1 @@
1
- {"version":3,"file":"fluidFetchInit.js","sourceRoot":"","sources":["../src/fluidFetchInit.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,6BAA0B;AAC1B,kEAA0C;AAC1C,yFAAsF;AACtF,yEAG2C;AAE3C,+DAAuE;AACvE,sFAAiF;AAEjF,kEAAoD;AAEpD,uEAAmE;AACnE,2EAA6D;AAC7D,yFAAqF;AACrF,2DAAuE;AACvE,qDAA0E;AAC1E,iEAAwD;AAE7C,QAAA,gBAAgB,GAAW,EAAE,CAAC;AAGlC,MAAM,sBAAsB,GAAG,CAAC,GAAW,EAAE,EAAE;IAClD,IAAI,OAAO,GAAG,+CAA+C,CAAC;IAC9D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE;QAC9B,uBAAa,CAAC,IAAI,CAAC,2BAA2B,GAAG,GAAG,CAAC,CAAC;QACtD,OAAO,GAAG,kGAAkG,CAAC;KAChH;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,OAAO,GAAG,EAAE,CAAC,CAAC;AACxC,CAAC,CAAC;AAPW,QAAA,sBAAsB,0BAOjC;AAEF,KAAK,UAAU,kBAAkB,CAC7B,eAAiC,EACjC,MAAc,EACd,YAA2B;IAE3B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC;IAE5C,sBAAc,GAAG;QACb,MAAM;QACN,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,MAAM;KACf,CAAC;IAEF,IAAI,8BAAa,EAAE;QACf,OAAO;KACV;IAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE9D,OAAO,CAAC,GAAG,CAAC;YACJ,MAAM;YACN,OAAO;YACP,MAAM;YACN,KAAK,EAAE,CAAC,CAAC;IAEjB,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAAsC,EAAE,EAAE;QACzE,OAAO,qCAAc,CACjB,KAAK,EAAE,eAAqC,EAAE,EAAE;YAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,cAAc,EAAE;gBACrF,OAAO,eAAe,CAAC,cAAc,EAAE,CAAC;aAC3C;YACD,OAAO,eAAe,CAAC,WAAW,CAAC;QACvC,CAAC,EACD,MAAM,EACN,YAAY,EACZ,SAAS,EACT,IAAI,CACP,CAAC;IACN,CAAC,CAAC;IACF,qEAAqE;IACrE,MAAM,qBAAqB,GAAG,CAAC,QAAuC,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/F,MAAM,0BAA0B,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAClE,mBAAmB,EACnB,qBAAqB,EACrB,SAAS,EACT;QACI,YAAY,EAAE,KAAK;QACnB,oBAAoB,EAAE,CAAC;KAC1B,CAAC,CAAC;IACP,OAAO,0BAA0B,CAAC,qBAAqB,CACnD,eAAe,EACf,SAAS,EAAE,SAAS;IACnB,KAAK,CACT,CAAC;AACN,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,QAAgB,EAAE,eAAkC;IAC9F,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,QAAgB,CAAC;IACrB,IAAI,UAAkB,CAAC;IACvB,IAAI,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QAC3C,QAAQ,GAAG,OAAO,CAAC;QACnB,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;KACxB;SAAM;QACH,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;KACxB;IAED,+CAA+C;IAC/C,wBAAgB,GAAG,UAAU,CAAC;IAE9B,sBAAc,GAAG;QACb,MAAM;QACN,QAAQ;QACR,EAAE,EAAE,UAAU;KACjB,CAAC;IAEF,IAAI,8BAAa,EAAE;QACf,OAAO;KACV;IAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,QAAQ,OAAO,UAAU,EAAE,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,oBAAoB,CAAC,yBAAQ,CAAC,CAAC;IAC9D,MAAM,0BAA0B,GAAG,IAAI,IAAI,CAAC,mCAAmC,CAAC,aAAa,CAAC,CAAC;IAC/F,OAAO,0BAA0B,CAAC,qBAAqB,CACnD,eAAe,EACf,SAAS,EAAE,SAAS;IACpB,KAAK,CACR,CAAC;AACN,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,WAA8B,EAAE,QAAgB;IAC3E,sBAAc,GAAG;QACb,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,UAAU;QACxC,QAAQ;QACR,EAAE,EAAE,WAAW,CAAC,EAAE;KACrB,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,6CAA6C,QAAQ,OAAO,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,oCAAgB,EAAE,CAAC;IAChC,MAAM,aAAa,GAAG,IAAI,yCAAqB,CAAC,8BAAa,EAAE,IAAI,CAAC,CAAC;IACrE,MAAM,0BAA0B,GAAG,IAAI,IAAI,CAAC,mCAAmC,CAAC,aAAa,CAAC,CAAC;IAC/F,OAAO,0BAA0B,CAAC,qBAAqB,CACnD,WAAW,EACX,SAAS,EAAE,SAAS;IACpB,KAAK,CACR,CAAC;AACN,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAW;IACjC,MAAM,aAAa,GAAmB;QAClC,IAAI,kCAAe,EAAE;QACrB,IAAI,mDAAuB,EAAE;QAC7B,qEAAqE;QACrE,IAAI,oDAAwB,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAQ,CAAC,EAAE,EAAE,CAAC;QAC5E,IAAI,mCAAgB,EAAE;KACzB,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,sCAAuB,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACvE,OAAO,QAAQ,CAAC;AACpB,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,MAAc;IAC/C,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,MAAM,CAAsB,CAAC;IAClE,IAAI,CAAC,WAAW,EAAE;QACd,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC,CAAC;KAC7D;IACD,MAAM,QAAQ,GAAG,IAAI,SAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IACnD,IAAI,QAAQ,KAAK,aAAa,EAAE;QAC5B,MAAM,eAAe,GAAG,WAA+B,CAAC;QACxD,OAAO,kBAAkB,CAAC,eAAe,EAAE,IAAI,SAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,sCAAyB,EAAE,CAAC,CAAC;KAClH;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE;QAC9B,MAAM,GAAG,GAAG,IAAI,SAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1C,OAAO,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;KAC5D;SAAM,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE;QACzD,MAAM,GAAG,GAAG,IAAI,SAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,QAAQ,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;SACzD;QACD,OAAO,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;KACjD;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC9E,CAAC;AAtBD,wCAsBC","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(\n odspResolvedUrl,\n undefined, // logger\n false, // clientIsSummrizer\n );\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(\n r11sResolvedUrl,\n undefined, // logger\n false, // clientIsSummarizer\n );\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(\n resolvedUrl,\n undefined, // logger\n false, // clientIsSummarizer\n );\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"]}
1
+ {"version":3,"file":"fluidFetchInit.js","sourceRoot":"","sources":["../src/fluidFetchInit.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { URL } from \"url\";\nimport child_process from \"child_process\";\nimport { IFluidResolvedUrl, IResolvedUrl, IUrlResolver } from \"@fluidframework/driver-definitions\";\nimport { configurableUrlResolver } from \"@fluidframework/driver-utils\";\nimport { FluidAppOdspUrlResolver } from \"@fluid-tools/fluidapp-odsp-urlresolver\";\nimport { IClientConfig, IOdspAuthRequestInfo } from \"@fluidframework/odsp-doclib-utils\";\nimport * as odsp from \"@fluidframework/odsp-driver\";\nimport { IOdspResolvedUrl, OdspResourceTokenFetchOptions } from \"@fluidframework/odsp-driver-definitions\";\nimport { OdspUrlResolver } from \"@fluidframework/odsp-urlresolver\";\nimport * as r11s from \"@fluidframework/routerlicious-driver\";\nimport { RouterliciousUrlResolver } from \"@fluidframework/routerlicious-urlresolver\";\nimport { getMicrosoftConfiguration } from \"@fluidframework/tool-utils\";\nimport { localDataOnly, paramJWT } from \"./fluidFetchArgs\";\nimport { resolveWrapper } from \"./fluidFetchSharePoint\";\n\nexport let latestVersionsId: string = \"\";\nexport let connectionInfo: any;\n\nexport const fluidFetchWebNavigator = (url: string) => {\n let message = \"Please open browser and navigate to this URL:\";\n if (process.platform === \"win32\") {\n child_process.exec(`start \"fluid-fetch\" /B \"${url}\"`);\n message = \"Opening browser to get authorization code. If that doesn't open, please go to this URL manually\";\n }\n console.log(`${message}\\n ${url}`);\n};\n\nasync function initializeODSPCore(\n odspResolvedUrl: IOdspResolvedUrl,\n server: string,\n clientConfig: IClientConfig,\n) {\n const { driveId, itemId } = odspResolvedUrl;\n\n connectionInfo = {\n server,\n drive: driveId,\n item: itemId,\n };\n\n if (localDataOnly) {\n return;\n }\n\n const docId = await odsp.getHashedDocumentId(driveId, itemId);\n\n console.log(`Connecting to ODSP:\n server: ${server}\n drive: ${driveId}\n item: ${itemId}\n docId: ${docId}`);\n\n const getStorageTokenStub = async (options: OdspResourceTokenFetchOptions) => {\n return resolveWrapper(\n async (authRequestInfo: IOdspAuthRequestInfo) => {\n if ((options.refresh || !authRequestInfo.accessToken) && authRequestInfo.refreshTokenFn) {\n return authRequestInfo.refreshTokenFn();\n }\n return authRequestInfo.accessToken;\n },\n server,\n clientConfig,\n undefined,\n true,\n );\n };\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n const getWebsocketTokenStub = (_options: OdspResourceTokenFetchOptions) => Promise.resolve(\"\");\n const odspDocumentServiceFactory = new odsp.OdspDocumentServiceFactory(\n getStorageTokenStub,\n getWebsocketTokenStub,\n undefined,\n {\n opsBatchSize: 20000,\n concurrentOpsBatches: 4,\n });\n return odspDocumentServiceFactory.createDocumentService(odspResolvedUrl);\n}\n\nasync function initializeR11s(server: string, pathname: string, r11sResolvedUrl: IFluidResolvedUrl) {\n const path = pathname.split(\"/\");\n let tenantId: string;\n let documentId: string;\n if (server === \"localhost\" && path.length < 4) {\n tenantId = \"fluid\";\n documentId = path[2];\n } else {\n tenantId = path[2];\n documentId = path[3];\n }\n\n // Latest version id is the documentId for r11s\n latestVersionsId = documentId;\n\n connectionInfo = {\n server,\n tenantId,\n id: documentId,\n };\n\n if (localDataOnly) {\n return;\n }\n\n console.log(`Connecting to r11s: tenantId=${tenantId} id:${documentId}`);\n const tokenProvider = new r11s.DefaultTokenProvider(paramJWT);\n const r11sDocumentServiceFactory = new r11s.RouterliciousDocumentServiceFactory(tokenProvider);\n return r11sDocumentServiceFactory.createDocumentService(r11sResolvedUrl);\n}\n\nasync function resolveUrl(url: string): Promise<IResolvedUrl | undefined> {\n const resolversList: IUrlResolver[] = [\n new OdspUrlResolver(),\n new FluidAppOdspUrlResolver(),\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n new RouterliciousUrlResolver(undefined, () => Promise.resolve(paramJWT), \"\"),\n ];\n const resolved = await configurableUrlResolver(resolversList, { url });\n return resolved;\n}\n\nexport async function fluidFetchInit(urlStr: string) {\n const resolvedUrl = await resolveUrl(urlStr) as IFluidResolvedUrl;\n if (!resolvedUrl) {\n return Promise.reject(new Error(`Unknown URL ${urlStr}`));\n }\n const protocol = new URL(resolvedUrl.url).protocol;\n if (protocol === \"fluid-odsp:\") {\n const odspResolvedUrl = resolvedUrl as IOdspResolvedUrl;\n return initializeODSPCore(odspResolvedUrl, new URL(odspResolvedUrl.siteUrl).host, getMicrosoftConfiguration());\n } else if (protocol === \"fluid:\") {\n const url = new URL(urlStr);\n const server = url.hostname.toLowerCase();\n return initializeR11s(server, url.pathname, resolvedUrl);\n }\n return Promise.reject(new Error(`Unknown resolved protocol ${protocol}`));\n}\n"]}
@@ -51,7 +51,7 @@ function loadAllSequencedMessages(documentService, dir, files) {
51
51
  const messages = JSON.parse(fileContent);
52
52
  // check if there is mismatch
53
53
  seqNumMismatch = messages[0].sequenceNumber !== lastSeq + 1;
54
- common_utils_1.assert(!seqNumMismatch, 0x1b9 /* "Unexpected value for sequence number of first message in file" */);
54
+ (0, common_utils_1.assert)(!seqNumMismatch, 0x1b9 /* "Unexpected value for sequence number of first message in file" */);
55
55
  lastSeq = messages[messages.length - 1].sequenceNumber;
56
56
  yield yield __await(messages);
57
57
  }
@@ -121,7 +121,7 @@ function loadAllSequencedMessages(documentService, dir, files) {
121
121
  requests++;
122
122
  const messages = result.value;
123
123
  // Empty buckets should never be returned
124
- common_utils_1.assert(messages.length !== 0, 0x1ba /* "should not return empty buckets" */);
124
+ (0, common_utils_1.assert)(messages.length !== 0, 0x1ba /* "should not return empty buckets" */);
125
125
  // console.log(`Loaded ops at ${messages[0].sequenceNumber}`);
126
126
  // This parsing of message contents happens in delta manager. But when we analyze messages
127
127
  // for message stats, we skip that path. So parsing of json contents needs to happen here.
@@ -200,8 +200,8 @@ dir, files) {
200
200
  messages = messages.filter((msg) => msg.sequenceNumber >= curr);
201
201
  }
202
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
203
+ (0, common_utils_1.assert)(sequencedMessages[0].sequenceNumber === curr, 0x1bb /* "Unexpected sequence number on first of messages to save" */);
204
+ (0, common_utils_1.assert)(sequencedMessages[sequencedMessages.length - 1].sequenceNumber
205
205
  === curr + sequencedMessages.length - 1, 0x1bc /* "Unexpected sequence number on last of messages to save" */);
206
206
  }
207
207
  // Time to write it out?
@@ -212,7 +212,7 @@ dir, files) {
212
212
  fs_1.default.writeFileSync(`${dir}/messages${name}.json`, JSON.stringify(write, undefined, fluidFetchArgs_1.paramActualFormatting ? 0 : 2));
213
213
  // increment curr by chunk
214
214
  curr += chunk;
215
- common_utils_1.assert(sequencedMessages.length === 0 || sequencedMessages[0].sequenceNumber === curr, 0x1bd /* "Stopped writing at unexpected sequence number" */);
215
+ (0, common_utils_1.assert)(sequencedMessages.length === 0 || sequencedMessages[0].sequenceNumber === curr, 0x1bd /* "Stopped writing at unexpected sequence number" */);
216
216
  index++;
217
217
  }
218
218
  if (result.done) {
@@ -242,7 +242,7 @@ async function fluidFetchMessages(documentService, saveDir) {
242
242
  generator = saveOps(generator, saveDir, files);
243
243
  }
244
244
  if (messageStats) {
245
- return fluidAnalyzeMessages_1.printMessageStats(generator, fluidFetchArgs_1.dumpMessageStats, fluidFetchArgs_1.dumpMessages, fluidFetchArgs_1.messageTypeFilter);
245
+ return (0, fluidAnalyzeMessages_1.printMessageStats)(generator, fluidFetchArgs_1.dumpMessageStats, fluidFetchArgs_1.dumpMessages, fluidFetchArgs_1.messageTypeFilter);
246
246
  }
247
247
  else {
248
248
  let item;
@@ -1 +1 @@
1
- {"version":3,"file":"fluidFetchMessages.js","sourceRoot":"","sources":["../src/fluidFetchMessages.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport {\n IDocumentService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n IClient,\n ISequencedDocumentMessage,\n MessageType,\n ScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport { printMessageStats } from \"./fluidAnalyzeMessages\";\nimport {\n connectToWebSocket,\n dumpMessages,\n dumpMessageStats,\n overWrite,\n paramActualFormatting,\n messageTypeFilter,\n} from \"./fluidFetchArgs\";\n\nfunction filenameFromIndex(index: number): string {\n return index === 0 ? \"\" : index.toString(); // support old tools...\n}\n\nlet firstAvailableDelta = 1;\nasync function* loadAllSequencedMessages(\n documentService?: IDocumentService,\n dir?: string,\n files?: string[]) {\n let lastSeq = 0;\n // flag for mismatch between last sequence number read and new one to be read\n let seqNumMismatch = false;\n\n // If we have local save, read ops from there first\n if (files !== undefined) {\n for (let i = 0; i < files.length; i++) {\n const file = filenameFromIndex(i);\n try {\n console.log(`reading messages${file}.json`);\n const fileContent = fs.readFileSync(`${dir}/messages${file}.json`, { encoding: \"utf-8\" });\n const messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n // check if there is mismatch\n seqNumMismatch = messages[0].sequenceNumber !== lastSeq + 1;\n assert(!seqNumMismatch, 0x1b9 /* \"Unexpected value for sequence number of first message in file\" */);\n lastSeq = messages[messages.length - 1].sequenceNumber;\n yield messages;\n } catch (e) {\n if (seqNumMismatch) {\n if (overWrite) {\n // with overWrite option on, we will delete all exisintg message.json files\n for (let index = 0; index < files.length; index++) {\n const name = filenameFromIndex(index);\n fs.unlinkSync(`${dir}/messages${name}.json`);\n }\n break;\n }\n // prompt user to back up and delete existing files\n console.error(\"There are deleted ops in the document being requested,\" +\n \" please back up the existing messages.json file and delete it from its directory.\" +\n \" Then try fetch tool again.\");\n console.error(e);\n return;\n } else {\n console.error(`Error reading / parsing messages from ${files}`);\n console.error(e);\n return;\n }\n }\n }\n if (lastSeq !== 0) {\n console.log(`Read ${lastSeq} ops from local cache`);\n }\n }\n\n if (!documentService) {\n return;\n }\n\n const deltaStorage = await documentService.connectToDeltaStorage();\n\n let timeStart = Date.now();\n let requests = 0;\n let opsStorage = 0;\n\n // reading only 1 op to test if there is mismatch\n const teststream = deltaStorage.fetchMessages(\n lastSeq + 1,\n lastSeq + 2);\n\n let statusCode;\n let innerMostErrorCode;\n let response;\n\n try {\n await teststream.read();\n } catch (error: any) {\n statusCode = error.getTelemetryProperties().statusCode;\n innerMostErrorCode = error.getTelemetryProperties().innerMostErrorCode;\n // if there is gap between ops, catch the error and check it is the error we need\n if (statusCode !== 410 || innerMostErrorCode !== \"fluidDeltaDataNotAvailable\") {\n throw error;\n }\n // get firstAvailableDelta from the error response, and set current sequence number to that\n response = JSON.parse(error.getTelemetryProperties().response);\n firstAvailableDelta = response.error.firstAvailableDelta;\n lastSeq = firstAvailableDelta - 1;\n }\n\n // continue reading rest of the ops\n const stream = deltaStorage.fetchMessages(\n lastSeq + 1, // inclusive left\n undefined, // to\n );\n\n while (true) {\n const result = await stream.read();\n if (result.done) {\n break;\n }\n requests++;\n const messages = result.value;\n\n // Empty buckets should never be returned\n assert(messages.length !== 0, 0x1ba /* \"should not return empty buckets\" */);\n // console.log(`Loaded ops at ${messages[0].sequenceNumber}`);\n\n // This parsing of message contents happens in delta manager. But when we analyze messages\n // for message stats, we skip that path. So parsing of json contents needs to happen here.\n for (const message of messages) {\n if (typeof message.contents === \"string\"\n && message.contents !== \"\"\n && message.type !== MessageType.ClientLeave\n ) {\n message.contents = JSON.parse(message.contents);\n }\n }\n\n opsStorage += messages.length;\n lastSeq = messages[messages.length - 1].sequenceNumber;\n yield messages;\n }\n\n // eslint-disable-next-line max-len\n console.log(`\\n${Math.floor((Date.now() - timeStart) / 1000)} seconds to retrieve ${opsStorage} ops in ${requests} requests`);\n\n if (connectToWebSocket) {\n let logMsg = \"\";\n const client: IClient = {\n mode: \"write\",\n permission: [],\n scopes: [ScopeType.DocRead, ScopeType.DocWrite, ScopeType.SummaryWrite],\n details: {\n capabilities: { interactive: true },\n },\n user: { id: \"blah\" },\n };\n console.log(\"Retrieving messages from web socket\");\n timeStart = Date.now();\n const deltaStream = await documentService.connectToDeltaStream(client);\n const initialMessages = deltaStream.initialMessages;\n deltaStream.dispose();\n console.log(`${Math.floor((Date.now() - timeStart) / 1000)} seconds to connect to web socket`);\n\n if (initialMessages) {\n const lastSequenceNumber = lastSeq;\n const filtered = initialMessages.filter((a) => a.sequenceNumber > lastSequenceNumber);\n const sorted = filtered.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n lastSeq = sorted[sorted.length - 1].sequenceNumber;\n // eslint-disable-next-line max-len\n logMsg = ` (${opsStorage} delta storage, ${initialMessages.length} initial ws messages, ${initialMessages.length - sorted.length} dup)`;\n yield sorted;\n }\n console.log(`${lastSeq} total messages${logMsg}`);\n }\n}\n\nasync function* saveOps(\n gen, // AsyncGenerator<ISequencedDocumentMessage[]>,\n dir: string,\n files: string[]) {\n // Split into 100K ops\n const chunk = 100 * 1000;\n\n let sequencedMessages: ISequencedDocumentMessage[] = [];\n\n // Figure out first file we want to write to\n let index = 0;\n let curr: number = 1;\n if (files.length !== 0) {\n index = files.length - 1;\n const name = filenameFromIndex(index);\n const fileContent = fs.readFileSync(`${dir}/messages${name}.json`, { encoding: \"utf-8\" });\n const messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n curr = messages[0].sequenceNumber;\n }\n\n while (true) {\n const result: IteratorResult<ISequencedDocumentMessage[]> = await gen.next();\n if (files.length === 0) {\n curr = firstAvailableDelta;\n }\n if (!result.done) {\n let messages = result.value;\n yield messages;\n if (messages[messages.length - 1].sequenceNumber < curr) {\n // Nothing interesting.\n continue;\n }\n if (messages[0].sequenceNumber < curr) {\n messages = messages.filter((msg) => msg.sequenceNumber >= curr);\n }\n sequencedMessages = sequencedMessages.concat(messages);\n assert(sequencedMessages[0].sequenceNumber === curr,\n 0x1bb /* \"Unexpected sequence number on first of messages to save\" */);\n assert(sequencedMessages[sequencedMessages.length - 1].sequenceNumber\n === curr + sequencedMessages.length - 1,\n 0x1bc /* \"Unexpected sequence number on last of messages to save\" */);\n }\n\n // Time to write it out?\n while (sequencedMessages.length >= chunk || (result.done && sequencedMessages.length !== 0)) {\n const name = filenameFromIndex(index);\n const write = sequencedMessages.splice(0, chunk);\n console.log(`writing messages${name}.json`);\n fs.writeFileSync(\n `${dir}/messages${name}.json`,\n JSON.stringify(write, undefined, paramActualFormatting ? 0 : 2));\n // increment curr by chunk\n curr += chunk;\n assert(sequencedMessages.length === 0 || sequencedMessages[0].sequenceNumber === curr,\n 0x1bd /* \"Stopped writing at unexpected sequence number\" */);\n index++;\n }\n\n if (result.done) {\n break;\n }\n }\n}\n\nexport async function fluidFetchMessages(documentService?: IDocumentService, saveDir?: string) {\n const messageStats = dumpMessageStats || dumpMessages;\n if (!messageStats && (saveDir === undefined || documentService === undefined)) {\n return;\n }\n\n const files = !saveDir ?\n undefined :\n fs.readdirSync(saveDir)\n .filter((file) => {\n if (!file.startsWith(\"messages\")) {\n return false;\n }\n return true;\n })\n .sort((a, b) => a.localeCompare(b));\n\n let generator = loadAllSequencedMessages(documentService, saveDir, files);\n\n if (saveDir && files !== undefined && documentService) {\n generator = saveOps(generator, saveDir, files);\n }\n\n if (messageStats) {\n return printMessageStats(\n generator,\n dumpMessageStats,\n dumpMessages,\n messageTypeFilter);\n } else {\n let item;\n for await (item of generator) { }\n }\n}\n"]}
1
+ {"version":3,"file":"fluidFetchMessages.js","sourceRoot":"","sources":["../src/fluidFetchMessages.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport {\n IDocumentService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n IClient,\n ISequencedDocumentMessage,\n MessageType,\n ScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport { printMessageStats } from \"./fluidAnalyzeMessages\";\nimport {\n connectToWebSocket,\n dumpMessages,\n dumpMessageStats,\n overWrite,\n paramActualFormatting,\n messageTypeFilter,\n} from \"./fluidFetchArgs\";\n\nfunction filenameFromIndex(index: number): string {\n return index === 0 ? \"\" : index.toString(); // support old tools...\n}\n\nlet firstAvailableDelta = 1;\nasync function* loadAllSequencedMessages(\n documentService?: IDocumentService,\n dir?: string,\n files?: string[]) {\n let lastSeq = 0;\n // flag for mismatch between last sequence number read and new one to be read\n let seqNumMismatch = false;\n\n // If we have local save, read ops from there first\n if (files !== undefined) {\n for (let i = 0; i < files.length; i++) {\n const file = filenameFromIndex(i);\n try {\n console.log(`reading messages${file}.json`);\n const fileContent = fs.readFileSync(`${dir}/messages${file}.json`, { encoding: \"utf-8\" });\n const messages: ISequencedDocumentMessage[] = JSON.parse(fileContent);\n // check if there is mismatch\n seqNumMismatch = messages[0].sequenceNumber !== lastSeq + 1;\n assert(!seqNumMismatch, 0x1b9 /* \"Unexpected value for sequence number of first message in file\" */);\n lastSeq = messages[messages.length - 1].sequenceNumber;\n yield messages;\n } catch (e) {\n if (seqNumMismatch) {\n if (overWrite) {\n // with overWrite option on, we will delete all exisintg message.json files\n for (let index = 0; index < files.length; index++) {\n const name = filenameFromIndex(index);\n fs.unlinkSync(`${dir}/messages${name}.json`);\n }\n break;\n }\n // prompt user to back up and delete existing files\n console.error(\"There are deleted ops in the document being requested,\" +\n \" please back up the existing messages.json file and delete it from its directory.\" +\n \" Then try fetch tool again.\");\n console.error(e);\n return;\n } else {\n console.error(`Error reading / parsing messages from ${files}`);\n console.error(e);\n return;\n }\n }\n }\n if (lastSeq !== 0) {\n console.log(`Read ${lastSeq} ops from local cache`);\n }\n }\n\n if (!documentService) {\n return;\n }\n\n const deltaStorage = await documentService.connectToDeltaStorage();\n\n let timeStart = Date.now();\n let requests = 0;\n let opsStorage = 0;\n\n // reading only 1 op to test if there is mismatch\n const teststream = deltaStorage.fetchMessages(\n lastSeq + 1,\n lastSeq + 2);\n\n let statusCode;\n let innerMostErrorCode;\n let response;\n\n try {\n await teststream.read();\n } catch (error: any) {\n statusCode = error.getTelemetryProperties().statusCode;\n innerMostErrorCode = error.getTelemetryProperties().innerMostErrorCode;\n // if there is gap between ops, catch the error and check it is the error we need\n if (statusCode !== 410 || innerMostErrorCode !== \"fluidDeltaDataNotAvailable\") {\n throw error;\n }\n // get firstAvailableDelta from the error response, and set current sequence number to that\n response = JSON.parse(error.getTelemetryProperties().response);\n firstAvailableDelta = response.error.firstAvailableDelta;\n lastSeq = firstAvailableDelta - 1;\n }\n\n // continue reading rest of the ops\n const stream = deltaStorage.fetchMessages(\n lastSeq + 1, // inclusive left\n undefined, // to\n );\n\n while (true) {\n const result = await stream.read();\n if (result.done) {\n break;\n }\n requests++;\n const messages = result.value;\n\n // Empty buckets should never be returned\n assert(messages.length !== 0, 0x1ba /* \"should not return empty buckets\" */);\n // console.log(`Loaded ops at ${messages[0].sequenceNumber}`);\n\n // This parsing of message contents happens in delta manager. But when we analyze messages\n // for message stats, we skip that path. So parsing of json contents needs to happen here.\n for (const message of messages) {\n if (typeof message.contents === \"string\"\n && message.contents !== \"\"\n && message.type !== MessageType.ClientLeave\n ) {\n message.contents = JSON.parse(message.contents);\n }\n }\n\n opsStorage += messages.length;\n lastSeq = messages[messages.length - 1].sequenceNumber;\n yield messages;\n }\n\n // eslint-disable-next-line max-len\n console.log(`\\n${Math.floor((Date.now() - timeStart) / 1000)} seconds to retrieve ${opsStorage} ops in ${requests} requests`);\n\n if (connectToWebSocket) {\n let logMsg = \"\";\n const client: IClient = {\n mode: \"write\",\n permission: [],\n scopes: [ScopeType.DocRead, ScopeType.DocWrite, ScopeType.SummaryWrite],\n details: {\n capabilities: { interactive: true },\n },\n user: { id: \"blah\" },\n };\n console.log(\"Retrieving messages from web socket\");\n timeStart = Date.now();\n const deltaStream = await documentService.connectToDeltaStream(client);\n const initialMessages = deltaStream.initialMessages;\n deltaStream.dispose();\n console.log(`${Math.floor((Date.now() - timeStart) / 1000)} seconds to connect to web socket`);\n\n if (initialMessages) {\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"]}
@@ -17,10 +17,10 @@ async function resolveWrapper(callback, server, clientConfig, forceTokenReauth =
17
17
  type: "browserLogin",
18
18
  navigator: fluidFetchInit_1.fluidFetchWebNavigator,
19
19
  };
20
- const tokens = await odspTokenManager.getOdspTokens(server, clientConfig, tokenConfig, undefined /* forceRefresh */, forceTokenReauth || fluidFetchArgs_1.getForceTokenReauth());
20
+ const tokens = await odspTokenManager.getOdspTokens(server, clientConfig, tokenConfig, undefined /* forceRefresh */, forceTokenReauth || (0, fluidFetchArgs_1.getForceTokenReauth)());
21
21
  const result = await callback({
22
22
  accessToken: tokens.accessToken,
23
- refreshTokenFn: odsp_doclib_utils_1.getOdspRefreshTokenFn(server, clientConfig, tokens),
23
+ refreshTokenFn: (0, odsp_doclib_utils_1.getOdspRefreshTokenFn)(server, clientConfig, tokens),
24
24
  });
25
25
  // If this is used for getting a token, then refresh the cache with new token.
26
26
  if (forToken) {
@@ -42,16 +42,16 @@ exports.resolveWrapper = resolveWrapper;
42
42
  async function resolveDriveItemByServerRelativePath(server, serverRelativePath, clientConfig) {
43
43
  return resolveWrapper(
44
44
  // eslint-disable-next-line @typescript-eslint/promise-function-async
45
- (authRequestInfo) => odsp_doclib_utils_1.getDriveItemByServerRelativePath(server, serverRelativePath, authRequestInfo, false), server, clientConfig);
45
+ (authRequestInfo) => (0, odsp_doclib_utils_1.getDriveItemByServerRelativePath)(server, serverRelativePath, authRequestInfo, false), server, clientConfig);
46
46
  }
47
47
  exports.resolveDriveItemByServerRelativePath = resolveDriveItemByServerRelativePath;
48
48
  async function resolveChildrenByDriveItem(server, folderDriveItem, clientConfig) {
49
49
  return resolveWrapper(
50
50
  // eslint-disable-next-line @typescript-eslint/promise-function-async
51
- (authRequestInfo) => odsp_doclib_utils_1.getChildrenByDriveItem(folderDriveItem, server, authRequestInfo), server, clientConfig);
51
+ (authRequestInfo) => (0, odsp_doclib_utils_1.getChildrenByDriveItem)(folderDriveItem, server, authRequestInfo), server, clientConfig);
52
52
  }
53
53
  async function getSharepointFiles(server, serverRelativePath, recurse) {
54
- const clientConfig = tool_utils_1.getMicrosoftConfiguration();
54
+ const clientConfig = (0, tool_utils_1.getMicrosoftConfiguration)();
55
55
  const fileInfo = await resolveDriveItemByServerRelativePath(server, serverRelativePath, clientConfig);
56
56
  console.log(fileInfo);
57
57
  const pendingFolder = [];
@@ -86,10 +86,10 @@ async function getSharepointFiles(server, serverRelativePath, recurse) {
86
86
  }
87
87
  exports.getSharepointFiles = getSharepointFiles;
88
88
  async function getSingleSharePointFile(server, drive, item) {
89
- const clientConfig = tool_utils_1.getMicrosoftConfiguration();
89
+ const clientConfig = (0, tool_utils_1.getMicrosoftConfiguration)();
90
90
  return resolveWrapper(
91
91
  // eslint-disable-next-line @typescript-eslint/promise-function-async
92
- (authRequestInfo) => odsp_doclib_utils_1.getDriveItemFromDriveAndItem(server, drive, item, authRequestInfo), server, clientConfig);
92
+ (authRequestInfo) => (0, odsp_doclib_utils_1.getDriveItemFromDriveAndItem)(server, drive, item, authRequestInfo), server, clientConfig);
93
93
  }
94
94
  exports.getSingleSharePointFile = getSingleSharePointFile;
95
95
  //# sourceMappingURL=fluidFetchSharePoint.js.map
@@ -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 { 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: any) {\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"]}
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: any) {\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"]}
@@ -56,7 +56,7 @@ function fetchBlobs(prefix, tree, storage, blobIdMap) {
56
56
  function createTreeBlob(tree, prefix, patched) {
57
57
  var _a;
58
58
  const id = (_a = tree.id) !== null && _a !== void 0 ? _a : "original";
59
- const blob = common_utils_1.stringToBuffer(JSON.stringify(tree), "utf8");
59
+ const blob = (0, common_utils_1.stringToBuffer)(JSON.stringify(tree), "utf8");
60
60
  const filename = patched ? "tree" : `tree-${id}`;
61
61
  const treePath = `${prefix}${filename}`;
62
62
  return { treePath, blobId: "original tree $id", filename, blob, patched, reused: false };
@@ -107,13 +107,13 @@ async function dumpSnapshotTreeVerbose(name, fetchedData) {
107
107
  if (buffer === undefined) {
108
108
  continue;
109
109
  }
110
- const blob = common_utils_1.bufferToString(buffer, "utf8");
110
+ const blob = (0, common_utils_1.bufferToString)(buffer, "utf8");
111
111
  // eslint-disable-next-line max-len
112
- console.log(`${item.treePath.padEnd(nameLength)} | ${item.reused ? "X" : " "} | ${fluidAnalyzeMessages_1.formatNumber(blob.length).padStart(10)}`);
112
+ console.log(`${item.treePath.padEnd(nameLength)} | ${item.reused ? "X" : " "} | ${(0, fluidAnalyzeMessages_1.formatNumber)(blob.length).padStart(10)}`);
113
113
  size += blob.length;
114
114
  }
115
115
  console.log("-".repeat(nameLength + 26));
116
- console.log(`${"Total snapshot size".padEnd(nameLength)} | | ${fluidAnalyzeMessages_1.formatNumber(size).padStart(10)}`);
116
+ console.log(`${"Total snapshot size".padEnd(nameLength)} | | ${(0, fluidAnalyzeMessages_1.formatNumber)(size).padStart(10)}`);
117
117
  }
118
118
  async function dumpSnapshotTree(name, fetchedData) {
119
119
  let size = 0;
@@ -125,7 +125,7 @@ async function dumpSnapshotTree(name, fetchedData) {
125
125
  if (buffer === undefined) {
126
126
  continue;
127
127
  }
128
- const blob = common_utils_1.bufferToString(buffer, "utf8");
128
+ const blob = (0, common_utils_1.bufferToString)(buffer, "utf8");
129
129
  if (!item.reused) {
130
130
  sizeNew += blob.length;
131
131
  blobCountNew++;
@@ -149,7 +149,7 @@ async function saveSnapshot(name, fetchedData, saveDir) {
149
149
  fs_1.default.writeFileSync(`${outDir}/${item.filename}`, Buffer.from(buffer));
150
150
  // we assume that the buffer is utf8 here, which currently is true for
151
151
  // all of our snapshot blobs. It doesn't necessary be true in the future
152
- let decoded = common_utils_1.bufferToString(buffer, "utf8");
152
+ let decoded = (0, common_utils_1.bufferToString)(buffer, "utf8");
153
153
  try {
154
154
  if (!fluidFetchArgs_1.paramActualFormatting) {
155
155
  decoded = JSON.stringify(JSON.parse(decoded), undefined, 2);
@@ -161,7 +161,7 @@ async function saveSnapshot(name, fetchedData, saveDir) {
161
161
  }
162
162
  else {
163
163
  // Write out same data for tree decoded or not, except for formatting
164
- const treeString = common_utils_1.bufferToString(buffer, "utf8");
164
+ const treeString = (0, common_utils_1.bufferToString)(buffer, "utf8");
165
165
  fs_1.default.writeFileSync(`${outDir}/${item.filename}.json`, treeString);
166
166
  fs_1.default.writeFileSync(`${outDir}/decoded/${item.filename}.json`, fluidFetchArgs_1.paramActualFormatting ? treeString : JSON.stringify(JSON.parse(treeString), undefined, 2));
167
167
  }
@@ -244,10 +244,10 @@ async function fluidFetchSnapshot(documentService, saveDir) {
244
244
  }
245
245
  }
246
246
  date = date.padStart(23);
247
- const size = fluidAnalyzeMessages_1.formatNumber(res.size).padStart(10);
248
- const sizeNew = fluidAnalyzeMessages_1.formatNumber(res.sizeNew).padStart(10);
249
- const blobCount = fluidAnalyzeMessages_1.formatNumber(res.blobCount).padStart(6);
250
- const blobCountNew = fluidAnalyzeMessages_1.formatNumber(res.blobCountNew).padStart(9);
247
+ const size = (0, fluidAnalyzeMessages_1.formatNumber)(res.size).padStart(10);
248
+ const sizeNew = (0, fluidAnalyzeMessages_1.formatNumber)(res.sizeNew).padStart(10);
249
+ const blobCount = (0, fluidAnalyzeMessages_1.formatNumber)(res.blobCount).padStart(6);
250
+ const blobCountNew = (0, fluidAnalyzeMessages_1.formatNumber)(res.blobCountNew).padStart(9);
251
251
  console.log(`${name.padEnd(15)} | ${date} | ${size} | ${sizeNew} | ${blobCount} | ${blobCountNew}`);
252
252
  await saveSnapshot(name, blobs, saveDir);
253
253
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fluidFetchSnapshot.js","sourceRoot":"","sources":["../src/fluidFetchSnapshot.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\nimport util from \"util\";\nimport { bufferToString, stringToBuffer, TelemetryNullLogger } from \"@fluidframework/common-utils\";\nimport {\n IDocumentService,\n IDocumentStorageService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ISnapshotTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { BlobAggregationStorage } from \"@fluidframework/driver-utils\";\nimport { formatNumber } from \"./fluidAnalyzeMessages\";\nimport {\n dumpSnapshotStats,\n dumpSnapshotTrees,\n dumpSnapshotVersions,\n paramActualFormatting,\n paramNumSnapshotVersions,\n paramSnapshotVersionIndex,\n paramUnpackAggregatedBlobs,\n} from \"./fluidFetchArgs\";\nimport { latestVersionsId } from \"./fluidFetchInit\";\n\ninterface ISnapshotInfo {\n blobCountNew: number;\n blobCount: number;\n size: number;\n sizeNew: number;\n}\n\ntype IFetchedData = IFetchedBlob | IFetchedTree;\n\ninterface IFetchedBlob {\n treePath: string;\n filename: string;\n blobId: string;\n blob: Promise<ArrayBufferLike | undefined>;\n reused: boolean;\n}\n\ninterface IFetchedTree {\n treePath: string;\n blobId: string;\n filename: string;\n blob: ArrayBufferLike;\n\n reused: false;\n\n patched: boolean;\n}\n\nfunction isFetchedTree(fetchedData: IFetchedData): fetchedData is IFetchedTree {\n return \"patched\" in fetchedData;\n}\n\nconst blobCache = new Map<string, Promise<ArrayBufferLike>>();\nlet blobCachePrevious = new Map<string, Promise<ArrayBufferLike>>();\nlet blobCacheCurrent = new Map<string, Promise<ArrayBufferLike>>();\n\nfunction fetchBlobs(prefix: string,\n tree: ISnapshotTree,\n storage: IDocumentStorageService,\n blobIdMap: Map<string, number>,\n) {\n const result: IFetchedBlob[] = [];\n for (const item of Object.keys(tree.blobs)) {\n const treePath = `${prefix}${item}`;\n const blobId = tree.blobs[item];\n if (blobId !== null) {\n let reused = true;\n let blob = blobCachePrevious.get(blobId);\n if (!blob) {\n reused = false;\n blob = blobCache.get(blobId);\n if (blob === undefined) {\n blob = storage.readBlob(blobId);\n blobCache.set(blobId, blob);\n }\n }\n blobCacheCurrent.set(blobId, blob);\n\n // Use the blobIdMap to assign a number for each unique blob\n // and use it as a prefix for files to avoid case-insensitive fs\n let index = blobIdMap.get(blobId);\n if (!index) {\n index = blobIdMap.size;\n blobIdMap.set(blobId, index);\n }\n const filename = `${index}-${blobId}`;\n result.push({ treePath, blobId, blob, reused, filename });\n\n // patch the tree so that we can write it out to reference the file\n tree.blobs[item] = filename;\n }\n }\n return result;\n}\n\nfunction createTreeBlob(tree: ISnapshotTree, prefix: string, patched: boolean): IFetchedTree {\n const id = tree.id ?? \"original\";\n const blob = stringToBuffer(JSON.stringify(tree),\"utf8\");\n const filename = patched ? \"tree\" : `tree-${id}`;\n const treePath = `${prefix}${filename}`;\n return { treePath, blobId: \"original tree $id\", filename, blob, patched, reused: false };\n}\n\nasync function fetchBlobsFromSnapshotTree(\n storage: IDocumentStorageService,\n tree: ISnapshotTree,\n prefix: string = \"/\",\n parentBlobIdMap?: Map<string, number>): Promise<IFetchedData[]> {\n const isTopLevel = !parentBlobIdMap;\n if (isTopLevel && dumpSnapshotTrees) {\n console.log(tree);\n }\n\n if (prefix === \"/\") {\n blobCachePrevious = blobCacheCurrent;\n blobCacheCurrent = new Map<string, Promise<ArrayBufferLike>>();\n }\n\n // Create the tree info before fetching blobs (which will modify it)\n let topLevelBlob: IFetchedTree | undefined;\n if (isTopLevel) {\n topLevelBlob = createTreeBlob(tree, prefix, false);\n }\n\n const blobIdMap = parentBlobIdMap ?? new Map<string, number>();\n let result: IFetchedData[] = fetchBlobs(prefix, tree, storage, blobIdMap);\n\n for (const subtreeId of Object.keys(tree.trees)) {\n const subtree = tree.trees[subtreeId];\n const dataStoreBlobs = await fetchBlobsFromSnapshotTree(\n storage,\n subtree,\n `${prefix}${subtreeId}/`, blobIdMap);\n result = result.concat(dataStoreBlobs);\n }\n\n if (topLevelBlob) {\n result.push(topLevelBlob);\n result.push(createTreeBlob(tree, prefix, true));\n }\n return result;\n}\n\nfunction getDumpFetchedData(fetchedData: IFetchedData[]) {\n const sorted = fetchedData.sort((a, b) => a.treePath.localeCompare(b.treePath));\n return sorted.filter((item) => !isFetchedTree(item) || !item.patched);\n}\n\nasync function dumpSnapshotTreeVerbose(name: string, fetchedData: IFetchedData[]) {\n let size = 0;\n const sorted = getDumpFetchedData(fetchedData);\n\n let nameLength = 10;\n for (const item of sorted) {\n nameLength = Math.max(nameLength, item.treePath.length);\n }\n\n console.log(\"\");\n console.log(`${\"Blob Path\".padEnd(nameLength)} | Reused | Bytes`);\n console.log(\"-\".repeat(nameLength + 26));\n for (const item of sorted) {\n const buffer = await item.blob;\n if (buffer === undefined) {\n continue;\n }\n const blob = bufferToString(buffer,\"utf8\");\n // eslint-disable-next-line max-len\n console.log(`${item.treePath.padEnd(nameLength)} | ${item.reused ? \"X\" : \" \"} | ${formatNumber(blob.length).padStart(10)}`);\n size += blob.length;\n }\n\n console.log(\"-\".repeat(nameLength + 26));\n console.log(`${\"Total snapshot size\".padEnd(nameLength)} | | ${formatNumber(size).padStart(10)}`);\n}\n\nasync function dumpSnapshotTree(name: string, fetchedData: IFetchedData[]): Promise<ISnapshotInfo> {\n let size = 0;\n let sizeNew = 0;\n let blobCountNew = 0;\n const sorted = getDumpFetchedData(fetchedData);\n\n for (const item of sorted) {\n const buffer = await item.blob;\n if (buffer === undefined) {\n continue;\n }\n const blob = bufferToString(buffer, \"utf8\");\n if (!item.reused) {\n sizeNew += blob.length;\n blobCountNew++;\n }\n size += blob.length;\n }\n\n return { blobCountNew, blobCount: sorted.length, size, sizeNew };\n}\n\nasync function saveSnapshot(name: string, fetchedData: IFetchedData[], saveDir: string) {\n const outDir = `${saveDir}/${name}/`;\n const mkdir = util.promisify(fs.mkdir);\n\n await mkdir(`${outDir}/decoded`, { recursive: true });\n await Promise.all(fetchedData.map(async (item) => {\n const buffer = await item.blob;\n if (buffer === undefined) {\n console.error(`ERROR: Unable to get data for blob ${item.blobId}`);\n return;\n }\n\n if (!isFetchedTree(item)) {\n // Just write the data as is.\n fs.writeFileSync(`${outDir}/${item.filename}`, Buffer.from(buffer));\n\n // we assume that the buffer is utf8 here, which currently is true for\n // all of our snapshot blobs. It doesn't necessary be true in the future\n let decoded = bufferToString(buffer,\"utf8\");\n try {\n if (!paramActualFormatting) {\n decoded = JSON.stringify(JSON.parse(decoded), undefined, 2);\n }\n } catch (e) {\n }\n fs.writeFileSync(\n `${outDir}/decoded/${item.filename}.json`, decoded);\n } else {\n // Write out same data for tree decoded or not, except for formatting\n const treeString = bufferToString(buffer,\"utf8\");\n fs.writeFileSync(`${outDir}/${item.filename}.json`, treeString);\n fs.writeFileSync(`${outDir}/decoded/${item.filename}.json`,\n paramActualFormatting ? treeString : JSON.stringify(JSON.parse(treeString), undefined, 2));\n }\n }));\n}\n\nasync function fetchBlobsFromVersion(storage: IDocumentStorageService, version: IVersion) {\n const tree = await reportErrors(`getSnapshotTree ${version.id}`, storage.getSnapshotTree(version));\n if (!tree) {\n return Promise.reject(new Error(\"Failed to load snapshot tree\"));\n }\n return fetchBlobsFromSnapshotTree(storage, tree);\n}\n\nasync function reportErrors<T>(message: string, res: Promise<T>) {\n try {\n return await res;\n } catch (error) {\n console.error(`Error calling ${message}`);\n throw error;\n }\n}\n\nexport async function fluidFetchSnapshot(\n documentService?: IDocumentService,\n saveDir?: string,\n ) {\n if (!dumpSnapshotStats && !dumpSnapshotTrees && !dumpSnapshotVersions && saveDir === undefined) {\n return;\n }\n\n // --local mode - do not connect to storage.\n // For now, bail out early.\n // In future, separate download from analyzes parts and allow offline analyzes\n if (!documentService) {\n return;\n }\n\n console.log(\"\\n\");\n\n let storage = await documentService.connectToStorage();\n if (paramUnpackAggregatedBlobs) {\n storage = BlobAggregationStorage.wrap(storage, new TelemetryNullLogger(), false /* allowPacking */);\n }\n\n let version: IVersion | undefined;\n const versions = await reportErrors(\n `getVersions ${latestVersionsId}`,\n storage.getVersions(latestVersionsId, paramNumSnapshotVersions));\n if (dumpSnapshotVersions) {\n console.log(\"Snapshot versions\");\n console.log(versions);\n }\n\n let blobsToDump: IFetchedData[] | undefined;\n if (paramSnapshotVersionIndex !== undefined) {\n version = versions[paramSnapshotVersionIndex];\n if (version === undefined) {\n console.log(`There are only ${versions.length} snapshots, --snapshotVersionIndex is too large`);\n return;\n }\n if (saveDir !== undefined) {\n blobsToDump = await fetchBlobsFromVersion(storage, version);\n const name = version.id;\n console.log(`Saving snapshot ${name}`);\n await saveSnapshot(name, blobsToDump, saveDir);\n }\n } else {\n version = versions[0];\n if (saveDir !== undefined && versions.length > 0) {\n console.log(\" Name | Date | Size | New Size | Blobs | New Blobs\");\n console.log(\"-\".repeat(86));\n\n // Go in reverse order, to correctly calculate blob reuse - from oldest to newest snapshots\n for (let i = versions.length - 1; i >= 0; i--) {\n const v = versions[i];\n const blobs = await fetchBlobsFromVersion(storage, v);\n blobsToDump = blobs;\n const name = `${i}-${v.id}`;\n const res = await dumpSnapshotTree(name, blobs);\n\n let date = \"\";\n if (v.date) {\n try {\n date = new Date(v.date).toLocaleString();\n } catch (e) {\n date = v.date.replace(\"T\", \" \");\n const index = date.lastIndexOf(\".\");\n if (index > 0) {\n date = `${date.substr(0, index)} Z`;\n }\n }\n }\n date = date.padStart(23);\n const size = formatNumber(res.size).padStart(10);\n const sizeNew = formatNumber(res.sizeNew).padStart(10);\n const blobCount = formatNumber(res.blobCount).padStart(6);\n const blobCountNew = formatNumber(res.blobCountNew).padStart(9);\n\n console.log(`${name.padEnd(15)} | ${date} | ${size} | ${sizeNew} | ${blobCount} | ${blobCountNew}`);\n\n await saveSnapshot(name, blobs, saveDir);\n }\n }\n }\n\n if (dumpSnapshotStats || dumpSnapshotTrees) {\n if (version === undefined) {\n console.log(\"No snapshot tree\");\n } else {\n if (blobsToDump === undefined) {\n blobsToDump = await fetchBlobsFromVersion(storage, version);\n }\n console.log(`\\n\\nSnapshot version ${version.id}`);\n await dumpSnapshotTreeVerbose(version.id, blobsToDump);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"fluidFetchSnapshot.js","sourceRoot":"","sources":["../src/fluidFetchSnapshot.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\nimport util from \"util\";\nimport { bufferToString, stringToBuffer, TelemetryNullLogger } from \"@fluidframework/common-utils\";\nimport {\n IDocumentService,\n IDocumentStorageService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ISnapshotTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { BlobAggregationStorage } from \"@fluidframework/driver-utils\";\nimport { formatNumber } from \"./fluidAnalyzeMessages\";\nimport {\n dumpSnapshotStats,\n dumpSnapshotTrees,\n dumpSnapshotVersions,\n paramActualFormatting,\n paramNumSnapshotVersions,\n paramSnapshotVersionIndex,\n paramUnpackAggregatedBlobs,\n} from \"./fluidFetchArgs\";\nimport { latestVersionsId } from \"./fluidFetchInit\";\n\ninterface ISnapshotInfo {\n blobCountNew: number;\n blobCount: number;\n size: number;\n sizeNew: number;\n}\n\ntype IFetchedData = IFetchedBlob | IFetchedTree;\n\ninterface IFetchedBlob {\n treePath: string;\n filename: string;\n blobId: string;\n blob: Promise<ArrayBufferLike | undefined>;\n reused: boolean;\n}\n\ninterface IFetchedTree {\n treePath: string;\n blobId: string;\n filename: string;\n blob: ArrayBufferLike;\n\n reused: false;\n\n patched: boolean;\n}\n\nfunction isFetchedTree(fetchedData: IFetchedData): fetchedData is IFetchedTree {\n return \"patched\" in fetchedData;\n}\n\nconst blobCache = new Map<string, Promise<ArrayBufferLike>>();\nlet blobCachePrevious = new Map<string, Promise<ArrayBufferLike>>();\nlet blobCacheCurrent = new Map<string, Promise<ArrayBufferLike>>();\n\nfunction fetchBlobs(prefix: string,\n tree: ISnapshotTree,\n storage: IDocumentStorageService,\n blobIdMap: Map<string, number>,\n) {\n const result: IFetchedBlob[] = [];\n for (const item of Object.keys(tree.blobs)) {\n const treePath = `${prefix}${item}`;\n const blobId = tree.blobs[item];\n if (blobId !== null) {\n let reused = true;\n let blob = blobCachePrevious.get(blobId);\n if (!blob) {\n reused = false;\n blob = blobCache.get(blobId);\n if (blob === undefined) {\n blob = storage.readBlob(blobId);\n blobCache.set(blobId, blob);\n }\n }\n blobCacheCurrent.set(blobId, blob);\n\n // Use the blobIdMap to assign a number for each unique blob\n // and use it as a prefix for files to avoid case-insensitive fs\n let index = blobIdMap.get(blobId);\n if (!index) {\n index = blobIdMap.size;\n blobIdMap.set(blobId, index);\n }\n const filename = `${index}-${blobId}`;\n result.push({ treePath, blobId, blob, reused, filename });\n\n // patch the tree so that we can write it out to reference the file\n tree.blobs[item] = filename;\n }\n }\n return result;\n}\n\nfunction createTreeBlob(tree: ISnapshotTree, prefix: string, patched: boolean): IFetchedTree {\n const id = tree.id ?? \"original\";\n const blob = stringToBuffer(JSON.stringify(tree), \"utf8\");\n const filename = patched ? \"tree\" : `tree-${id}`;\n const treePath = `${prefix}${filename}`;\n return { treePath, blobId: \"original tree $id\", filename, blob, patched, reused: false };\n}\n\nasync function fetchBlobsFromSnapshotTree(\n storage: IDocumentStorageService,\n tree: ISnapshotTree,\n prefix: string = \"/\",\n parentBlobIdMap?: Map<string, number>): Promise<IFetchedData[]> {\n const isTopLevel = !parentBlobIdMap;\n if (isTopLevel && dumpSnapshotTrees) {\n console.log(tree);\n }\n\n if (prefix === \"/\") {\n blobCachePrevious = blobCacheCurrent;\n blobCacheCurrent = new Map<string, Promise<ArrayBufferLike>>();\n }\n\n // Create the tree info before fetching blobs (which will modify it)\n let topLevelBlob: IFetchedTree | undefined;\n if (isTopLevel) {\n topLevelBlob = createTreeBlob(tree, prefix, false);\n }\n\n const blobIdMap = parentBlobIdMap ?? new Map<string, number>();\n let result: IFetchedData[] = fetchBlobs(prefix, tree, storage, blobIdMap);\n\n for (const subtreeId of Object.keys(tree.trees)) {\n const subtree = tree.trees[subtreeId];\n const dataStoreBlobs = await fetchBlobsFromSnapshotTree(\n storage,\n subtree,\n `${prefix}${subtreeId}/`, blobIdMap);\n result = result.concat(dataStoreBlobs);\n }\n\n if (topLevelBlob) {\n result.push(topLevelBlob);\n result.push(createTreeBlob(tree, prefix, true));\n }\n return result;\n}\n\nfunction getDumpFetchedData(fetchedData: IFetchedData[]) {\n const sorted = fetchedData.sort((a, b) => a.treePath.localeCompare(b.treePath));\n return sorted.filter((item) => !isFetchedTree(item) || !item.patched);\n}\n\nasync function dumpSnapshotTreeVerbose(name: string, fetchedData: IFetchedData[]) {\n let size = 0;\n const sorted = getDumpFetchedData(fetchedData);\n\n let nameLength = 10;\n for (const item of sorted) {\n nameLength = Math.max(nameLength, item.treePath.length);\n }\n\n console.log(\"\");\n console.log(`${\"Blob Path\".padEnd(nameLength)} | Reused | Bytes`);\n console.log(\"-\".repeat(nameLength + 26));\n for (const item of sorted) {\n const buffer = await item.blob;\n if (buffer === undefined) {\n continue;\n }\n const blob = bufferToString(buffer, \"utf8\");\n // eslint-disable-next-line max-len\n console.log(`${item.treePath.padEnd(nameLength)} | ${item.reused ? \"X\" : \" \"} | ${formatNumber(blob.length).padStart(10)}`);\n size += blob.length;\n }\n\n console.log(\"-\".repeat(nameLength + 26));\n console.log(`${\"Total snapshot size\".padEnd(nameLength)} | | ${formatNumber(size).padStart(10)}`);\n}\n\nasync function dumpSnapshotTree(name: string, fetchedData: IFetchedData[]): Promise<ISnapshotInfo> {\n let size = 0;\n let sizeNew = 0;\n let blobCountNew = 0;\n const sorted = getDumpFetchedData(fetchedData);\n\n for (const item of sorted) {\n const buffer = await item.blob;\n if (buffer === undefined) {\n continue;\n }\n const blob = bufferToString(buffer, \"utf8\");\n if (!item.reused) {\n sizeNew += blob.length;\n blobCountNew++;\n }\n size += blob.length;\n }\n\n return { blobCountNew, blobCount: sorted.length, size, sizeNew };\n}\n\nasync function saveSnapshot(name: string, fetchedData: IFetchedData[], saveDir: string) {\n const outDir = `${saveDir}/${name}/`;\n const mkdir = util.promisify(fs.mkdir);\n\n await mkdir(`${outDir}/decoded`, { recursive: true });\n await Promise.all(fetchedData.map(async (item) => {\n const buffer = await item.blob;\n if (buffer === undefined) {\n console.error(`ERROR: Unable to get data for blob ${item.blobId}`);\n return;\n }\n\n if (!isFetchedTree(item)) {\n // Just write the data as is.\n fs.writeFileSync(`${outDir}/${item.filename}`, Buffer.from(buffer));\n\n // we assume that the buffer is utf8 here, which currently is true for\n // all of our snapshot blobs. It doesn't necessary be true in the future\n let decoded = bufferToString(buffer, \"utf8\");\n try {\n if (!paramActualFormatting) {\n decoded = JSON.stringify(JSON.parse(decoded), undefined, 2);\n }\n } catch (e) {\n }\n fs.writeFileSync(\n `${outDir}/decoded/${item.filename}.json`, decoded);\n } else {\n // Write out same data for tree decoded or not, except for formatting\n const treeString = bufferToString(buffer, \"utf8\");\n fs.writeFileSync(`${outDir}/${item.filename}.json`, treeString);\n fs.writeFileSync(`${outDir}/decoded/${item.filename}.json`,\n paramActualFormatting ? treeString : JSON.stringify(JSON.parse(treeString), undefined, 2));\n }\n }));\n}\n\nasync function fetchBlobsFromVersion(storage: IDocumentStorageService, version: IVersion) {\n const tree = await reportErrors(`getSnapshotTree ${version.id}`, storage.getSnapshotTree(version));\n if (!tree) {\n return Promise.reject(new Error(\"Failed to load snapshot tree\"));\n }\n return fetchBlobsFromSnapshotTree(storage, tree);\n}\n\nasync function reportErrors<T>(message: string, res: Promise<T>) {\n try {\n return await res;\n } catch (error) {\n console.error(`Error calling ${message}`);\n throw error;\n }\n}\n\nexport async function fluidFetchSnapshot(\n documentService?: IDocumentService,\n saveDir?: string,\n ) {\n if (!dumpSnapshotStats && !dumpSnapshotTrees && !dumpSnapshotVersions && saveDir === undefined) {\n return;\n }\n\n // --local mode - do not connect to storage.\n // For now, bail out early.\n // In future, separate download from analyzes parts and allow offline analyzes\n if (!documentService) {\n return;\n }\n\n console.log(\"\\n\");\n\n let storage = await documentService.connectToStorage();\n if (paramUnpackAggregatedBlobs) {\n storage = BlobAggregationStorage.wrap(storage, new TelemetryNullLogger(), false /* allowPacking */);\n }\n\n let version: IVersion | undefined;\n const versions = await reportErrors(\n `getVersions ${latestVersionsId}`,\n storage.getVersions(latestVersionsId, paramNumSnapshotVersions));\n if (dumpSnapshotVersions) {\n console.log(\"Snapshot versions\");\n console.log(versions);\n }\n\n let blobsToDump: IFetchedData[] | undefined;\n if (paramSnapshotVersionIndex !== undefined) {\n version = versions[paramSnapshotVersionIndex];\n if (version === undefined) {\n console.log(`There are only ${versions.length} snapshots, --snapshotVersionIndex is too large`);\n return;\n }\n if (saveDir !== undefined) {\n blobsToDump = await fetchBlobsFromVersion(storage, version);\n const name = version.id;\n console.log(`Saving snapshot ${name}`);\n await saveSnapshot(name, blobsToDump, saveDir);\n }\n } else {\n version = versions[0];\n if (saveDir !== undefined && versions.length > 0) {\n console.log(\" Name | Date | Size | New Size | Blobs | New Blobs\");\n console.log(\"-\".repeat(86));\n\n // Go in reverse order, to correctly calculate blob reuse - from oldest to newest snapshots\n for (let i = versions.length - 1; i >= 0; i--) {\n const v = versions[i];\n const blobs = await fetchBlobsFromVersion(storage, v);\n blobsToDump = blobs;\n const name = `${i}-${v.id}`;\n const res = await dumpSnapshotTree(name, blobs);\n\n let date = \"\";\n if (v.date) {\n try {\n date = new Date(v.date).toLocaleString();\n } catch (e) {\n date = v.date.replace(\"T\", \" \");\n const index = date.lastIndexOf(\".\");\n if (index > 0) {\n date = `${date.substr(0, index)} Z`;\n }\n }\n }\n date = date.padStart(23);\n const size = formatNumber(res.size).padStart(10);\n const sizeNew = formatNumber(res.sizeNew).padStart(10);\n const blobCount = formatNumber(res.blobCount).padStart(6);\n const blobCountNew = formatNumber(res.blobCountNew).padStart(9);\n\n console.log(`${name.padEnd(15)} | ${date} | ${size} | ${sizeNew} | ${blobCount} | ${blobCountNew}`);\n\n await saveSnapshot(name, blobs, saveDir);\n }\n }\n }\n\n if (dumpSnapshotStats || dumpSnapshotTrees) {\n if (version === undefined) {\n console.log(\"No snapshot tree\");\n } else {\n if (blobsToDump === undefined) {\n blobsToDump = await fetchBlobsFromVersion(storage, version);\n }\n console.log(`\\n\\nSnapshot version ${version.id}`);\n await dumpSnapshotTreeVerbose(version.id, blobsToDump);\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluid-tools/fetch-tool",
3
- "version": "0.59.2001",
3
+ "version": "0.59.3000",
4
4
  "description": "Console tool to fetch Fluid data from relay service",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -29,28 +29,27 @@
29
29
  "tsfmt:fix": "tsfmt --replace"
30
30
  },
31
31
  "dependencies": {
32
- "@fluid-tools/fluidapp-odsp-urlresolver": "^0.59.2001",
33
- "@fluidframework/azure-client": "^0.59.2001",
32
+ "@fluid-tools/fluidapp-odsp-urlresolver": "^0.59.3000",
34
33
  "@fluidframework/common-utils": "^0.32.1",
35
- "@fluidframework/container-runtime": "^0.59.2001",
36
- "@fluidframework/datastore": "^0.59.2001",
34
+ "@fluidframework/container-runtime": "^0.59.3000",
35
+ "@fluidframework/datastore": "^0.59.3000",
37
36
  "@fluidframework/driver-definitions": "^0.46.1000",
38
- "@fluidframework/driver-utils": "^0.59.2001",
39
- "@fluidframework/odsp-doclib-utils": "^0.59.2001",
40
- "@fluidframework/odsp-driver": "^0.59.2001",
41
- "@fluidframework/odsp-driver-definitions": "^0.59.2001",
42
- "@fluidframework/odsp-urlresolver": "^0.59.2001",
37
+ "@fluidframework/driver-utils": "^0.59.3000",
38
+ "@fluidframework/odsp-doclib-utils": "^0.59.3000",
39
+ "@fluidframework/odsp-driver": "^0.59.3000",
40
+ "@fluidframework/odsp-driver-definitions": "^0.59.3000",
41
+ "@fluidframework/odsp-urlresolver": "^0.59.3000",
43
42
  "@fluidframework/protocol-definitions": "^0.1028.1000",
44
- "@fluidframework/routerlicious-driver": "^0.59.2001",
45
- "@fluidframework/routerlicious-urlresolver": "^0.59.2001",
46
- "@fluidframework/runtime-definitions": "^0.59.2001",
47
- "@fluidframework/telemetry-utils": "^0.59.2001",
48
- "@fluidframework/test-client-utils": "^0.59.2001",
49
- "@fluidframework/tool-utils": "^0.59.2001"
43
+ "@fluidframework/routerlicious-driver": "^0.59.3000",
44
+ "@fluidframework/routerlicious-urlresolver": "^0.59.3000",
45
+ "@fluidframework/runtime-definitions": "^0.59.3000",
46
+ "@fluidframework/telemetry-utils": "^0.59.3000",
47
+ "@fluidframework/test-client-utils": "^0.59.3000",
48
+ "@fluidframework/tool-utils": "^0.59.3000"
50
49
  },
51
50
  "devDependencies": {
52
51
  "@fluidframework/build-common": "^0.23.0",
53
- "@fluidframework/eslint-config-fluid": "^0.28.1000",
52
+ "@fluidframework/eslint-config-fluid": "^0.28.2000",
54
53
  "@rushstack/eslint-config": "^2.5.1",
55
54
  "@types/node": "^14.18.0",
56
55
  "@typescript-eslint/eslint-plugin": "~5.9.0",
@@ -67,7 +66,7 @@
67
66
  "eslint-plugin-tsdoc": "~0.2.14",
68
67
  "eslint-plugin-unicorn": "~40.0.0",
69
68
  "rimraf": "^2.6.2",
70
- "typescript": "~4.1.3",
69
+ "typescript": "~4.5.5",
71
70
  "typescript-formatter": "7.1.0"
72
71
  }
73
72
  }