@fluidframework/odsp-driver 2.0.0-dev-rc.2.0.0.245554 → 2.0.0-dev-rc.2.0.0.246488

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 (46) hide show
  1. package/dist/createOdspCreateContainerRequest.d.ts.map +1 -1
  2. package/dist/createOdspCreateContainerRequest.js +4 -0
  3. package/dist/createOdspCreateContainerRequest.js.map +1 -1
  4. package/dist/getQueryString.d.ts.map +1 -1
  5. package/dist/getQueryString.js +4 -0
  6. package/dist/getQueryString.js.map +1 -1
  7. package/dist/odspCache.d.ts.map +1 -1
  8. package/dist/odspCache.js +2 -2
  9. package/dist/odspCache.js.map +1 -1
  10. package/dist/odspDriverUrlResolver.d.ts +4 -0
  11. package/dist/odspDriverUrlResolver.d.ts.map +1 -1
  12. package/dist/odspDriverUrlResolver.js +2 -2
  13. package/dist/odspDriverUrlResolver.js.map +1 -1
  14. package/dist/odspDriverUrlResolverForShareLink.d.ts +4 -0
  15. package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  16. package/dist/odspDriverUrlResolverForShareLink.js +2 -2
  17. package/dist/odspDriverUrlResolverForShareLink.js.map +1 -1
  18. package/dist/packageVersion.d.ts +1 -1
  19. package/dist/packageVersion.js +1 -1
  20. package/dist/packageVersion.js.map +1 -1
  21. package/lib/createOdspCreateContainerRequest.d.ts.map +1 -1
  22. package/lib/createOdspCreateContainerRequest.js +4 -0
  23. package/lib/createOdspCreateContainerRequest.js.map +1 -1
  24. package/lib/getQueryString.d.ts.map +1 -1
  25. package/lib/getQueryString.js +4 -0
  26. package/lib/getQueryString.js.map +1 -1
  27. package/lib/odspCache.d.ts.map +1 -1
  28. package/lib/odspCache.js.map +1 -1
  29. package/lib/odspDriverUrlResolver.d.ts +4 -0
  30. package/lib/odspDriverUrlResolver.d.ts.map +1 -1
  31. package/lib/odspDriverUrlResolver.js.map +1 -1
  32. package/lib/odspDriverUrlResolverForShareLink.d.ts +4 -0
  33. package/lib/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  34. package/lib/odspDriverUrlResolverForShareLink.js.map +1 -1
  35. package/lib/packageVersion.d.ts +1 -1
  36. package/lib/packageVersion.js +1 -1
  37. package/lib/packageVersion.js.map +1 -1
  38. package/lib/test/odspDriverResolverTest.spec.js.map +1 -1
  39. package/lib/test/opsCaching.spec.js.map +1 -1
  40. package/package.json +11 -11
  41. package/src/createOdspCreateContainerRequest.ts +1 -0
  42. package/src/getQueryString.ts +1 -0
  43. package/src/odspCache.ts +1 -0
  44. package/src/odspDriverUrlResolver.ts +1 -0
  45. package/src/odspDriverUrlResolverForShareLink.ts +1 -0
  46. package/src/packageVersion.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"odspDriverUrlResolverForShareLink.d.ts","sourceRoot":"","sources":["../src/odspDriverUrlResolverForShareLink.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,EACN,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACN,gBAAgB,EAChB,YAAY,EACZ,6BAA6B,EAC7B,YAAY,EACZ,MAAM,yCAAyC,CAAC;AAMjD,OAAO,EAAE,yBAAyB,EAAqB,MAAM,sBAAsB,CAAC;AAMpF;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACrC;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC,6BAA6B,CAAC,CAAC;IAC1D;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC;CAC3B;AAMD;;;;;GAKG;AACH,qBAAa,iCAAkC,YAAW,YAAY;IAoBpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IApB7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAoC;IAE1E;;;;;;;;;;;OAWG;gBAEF,qBAAqB,CAAC,EAAE,qBAAqB,GAAG,SAAS,EACzD,MAAM,CAAC,EAAE,oBAAoB,EACZ,OAAO,CAAC,oBAAQ,EAChB,UAAU,CAAC,iBACd,gBAAgB,iBACd,MAAM,KACjB,QAAQ,MAAM,GAAG,SAAS,CAAC,aAAA;IAWjC;;;OAGG;IACI,mBAAmB,CAAC,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IA4BrF,OAAO,CAAC,MAAM;IAId;;OAEG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiClE,OAAO,CAAC,cAAc;YAQR,mBAAmB;IAiCjC;;;;;;;;OAQG;IACU,cAAc,CAC1B,WAAW,EAAE,YAAY,EACzB,aAAa,EAAE,MAAM,EACrB,iBAAiB,CAAC,EAAE,qBAAqB,GACvC,OAAO,CAAC,MAAM,CAAC;IAQlB;;;;;;;;;;OAUG;IACU,mBAAmB,CAC/B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,YAAY,EACzB,aAAa,EAAE,MAAM,EACrB,iBAAiB,CAAC,EAAE,qBAAqB,GACvC,OAAO,CAAC,MAAM,CAAC;IA0ClB;;OAEG;WACW,iBAAiB,CAC9B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,yBAAyB,GACnC,MAAM;CAOT"}
1
+ {"version":3,"file":"odspDriverUrlResolverForShareLink.d.ts","sourceRoot":"","sources":["../src/odspDriverUrlResolverForShareLink.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,EACN,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACN,gBAAgB,EAChB,YAAY,EACZ,6BAA6B,EAC7B,YAAY,EACZ,MAAM,yCAAyC,CAAC;AAMjD,OAAO,EAAE,yBAAyB,EAAqB,MAAM,sBAAsB,CAAC;AAMpF;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACrC;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC,6BAA6B,CAAC,CAAC;IAC1D;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC;CAC3B;AAMD;;;;;GAKG;AACH,qBAAa,iCAAkC,YAAW,YAAY;IAoBpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IApB7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAoC;IAE1E;;;;;;;;;;;OAWG;gBAEF,qBAAqB,CAAC,EAAE,qBAAqB,GAAG,SAAS,EACzD,MAAM,CAAC,EAAE,oBAAoB,EACZ,OAAO,CAAC,oBAAQ,EAChB,UAAU,CAAC,iBACd,gBAAgB,iBACd,MAAM,KACjB,QAAQ,MAAM,GAAG,SAAS,CAAC,aAAA;IAWjC;;;OAGG;IACI,mBAAmB,CAAC,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IA4BrF,OAAO,CAAC,MAAM;IAId;;OAEG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiClE,OAAO,CAAC,cAAc;YAQR,mBAAmB;IAiCjC;;;;;;;;OAQG;IACU,cAAc,CAC1B,WAAW,EAAE,YAAY,EACzB,aAAa,EAAE,MAAM,EACrB,iBAAiB,CAAC,EAAE,qBAAqB,GACvC,OAAO,CAAC,MAAM,CAAC;IAQlB;;;;;;;;;;OAUG;IACU,mBAAmB,CAC/B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,YAAY,EACzB,aAAa,EAAE,MAAM,EACrB,iBAAiB,CAAC,EAAE,qBAAqB,GACvC,OAAO,CAAC,MAAM,CAAC;IA0ClB;;OAEG;WACW,iBAAiB,CAC9B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,yBAAyB,GACnC,MAAM;CAOT"}
@@ -1 +1 @@
1
- {"version":3,"file":"odspDriverUrlResolverForShareLink.js","sourceRoot":"","sources":["../src/odspDriverUrlResolverForShareLink.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 */\nimport { PromiseCache } from \"@fluidframework/core-utils\";\nimport { ITelemetryBaseLogger, IRequest } from \"@fluidframework/core-interfaces\";\nimport {\n\tIContainerPackageInfo,\n\tIResolvedUrl,\n\tIUrlResolver,\n} from \"@fluidframework/driver-definitions\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils\";\nimport {\n\tIOdspResolvedUrl,\n\tIdentityType,\n\tOdspResourceTokenFetchOptions,\n\tTokenFetcher,\n} from \"@fluidframework/odsp-driver-definitions\";\nimport {\n\tgetLocatorFromOdspUrl,\n\tstoreLocatorInOdspUrl,\n\tlocatorQueryParamName,\n} from \"./odspFluidFileLink.js\";\nimport { OdspFluidDataStoreLocator, SharingLinkHeader } from \"./contractsPublic.js\";\nimport { createOdspUrl } from \"./createOdspUrl.js\";\nimport { OdspDriverUrlResolver } from \"./odspDriverUrlResolver.js\";\nimport { getOdspResolvedUrl, createOdspLogger } from \"./odspUtils.js\";\nimport { getFileLink } from \"./getFileLink.js\";\n\n/**\n * Properties passed to the code responsible for fetching share link for a file.\n * @alpha\n */\nexport interface ShareLinkFetcherProps {\n\t/**\n\t * Callback method that is used to fetch access token necessary to call API that produces share link\n\t */\n\ttokenFetcher: TokenFetcher<OdspResourceTokenFetchOptions>;\n\t/**\n\t * Identity type determining the shape of share link as it differs for Enterprise and Consumer users.\n\t */\n\tidentityType: IdentityType;\n}\n\n// back-compat: GitHub #9653\nconst isFluidPackage = (pkg: Record<string, unknown>): boolean =>\n\ttypeof pkg === \"object\" && typeof pkg?.name === \"string\" && typeof pkg?.fluid === \"object\";\n\n/**\n * Resolver to resolve urls like the ones created by createOdspUrl which is driver inner\n * url format and the ones which have things like driveId, siteId, itemId etc encoded in nav param.\n * This resolver also handles share links and try to generate one for the use by the app.\n * @alpha\n */\nexport class OdspDriverUrlResolverForShareLink implements IUrlResolver {\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate readonly sharingLinkCache = new PromiseCache<string, string>();\n\tprivate readonly shareLinkFetcherProps: ShareLinkFetcherProps | undefined;\n\n\t/**\n\t * Creates url resolver instance\n\t * @param shareLinkFetcherProps - properties used when fetching share link.\n\t * Can be set as 'undefined' for cases where share link is not needed. Currently, only\n\t * getAbsoluteUrl() method requires share link.\n\t * @param logger - logger object that is used as telemetry sink\n\t * @param appName - application name hint that is encoded with url produced by getAbsoluteUrl() method.\n\t * This hint is used by link handling logic which determines which app to redirect to when user\n\t * navigates directly to the link.\n\t * @param getContext - callback function which is used to get context for given resolved url. If context\n\t * is returned then it will be embedded into url returned by getAbsoluteUrl() method.\n\t */\n\tpublic constructor(\n\t\tshareLinkFetcherProps?: ShareLinkFetcherProps | undefined,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tprivate readonly appName?: string,\n\t\tprivate readonly getContext?: (\n\t\t\tresolvedUrl: IOdspResolvedUrl,\n\t\t\tdataStorePath: string,\n\t\t) => Promise<string | undefined>,\n\t) {\n\t\tthis.logger = createOdspLogger(logger);\n\t\tif (shareLinkFetcherProps) {\n\t\t\tthis.shareLinkFetcherProps = {\n\t\t\t\t...shareLinkFetcherProps,\n\t\t\t\ttokenFetcher: shareLinkFetcherProps.tokenFetcher,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Takes an already generated data store url (from requestUrl) and appends a path to the\n\t * existing data store information.\n\t */\n\tpublic appendDataStorePath(requestUrl: URL, pathToAppend: string): string | undefined {\n\t\tconst fluidInfo = getLocatorFromOdspUrl(requestUrl);\n\n\t\tif (!fluidInfo) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst parsingUrl = new URL(\n\t\t\tfluidInfo.dataStorePath,\n\t\t\t`${requestUrl.protocol}//${requestUrl.hostname}`,\n\t\t);\n\t\t// Determine if the caller is passing a query parameter or path since processing will be different.\n\t\tif (pathToAppend.startsWith(\"/?\") || pathToAppend.startsWith(\"?\")) {\n\t\t\tconst queryParams = new URLSearchParams(pathToAppend);\n\t\t\tfor (const [key, value] of queryParams.entries()) {\n\t\t\t\tparsingUrl.searchParams.append(key, value);\n\t\t\t}\n\t\t\tfluidInfo.dataStorePath = `${parsingUrl.pathname}${parsingUrl.search}`;\n\t\t} else {\n\t\t\tfluidInfo.dataStorePath = `${parsingUrl.pathname}${\n\t\t\t\tparsingUrl.pathname.endsWith(\"/\") || pathToAppend.startsWith(\"/\") ? \"\" : \"/\"\n\t\t\t}${pathToAppend}/${parsingUrl.search}`;\n\t\t}\n\t\tstoreLocatorInOdspUrl(requestUrl, fluidInfo);\n\n\t\treturn requestUrl.href;\n\t}\n\n\tprivate getKey(resolvedUrl: IOdspResolvedUrl): string {\n\t\treturn `${resolvedUrl.siteUrl},${resolvedUrl.driveId},${resolvedUrl.itemId}`;\n\t}\n\n\t/**\n\t * Resolves request URL into driver details\n\t */\n\tpublic async resolve(request: IRequest): Promise<IOdspResolvedUrl> {\n\t\tconst requestToBeResolved = { headers: request.headers, url: request.url };\n\t\tconst isSharingLinkToRedeem =\n\t\t\trequestToBeResolved.headers?.[SharingLinkHeader.isSharingLinkToRedeem];\n\t\ttry {\n\t\t\tconst url = new URL(request.url);\n\n\t\t\tconst odspFluidInfo = getLocatorFromOdspUrl(url);\n\t\t\tif (odspFluidInfo) {\n\t\t\t\trequestToBeResolved.url = createOdspUrl(odspFluidInfo);\n\t\t\t}\n\t\t} catch {\n\t\t\t// If the locator throws some error, then try to resolve the request as it is.\n\t\t}\n\n\t\tconst odspResolvedUrl = await new OdspDriverUrlResolver().resolve(requestToBeResolved);\n\n\t\tif (isSharingLinkToRedeem) {\n\t\t\t// We need to remove the nav param if set by host when setting the sharelink as otherwise the shareLinkId\n\t\t\t// when redeeming the share link during the redeem fallback for trees latest call becomes greater than\n\t\t\t// the eligible length.\n\t\t\todspResolvedUrl.shareLinkInfo = Object.assign(odspResolvedUrl.shareLinkInfo ?? {}, {\n\t\t\t\tsharingLinkToRedeem: this.removeNavParam(request.url),\n\t\t\t});\n\t\t}\n\t\tif (odspResolvedUrl.itemId) {\n\t\t\t// Kick start the sharing link request if we don't have it already as a performance optimization.\n\t\t\t// For detached create new, we don't have an item id yet and therefore cannot generate a share link\n\t\t\tthis.getShareLinkPromise(odspResolvedUrl).catch(() => {});\n\t\t}\n\t\treturn odspResolvedUrl;\n\t}\n\n\tprivate removeNavParam(link: string): string {\n\t\tconst url = new URL(link);\n\t\tconst params = new URLSearchParams(url.search);\n\t\tparams.delete(locatorQueryParamName);\n\t\turl.search = params.toString();\n\t\treturn url.href;\n\t}\n\n\tprivate async getShareLinkPromise(resolvedUrl: IOdspResolvedUrl): Promise<string> {\n\t\tif (this.shareLinkFetcherProps === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Failed to get share link because share link fetcher props are missing\",\n\t\t\t);\n\t\t}\n\n\t\tif (!(resolvedUrl.siteUrl && resolvedUrl.driveId && resolvedUrl.itemId)) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Failed to get share link because necessary information is missing \" +\n\t\t\t\t\t\"(e.g. siteUrl, driveId or itemId)\",\n\t\t\t);\n\t\t}\n\n\t\tconst key = this.getKey(resolvedUrl);\n\t\tconst cachedLinkPromise = this.sharingLinkCache.get(key);\n\t\tif (cachedLinkPromise) {\n\t\t\treturn cachedLinkPromise;\n\t\t}\n\t\tconst newLinkPromise = getFileLink(\n\t\t\tthis.shareLinkFetcherProps.tokenFetcher,\n\t\t\tresolvedUrl,\n\t\t\tthis.logger,\n\t\t).catch((error) => {\n\t\t\t// This should imply that error is a non-retriable error.\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"FluidFileUrlError\" }, error);\n\t\t\tthis.sharingLinkCache.remove(key);\n\t\t\tthrow error;\n\t\t});\n\t\tthis.sharingLinkCache.add(key, async () => newLinkPromise);\n\t\treturn newLinkPromise;\n\t}\n\n\t/**\n\t * Requests a driver + data store storage URL. Note that this method requires share link to be fetched\n\t * and it will throw in case share link fetcher props were not specified when instance was created.\n\t * @param resolvedUrl - The driver resolved URL\n\t * @param dataStorePath - The relative data store path URL.\n\t * For requesting a driver URL, this value should always be '/'. If an empty string is passed, then dataStorePath\n\t * will be extracted from the resolved url if present.\n\t * @param packageInfoSource - optional, represents container package information to be included in url.\n\t */\n\tpublic async getAbsoluteUrl(\n\t\tresolvedUrl: IResolvedUrl,\n\t\tdataStorePath: string,\n\t\tpackageInfoSource?: IContainerPackageInfo,\n\t): Promise<string> {\n\t\tconst odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\n\t\tconst shareLink = await this.getShareLinkPromise(odspResolvedUrl);\n\n\t\treturn this.appendLocatorParams(shareLink, resolvedUrl, dataStorePath, packageInfoSource);\n\t}\n\n\t/**\n\t * Appends the store locator properties to the provided base URL. This function is useful for scenarios where an application\n\t * has a base URL (for example a sharing link) of the Fluid file, but does not have the locator information that would be used by Fluid\n\t * to load the file later.\n\t * @param baseUrl - The input URL on which the locator params will be appended.\n\t * @param resolvedUrl - odsp-driver's resolvedURL object.\n\t * @param dataStorePath - The relative data store path URL.\n\t * For requesting a driver URL, this value should always be '/'. If an empty string is passed, then dataStorePath\n\t * will be extracted from the resolved url if present.\n\t * @returns The provided base URL appended with odsp-specific locator information\n\t */\n\tpublic async appendLocatorParams(\n\t\tbaseUrl: string,\n\t\tresolvedUrl: IResolvedUrl,\n\t\tdataStorePath: string,\n\t\tpackageInfoSource?: IContainerPackageInfo,\n\t): Promise<string> {\n\t\tconst url = new URL(baseUrl);\n\t\tconst odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\n\t\t// If the user has passed an empty dataStorePath, then extract it from the resolved url.\n\t\tconst actualDataStorePath = dataStorePath || (odspResolvedUrl.dataStorePath ?? \"\");\n\n\t\tlet containerPackageName: string | undefined;\n\t\tif (packageInfoSource && \"name\" in packageInfoSource) {\n\t\t\tcontainerPackageName = packageInfoSource.name;\n\t\t\t// packageInfoSource is cast to any as it is typed to IContainerPackageInfo instead of IFluidCodeDetails\n\t\t\t// TODO: use a stronger type\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t} else if (isFluidPackage((packageInfoSource as any)?.package)) {\n\t\t\t// TODO: use a stronger type\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\tcontainerPackageName = (packageInfoSource as any)?.package.name;\n\t\t} else {\n\t\t\t// TODO: use a stronger type\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\tcontainerPackageName = (packageInfoSource as any)?.package;\n\t\t}\n\t\t// TODO: use a stronger type\n\t\tcontainerPackageName =\n\t\t\tcontainerPackageName ?? odspResolvedUrl.codeHint?.containerPackageName;\n\n\t\tconst context = await this.getContext?.(odspResolvedUrl, actualDataStorePath);\n\n\t\tstoreLocatorInOdspUrl(url, {\n\t\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\t\tdriveId: odspResolvedUrl.driveId,\n\t\t\titemId: odspResolvedUrl.itemId,\n\t\t\tdataStorePath: actualDataStorePath,\n\t\t\tappName: this.appName,\n\t\t\tcontainerPackageName,\n\t\t\tfileVersion: odspResolvedUrl.fileVersion,\n\t\t\tcontext,\n\t\t});\n\n\t\treturn url.href;\n\t}\n\n\t/**\n\t * Crafts a supported document/driver URL\n\t */\n\tpublic static createDocumentUrl(\n\t\tbaseUrl: string,\n\t\tdriverInfo: OdspFluidDataStoreLocator,\n\t): string {\n\t\tconst url = new URL(baseUrl);\n\n\t\tstoreLocatorInOdspUrl(url, driverInfo);\n\n\t\treturn url.href;\n\t}\n}\n"]}
1
+ {"version":3,"file":"odspDriverUrlResolverForShareLink.js","sourceRoot":"","sources":["../src/odspDriverUrlResolverForShareLink.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 { PromiseCache } from \"@fluidframework/core-utils\";\nimport { ITelemetryBaseLogger, IRequest } from \"@fluidframework/core-interfaces\";\nimport {\n\tIContainerPackageInfo,\n\tIResolvedUrl,\n\tIUrlResolver,\n} from \"@fluidframework/driver-definitions\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils\";\nimport {\n\tIOdspResolvedUrl,\n\tIdentityType,\n\tOdspResourceTokenFetchOptions,\n\tTokenFetcher,\n} from \"@fluidframework/odsp-driver-definitions\";\nimport {\n\tgetLocatorFromOdspUrl,\n\tstoreLocatorInOdspUrl,\n\tlocatorQueryParamName,\n} from \"./odspFluidFileLink.js\";\nimport { OdspFluidDataStoreLocator, SharingLinkHeader } from \"./contractsPublic.js\";\nimport { createOdspUrl } from \"./createOdspUrl.js\";\nimport { OdspDriverUrlResolver } from \"./odspDriverUrlResolver.js\";\nimport { getOdspResolvedUrl, createOdspLogger } from \"./odspUtils.js\";\nimport { getFileLink } from \"./getFileLink.js\";\n\n/**\n * Properties passed to the code responsible for fetching share link for a file.\n * @alpha\n */\nexport interface ShareLinkFetcherProps {\n\t/**\n\t * Callback method that is used to fetch access token necessary to call API that produces share link\n\t */\n\ttokenFetcher: TokenFetcher<OdspResourceTokenFetchOptions>;\n\t/**\n\t * Identity type determining the shape of share link as it differs for Enterprise and Consumer users.\n\t */\n\tidentityType: IdentityType;\n}\n\n// back-compat: GitHub #9653\nconst isFluidPackage = (pkg: Record<string, unknown>): boolean =>\n\ttypeof pkg === \"object\" && typeof pkg?.name === \"string\" && typeof pkg?.fluid === \"object\";\n\n/**\n * Resolver to resolve urls like the ones created by createOdspUrl which is driver inner\n * url format and the ones which have things like driveId, siteId, itemId etc encoded in nav param.\n * This resolver also handles share links and try to generate one for the use by the app.\n * @alpha\n */\nexport class OdspDriverUrlResolverForShareLink implements IUrlResolver {\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate readonly sharingLinkCache = new PromiseCache<string, string>();\n\tprivate readonly shareLinkFetcherProps: ShareLinkFetcherProps | undefined;\n\n\t/**\n\t * Creates url resolver instance\n\t * @param shareLinkFetcherProps - properties used when fetching share link.\n\t * Can be set as 'undefined' for cases where share link is not needed. Currently, only\n\t * getAbsoluteUrl() method requires share link.\n\t * @param logger - logger object that is used as telemetry sink\n\t * @param appName - application name hint that is encoded with url produced by getAbsoluteUrl() method.\n\t * This hint is used by link handling logic which determines which app to redirect to when user\n\t * navigates directly to the link.\n\t * @param getContext - callback function which is used to get context for given resolved url. If context\n\t * is returned then it will be embedded into url returned by getAbsoluteUrl() method.\n\t */\n\tpublic constructor(\n\t\tshareLinkFetcherProps?: ShareLinkFetcherProps | undefined,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tprivate readonly appName?: string,\n\t\tprivate readonly getContext?: (\n\t\t\tresolvedUrl: IOdspResolvedUrl,\n\t\t\tdataStorePath: string,\n\t\t) => Promise<string | undefined>,\n\t) {\n\t\tthis.logger = createOdspLogger(logger);\n\t\tif (shareLinkFetcherProps) {\n\t\t\tthis.shareLinkFetcherProps = {\n\t\t\t\t...shareLinkFetcherProps,\n\t\t\t\ttokenFetcher: shareLinkFetcherProps.tokenFetcher,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Takes an already generated data store url (from requestUrl) and appends a path to the\n\t * existing data store information.\n\t */\n\tpublic appendDataStorePath(requestUrl: URL, pathToAppend: string): string | undefined {\n\t\tconst fluidInfo = getLocatorFromOdspUrl(requestUrl);\n\n\t\tif (!fluidInfo) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst parsingUrl = new URL(\n\t\t\tfluidInfo.dataStorePath,\n\t\t\t`${requestUrl.protocol}//${requestUrl.hostname}`,\n\t\t);\n\t\t// Determine if the caller is passing a query parameter or path since processing will be different.\n\t\tif (pathToAppend.startsWith(\"/?\") || pathToAppend.startsWith(\"?\")) {\n\t\t\tconst queryParams = new URLSearchParams(pathToAppend);\n\t\t\tfor (const [key, value] of queryParams.entries()) {\n\t\t\t\tparsingUrl.searchParams.append(key, value);\n\t\t\t}\n\t\t\tfluidInfo.dataStorePath = `${parsingUrl.pathname}${parsingUrl.search}`;\n\t\t} else {\n\t\t\tfluidInfo.dataStorePath = `${parsingUrl.pathname}${\n\t\t\t\tparsingUrl.pathname.endsWith(\"/\") || pathToAppend.startsWith(\"/\") ? \"\" : \"/\"\n\t\t\t}${pathToAppend}/${parsingUrl.search}`;\n\t\t}\n\t\tstoreLocatorInOdspUrl(requestUrl, fluidInfo);\n\n\t\treturn requestUrl.href;\n\t}\n\n\tprivate getKey(resolvedUrl: IOdspResolvedUrl): string {\n\t\treturn `${resolvedUrl.siteUrl},${resolvedUrl.driveId},${resolvedUrl.itemId}`;\n\t}\n\n\t/**\n\t * Resolves request URL into driver details\n\t */\n\tpublic async resolve(request: IRequest): Promise<IOdspResolvedUrl> {\n\t\tconst requestToBeResolved = { headers: request.headers, url: request.url };\n\t\tconst isSharingLinkToRedeem =\n\t\t\trequestToBeResolved.headers?.[SharingLinkHeader.isSharingLinkToRedeem];\n\t\ttry {\n\t\t\tconst url = new URL(request.url);\n\n\t\t\tconst odspFluidInfo = getLocatorFromOdspUrl(url);\n\t\t\tif (odspFluidInfo) {\n\t\t\t\trequestToBeResolved.url = createOdspUrl(odspFluidInfo);\n\t\t\t}\n\t\t} catch {\n\t\t\t// If the locator throws some error, then try to resolve the request as it is.\n\t\t}\n\n\t\tconst odspResolvedUrl = await new OdspDriverUrlResolver().resolve(requestToBeResolved);\n\n\t\tif (isSharingLinkToRedeem) {\n\t\t\t// We need to remove the nav param if set by host when setting the sharelink as otherwise the shareLinkId\n\t\t\t// when redeeming the share link during the redeem fallback for trees latest call becomes greater than\n\t\t\t// the eligible length.\n\t\t\todspResolvedUrl.shareLinkInfo = Object.assign(odspResolvedUrl.shareLinkInfo ?? {}, {\n\t\t\t\tsharingLinkToRedeem: this.removeNavParam(request.url),\n\t\t\t});\n\t\t}\n\t\tif (odspResolvedUrl.itemId) {\n\t\t\t// Kick start the sharing link request if we don't have it already as a performance optimization.\n\t\t\t// For detached create new, we don't have an item id yet and therefore cannot generate a share link\n\t\t\tthis.getShareLinkPromise(odspResolvedUrl).catch(() => {});\n\t\t}\n\t\treturn odspResolvedUrl;\n\t}\n\n\tprivate removeNavParam(link: string): string {\n\t\tconst url = new URL(link);\n\t\tconst params = new URLSearchParams(url.search);\n\t\tparams.delete(locatorQueryParamName);\n\t\turl.search = params.toString();\n\t\treturn url.href;\n\t}\n\n\tprivate async getShareLinkPromise(resolvedUrl: IOdspResolvedUrl): Promise<string> {\n\t\tif (this.shareLinkFetcherProps === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Failed to get share link because share link fetcher props are missing\",\n\t\t\t);\n\t\t}\n\n\t\tif (!(resolvedUrl.siteUrl && resolvedUrl.driveId && resolvedUrl.itemId)) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Failed to get share link because necessary information is missing \" +\n\t\t\t\t\t\"(e.g. siteUrl, driveId or itemId)\",\n\t\t\t);\n\t\t}\n\n\t\tconst key = this.getKey(resolvedUrl);\n\t\tconst cachedLinkPromise = this.sharingLinkCache.get(key);\n\t\tif (cachedLinkPromise) {\n\t\t\treturn cachedLinkPromise;\n\t\t}\n\t\tconst newLinkPromise = getFileLink(\n\t\t\tthis.shareLinkFetcherProps.tokenFetcher,\n\t\t\tresolvedUrl,\n\t\t\tthis.logger,\n\t\t).catch((error) => {\n\t\t\t// This should imply that error is a non-retriable error.\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"FluidFileUrlError\" }, error);\n\t\t\tthis.sharingLinkCache.remove(key);\n\t\t\tthrow error;\n\t\t});\n\t\tthis.sharingLinkCache.add(key, async () => newLinkPromise);\n\t\treturn newLinkPromise;\n\t}\n\n\t/**\n\t * Requests a driver + data store storage URL. Note that this method requires share link to be fetched\n\t * and it will throw in case share link fetcher props were not specified when instance was created.\n\t * @param resolvedUrl - The driver resolved URL\n\t * @param dataStorePath - The relative data store path URL.\n\t * For requesting a driver URL, this value should always be '/'. If an empty string is passed, then dataStorePath\n\t * will be extracted from the resolved url if present.\n\t * @param packageInfoSource - optional, represents container package information to be included in url.\n\t */\n\tpublic async getAbsoluteUrl(\n\t\tresolvedUrl: IResolvedUrl,\n\t\tdataStorePath: string,\n\t\tpackageInfoSource?: IContainerPackageInfo,\n\t): Promise<string> {\n\t\tconst odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\n\t\tconst shareLink = await this.getShareLinkPromise(odspResolvedUrl);\n\n\t\treturn this.appendLocatorParams(shareLink, resolvedUrl, dataStorePath, packageInfoSource);\n\t}\n\n\t/**\n\t * Appends the store locator properties to the provided base URL. This function is useful for scenarios where an application\n\t * has a base URL (for example a sharing link) of the Fluid file, but does not have the locator information that would be used by Fluid\n\t * to load the file later.\n\t * @param baseUrl - The input URL on which the locator params will be appended.\n\t * @param resolvedUrl - odsp-driver's resolvedURL object.\n\t * @param dataStorePath - The relative data store path URL.\n\t * For requesting a driver URL, this value should always be '/'. If an empty string is passed, then dataStorePath\n\t * will be extracted from the resolved url if present.\n\t * @returns The provided base URL appended with odsp-specific locator information\n\t */\n\tpublic async appendLocatorParams(\n\t\tbaseUrl: string,\n\t\tresolvedUrl: IResolvedUrl,\n\t\tdataStorePath: string,\n\t\tpackageInfoSource?: IContainerPackageInfo,\n\t): Promise<string> {\n\t\tconst url = new URL(baseUrl);\n\t\tconst odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\n\t\t// If the user has passed an empty dataStorePath, then extract it from the resolved url.\n\t\tconst actualDataStorePath = dataStorePath || (odspResolvedUrl.dataStorePath ?? \"\");\n\n\t\tlet containerPackageName: string | undefined;\n\t\tif (packageInfoSource && \"name\" in packageInfoSource) {\n\t\t\tcontainerPackageName = packageInfoSource.name;\n\t\t\t// packageInfoSource is cast to any as it is typed to IContainerPackageInfo instead of IFluidCodeDetails\n\t\t\t// TODO: use a stronger type\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t} else if (isFluidPackage((packageInfoSource as any)?.package)) {\n\t\t\t// TODO: use a stronger type\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\tcontainerPackageName = (packageInfoSource as any)?.package.name;\n\t\t} else {\n\t\t\t// TODO: use a stronger type\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\tcontainerPackageName = (packageInfoSource as any)?.package;\n\t\t}\n\t\t// TODO: use a stronger type\n\t\tcontainerPackageName =\n\t\t\tcontainerPackageName ?? odspResolvedUrl.codeHint?.containerPackageName;\n\n\t\tconst context = await this.getContext?.(odspResolvedUrl, actualDataStorePath);\n\n\t\tstoreLocatorInOdspUrl(url, {\n\t\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\t\tdriveId: odspResolvedUrl.driveId,\n\t\t\titemId: odspResolvedUrl.itemId,\n\t\t\tdataStorePath: actualDataStorePath,\n\t\t\tappName: this.appName,\n\t\t\tcontainerPackageName,\n\t\t\tfileVersion: odspResolvedUrl.fileVersion,\n\t\t\tcontext,\n\t\t});\n\n\t\treturn url.href;\n\t}\n\n\t/**\n\t * Crafts a supported document/driver URL\n\t */\n\tpublic static createDocumentUrl(\n\t\tbaseUrl: string,\n\t\tdriverInfo: OdspFluidDataStoreLocator,\n\t): string {\n\t\tconst url = new URL(baseUrl);\n\n\t\tstoreLocatorInOdspUrl(url, driverInfo);\n\n\t\treturn url.href;\n\t}\n}\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/odsp-driver";
8
- export declare const pkgVersion = "2.0.0-dev-rc.2.0.0.245554";
8
+ export declare const pkgVersion = "2.0.0-dev-rc.2.0.0.246488";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export const pkgName = "@fluidframework/odsp-driver";
8
- export const pkgVersion = "2.0.0-dev-rc.2.0.0.245554";
8
+ export const pkgVersion = "2.0.0-dev-rc.2.0.0.246488";
9
9
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,6BAA6B,CAAC;AACrD,MAAM,CAAC,MAAM,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/odsp-driver\";\nexport const pkgVersion = \"2.0.0-dev-rc.2.0.0.245554\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,6BAA6B,CAAC;AACrD,MAAM,CAAC,MAAM,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/odsp-driver\";\nexport const pkgVersion = \"2.0.0-dev-rc.2.0.0.246488\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"odspDriverResolverTest.spec.js","sourceRoot":"","sources":["../../src/test/odspDriverResolverTest.spec.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 */\nimport { strict as assert } from \"node:assert\";\nimport { DriverHeader } from \"@fluidframework/driver-definitions\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IOdspResolvedUrl } from \"@fluidframework/odsp-driver-definitions\";\nimport { OdspDriverUrlResolver } from \"../odspDriverUrlResolver.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\nimport { createOdspCreateContainerRequest } from \"../createOdspCreateContainerRequest.js\";\nimport { createOdspUrl } from \"../createOdspUrl.js\";\n\ndescribe(\"Odsp Driver Resolver\", () => {\n\tconst siteUrl = \"https://localhost\";\n\tconst driveId = \"driveId\";\n\tconst filePath = \"path\";\n\tconst fileName = \"fileName\";\n\tconst packageName = \"packageName\";\n\tlet resolver: OdspDriverUrlResolver;\n\tlet request: IRequest;\n\n\tbeforeEach(() => {\n\t\tresolver = new OdspDriverUrlResolver();\n\t\trequest = createOdspCreateContainerRequest(siteUrl, driveId, filePath, fileName);\n\t});\n\n\tit(\"Can create new request\", async () => {\n\t\tassert.strictEqual(\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\trequest.headers?.[DriverHeader.createNew].fileName,\n\t\t\tfileName,\n\t\t\t\"Request should contain fileName\",\n\t\t);\n\t\tconst url = `${siteUrl}?driveId=${encodeURIComponent(driveId)}&path=${encodeURIComponent(\n\t\t\tfilePath,\n\t\t)}`;\n\t\tassert.strictEqual(request.url, url, \"Request url should match\");\n\t});\n\n\tit(\"Should resolve createNew request\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\n\t\tconst [, queryString] = request.url.split(\"?\");\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"path\"), filePath, \"filePath should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive id should match\");\n\t});\n\n\tit(\"Should resolve url with a data store\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst expected: IOdspResolvedUrl = {\n\t\t\tendpoints: {\n\t\t\t\tsnapshotStorageUrl: \"\",\n\t\t\t\tattachmentGETStorageUrl: \"\",\n\t\t\t\tattachmentPOSTStorageUrl: \"\",\n\t\t\t\tdeltaStorageUrl: \"\",\n\t\t\t},\n\t\t\ttokens: {},\n\t\t\ttype: \"fluid\",\n\t\t\todspResolvedUrl: true,\n\t\t\tid: \"odspCreateNew\",\n\t\t\turl: \"https://https://localhost?driveId=driveId&path=path&version=null\",\n\t\t\tsiteUrl: \"https://localhost\",\n\t\t\thashedDocumentId: \"\",\n\t\t\tdriveId: \"driveId\",\n\t\t\titemId: \"\",\n\t\t\tfileName: \"fileName\",\n\t\t\tfileVersion: undefined,\n\t\t\tsummarizer: false,\n\t\t\tcodeHint: { containerPackageName: undefined },\n\t\t\tshareLinkInfo: undefined,\n\t\t\tisClpCompliantApp: undefined,\n\t\t};\n\t\tassert.deepStrictEqual(resolvedUrl, expected);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\");\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should add codeHint if request contains containerPackageName\", async () => {\n\t\tconst newRequest = request;\n\t\tnewRequest.url += `&containerPackageName=${encodeURIComponent(packageName)}`;\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.codeHint?.containerPackageName,\n\t\t\tpackageName,\n\t\t\t\"containerPackageName should match\",\n\t\t);\n\t});\n\n\tit(\"Should resolve url with a string in the codeDetails package\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst codeDetails = {\n\t\t\tpackage: packageName,\n\t\t};\n\t\t// codeDetails is cast to any for testing the IFluidCodeDetails approach\n\t\tconst response = await resolver.getAbsoluteUrl(\n\t\t\tresolvedUrl,\n\t\t\t\"/datastore\",\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n\t\t\tcodeDetails as any,\n\t\t);\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"should resolve and then getAbsoluteUrl should pick dataStorePath from resolvedUrl\", async () => {\n\t\tconst resolvedUrl1 = await resolver.resolve({\n\t\t\turl: createOdspUrl({\n\t\t\t\tdriveId,\n\t\t\t\titemId: \"itemId\",\n\t\t\t\tsiteUrl,\n\t\t\t\tdataStorePath: \"datastore\",\n\t\t\t\tfileVersion: \"0.1\",\n\t\t\t\tappName: \"app\",\n\t\t\t\tcontainerPackageName: packageName,\n\t\t\t}),\n\t\t});\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl1, \"\");\n\n\t\tconst resolvedUrl2 = await resolver.resolve({ url: response });\n\t\tassert.strictEqual(resolvedUrl2.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl2.dataStorePath,\n\t\t\t\"datastore\",\n\t\t\t\"DataStorePath should be equal\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl2.codeHint?.containerPackageName,\n\t\t\tpackageName,\n\t\t\t\"DataStorePath should be equal\",\n\t\t);\n\t\tassert.strictEqual(resolvedUrl2.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl2.itemId, \"itemId\", \"Item id should be absent\");\n\t});\n\n\tit(\"Should resolve url given container package info\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\", {\n\t\t\tname: packageName,\n\t\t});\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with a IFluidPackage in the codeDetails package\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst fluidPackage = {\n\t\t\tname: packageName,\n\t\t\tfluid: {},\n\t\t};\n\t\tconst codeDetails = { package: fluidPackage };\n\t\t// codeDetails is cast to any for testing the IFluidCodeDetails approach\n\t\tconst response = await resolver.getAbsoluteUrl(\n\t\t\tresolvedUrl,\n\t\t\t\"/datastore\",\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n\t\t\tcodeDetails as any,\n\t\t);\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with a codeHint in the resolved url\", async () => {\n\t\tconst newRequest = request;\n\t\tnewRequest.url += `&containerPackageName=${encodeURIComponent(packageName)}`;\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\");\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with empty file path\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"\";\n\t\trequest = createOdspCreateContainerRequest(siteUrl, driveId, testFilePath, fileName);\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.codeHint?.containerPackageName,\n\t\t\tundefined,\n\t\t\t\"Container Package Name should be undefined\",\n\t\t);\n\n\t\tconst [, queryString] = request.url.split(\"?\");\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"path\"), testFilePath, \"filePath should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive id should match\");\n\t});\n\n\tit(\"Should resolve url with non-empty file path and item id\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t\theaders: { createNew: { fileName: `${fileName}` } },\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}` +\n\t\t\t`&version=null`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with file path containing 3 data object ids\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2/data3\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with file path containing ending slashes\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2//\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with special characters\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2/!@$\";\n\t\tconst itemId = \"item!@$\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"resolves urls with datastore path in url path\", async () => {\n\t\tconst absoluteUrl = \"https://localhost/datastore?driveId=driveId&itemId=&path=/\";\n\t\tconst resolvedUrl = await resolver.resolve({ url: absoluteUrl });\n\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.url,\n\t\t\t\"https://placeholder/placeholder/AV5r7rhbMqs3T5cL8TUpqk6FpWldev0qKsKlnjkC5mg%3D/\",\n\t\t);\n\t});\n\n\tit(\"Should resolve url with file version\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1\";\n\t\tconst itemId = \"item\";\n\t\tconst fileVersion = \"285.0\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}&fileVersion=${fileVersion}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\t\tassert.strictEqual(resolvedUrl.fileVersion, fileVersion, \"FileVersion should be equal\");\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n});\n"]}
1
+ {"version":3,"file":"odspDriverResolverTest.spec.js","sourceRoot":"","sources":["../../src/test/odspDriverResolverTest.spec.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 { strict as assert } from \"node:assert\";\nimport { DriverHeader } from \"@fluidframework/driver-definitions\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IOdspResolvedUrl } from \"@fluidframework/odsp-driver-definitions\";\nimport { OdspDriverUrlResolver } from \"../odspDriverUrlResolver.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\nimport { createOdspCreateContainerRequest } from \"../createOdspCreateContainerRequest.js\";\nimport { createOdspUrl } from \"../createOdspUrl.js\";\n\ndescribe(\"Odsp Driver Resolver\", () => {\n\tconst siteUrl = \"https://localhost\";\n\tconst driveId = \"driveId\";\n\tconst filePath = \"path\";\n\tconst fileName = \"fileName\";\n\tconst packageName = \"packageName\";\n\tlet resolver: OdspDriverUrlResolver;\n\tlet request: IRequest;\n\n\tbeforeEach(() => {\n\t\tresolver = new OdspDriverUrlResolver();\n\t\trequest = createOdspCreateContainerRequest(siteUrl, driveId, filePath, fileName);\n\t});\n\n\tit(\"Can create new request\", async () => {\n\t\tassert.strictEqual(\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\trequest.headers?.[DriverHeader.createNew].fileName,\n\t\t\tfileName,\n\t\t\t\"Request should contain fileName\",\n\t\t);\n\t\tconst url = `${siteUrl}?driveId=${encodeURIComponent(driveId)}&path=${encodeURIComponent(\n\t\t\tfilePath,\n\t\t)}`;\n\t\tassert.strictEqual(request.url, url, \"Request url should match\");\n\t});\n\n\tit(\"Should resolve createNew request\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\n\t\tconst [, queryString] = request.url.split(\"?\");\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"path\"), filePath, \"filePath should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive id should match\");\n\t});\n\n\tit(\"Should resolve url with a data store\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst expected: IOdspResolvedUrl = {\n\t\t\tendpoints: {\n\t\t\t\tsnapshotStorageUrl: \"\",\n\t\t\t\tattachmentGETStorageUrl: \"\",\n\t\t\t\tattachmentPOSTStorageUrl: \"\",\n\t\t\t\tdeltaStorageUrl: \"\",\n\t\t\t},\n\t\t\ttokens: {},\n\t\t\ttype: \"fluid\",\n\t\t\todspResolvedUrl: true,\n\t\t\tid: \"odspCreateNew\",\n\t\t\turl: \"https://https://localhost?driveId=driveId&path=path&version=null\",\n\t\t\tsiteUrl: \"https://localhost\",\n\t\t\thashedDocumentId: \"\",\n\t\t\tdriveId: \"driveId\",\n\t\t\titemId: \"\",\n\t\t\tfileName: \"fileName\",\n\t\t\tfileVersion: undefined,\n\t\t\tsummarizer: false,\n\t\t\tcodeHint: { containerPackageName: undefined },\n\t\t\tshareLinkInfo: undefined,\n\t\t\tisClpCompliantApp: undefined,\n\t\t};\n\t\tassert.deepStrictEqual(resolvedUrl, expected);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\");\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should add codeHint if request contains containerPackageName\", async () => {\n\t\tconst newRequest = request;\n\t\tnewRequest.url += `&containerPackageName=${encodeURIComponent(packageName)}`;\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.codeHint?.containerPackageName,\n\t\t\tpackageName,\n\t\t\t\"containerPackageName should match\",\n\t\t);\n\t});\n\n\tit(\"Should resolve url with a string in the codeDetails package\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst codeDetails = {\n\t\t\tpackage: packageName,\n\t\t};\n\t\t// codeDetails is cast to any for testing the IFluidCodeDetails approach\n\t\tconst response = await resolver.getAbsoluteUrl(\n\t\t\tresolvedUrl,\n\t\t\t\"/datastore\",\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n\t\t\tcodeDetails as any,\n\t\t);\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"should resolve and then getAbsoluteUrl should pick dataStorePath from resolvedUrl\", async () => {\n\t\tconst resolvedUrl1 = await resolver.resolve({\n\t\t\turl: createOdspUrl({\n\t\t\t\tdriveId,\n\t\t\t\titemId: \"itemId\",\n\t\t\t\tsiteUrl,\n\t\t\t\tdataStorePath: \"datastore\",\n\t\t\t\tfileVersion: \"0.1\",\n\t\t\t\tappName: \"app\",\n\t\t\t\tcontainerPackageName: packageName,\n\t\t\t}),\n\t\t});\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl1, \"\");\n\n\t\tconst resolvedUrl2 = await resolver.resolve({ url: response });\n\t\tassert.strictEqual(resolvedUrl2.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl2.dataStorePath,\n\t\t\t\"datastore\",\n\t\t\t\"DataStorePath should be equal\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl2.codeHint?.containerPackageName,\n\t\t\tpackageName,\n\t\t\t\"DataStorePath should be equal\",\n\t\t);\n\t\tassert.strictEqual(resolvedUrl2.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl2.itemId, \"itemId\", \"Item id should be absent\");\n\t});\n\n\tit(\"Should resolve url given container package info\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\", {\n\t\t\tname: packageName,\n\t\t});\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with a IFluidPackage in the codeDetails package\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst fluidPackage = {\n\t\t\tname: packageName,\n\t\t\tfluid: {},\n\t\t};\n\t\tconst codeDetails = { package: fluidPackage };\n\t\t// codeDetails is cast to any for testing the IFluidCodeDetails approach\n\t\tconst response = await resolver.getAbsoluteUrl(\n\t\t\tresolvedUrl,\n\t\t\t\"/datastore\",\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n\t\t\tcodeDetails as any,\n\t\t);\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with a codeHint in the resolved url\", async () => {\n\t\tconst newRequest = request;\n\t\tnewRequest.url += `&containerPackageName=${encodeURIComponent(packageName)}`;\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\");\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with empty file path\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"\";\n\t\trequest = createOdspCreateContainerRequest(siteUrl, driveId, testFilePath, fileName);\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.codeHint?.containerPackageName,\n\t\t\tundefined,\n\t\t\t\"Container Package Name should be undefined\",\n\t\t);\n\n\t\tconst [, queryString] = request.url.split(\"?\");\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"path\"), testFilePath, \"filePath should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive id should match\");\n\t});\n\n\tit(\"Should resolve url with non-empty file path and item id\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t\theaders: { createNew: { fileName: `${fileName}` } },\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}` +\n\t\t\t`&version=null`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with file path containing 3 data object ids\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2/data3\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with file path containing ending slashes\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2//\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with special characters\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2/!@$\";\n\t\tconst itemId = \"item!@$\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"resolves urls with datastore path in url path\", async () => {\n\t\tconst absoluteUrl = \"https://localhost/datastore?driveId=driveId&itemId=&path=/\";\n\t\tconst resolvedUrl = await resolver.resolve({ url: absoluteUrl });\n\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.url,\n\t\t\t\"https://placeholder/placeholder/AV5r7rhbMqs3T5cL8TUpqk6FpWldev0qKsKlnjkC5mg%3D/\",\n\t\t);\n\t});\n\n\tit(\"Should resolve url with file version\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1\";\n\t\tconst itemId = \"item\";\n\t\tconst fileVersion = \"285.0\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}&fileVersion=${fileVersion}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\t\tassert.strictEqual(resolvedUrl.fileVersion, fileVersion, \"FileVersion should be equal\");\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"opsCaching.spec.js","sourceRoot":"","sources":["../../src/test/opsCaching.spec.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 */\nimport { strict as assert } from \"node:assert\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { IStream } from \"@fluidframework/driver-definitions\";\nimport { delay } from \"@fluidframework/core-utils\";\nimport { OdspDeltaStorageWithCache } from \"../odspDeltaStorageService.js\";\nimport { OpsCache, ICache, IMessage, CacheEntry } from \"../opsCaching.js\";\nimport { OdspDocumentStorageService } from \"../odspDocumentStorageManager.js\";\n\nexport type MyDataInput = IMessage & { data: string };\n\nclass MockCache implements ICache {\n\tpublic writeCount = 0;\n\tpublic opsWritten = 0;\n\n\tpublic async write(batchNumber: string, data: string): Promise<void> {\n\t\tthis.writeCount++;\n\t\tthis.data[batchNumber] = JSON.parse(data);\n\t\tfor (const op of this.data[batchNumber] as CacheEntry) {\n\t\t\t// JSON.serialize converts undefined to null\n\t\t\tif (op !== null) {\n\t\t\t\tthis.opsWritten++;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async read(batchNumber: string): Promise<string | undefined> {\n\t\tconst content = this.data[batchNumber];\n\t\tif (content === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn JSON.stringify(content);\n\t}\n\n\tpublic remove(): void {\n\t\t// Do not reset this.writeCount such that we can test that writes happened, but later on data was cleared\n\t\tthis.writeCount++;\n\t\tthis.opsWritten++;\n\t\tthis.data = {};\n\t}\n\n\tpublic data: { [key: string]: unknown } = {};\n}\n\nasync function validate(\n\tmockCache: MockCache,\n\texpected: { [key: number]: (MyDataInput | undefined)[] },\n\tcache: OpsCache,\n\tinitialSeq: number,\n): Promise<void> {\n\tassert.deepEqual(mockCache.data, JSON.parse(JSON.stringify(expected)));\n\n\tconst expectedArr: MyDataInput[] = [];\n\tfor (const values of Object.values(expected)) {\n\t\tfor (const op of values) {\n\t\t\tif (op !== undefined) {\n\t\t\t\texpectedArr.push(op);\n\t\t\t}\n\t\t}\n\t}\n\n\tlet result = await cache.get(initialSeq + 1, undefined);\n\tassert.deepEqual(result, expectedArr);\n\n\tif (initialSeq >= 10) {\n\t\tresult = await cache.get(1, 10);\n\t\tassert(result.length === 0);\n\t}\n\n\t// Asking for one too early should result in empty result, as hit miss should result in no ops.\n\tif (initialSeq > 0) {\n\t\tresult = await cache.get(initialSeq, undefined);\n\t\tassert(result.length === 0);\n\t}\n\n\tif (expectedArr.length > 0) {\n\t\tconst last = expectedArr[expectedArr.length - 1].sequenceNumber + 1;\n\n\t\tresult = await cache.get(last, undefined);\n\t\tassert(result.length === 0);\n\n\t\tresult = await cache.get(last + 10, undefined);\n\t\tassert(result.length === 0);\n\n\t\tresult = await cache.get(initialSeq + 2, last);\n\t\tassert.deepEqual(result, expectedArr.slice(1));\n\n\t\tresult = await cache.get(initialSeq + 2, last + 100000);\n\t\tassert.deepEqual(result, expectedArr.slice(1));\n\n\t\tresult = await cache.get(initialSeq + 2, last - 1);\n\t\tassert.deepEqual(result, expectedArr.slice(1, -1));\n\t}\n}\n\nasync function runTestNoTimer(\n\tbatchSize: number,\n\tinitialSeq: number,\n\tmockData: MyDataInput[],\n\texpected: { [key: number]: (MyDataInput | undefined)[] },\n\tinitialWritesExpected: number,\n\ttotalOpsWritten?: number,\n): Promise<void> {\n\tconst mockCache = new MockCache();\n\tconst logger = new MockLogger();\n\tconst cache = new OpsCache(\n\t\tinitialSeq,\n\t\tlogger.toTelemetryLogger(),\n\t\tmockCache,\n\t\tbatchSize,\n\t\t-1, // timerGranularity\n\t\t10, // totalOpsToCache\n\t);\n\n\tcache.addOps(mockData);\n\n\tconst writes = mockCache.writeCount;\n\tassert.equal(writes, initialWritesExpected, \"initialWrites should match\");\n\n\t// Validate that writing same ops is not going to change anything\n\tcache.addOps(mockData);\n\tassert.equal(writes, mockCache.writeCount);\n\n\tawait validate(mockCache, expected, cache, initialSeq);\n\n\t// ensure all ops are flushed properly\n\tcache.flushOps();\n\tassert.equal(mockCache.opsWritten, totalOpsWritten ?? mockData.length);\n\n\t// ensure adding same ops and flushing again is doing nothing\n\tcache.addOps(mockData);\n\tcache.flushOps();\n\tassert.equal(\n\t\tmockCache.opsWritten,\n\t\ttotalOpsWritten ?? mockData.length,\n\t\t\"ops written does not match\",\n\t);\n\tlogger.assertMatchNone([{ category: \"error\" }]);\n}\n\nexport async function runTestWithTimer(\n\tbatchSize: number,\n\tinitialSeq: number,\n\tmockData: MyDataInput[],\n\texpected: { [key: number]: (MyDataInput | undefined)[] },\n\tinitialWritesExpected: number,\n\ttotalWritesExpected: number,\n\ttotalOpsWritten?: number,\n): Promise<void> {\n\tconst mockCache = new MockCache();\n\tconst logger = new MockLogger();\n\tconst cache = new OpsCache(\n\t\tinitialSeq,\n\t\tlogger.toTelemetryLogger(),\n\t\tmockCache,\n\t\tbatchSize,\n\t\t1, // timerGranularity\n\t\t10, // totalOpsToCache\n\t);\n\n\tcache.addOps(mockData);\n\tassert.equal(mockCache.writeCount, initialWritesExpected);\n\tawait validate(mockCache, expected, cache, initialSeq);\n\n\twhile (mockCache.writeCount < totalWritesExpected) {\n\t\tawait delay(1);\n\t}\n\tassert.equal(mockCache.writeCount, totalWritesExpected);\n\tassert.equal(mockCache.opsWritten, totalOpsWritten ?? mockData.length);\n\tlogger.assertMatchNone([{ category: \"error\" }]);\n}\n\nexport async function runTest(\n\tbatchSize: number,\n\tinitialSeq: number,\n\tmockData: MyDataInput[],\n\texpected: { [key: string]: (MyDataInput | undefined)[] },\n\tinitialWritesExpected: number,\n\ttotalWritesExpected: number,\n\ttotalOpsWritten?: number,\n): Promise<void> {\n\tawait runTestNoTimer(\n\t\tbatchSize,\n\t\tinitialSeq,\n\t\tmockData,\n\t\texpected,\n\t\tinitialWritesExpected,\n\t\ttotalOpsWritten,\n\t);\n\tawait runTestWithTimer(\n\t\tbatchSize,\n\t\tinitialSeq,\n\t\tmockData,\n\t\texpected,\n\t\tinitialWritesExpected,\n\t\ttotalWritesExpected,\n\t\ttotalOpsWritten,\n\t);\n}\n\ndescribe(\"OpsCache\", () => {\n\tconst mockData1: MyDataInput[] = [\n\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t{ sequenceNumber: 110, data: \"110\" },\n\t\t{ sequenceNumber: 115, data: \"115\" },\n\t\t{ sequenceNumber: 120, data: \"120\" },\n\t\t{ sequenceNumber: 125, data: \"125\" },\n\t\t{ sequenceNumber: 130, data: \"130\" },\n\t\t{ sequenceNumber: 135, data: \"135\" },\n\t\t{ sequenceNumber: 140, data: \"140\" },\n\t\t{ sequenceNumber: 145, data: \"140\" },\n\t];\n\n\tit(\"1 element in each batch of 5 should not commit\", async () => {\n\t\tawait runTest(5, 100, mockData1, {}, 0, 9);\n\t});\n\n\tit(\"2 element in each batch of 10 should not commit\", async () => {\n\t\tawait runTest(10, 100, mockData1, {}, 0, 4, 8);\n\t});\n\n\tit(\"6 sequential elements with batch of 5 should commit 1 batch\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t],\n\t\t\t{\n\t\t\t\t\"5_20\": [\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t);\n\t});\n\n\tit(\"Epmty ops at beginning and end of batch should cause the batch to not be cached\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t],\n\t\t\t{},\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t});\n\n\tit(\"Epmty ops at just the beginning should still cause the batch to be cached\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t],\n\t\t\t{\n\t\t\t\t\"5_20\": [\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t1,\n\t\t\t1,\n\t\t\t4,\n\t\t);\n\t});\n\n\tconst mockData3: MyDataInput[] = [\n\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t{ sequenceNumber: 103, data: \"103\" },\n\t];\n\n\tit(\"3 sequential elements with batch of 2 and offset of 1 should commit 2 batches\", async () => {\n\t\tawait runTest(\n\t\t\t2,\n\t\t\t101,\n\t\t\tmockData3,\n\t\t\t{\n\t\t\t\t\"2_51\": [\n\t\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t1,\n\t\t\t1,\n\t\t);\n\t});\n\n\tit(\"with batch size of 1 all ops should commit in own batch\", async () => {\n\t\tawait runTest(\n\t\t\t1,\n\t\t\t101,\n\t\t\tmockData3,\n\t\t\t{\n\t\t\t\t\"1_102\": [{ sequenceNumber: 102, data: \"102\" }],\n\t\t\t\t\"1_103\": [{ sequenceNumber: 103, data: \"103\" }],\n\t\t\t},\n\t\t\t2,\n\t\t\t2,\n\t\t);\n\t});\n\n\tit(\"Too many ops\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t\t{ sequenceNumber: 106, data: \"106\" },\n\t\t\t\t{ sequenceNumber: 107, data: \"107\" },\n\t\t\t\t{ sequenceNumber: 108, data: \"108\" },\n\t\t\t\t{ sequenceNumber: 109, data: \"109\" },\n\t\t\t\t{ sequenceNumber: 110, data: \"110\" },\n\t\t\t\t{ sequenceNumber: 111, data: \"111\" },\n\t\t\t\t{ sequenceNumber: 112, data: \"112\" },\n\t\t\t\t{ sequenceNumber: 113, data: \"113\" },\n\t\t\t\t{ sequenceNumber: 114, data: \"114\" },\n\t\t\t\t{ sequenceNumber: 115, data: \"115\" },\n\t\t\t],\n\t\t\t{},\n\t\t\t3,\n\t\t\t3,\n\t\t);\n\t});\n\n\tit(\"Gap in ops\", async () => {\n\t\tconst mockCache = new MockCache();\n\t\tconst initialSeq = 100;\n\n\t\tconst mockData: MyDataInput[] = [\n\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t{ sequenceNumber: 106, data: \"106\" },\n\t\t\t// Gap:\n\t\t\t// { sequenceNumber: 107, data: \"107\" },\n\t\t\t{ sequenceNumber: 108, data: \"108\" },\n\t\t\t{ sequenceNumber: 109, data: \"109\" },\n\t\t\t// Start a new butch - that's where we had bug!\n\t\t\t{ sequenceNumber: 110, data: \"110\" },\n\t\t\t{ sequenceNumber: 111, data: \"111\" },\n\t\t];\n\t\tconst logger = new MockLogger();\n\t\tconst cache = new OpsCache(\n\t\t\tinitialSeq,\n\t\t\tlogger.toTelemetryLogger(),\n\t\t\tmockCache,\n\t\t\t5 /* batchSize */,\n\t\t\t-1, // timerGranularity\n\t\t\t100, // totalOpsToCache\n\t\t);\n\n\t\tcache.addOps(mockData);\n\t\tcache.flushOps();\n\n\t\tconst result = await cache.get(initialSeq + 1, undefined);\n\t\tassert.deepEqual(result, [\n\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t{ sequenceNumber: 106, data: \"106\" },\n\t\t]);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n});\n\ndescribe(\"OdspDeltaStorageWithCache\", () => {\n\tasync function readAll(\n\t\tstream: IStream<ISequencedDocumentMessage[]>,\n\t): Promise<ISequencedDocumentMessage[]> {\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t// eslint-disable-next-line no-constant-condition\n\t\twhile (true) {\n\t\t\tconst result = await stream.read();\n\t\t\tif (result.done) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tops.push(...result.value);\n\t\t}\n\t\treturn ops;\n\t}\n\n\tfunction createOps(fromArg: number, length: number): ISequencedDocumentMessage[] {\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tlet from = fromArg;\n\t\tconst to = from + length;\n\t\twhile (from < to) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tops.push({ sequenceNumber: from } as ISequencedDocumentMessage);\n\t\t\tfrom++;\n\t\t}\n\t\treturn ops;\n\t}\n\n\tfunction filterOps(\n\t\tops: ISequencedDocumentMessage[],\n\t\tfrom: number,\n\t\tto: number,\n\t): ISequencedDocumentMessage[] {\n\t\treturn ops.filter((op) => op.sequenceNumber >= from && op.sequenceNumber < to);\n\t}\n\n\tfunction validateOps(ops: ISequencedDocumentMessage[], from: number, to: number): void {\n\t\tif (to < from) {\n\t\t\tassert(ops.length === 0);\n\t\t} else {\n\t\t\tassert(ops.length === to - from);\n\t\t\tassert(ops.length === 0 || ops[0].sequenceNumber === from);\n\t\t\tassert(ops.length === 0 || ops[ops.length - 1].sequenceNumber === to - 1);\n\t\t}\n\t}\n\n\tasync function testStorage(\n\t\tfromTotal: number,\n\t\ttoTotal: number | undefined,\n\t\tcacheOnly: boolean,\n\t\topsFromSnapshot: number,\n\t\topsFromCache: number,\n\t\topsFromStorage: number,\n\t\tconcurrency = 1,\n\t\tbatchSize = 100,\n\t): Promise<void> {\n\t\tconst snapshotOps = createOps(fromTotal, opsFromSnapshot);\n\t\tconst cachedOps = createOps(fromTotal + opsFromSnapshot, opsFromCache);\n\t\tconst storageOps = createOps(fromTotal + opsFromSnapshot + opsFromCache, opsFromStorage);\n\n\t\tlet totalOps = opsFromSnapshot + opsFromCache + (cacheOnly ? 0 : opsFromStorage);\n\t\tconst actualTo = toTotal ?? fromTotal + totalOps;\n\t\tassert(actualTo <= fromTotal + totalOps); // code will deadlock if that's not the case\n\t\tconst askingOps = actualTo - fromTotal;\n\t\ttotalOps = Math.min(totalOps, askingOps);\n\n\t\tlet opsToCache: ISequencedDocumentMessage[] = [];\n\t\tconst logger = new MockLogger();\n\t\tconst storage = new OdspDeltaStorageWithCache(\n\t\t\tsnapshotOps,\n\t\t\tlogger.toTelemetryLogger(),\n\t\t\tbatchSize,\n\t\t\tconcurrency,\n\t\t\t// getFromStorage\n\t\t\tasync (from: number, to: number) => {\n\t\t\t\treturn { messages: filterOps(storageOps, from, to), partialResult: false };\n\t\t\t},\n\t\t\t// getCached\n\t\t\tasync (from: number, to: number) => filterOps(cachedOps, from, to),\n\t\t\t// requestFromSocket\n\t\t\t(from: number, to: number) => {},\n\t\t\t// opsReceived\n\t\t\t(ops: ISequencedDocumentMessage[]) => opsToCache.push(...ops),\n\t\t\t() => ({ isFirstSnapshotFromNetwork: false }) as unknown as OdspDocumentStorageService,\n\t\t);\n\n\t\tconst stream = storage.fetchMessages(\n\t\t\tfromTotal,\n\t\t\ttoTotal,\n\t\t\tundefined, // abortSignal\n\t\t\tcacheOnly,\n\t\t);\n\n\t\tconst opsAll = await readAll(stream);\n\n\t\tvalidateOps(opsAll, fromTotal, fromTotal + totalOps);\n\t\tif (cacheOnly) {\n\t\t\tassert(opsToCache.length === 0);\n\t\t} else {\n\t\t\topsToCache = opsToCache.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\t\t\tvalidateOps(\n\t\t\t\topsToCache,\n\t\t\t\tfromTotal + opsFromSnapshot + opsFromCache,\n\t\t\t\tfromTotal + totalOps,\n\t\t\t);\n\t\t}\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t}\n\n\tit(\"basic permutations\", async () => {\n\t\tawait testStorage(105, undefined, false, 0, 0, 0);\n\t\tawait testStorage(105, undefined, false, 110, 0, 0);\n\t\tawait testStorage(105, undefined, false, 110, 245, 0);\n\t\tawait testStorage(105, undefined, false, 110, 245, 1000);\n\t\tawait testStorage(105, undefined, false, 110, 9001, 8002);\n\n\t\tawait testStorage(105, undefined, false, 0, 245, 0);\n\t\tawait testStorage(105, undefined, false, 0, 9000, 0);\n\t\tawait testStorage(105, undefined, false, 0, 245, 150);\n\n\t\tawait testStorage(105, undefined, false, 110, 0, 150);\n\t\tawait testStorage(105, undefined, false, 0, 0, 150);\n\t});\n\n\tit(\"cached\", async () => {\n\t\tawait testStorage(105, undefined, true, 0, 0, 0);\n\t\tawait testStorage(105, undefined, true, 110, 0, 0);\n\t\tawait testStorage(105, undefined, true, 110, 245, 0);\n\t\tawait testStorage(105, undefined, true, 1001, 8001, 0);\n\t\tawait testStorage(105, undefined, true, 110, 245, 1000);\n\n\t\tawait testStorage(105, undefined, true, 0, 245, 0);\n\t\tawait testStorage(105, undefined, true, 0, 245, 150);\n\n\t\tawait testStorage(105, undefined, true, 110, 0, 150);\n\t\tawait testStorage(105, undefined, true, 0, 0, 150);\n\t});\n\n\tit(\"fixed to\", async () => {\n\t\tawait testStorage(105, 105 + 110, false, 110, 0, 0);\n\t\tawait testStorage(105, 105 + 110 + 245, false, 110, 245, 0);\n\t\tawait testStorage(105, 105 + 110 + 245 + 500, false, 110, 245, 1000);\n\n\t\tawait testStorage(105, 105 + 245 + 150, false, 0, 245, 150);\n\n\t\tawait testStorage(105, 105 + 110 + 150, false, 110, 0, 150);\n\t\tawait testStorage(105, 105 + 140, false, 0, 0, 150);\n\t});\n\n\tit(\"concurency\", async () => {\n\t\tawait testStorage(105, undefined, false, 0, 0, 0, 2);\n\t\tawait testStorage(105, undefined, false, 110, 0, 0, 2);\n\t\tawait testStorage(105, undefined, false, 110, 245, 0, 2);\n\t\tawait testStorage(105, undefined, false, 110, 245, 1000, 2);\n\t\tawait testStorage(105, undefined, false, 110, 9001, 8002, 2);\n\n\t\tawait testStorage(105, undefined, false, 0, 245, 0, 2);\n\t\tawait testStorage(105, undefined, false, 0, 9000, 0, 2);\n\t\tawait testStorage(105, undefined, false, 0, 245, 150, 2);\n\n\t\tawait testStorage(105, undefined, false, 110, 0, 150, 2);\n\t\tawait testStorage(105, undefined, false, 0, 0, 150, 2);\n\t});\n});\n"]}
1
+ {"version":3,"file":"opsCaching.spec.js","sourceRoot":"","sources":["../../src/test/opsCaching.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAG7D,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAgC,MAAM,kBAAkB,CAAC;AAK1E,MAAM,SAAS;IAAf;QACQ,eAAU,GAAG,CAAC,CAAC;QACf,eAAU,GAAG,CAAC,CAAC;QA4Bf,SAAI,GAA+B,EAAE,CAAC;IAC9C,CAAC;IA3BO,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,IAAY;QACnD,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAe,EAAE;YACtD,4CAA4C;YAC5C,IAAI,EAAE,KAAK,IAAI,EAAE;gBAChB,IAAI,CAAC,UAAU,EAAE,CAAC;aAClB;SACD;IACF,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,WAAmB;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,IAAI,OAAO,KAAK,SAAS,EAAE;YAC1B,OAAO,SAAS,CAAC;SACjB;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAEM,MAAM;QACZ,yGAAyG;QACzG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IAChB,CAAC;CAGD;AAED,KAAK,UAAU,QAAQ,CACtB,SAAoB,EACpB,QAAwD,EACxD,KAAe,EACf,UAAkB;IAElB,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEvE,MAAM,WAAW,GAAkB,EAAE,CAAC;IACtC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;QAC7C,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE;YACxB,IAAI,EAAE,KAAK,SAAS,EAAE;gBACrB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACrB;SACD;KACD;IAED,IAAI,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEtC,IAAI,UAAU,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;KAC5B;IAED,+FAA+F;IAC/F,IAAI,UAAU,GAAG,CAAC,EAAE;QACnB,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;KAC5B;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QAC3B,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;QAEpE,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAE5B,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAE5B,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/C,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/C,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KACnD;AACF,CAAC;AAED,KAAK,UAAU,cAAc,CAC5B,SAAiB,EACjB,UAAkB,EAClB,QAAuB,EACvB,QAAwD,EACxD,qBAA6B,EAC7B,eAAwB;IAExB,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,QAAQ,CACzB,UAAU,EACV,MAAM,CAAC,iBAAiB,EAAE,EAC1B,SAAS,EACT,SAAS,EACT,CAAC,CAAC,EAAE,mBAAmB;IACvB,EAAE,CACF,CAAC;IAEF,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEvB,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC;IACpC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,qBAAqB,EAAE,4BAA4B,CAAC,CAAC;IAE1E,iEAAiE;IACjE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvB,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAEvD,sCAAsC;IACtC,KAAK,CAAC,QAAQ,EAAE,CAAC;IACjB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,eAAe,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEvE,6DAA6D;IAC7D,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvB,KAAK,CAAC,QAAQ,EAAE,CAAC;IACjB,MAAM,CAAC,KAAK,CACX,SAAS,CAAC,UAAU,EACpB,eAAe,IAAI,QAAQ,CAAC,MAAM,EAClC,4BAA4B,CAC5B,CAAC;IACF,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,SAAiB,EACjB,UAAkB,EAClB,QAAuB,EACvB,QAAwD,EACxD,qBAA6B,EAC7B,mBAA2B,EAC3B,eAAwB;IAExB,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,QAAQ,CACzB,UAAU,EACV,MAAM,CAAC,iBAAiB,EAAE,EAC1B,SAAS,EACT,SAAS,EACT,CAAC,EAAE,mBAAmB;IACtB,EAAE,CACF,CAAC;IAEF,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IAC1D,MAAM,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAEvD,OAAO,SAAS,CAAC,UAAU,GAAG,mBAAmB,EAAE;QAClD,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;KACf;IACD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,eAAe,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvE,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC5B,SAAiB,EACjB,UAAkB,EAClB,QAAuB,EACvB,QAAwD,EACxD,qBAA6B,EAC7B,mBAA2B,EAC3B,eAAwB;IAExB,MAAM,cAAc,CACnB,SAAS,EACT,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,qBAAqB,EACrB,eAAe,CACf,CAAC;IACF,MAAM,gBAAgB,CACrB,SAAS,EACT,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,CACf,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACzB,MAAM,SAAS,GAAkB;QAChC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;QACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;QACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;QACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;QACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;QACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;QACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;QACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;QACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;KACpC,CAAC;IAEF,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,OAAO,CACZ,CAAC,EACD,GAAG,EACH;YACC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;SACpC,EACD;YACC,MAAM,EAAE;gBACP,SAAS;gBACT,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;gBACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;gBACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;gBACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;aACpC;SACD,EACD,CAAC,EACD,CAAC,CACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,OAAO,CACZ,CAAC,EACD,GAAG,EACH;YACC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;SACpC,EACD,EAAE,EACF,CAAC,EACD,CAAC,EACD,CAAC,CACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,OAAO,CACZ,CAAC,EACD,GAAG,EACH;YACC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;SACpC,EACD;YACC,MAAM,EAAE;gBACP,SAAS;gBACT,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;gBACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;gBACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;gBACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;aACpC;SACD,EACD,CAAC,EACD,CAAC,EACD,CAAC,CACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAkB;QAChC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;QACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;KACpC,CAAC;IAEF,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,OAAO,CACZ,CAAC,EACD,GAAG,EACH,SAAS,EACT;YACC,MAAM,EAAE;gBACP,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;gBACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;aACpC;SACD,EACD,CAAC,EACD,CAAC,CACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,OAAO,CACZ,CAAC,EACD,GAAG,EACH,SAAS,EACT;YACC,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAC/C,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;SAC/C,EACD,CAAC,EACD,CAAC,CACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC7B,MAAM,OAAO,CACZ,CAAC,EACD,GAAG,EACH;YACC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;SACpC,EACD,EAAE,EACF,CAAC,EACD,CAAC,CACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QAC3B,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,GAAG,CAAC;QAEvB,MAAM,QAAQ,GAAkB;YAC/B,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,OAAO;YACP,wCAAwC;YACxC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,+CAA+C;YAC/C,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;SACpC,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,QAAQ,CACzB,UAAU,EACV,MAAM,CAAC,iBAAiB,EAAE,EAC1B,SAAS,EACT,CAAC,CAAC,eAAe,EACjB,CAAC,CAAC,EAAE,mBAAmB;QACvB,GAAG,CACH,CAAC;QAEF,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,KAAK,CAAC,QAAQ,EAAE,CAAC;QAEjB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;YACxB,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;YACpC,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;SACpC,CAAC,CAAC;QACH,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IAC1C,KAAK,UAAU,OAAO,CACrB,MAA4C;QAE5C,MAAM,GAAG,GAAgC,EAAE,CAAC;QAC5C,iDAAiD;QACjD,OAAO,IAAI,EAAE;YACZ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,MAAM,CAAC,IAAI,EAAE;gBAChB,MAAM;aACN;YACD,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;SAC1B;QACD,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,SAAS,SAAS,CAAC,OAAe,EAAE,MAAc;QACjD,MAAM,GAAG,GAAgC,EAAE,CAAC;QAC5C,IAAI,IAAI,GAAG,OAAO,CAAC;QACnB,MAAM,EAAE,GAAG,IAAI,GAAG,MAAM,CAAC;QACzB,OAAO,IAAI,GAAG,EAAE,EAAE;YACjB,yEAAyE;YACzE,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,IAAI,EAA+B,CAAC,CAAC;YAChE,IAAI,EAAE,CAAC;SACP;QACD,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,SAAS,SAAS,CACjB,GAAgC,EAChC,IAAY,EACZ,EAAU;QAEV,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,cAAc,IAAI,IAAI,IAAI,EAAE,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,SAAS,WAAW,CAAC,GAAgC,EAAE,IAAY,EAAE,EAAU;QAC9E,IAAI,EAAE,GAAG,IAAI,EAAE;YACd,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;SACzB;aAAM;YACN,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC;YAC3D,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;SAC1E;IACF,CAAC;IAED,KAAK,UAAU,WAAW,CACzB,SAAiB,EACjB,OAA2B,EAC3B,SAAkB,EAClB,eAAuB,EACvB,YAAoB,EACpB,cAAsB,EACtB,WAAW,GAAG,CAAC,EACf,SAAS,GAAG,GAAG;QAEf,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,GAAG,eAAe,EAAE,YAAY,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,GAAG,eAAe,GAAG,YAAY,EAAE,cAAc,CAAC,CAAC;QAEzF,IAAI,QAAQ,GAAG,eAAe,GAAG,YAAY,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,OAAO,IAAI,SAAS,GAAG,QAAQ,CAAC;QACjD,MAAM,CAAC,QAAQ,IAAI,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,4CAA4C;QACtF,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;QACvC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEzC,IAAI,UAAU,GAAgC,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAC5C,WAAW,EACX,MAAM,CAAC,iBAAiB,EAAE,EAC1B,SAAS,EACT,WAAW;QACX,iBAAiB;QACjB,KAAK,EAAE,IAAY,EAAE,EAAU,EAAE,EAAE;YAClC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QAC5E,CAAC;QACD,YAAY;QACZ,KAAK,EAAE,IAAY,EAAE,EAAU,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;QAClE,oBAAoB;QACpB,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,GAAE,CAAC;QAChC,cAAc;QACd,CAAC,GAAgC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,EAC7D,GAAG,EAAE,CAAC,CAAC,EAAE,0BAA0B,EAAE,KAAK,EAAE,CAA0C,CACtF,CAAC;QAEF,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CACnC,SAAS,EACT,OAAO,EACP,SAAS,EAAE,cAAc;QACzB,SAAS,CACT,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QAErC,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;QACrD,IAAI,SAAS,EAAE;YACd,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;SAChC;aAAM;YACN,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;YAC5E,WAAW,CACV,UAAU,EACV,SAAS,GAAG,eAAe,GAAG,YAAY,EAC1C,SAAS,GAAG,QAAQ,CACpB,CAAC;SACF;QACD,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE1D,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEtD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACvB,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACrD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACvD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAExD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAErD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACrD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;QACzB,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAErE,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAE5D,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QAC3B,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE7D,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEzD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { IStream } from \"@fluidframework/driver-definitions\";\nimport { delay } from \"@fluidframework/core-utils\";\nimport { OdspDeltaStorageWithCache } from \"../odspDeltaStorageService.js\";\nimport { OpsCache, ICache, IMessage, CacheEntry } from \"../opsCaching.js\";\nimport { OdspDocumentStorageService } from \"../odspDocumentStorageManager.js\";\n\nexport type MyDataInput = IMessage & { data: string };\n\nclass MockCache implements ICache {\n\tpublic writeCount = 0;\n\tpublic opsWritten = 0;\n\n\tpublic async write(batchNumber: string, data: string): Promise<void> {\n\t\tthis.writeCount++;\n\t\tthis.data[batchNumber] = JSON.parse(data);\n\t\tfor (const op of this.data[batchNumber] as CacheEntry) {\n\t\t\t// JSON.serialize converts undefined to null\n\t\t\tif (op !== null) {\n\t\t\t\tthis.opsWritten++;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async read(batchNumber: string): Promise<string | undefined> {\n\t\tconst content = this.data[batchNumber];\n\t\tif (content === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn JSON.stringify(content);\n\t}\n\n\tpublic remove(): void {\n\t\t// Do not reset this.writeCount such that we can test that writes happened, but later on data was cleared\n\t\tthis.writeCount++;\n\t\tthis.opsWritten++;\n\t\tthis.data = {};\n\t}\n\n\tpublic data: { [key: string]: unknown } = {};\n}\n\nasync function validate(\n\tmockCache: MockCache,\n\texpected: { [key: number]: (MyDataInput | undefined)[] },\n\tcache: OpsCache,\n\tinitialSeq: number,\n): Promise<void> {\n\tassert.deepEqual(mockCache.data, JSON.parse(JSON.stringify(expected)));\n\n\tconst expectedArr: MyDataInput[] = [];\n\tfor (const values of Object.values(expected)) {\n\t\tfor (const op of values) {\n\t\t\tif (op !== undefined) {\n\t\t\t\texpectedArr.push(op);\n\t\t\t}\n\t\t}\n\t}\n\n\tlet result = await cache.get(initialSeq + 1, undefined);\n\tassert.deepEqual(result, expectedArr);\n\n\tif (initialSeq >= 10) {\n\t\tresult = await cache.get(1, 10);\n\t\tassert(result.length === 0);\n\t}\n\n\t// Asking for one too early should result in empty result, as hit miss should result in no ops.\n\tif (initialSeq > 0) {\n\t\tresult = await cache.get(initialSeq, undefined);\n\t\tassert(result.length === 0);\n\t}\n\n\tif (expectedArr.length > 0) {\n\t\tconst last = expectedArr[expectedArr.length - 1].sequenceNumber + 1;\n\n\t\tresult = await cache.get(last, undefined);\n\t\tassert(result.length === 0);\n\n\t\tresult = await cache.get(last + 10, undefined);\n\t\tassert(result.length === 0);\n\n\t\tresult = await cache.get(initialSeq + 2, last);\n\t\tassert.deepEqual(result, expectedArr.slice(1));\n\n\t\tresult = await cache.get(initialSeq + 2, last + 100000);\n\t\tassert.deepEqual(result, expectedArr.slice(1));\n\n\t\tresult = await cache.get(initialSeq + 2, last - 1);\n\t\tassert.deepEqual(result, expectedArr.slice(1, -1));\n\t}\n}\n\nasync function runTestNoTimer(\n\tbatchSize: number,\n\tinitialSeq: number,\n\tmockData: MyDataInput[],\n\texpected: { [key: number]: (MyDataInput | undefined)[] },\n\tinitialWritesExpected: number,\n\ttotalOpsWritten?: number,\n): Promise<void> {\n\tconst mockCache = new MockCache();\n\tconst logger = new MockLogger();\n\tconst cache = new OpsCache(\n\t\tinitialSeq,\n\t\tlogger.toTelemetryLogger(),\n\t\tmockCache,\n\t\tbatchSize,\n\t\t-1, // timerGranularity\n\t\t10, // totalOpsToCache\n\t);\n\n\tcache.addOps(mockData);\n\n\tconst writes = mockCache.writeCount;\n\tassert.equal(writes, initialWritesExpected, \"initialWrites should match\");\n\n\t// Validate that writing same ops is not going to change anything\n\tcache.addOps(mockData);\n\tassert.equal(writes, mockCache.writeCount);\n\n\tawait validate(mockCache, expected, cache, initialSeq);\n\n\t// ensure all ops are flushed properly\n\tcache.flushOps();\n\tassert.equal(mockCache.opsWritten, totalOpsWritten ?? mockData.length);\n\n\t// ensure adding same ops and flushing again is doing nothing\n\tcache.addOps(mockData);\n\tcache.flushOps();\n\tassert.equal(\n\t\tmockCache.opsWritten,\n\t\ttotalOpsWritten ?? mockData.length,\n\t\t\"ops written does not match\",\n\t);\n\tlogger.assertMatchNone([{ category: \"error\" }]);\n}\n\nexport async function runTestWithTimer(\n\tbatchSize: number,\n\tinitialSeq: number,\n\tmockData: MyDataInput[],\n\texpected: { [key: number]: (MyDataInput | undefined)[] },\n\tinitialWritesExpected: number,\n\ttotalWritesExpected: number,\n\ttotalOpsWritten?: number,\n): Promise<void> {\n\tconst mockCache = new MockCache();\n\tconst logger = new MockLogger();\n\tconst cache = new OpsCache(\n\t\tinitialSeq,\n\t\tlogger.toTelemetryLogger(),\n\t\tmockCache,\n\t\tbatchSize,\n\t\t1, // timerGranularity\n\t\t10, // totalOpsToCache\n\t);\n\n\tcache.addOps(mockData);\n\tassert.equal(mockCache.writeCount, initialWritesExpected);\n\tawait validate(mockCache, expected, cache, initialSeq);\n\n\twhile (mockCache.writeCount < totalWritesExpected) {\n\t\tawait delay(1);\n\t}\n\tassert.equal(mockCache.writeCount, totalWritesExpected);\n\tassert.equal(mockCache.opsWritten, totalOpsWritten ?? mockData.length);\n\tlogger.assertMatchNone([{ category: \"error\" }]);\n}\n\nexport async function runTest(\n\tbatchSize: number,\n\tinitialSeq: number,\n\tmockData: MyDataInput[],\n\texpected: { [key: string]: (MyDataInput | undefined)[] },\n\tinitialWritesExpected: number,\n\ttotalWritesExpected: number,\n\ttotalOpsWritten?: number,\n): Promise<void> {\n\tawait runTestNoTimer(\n\t\tbatchSize,\n\t\tinitialSeq,\n\t\tmockData,\n\t\texpected,\n\t\tinitialWritesExpected,\n\t\ttotalOpsWritten,\n\t);\n\tawait runTestWithTimer(\n\t\tbatchSize,\n\t\tinitialSeq,\n\t\tmockData,\n\t\texpected,\n\t\tinitialWritesExpected,\n\t\ttotalWritesExpected,\n\t\ttotalOpsWritten,\n\t);\n}\n\ndescribe(\"OpsCache\", () => {\n\tconst mockData1: MyDataInput[] = [\n\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t{ sequenceNumber: 110, data: \"110\" },\n\t\t{ sequenceNumber: 115, data: \"115\" },\n\t\t{ sequenceNumber: 120, data: \"120\" },\n\t\t{ sequenceNumber: 125, data: \"125\" },\n\t\t{ sequenceNumber: 130, data: \"130\" },\n\t\t{ sequenceNumber: 135, data: \"135\" },\n\t\t{ sequenceNumber: 140, data: \"140\" },\n\t\t{ sequenceNumber: 145, data: \"140\" },\n\t];\n\n\tit(\"1 element in each batch of 5 should not commit\", async () => {\n\t\tawait runTest(5, 100, mockData1, {}, 0, 9);\n\t});\n\n\tit(\"2 element in each batch of 10 should not commit\", async () => {\n\t\tawait runTest(10, 100, mockData1, {}, 0, 4, 8);\n\t});\n\n\tit(\"6 sequential elements with batch of 5 should commit 1 batch\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t],\n\t\t\t{\n\t\t\t\t\"5_20\": [\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t);\n\t});\n\n\tit(\"Epmty ops at beginning and end of batch should cause the batch to not be cached\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t],\n\t\t\t{},\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t});\n\n\tit(\"Epmty ops at just the beginning should still cause the batch to be cached\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t],\n\t\t\t{\n\t\t\t\t\"5_20\": [\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t1,\n\t\t\t1,\n\t\t\t4,\n\t\t);\n\t});\n\n\tconst mockData3: MyDataInput[] = [\n\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t{ sequenceNumber: 103, data: \"103\" },\n\t];\n\n\tit(\"3 sequential elements with batch of 2 and offset of 1 should commit 2 batches\", async () => {\n\t\tawait runTest(\n\t\t\t2,\n\t\t\t101,\n\t\t\tmockData3,\n\t\t\t{\n\t\t\t\t\"2_51\": [\n\t\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t1,\n\t\t\t1,\n\t\t);\n\t});\n\n\tit(\"with batch size of 1 all ops should commit in own batch\", async () => {\n\t\tawait runTest(\n\t\t\t1,\n\t\t\t101,\n\t\t\tmockData3,\n\t\t\t{\n\t\t\t\t\"1_102\": [{ sequenceNumber: 102, data: \"102\" }],\n\t\t\t\t\"1_103\": [{ sequenceNumber: 103, data: \"103\" }],\n\t\t\t},\n\t\t\t2,\n\t\t\t2,\n\t\t);\n\t});\n\n\tit(\"Too many ops\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t\t{ sequenceNumber: 106, data: \"106\" },\n\t\t\t\t{ sequenceNumber: 107, data: \"107\" },\n\t\t\t\t{ sequenceNumber: 108, data: \"108\" },\n\t\t\t\t{ sequenceNumber: 109, data: \"109\" },\n\t\t\t\t{ sequenceNumber: 110, data: \"110\" },\n\t\t\t\t{ sequenceNumber: 111, data: \"111\" },\n\t\t\t\t{ sequenceNumber: 112, data: \"112\" },\n\t\t\t\t{ sequenceNumber: 113, data: \"113\" },\n\t\t\t\t{ sequenceNumber: 114, data: \"114\" },\n\t\t\t\t{ sequenceNumber: 115, data: \"115\" },\n\t\t\t],\n\t\t\t{},\n\t\t\t3,\n\t\t\t3,\n\t\t);\n\t});\n\n\tit(\"Gap in ops\", async () => {\n\t\tconst mockCache = new MockCache();\n\t\tconst initialSeq = 100;\n\n\t\tconst mockData: MyDataInput[] = [\n\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t{ sequenceNumber: 106, data: \"106\" },\n\t\t\t// Gap:\n\t\t\t// { sequenceNumber: 107, data: \"107\" },\n\t\t\t{ sequenceNumber: 108, data: \"108\" },\n\t\t\t{ sequenceNumber: 109, data: \"109\" },\n\t\t\t// Start a new butch - that's where we had bug!\n\t\t\t{ sequenceNumber: 110, data: \"110\" },\n\t\t\t{ sequenceNumber: 111, data: \"111\" },\n\t\t];\n\t\tconst logger = new MockLogger();\n\t\tconst cache = new OpsCache(\n\t\t\tinitialSeq,\n\t\t\tlogger.toTelemetryLogger(),\n\t\t\tmockCache,\n\t\t\t5 /* batchSize */,\n\t\t\t-1, // timerGranularity\n\t\t\t100, // totalOpsToCache\n\t\t);\n\n\t\tcache.addOps(mockData);\n\t\tcache.flushOps();\n\n\t\tconst result = await cache.get(initialSeq + 1, undefined);\n\t\tassert.deepEqual(result, [\n\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t{ sequenceNumber: 106, data: \"106\" },\n\t\t]);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n});\n\ndescribe(\"OdspDeltaStorageWithCache\", () => {\n\tasync function readAll(\n\t\tstream: IStream<ISequencedDocumentMessage[]>,\n\t): Promise<ISequencedDocumentMessage[]> {\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t// eslint-disable-next-line no-constant-condition\n\t\twhile (true) {\n\t\t\tconst result = await stream.read();\n\t\t\tif (result.done) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tops.push(...result.value);\n\t\t}\n\t\treturn ops;\n\t}\n\n\tfunction createOps(fromArg: number, length: number): ISequencedDocumentMessage[] {\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tlet from = fromArg;\n\t\tconst to = from + length;\n\t\twhile (from < to) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tops.push({ sequenceNumber: from } as ISequencedDocumentMessage);\n\t\t\tfrom++;\n\t\t}\n\t\treturn ops;\n\t}\n\n\tfunction filterOps(\n\t\tops: ISequencedDocumentMessage[],\n\t\tfrom: number,\n\t\tto: number,\n\t): ISequencedDocumentMessage[] {\n\t\treturn ops.filter((op) => op.sequenceNumber >= from && op.sequenceNumber < to);\n\t}\n\n\tfunction validateOps(ops: ISequencedDocumentMessage[], from: number, to: number): void {\n\t\tif (to < from) {\n\t\t\tassert(ops.length === 0);\n\t\t} else {\n\t\t\tassert(ops.length === to - from);\n\t\t\tassert(ops.length === 0 || ops[0].sequenceNumber === from);\n\t\t\tassert(ops.length === 0 || ops[ops.length - 1].sequenceNumber === to - 1);\n\t\t}\n\t}\n\n\tasync function testStorage(\n\t\tfromTotal: number,\n\t\ttoTotal: number | undefined,\n\t\tcacheOnly: boolean,\n\t\topsFromSnapshot: number,\n\t\topsFromCache: number,\n\t\topsFromStorage: number,\n\t\tconcurrency = 1,\n\t\tbatchSize = 100,\n\t): Promise<void> {\n\t\tconst snapshotOps = createOps(fromTotal, opsFromSnapshot);\n\t\tconst cachedOps = createOps(fromTotal + opsFromSnapshot, opsFromCache);\n\t\tconst storageOps = createOps(fromTotal + opsFromSnapshot + opsFromCache, opsFromStorage);\n\n\t\tlet totalOps = opsFromSnapshot + opsFromCache + (cacheOnly ? 0 : opsFromStorage);\n\t\tconst actualTo = toTotal ?? fromTotal + totalOps;\n\t\tassert(actualTo <= fromTotal + totalOps); // code will deadlock if that's not the case\n\t\tconst askingOps = actualTo - fromTotal;\n\t\ttotalOps = Math.min(totalOps, askingOps);\n\n\t\tlet opsToCache: ISequencedDocumentMessage[] = [];\n\t\tconst logger = new MockLogger();\n\t\tconst storage = new OdspDeltaStorageWithCache(\n\t\t\tsnapshotOps,\n\t\t\tlogger.toTelemetryLogger(),\n\t\t\tbatchSize,\n\t\t\tconcurrency,\n\t\t\t// getFromStorage\n\t\t\tasync (from: number, to: number) => {\n\t\t\t\treturn { messages: filterOps(storageOps, from, to), partialResult: false };\n\t\t\t},\n\t\t\t// getCached\n\t\t\tasync (from: number, to: number) => filterOps(cachedOps, from, to),\n\t\t\t// requestFromSocket\n\t\t\t(from: number, to: number) => {},\n\t\t\t// opsReceived\n\t\t\t(ops: ISequencedDocumentMessage[]) => opsToCache.push(...ops),\n\t\t\t() => ({ isFirstSnapshotFromNetwork: false }) as unknown as OdspDocumentStorageService,\n\t\t);\n\n\t\tconst stream = storage.fetchMessages(\n\t\t\tfromTotal,\n\t\t\ttoTotal,\n\t\t\tundefined, // abortSignal\n\t\t\tcacheOnly,\n\t\t);\n\n\t\tconst opsAll = await readAll(stream);\n\n\t\tvalidateOps(opsAll, fromTotal, fromTotal + totalOps);\n\t\tif (cacheOnly) {\n\t\t\tassert(opsToCache.length === 0);\n\t\t} else {\n\t\t\topsToCache = opsToCache.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\t\t\tvalidateOps(\n\t\t\t\topsToCache,\n\t\t\t\tfromTotal + opsFromSnapshot + opsFromCache,\n\t\t\t\tfromTotal + totalOps,\n\t\t\t);\n\t\t}\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t}\n\n\tit(\"basic permutations\", async () => {\n\t\tawait testStorage(105, undefined, false, 0, 0, 0);\n\t\tawait testStorage(105, undefined, false, 110, 0, 0);\n\t\tawait testStorage(105, undefined, false, 110, 245, 0);\n\t\tawait testStorage(105, undefined, false, 110, 245, 1000);\n\t\tawait testStorage(105, undefined, false, 110, 9001, 8002);\n\n\t\tawait testStorage(105, undefined, false, 0, 245, 0);\n\t\tawait testStorage(105, undefined, false, 0, 9000, 0);\n\t\tawait testStorage(105, undefined, false, 0, 245, 150);\n\n\t\tawait testStorage(105, undefined, false, 110, 0, 150);\n\t\tawait testStorage(105, undefined, false, 0, 0, 150);\n\t});\n\n\tit(\"cached\", async () => {\n\t\tawait testStorage(105, undefined, true, 0, 0, 0);\n\t\tawait testStorage(105, undefined, true, 110, 0, 0);\n\t\tawait testStorage(105, undefined, true, 110, 245, 0);\n\t\tawait testStorage(105, undefined, true, 1001, 8001, 0);\n\t\tawait testStorage(105, undefined, true, 110, 245, 1000);\n\n\t\tawait testStorage(105, undefined, true, 0, 245, 0);\n\t\tawait testStorage(105, undefined, true, 0, 245, 150);\n\n\t\tawait testStorage(105, undefined, true, 110, 0, 150);\n\t\tawait testStorage(105, undefined, true, 0, 0, 150);\n\t});\n\n\tit(\"fixed to\", async () => {\n\t\tawait testStorage(105, 105 + 110, false, 110, 0, 0);\n\t\tawait testStorage(105, 105 + 110 + 245, false, 110, 245, 0);\n\t\tawait testStorage(105, 105 + 110 + 245 + 500, false, 110, 245, 1000);\n\n\t\tawait testStorage(105, 105 + 245 + 150, false, 0, 245, 150);\n\n\t\tawait testStorage(105, 105 + 110 + 150, false, 110, 0, 150);\n\t\tawait testStorage(105, 105 + 140, false, 0, 0, 150);\n\t});\n\n\tit(\"concurency\", async () => {\n\t\tawait testStorage(105, undefined, false, 0, 0, 0, 2);\n\t\tawait testStorage(105, undefined, false, 110, 0, 0, 2);\n\t\tawait testStorage(105, undefined, false, 110, 245, 0, 2);\n\t\tawait testStorage(105, undefined, false, 110, 245, 1000, 2);\n\t\tawait testStorage(105, undefined, false, 110, 9001, 8002, 2);\n\n\t\tawait testStorage(105, undefined, false, 0, 245, 0, 2);\n\t\tawait testStorage(105, undefined, false, 0, 9000, 0, 2);\n\t\tawait testStorage(105, undefined, false, 0, 245, 150, 2);\n\n\t\tawait testStorage(105, undefined, false, 110, 0, 150, 2);\n\t\tawait testStorage(105, undefined, false, 0, 0, 150, 2);\n\t});\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/odsp-driver",
3
- "version": "2.0.0-dev-rc.2.0.0.245554",
3
+ "version": "2.0.0-dev-rc.2.0.0.246488",
4
4
  "description": "Socket storage implementation for SPO and ODC",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -87,24 +87,24 @@
87
87
  "temp-directory": "nyc/.nyc_output"
88
88
  },
89
89
  "dependencies": {
90
- "@fluid-internal/client-utils": "2.0.0-dev-rc.2.0.0.245554",
91
- "@fluidframework/core-interfaces": "2.0.0-dev-rc.2.0.0.245554",
92
- "@fluidframework/core-utils": "2.0.0-dev-rc.2.0.0.245554",
93
- "@fluidframework/driver-base": "2.0.0-dev-rc.2.0.0.245554",
94
- "@fluidframework/driver-definitions": "2.0.0-dev-rc.2.0.0.245554",
95
- "@fluidframework/driver-utils": "2.0.0-dev-rc.2.0.0.245554",
96
- "@fluidframework/odsp-doclib-utils": "2.0.0-dev-rc.2.0.0.245554",
97
- "@fluidframework/odsp-driver-definitions": "2.0.0-dev-rc.2.0.0.245554",
90
+ "@fluid-internal/client-utils": "2.0.0-dev-rc.2.0.0.246488",
91
+ "@fluidframework/core-interfaces": "2.0.0-dev-rc.2.0.0.246488",
92
+ "@fluidframework/core-utils": "2.0.0-dev-rc.2.0.0.246488",
93
+ "@fluidframework/driver-base": "2.0.0-dev-rc.2.0.0.246488",
94
+ "@fluidframework/driver-definitions": "2.0.0-dev-rc.2.0.0.246488",
95
+ "@fluidframework/driver-utils": "2.0.0-dev-rc.2.0.0.246488",
96
+ "@fluidframework/odsp-doclib-utils": "2.0.0-dev-rc.2.0.0.246488",
97
+ "@fluidframework/odsp-driver-definitions": "2.0.0-dev-rc.2.0.0.246488",
98
98
  "@fluidframework/protocol-base": "^4.0.0",
99
99
  "@fluidframework/protocol-definitions": "^3.2.0",
100
- "@fluidframework/telemetry-utils": "2.0.0-dev-rc.2.0.0.245554",
100
+ "@fluidframework/telemetry-utils": "2.0.0-dev-rc.2.0.0.246488",
101
101
  "node-fetch": "^2.6.9",
102
102
  "socket.io-client": "^4.7.3",
103
103
  "uuid": "^9.0.0"
104
104
  },
105
105
  "devDependencies": {
106
106
  "@arethetypeswrong/cli": "^0.13.3",
107
- "@fluid-internal/mocha-test-setup": "2.0.0-dev-rc.2.0.0.245554",
107
+ "@fluid-internal/mocha-test-setup": "2.0.0-dev-rc.2.0.0.246488",
108
108
  "@fluid-tools/build-cli": "^0.34.0",
109
109
  "@fluidframework/build-common": "^2.0.3",
110
110
  "@fluidframework/build-tools": "^0.34.0",
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+
5
6
  import { IRequest } from "@fluidframework/core-interfaces";
6
7
  import { DriverHeader } from "@fluidframework/driver-definitions";
7
8
  import { ISharingLinkKind } from "@fluidframework/odsp-driver-definitions";
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+
5
6
  import { ISnapshotOptions } from "@fluidframework/odsp-driver-definitions";
6
7
 
7
8
  /**
package/src/odspCache.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+
5
6
  import { PromiseCache } from "@fluidframework/core-utils";
6
7
  import {
7
8
  IOdspResolvedUrl,
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+
5
6
  import { assert } from "@fluidframework/core-utils";
6
7
  import { IRequest } from "@fluidframework/core-interfaces";
7
8
  import {
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+
5
6
  import { PromiseCache } from "@fluidframework/core-utils";
6
7
  import { ITelemetryBaseLogger, IRequest } from "@fluidframework/core-interfaces";
7
8
  import {
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/odsp-driver";
9
- export const pkgVersion = "2.0.0-dev-rc.2.0.0.245554";
9
+ export const pkgVersion = "2.0.0-dev-rc.2.0.0.246488";