@fluidframework/odsp-driver 2.93.0 → 2.100.0

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 (50) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/compactSnapshotParser.d.ts +2 -2
  3. package/dist/compactSnapshotParser.d.ts.map +1 -1
  4. package/dist/compactSnapshotParser.js.map +1 -1
  5. package/dist/epochTracker.d.ts +8 -4
  6. package/dist/epochTracker.d.ts.map +1 -1
  7. package/dist/epochTracker.js +12 -9
  8. package/dist/epochTracker.js.map +1 -1
  9. package/dist/fetchSnapshot.d.ts +9 -6
  10. package/dist/fetchSnapshot.d.ts.map +1 -1
  11. package/dist/fetchSnapshot.js +8 -3
  12. package/dist/fetchSnapshot.js.map +1 -1
  13. package/dist/odspDocumentStorageManager.d.ts.map +1 -1
  14. package/dist/odspDocumentStorageManager.js +1 -1
  15. package/dist/odspDocumentStorageManager.js.map +1 -1
  16. package/dist/packageVersion.d.ts +1 -1
  17. package/dist/packageVersion.d.ts.map +1 -1
  18. package/dist/packageVersion.js +1 -1
  19. package/dist/packageVersion.js.map +1 -1
  20. package/dist/prefetchLatestSnapshot.d.ts.map +1 -1
  21. package/dist/prefetchLatestSnapshot.js +2 -2
  22. package/dist/prefetchLatestSnapshot.js.map +1 -1
  23. package/lib/compactSnapshotParser.d.ts +2 -2
  24. package/lib/compactSnapshotParser.d.ts.map +1 -1
  25. package/lib/compactSnapshotParser.js.map +1 -1
  26. package/lib/epochTracker.d.ts +8 -4
  27. package/lib/epochTracker.d.ts.map +1 -1
  28. package/lib/epochTracker.js +13 -10
  29. package/lib/epochTracker.js.map +1 -1
  30. package/lib/fetchSnapshot.d.ts +9 -6
  31. package/lib/fetchSnapshot.d.ts.map +1 -1
  32. package/lib/fetchSnapshot.js +8 -3
  33. package/lib/fetchSnapshot.js.map +1 -1
  34. package/lib/odspDocumentStorageManager.d.ts.map +1 -1
  35. package/lib/odspDocumentStorageManager.js +1 -1
  36. package/lib/odspDocumentStorageManager.js.map +1 -1
  37. package/lib/packageVersion.d.ts +1 -1
  38. package/lib/packageVersion.d.ts.map +1 -1
  39. package/lib/packageVersion.js +1 -1
  40. package/lib/packageVersion.js.map +1 -1
  41. package/lib/prefetchLatestSnapshot.d.ts.map +1 -1
  42. package/lib/prefetchLatestSnapshot.js +2 -2
  43. package/lib/prefetchLatestSnapshot.js.map +1 -1
  44. package/package.json +13 -13
  45. package/src/compactSnapshotParser.ts +2 -2
  46. package/src/epochTracker.ts +30 -11
  47. package/src/fetchSnapshot.ts +13 -7
  48. package/src/odspDocumentStorageManager.ts +1 -0
  49. package/src/packageVersion.ts +1 -1
  50. package/src/prefetchLatestSnapshot.ts +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"odspDocumentStorageManager.js","sourceRoot":"","sources":["../src/odspDocumentStorageManager.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 { performanceNow } from \"@fluid-internal/client-utils\";\nimport { LogLevel } from \"@fluidframework/core-interfaces\";\nimport { assert, delay } from \"@fluidframework/core-utils/internal\";\nimport { promiseRaceWithWinner } from \"@fluidframework/driver-base/internal\";\nimport type { ISummaryTree } from \"@fluidframework/driver-definitions\";\nimport {\n\tFetchSource,\n\ttype ISnapshot,\n\ttype ISnapshotFetchOptions,\n\ttype ISummaryContext,\n\ttype ICreateBlobResponse,\n\ttype IVersion,\n\ttype ISnapshotTree,\n} from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tgetKeyForCacheEntry,\n\tNonRetryableError,\n\tRateLimiter,\n} from \"@fluidframework/driver-utils/internal\";\nimport {\n\ttype IOdspResolvedUrl,\n\ttype ISnapshotOptions,\n\ttype InstrumentedStorageTokenFetcher,\n\tOdspErrorTypes,\n} from \"@fluidframework/odsp-driver-definitions/internal\";\nimport {\n\ttype ITelemetryLoggerExt,\n\tPerformanceEvent,\n\tgenerateStack,\n\tloggerToMonitoringContext,\n\tnormalizeError,\n\toverwriteStack,\n\ttype IConfigProvider,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport type {\n\tHostStoragePolicyInternal,\n\tIDocumentStorageGetVersionsResponse,\n\t// eslint-disable-next-line import-x/no-deprecated\n\tISnapshotCachedEntry,\n\tISnapshotCachedEntry2,\n\tIVersionedValueWithEpoch,\n} from \"./contracts.js\";\nimport { useCreateNewModule } from \"./createFile/index.js\";\nimport type { EpochTracker } from \"./epochTracker.js\";\nimport {\n\ttype ISnapshotRequestAndResponseOptions,\n\ttype SnapshotFormatSupportType,\n\tdownloadSnapshot,\n\tgetTreeStats,\n\tfetchSnapshot,\n\tfetchSnapshotWithRedeem,\n} from \"./fetchSnapshot.js\";\nimport { getHeadersWithAuth } from \"./getUrlAndHeadersWithAuth.js\";\nimport type { IOdspCache, IPrefetchSnapshotContents } from \"./odspCache.js\";\nimport type { FlushResult } from \"./odspDocumentDeltaConnection.js\";\nimport { OdspDocumentStorageServiceBase } from \"./odspDocumentStorageServiceBase.js\";\nimport type { OdspSummaryUploadManager } from \"./odspSummaryUploadManager.js\";\nimport {\n\ttype IOdspResponse,\n\tcreateCacheSnapshotKey,\n\tgetWithRetryForTokenRefresh,\n\tisInstanceOfISnapshot,\n\tisSnapshotFetchForLoadingGroup,\n\tsnapshotWithLoadingGroupIdSupported,\n\tuseLegacyFlowWithoutGroupsForSnapshotFetch,\n\ttype TokenFetchOptionsEx,\n} from \"./odspUtils.js\";\nimport { pkgVersion as driverVersion } from \"./packageVersion.js\";\n\nexport const defaultSummarizerCacheExpiryTimeout: number = 60 * 1000; // 60 seconds.\n\ninterface GetVersionsTelemetryProps {\n\tcacheEntryAge?: number;\n\tcacheSummarizerExpired?: boolean;\n}\n\nexport class OdspDocumentStorageService extends OdspDocumentStorageServiceBase {\n\tprivate odspSummaryModuleLoaded: boolean = false;\n\tprivate summaryModuleP: Promise<OdspSummaryUploadManager> | undefined;\n\tprivate odspSummaryUploadManager: OdspSummaryUploadManager | undefined;\n\n\tprivate firstSnapshotFetchCall = true;\n\tprivate _isFirstSnapshotFromNetwork: boolean | undefined;\n\tprivate readonly documentId: string;\n\tprivate readonly snapshotUrl: string | undefined;\n\tprivate readonly attachmentPOSTUrl: string | undefined;\n\tprivate readonly attachmentGETUrl: string | undefined;\n\tprivate readonly config: IConfigProvider;\n\t// Driver specified limits for snapshot size and time.\n\t/**\n\t * NOTE: While commit cfff6e3 added restrictions to prevent large payloads, snapshot failures will continue to\n\t * happen until blob request throttling is implemented. Until then, as a temporary fix we set arbitrarily large\n\t * snapshot size and timeout limits so that such failures are unlikely to occur.\n\t */\n\tprivate readonly maxSnapshotSizeLimit = 500000000; // 500 MB\n\tprivate readonly maxSnapshotFetchTimeout = 120000; // 2 min\n\n\t// limits the amount of parallel \"attachment\" blob uploads\n\tprivate readonly createBlobRateLimiter = new RateLimiter(1);\n\n\tconstructor(\n\t\tprivate readonly odspResolvedUrl: IOdspResolvedUrl,\n\t\tprivate readonly getAuthHeader: InstrumentedStorageTokenFetcher,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tprivate readonly fetchFullSnapshot: boolean,\n\t\tprivate readonly cache: IOdspCache,\n\t\tprivate readonly hostPolicy: HostStoragePolicyInternal,\n\t\tprivate readonly epochTracker: EpochTracker,\n\t\tprivate readonly flushCallback: () => Promise<FlushResult>,\n\t\tprivate readonly relayServiceTenantAndSessionId: () => string | undefined,\n\t\tprivate readonly snapshotFormatFetchType?: SnapshotFormatSupportType,\n\t) {\n\t\tsuper(loggerToMonitoringContext(logger).config);\n\n\t\tthis.documentId = this.odspResolvedUrl.hashedDocumentId;\n\t\tthis.snapshotUrl = this.odspResolvedUrl.endpoints.snapshotStorageUrl;\n\t\tthis.attachmentPOSTUrl = this.odspResolvedUrl.endpoints.attachmentPOSTStorageUrl;\n\t\tthis.attachmentGETUrl = this.odspResolvedUrl.endpoints.attachmentGETStorageUrl;\n\t\tthis.config = loggerToMonitoringContext(logger).config;\n\t}\n\n\tpublic get isFirstSnapshotFromNetwork(): boolean | undefined {\n\t\treturn this._isFirstSnapshotFromNetwork;\n\t}\n\n\tpublic async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n\t\tthis.checkAttachmentPOSTUrl();\n\n\t\tconst response = await getWithRetryForTokenRefresh(async (options) => {\n\t\t\tconst url = `${this.attachmentPOSTUrl}/content`;\n\t\t\tconst method = \"POST\";\n\t\t\tconst authHeader = await this.getAuthHeader(\n\t\t\t\t{ ...options, request: { url, method } },\n\t\t\t\t\"CreateBlob\",\n\t\t\t);\n\t\t\tconst headers = getHeadersWithAuth(authHeader);\n\t\t\theaders[\"Content-Type\"] = \"application/octet-stream\";\n\t\t\tif (this.config.getBoolean(\"Fluid.Driver.Odsp.enableLargeBlobUpload\")) {\n\t\t\t\t// Enable the large blob upload feature\n\t\t\t\theaders.Prefer = \"Increase-Attachment-Size-Limit\";\n\t\t\t}\n\n\t\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\t\tthis.logger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"createBlob\",\n\t\t\t\t\tsize: file.byteLength,\n\t\t\t\t\twaitQueueLength: this.createBlobRateLimiter.waitQueueLength,\n\t\t\t\t},\n\t\t\t\tasync (event) => {\n\t\t\t\t\tconst res = await this.createBlobRateLimiter.schedule(async () =>\n\t\t\t\t\t\tthis.epochTracker.fetchAndParseAsJSON<ICreateBlobResponse>(\n\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbody: file,\n\t\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"createBlob\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tevent.end({\n\t\t\t\t\t\tblobId: res.content.id,\n\t\t\t\t\t\t...res.propsToLog,\n\t\t\t\t\t});\n\t\t\t\t\treturn res;\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\n\t\treturn response.content;\n\t}\n\n\tprotected async fetchBlobFromStorage(\n\t\tblobId: string,\n\t\tevicted: boolean,\n\t): Promise<ArrayBuffer> {\n\t\tthis.checkAttachmentGETUrl();\n\n\t\tconst blob = await getWithRetryForTokenRefresh(async (options) => {\n\t\t\tconst url = `${this.attachmentGETUrl}/${encodeURIComponent(blobId)}/content`;\n\t\t\tconst method = \"GET\";\n\t\t\tconst authHeader = await this.getAuthHeader(\n\t\t\t\t{ ...options, request: { url, method } },\n\t\t\t\t\"GetBlob\",\n\t\t\t);\n\t\t\tconst headers = getHeadersWithAuth(authHeader);\n\n\t\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\t\tthis.logger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"readDataBlob\",\n\t\t\t\t\tblobId,\n\t\t\t\t\tevicted,\n\t\t\t\t\twaitQueueLength: this.epochTracker.rateLimiter.waitQueueLength,\n\t\t\t\t},\n\t\t\t\tasync (event) => {\n\t\t\t\t\tconst res = await this.epochTracker.fetchArray(url, { headers }, \"blob\");\n\t\t\t\t\tevent.end({\n\t\t\t\t\t\twaitQueueLength: this.epochTracker.rateLimiter.waitQueueLength,\n\t\t\t\t\t\t...res.propsToLog,\n\t\t\t\t\t\tattempts: options.refresh ? 2 : 1,\n\t\t\t\t\t});\n\t\t\t\t\tconst cacheControl = res.headers.get(\"cache-control\");\n\t\t\t\t\tif (\n\t\t\t\t\t\tcacheControl === undefined ||\n\t\t\t\t\t\t!(cacheControl.includes(\"private\") || cacheControl.includes(\"public\"))\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\t\t\t\teventName: \"NonCacheableBlob\",\n\t\t\t\t\t\t\tcacheControl,\n\t\t\t\t\t\t\tblobId,\n\t\t\t\t\t\t\t...res.propsToLog,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn res.content;\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t\tthis.blobCache.setBlob(blobId, blob);\n\t\treturn blob;\n\t}\n\n\tpublic async getSnapshotTree(\n\t\tversion?: IVersion,\n\t\tscenarioName?: string,\n\t\t// eslint-disable-next-line @rushstack/no-new-null\n\t): Promise<ISnapshotTree | null> {\n\t\tif (!this.snapshotUrl) {\n\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\treturn null;\n\t\t}\n\t\treturn super.getSnapshotTree(version, scenarioName);\n\t}\n\n\t/**\n\t * Fetches and returns the snapshot. If no loadingGroupIds or empty loadingGroupIds is provided, then snapshot for all\n\t * ungrouped data will be provided.\n\t * @param snapshotFetchOptions - fetch options for snapshot.\n\t */\n\tpublic async getSnapshot(snapshotFetchOptions?: ISnapshotFetchOptions): Promise<ISnapshot> {\n\t\t// Don't consult cache if request is not for a particular loading group.\n\t\tconst { snapshot } = await this.fetchSnapshot({\n\t\t\t...snapshotFetchOptions,\n\t\t\tfetchSource: isSnapshotFetchForLoadingGroup(snapshotFetchOptions?.loadingGroupIds)\n\t\t\t\t? FetchSource.noCache\n\t\t\t\t: snapshotFetchOptions?.fetchSource,\n\t\t\tloadingGroupIds: snapshotFetchOptions?.loadingGroupIds ?? [],\n\t\t});\n\n\t\treturn {\n\t\t\t...snapshot,\n\t\t\tsnapshotTree: this.combineProtocolAndAppSnapshotTree(snapshot.snapshotTree),\n\t\t};\n\t}\n\n\tprivate async fetchSnapshot(\n\t\tsnapshotFetchOptions: ISnapshotFetchOptions,\n\t): Promise<{ snapshot: ISnapshot; id: string | undefined }> {\n\t\tconst hostSnapshotOptions = this.hostPolicy.snapshotOptions;\n\t\tconst odspSnapshotCacheValue: ISnapshot = await PerformanceEvent.timedExecAsync(\n\t\t\tthis.logger,\n\t\t\t{\n\t\t\t\teventName: isSnapshotFetchForLoadingGroup(snapshotFetchOptions.loadingGroupIds)\n\t\t\t\t\t? \"ObtainSnapshotForGroup\"\n\t\t\t\t\t: \"ObtainSnapshot\",\n\t\t\t\tfetchSource: snapshotFetchOptions?.fetchSource,\n\t\t\t},\n\t\t\tasync (event: PerformanceEvent) => {\n\t\t\t\tconst props: GetVersionsTelemetryProps = {};\n\t\t\t\tlet cacheLookupTimeInSerialFetch = 0;\n\t\t\t\tlet retrievedSnapshot: ISnapshot | IPrefetchSnapshotContents | undefined;\n\n\t\t\t\tlet method: string;\n\t\t\t\tlet prefetchWaitStartTime: number = performanceNow();\n\t\t\t\tif (snapshotFetchOptions.fetchSource === FetchSource.noCache) {\n\t\t\t\t\tretrievedSnapshot = await this.fetchSnapshotFromNetwork(\n\t\t\t\t\t\thostSnapshotOptions,\n\t\t\t\t\t\tsnapshotFetchOptions.loadingGroupIds,\n\t\t\t\t\t\tsnapshotFetchOptions.scenarioName,\n\t\t\t\t\t);\n\t\t\t\t\tmethod = \"networkOnly\";\n\t\t\t\t} else {\n\t\t\t\t\t// Here's the logic to grab the persistent cache snapshot implemented by the host\n\t\t\t\t\t// Epoch tracker is responsible for communicating with the persistent cache, handling epochs and cache versions\n\t\t\t\t\tconst cachedSnapshotP: Promise<ISnapshot | undefined> = this.epochTracker\n\t\t\t\t\t\t.get(\n\t\t\t\t\t\t\tcreateCacheSnapshotKey(\n\t\t\t\t\t\t\t\tthis.odspResolvedUrl,\n\t\t\t\t\t\t\t\tsnapshotWithLoadingGroupIdSupported(this.config),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.then(\n\t\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\t\t// eslint-disable-next-line import-x/no-deprecated\n\t\t\t\t\t\t\t\tsnapshotCachedEntry: ISnapshotCachedEntry | ISnapshotCachedEntry2,\n\t\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\t\tif (snapshotCachedEntry !== undefined) {\n\t\t\t\t\t\t\t\t\t// If the cached entry does not contain the entry time, then assign it a default of 30 days old.\n\t\t\t\t\t\t\t\t\tconst age =\n\t\t\t\t\t\t\t\t\t\tDate.now() -\n\t\t\t\t\t\t\t\t\t\t(snapshotCachedEntry.cacheEntryTime ??\n\t\t\t\t\t\t\t\t\t\t\tDate.now() - 30 * 24 * 60 * 60 * 1000);\n\n\t\t\t\t\t\t\t\t\t// In order to decrease the number of times we have to execute a snapshot refresh,\n\t\t\t\t\t\t\t\t\t// if this is the summarizer and we have a cache entry but it is past the defaultSummarizerCacheExpiryTimeout,\n\t\t\t\t\t\t\t\t\t// force the network retrieval instead as there might be a more recent snapshot available.\n\t\t\t\t\t\t\t\t\t// See: https://github.com/microsoft/FluidFramework/issues/8995 for additional information.\n\t\t\t\t\t\t\t\t\tif (this.hostPolicy.summarizerClient) {\n\t\t\t\t\t\t\t\t\t\tif (age > defaultSummarizerCacheExpiryTimeout) {\n\t\t\t\t\t\t\t\t\t\t\tprops.cacheSummarizerExpired = true;\n\t\t\t\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tprops.cacheSummarizerExpired = false;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Record the cache age\n\t\t\t\t\t\t\t\t\tprops.cacheEntryAge = age;\n\t\t\t\t\t\t\t\t\t// Snapshot from cache could be in older format, so transform that before returning.\n\t\t\t\t\t\t\t\t\tif (isInstanceOfISnapshot(snapshotCachedEntry)) {\n\t\t\t\t\t\t\t\t\t\treturn snapshotCachedEntry;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tconst snapshot: ISnapshot = {\n\t\t\t\t\t\t\t\t\t\t\tsnapshotTree: snapshotCachedEntry.snapshotTree,\n\t\t\t\t\t\t\t\t\t\t\tblobContents: snapshotCachedEntry.blobs,\n\t\t\t\t\t\t\t\t\t\t\tops: snapshotCachedEntry.ops,\n\t\t\t\t\t\t\t\t\t\t\tlatestSequenceNumber: snapshotCachedEntry.latestSequenceNumber,\n\t\t\t\t\t\t\t\t\t\t\tsequenceNumber: snapshotCachedEntry.sequenceNumber,\n\t\t\t\t\t\t\t\t\t\t\tsnapshotFormatV: 1,\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\treturn snapshot;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t// Based on the concurrentSnapshotFetch policy:\n\t\t\t\t\t// Either retrieve both the network and cache snapshots concurrently and pick the first to return,\n\t\t\t\t\t// or grab the cache value and then the network value if the cache value returns undefined.\n\t\t\t\t\t// For summarizer which could call this during refreshing of summary parent, always use the cache\n\t\t\t\t\t// first. Also for other clients, if it is not critical path which is determined by firstSnapshotFetchCall,\n\t\t\t\t\t// then also check the cache first.\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.firstSnapshotFetchCall &&\n\t\t\t\t\t\tthis.hostPolicy.concurrentSnapshotFetch &&\n\t\t\t\t\t\t!this.hostPolicy.summarizerClient\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst networkSnapshotP = this.fetchSnapshotFromNetwork(\n\t\t\t\t\t\t\thostSnapshotOptions,\n\t\t\t\t\t\t\tsnapshotFetchOptions.loadingGroupIds,\n\t\t\t\t\t\t\tsnapshotFetchOptions.scenarioName,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// Ensure that failures on both paths are ignored initially.\n\t\t\t\t\t\t// I.e. if cache fails for some reason, we will proceed with network result.\n\t\t\t\t\t\t// And vice versa - if (for example) client is offline and network request fails first, we\n\t\t\t\t\t\t// do want to attempt to succeed with cached data!\n\t\t\t\t\t\tconst promiseRaceWinner = await promiseRaceWithWinner([\n\t\t\t\t\t\t\tcachedSnapshotP.catch(() => undefined),\n\t\t\t\t\t\t\tnetworkSnapshotP.catch(() => undefined),\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tretrievedSnapshot = promiseRaceWinner.value;\n\t\t\t\t\t\tmethod = promiseRaceWinner.index === 0 ? \"cache\" : \"network\";\n\n\t\t\t\t\t\tif (retrievedSnapshot === undefined) {\n\t\t\t\t\t\t\t// if network failed -> wait for cache ( then return network failure)\n\t\t\t\t\t\t\t// If cache returned empty or failed -> wait for network (success of failure)\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tif (promiseRaceWinner.index === 1) {\n\t\t\t\t\t\t\t\t\tretrievedSnapshot = await cachedSnapshotP;\n\t\t\t\t\t\t\t\t\tmethod = \"cache\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (retrievedSnapshot === undefined) {\n\t\t\t\t\t\t\t\t\tretrievedSnapshot = await networkSnapshotP;\n\t\t\t\t\t\t\t\t\tmethod = \"network\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\t\t\t// The call stacks of any errors thrown by cached snapshot or network snapshot aren't very useful:\n\t\t\t\t\t\t\t\t// they get truncated at this stack frame due to the promise race and how v8 tracks async stack traces--\n\t\t\t\t\t\t\t\t// see https://v8.dev/docs/stack-trace-api#async-stack-traces and the \"zero-cost async stack traces\" document\n\t\t\t\t\t\t\t\t// linked there. https://v8.dev/blog/fast-async#await-under-the-hood may also be helpful for context on internals.\n\t\t\t\t\t\t\t\t// Regenerating the stack at this level provides more information for logged errors.\n\t\t\t\t\t\t\t\t// Once FF uses an ES2021 target, we could convert the above promise race to use `Promise.any` + AggregateError and\n\t\t\t\t\t\t\t\t// get similar quality stacks with less hand-crafted code.\n\t\t\t\t\t\t\t\tconst innerStack = (error as Error).stack;\n\t\t\t\t\t\t\t\tconst normalizedError = normalizeError(error);\n\t\t\t\t\t\t\t\tnormalizedError.addTelemetryProperties({ innerStack });\n\n\t\t\t\t\t\t\t\tconst newStack = `<<STACK TRUNCATED: see innerStack property>> \\n${generateStack()}`;\n\t\t\t\t\t\t\t\toverwriteStack(normalizedError, newStack);\n\n\t\t\t\t\t\t\t\tthrow normalizedError;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Note: There's a race condition here - another caller may come past the undefined check\n\t\t\t\t\t\t// while the first caller is awaiting later async code in this block.\n\t\t\t\t\t\tconst startTime = performanceNow();\n\t\t\t\t\t\tretrievedSnapshot = await cachedSnapshotP;\n\t\t\t\t\t\tcacheLookupTimeInSerialFetch = performanceNow() - startTime;\n\t\t\t\t\t\tmethod = retrievedSnapshot === undefined ? \"network\" : \"cache\";\n\n\t\t\t\t\t\tif (retrievedSnapshot === undefined) {\n\t\t\t\t\t\t\tprefetchWaitStartTime = performanceNow();\n\t\t\t\t\t\t\tretrievedSnapshot = await this.fetchSnapshotFromNetwork(\n\t\t\t\t\t\t\t\thostSnapshotOptions,\n\t\t\t\t\t\t\t\tsnapshotFetchOptions.loadingGroupIds,\n\t\t\t\t\t\t\t\tsnapshotFetchOptions.scenarioName,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (method === \"network\") {\n\t\t\t\t\tprops.cacheEntryAge = undefined;\n\t\t\t\t}\n\t\t\t\tif (this.firstSnapshotFetchCall) {\n\t\t\t\t\tthis._isFirstSnapshotFromNetwork = method === \"cache\" ? false : true;\n\t\t\t\t}\n\t\t\t\tconst prefetchStartTime: number | undefined = (\n\t\t\t\t\tretrievedSnapshot as IPrefetchSnapshotContents\n\t\t\t\t).prefetchStartTime;\n\t\t\t\tevent.end({\n\t\t\t\t\t...props,\n\t\t\t\t\tmethod,\n\t\t\t\t\tfetchSnapshotForInitialLoad: this.firstSnapshotFetchCall,\n\t\t\t\t\tuseLegacyFlowWithoutGroups: useLegacyFlowWithoutGroupsForSnapshotFetch(\n\t\t\t\t\t\tsnapshotFetchOptions.loadingGroupIds,\n\t\t\t\t\t),\n\t\t\t\t\tavoidPrefetchSnapshotCache: this.hostPolicy.avoidPrefetchSnapshotCache,\n\t\t\t\t\t...getTreeStats(retrievedSnapshot),\n\t\t\t\t\tcacheLookupTimeInSerialFetch,\n\t\t\t\t\tprefetchSavedDuration:\n\t\t\t\t\t\tprefetchStartTime !== undefined && method !== \"cache\"\n\t\t\t\t\t\t\t? prefetchWaitStartTime - prefetchStartTime\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t});\n\t\t\t\treturn retrievedSnapshot;\n\t\t\t},\n\t\t);\n\n\t\tconst stTime = performanceNow();\n\t\t// Don't override ops which were fetched during initial load, since we could still need them.\n\t\tconst id = this.initializeFromSnapshot(\n\t\t\todspSnapshotCacheValue,\n\t\t\tthis.firstSnapshotFetchCall,\n\t\t\tsnapshotFetchOptions?.cacheSnapshot ?? this.firstSnapshotFetchCall,\n\t\t);\n\t\tthis.logger.sendTelemetryEvent(\n\t\t\t{\n\t\t\t\teventName: \"SnapshotInitializeTime\",\n\t\t\t\tduration: performanceNow() - stTime,\n\t\t\t},\n\t\t\tundefined,\n\t\t\tLogLevel.verbose,\n\t\t);\n\t\tthis.firstSnapshotFetchCall = false;\n\n\t\treturn { snapshot: odspSnapshotCacheValue, id };\n\t}\n\n\tpublic async getVersions(\n\t\t// eslint-disable-next-line @rushstack/no-new-null\n\t\tblobid: string | null,\n\t\tcount: number,\n\t\tscenarioName?: string,\n\t\tfetchSource?: FetchSource,\n\t): Promise<IVersion[]> {\n\t\t// Regular load workflow uses blobId === documentID to indicate \"latest\".\n\t\tif (blobid !== this.documentId && blobid) {\n\t\t\t// FluidFetch & FluidDebugger tools use empty sting to query for versions\n\t\t\t// In such case we need to make a call against SPO to give full picture to the tool.\n\t\t\t// Otherwise, each commit calls getVersions but odsp doesn't have a history for each commit\n\t\t\t// return the blobid as is\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: blobid,\n\t\t\t\t\ttreeId: undefined!,\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\n\t\t// Can't really make a call if we do not have URL\n\t\tif (!this.snapshotUrl) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// If count is one, we can use the trees/latest API, which returns the latest version and trees in a single request for better performance\n\t\tif (count === 1 && (blobid === null || blobid === this.documentId)) {\n\t\t\tconst { id } = await this.fetchSnapshot({\n\t\t\t\tcacheSnapshot: true,\n\t\t\t\tscenarioName,\n\t\t\t\tversionId: blobid ?? undefined,\n\t\t\t\tfetchSource,\n\t\t\t});\n\t\t\treturn id ? [{ id, treeId: undefined! }] : [];\n\t\t}\n\n\t\treturn getWithRetryForTokenRefresh(async (options) => {\n\t\t\tconst url = `${this.snapshotUrl}/versions?top=${count}`;\n\t\t\tconst method = \"GET\";\n\t\t\tconst storageToken = await this.getAuthHeader(\n\t\t\t\t{ ...options, request: { url, method } },\n\t\t\t\t\"GetVersions\",\n\t\t\t);\n\t\t\tconst headers = getHeadersWithAuth(storageToken);\n\n\t\t\t// Fetch the latest snapshot versions for the document\n\t\t\tconst response = await PerformanceEvent.timedExecAsync(\n\t\t\t\tthis.logger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"getVersions\",\n\t\t\t\t},\n\t\t\t\tasync () =>\n\t\t\t\t\tthis.epochTracker.fetchAndParseAsJSON<IDocumentStorageGetVersionsResponse>(\n\t\t\t\t\t\turl,\n\t\t\t\t\t\t{ headers },\n\t\t\t\t\t\t\"versions\",\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tscenarioName,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tconst versionsResponse = response.content;\n\t\t\tif (!versionsResponse) {\n\t\t\t\tthrow new NonRetryableError(\n\t\t\t\t\t\"No response from /versions endpoint\",\n\t\t\t\t\tOdspErrorTypes.genericNetworkError,\n\t\t\t\t\t{ driverVersion },\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!Array.isArray(versionsResponse.value)) {\n\t\t\t\tthrow new NonRetryableError(\n\t\t\t\t\t\"Incorrect response from /versions endpoint, expected an array\",\n\t\t\t\t\tOdspErrorTypes.genericNetworkError,\n\t\t\t\t\t{ driverVersion },\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn versionsResponse.value.map((version) => {\n\t\t\t\treturn {\n\t\t\t\t\tid: version.id,\n\t\t\t\t\ttreeId: undefined!,\n\t\t\t\t};\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async fetchSnapshotFromNetwork(\n\t\thostSnapshotOptions: ISnapshotOptions | undefined,\n\t\tloadingGroupIds: string[] | undefined,\n\t\tscenarioName?: string,\n\t): Promise<ISnapshot | IPrefetchSnapshotContents> {\n\t\treturn this.fetchSnapshotFromNetworkCore(\n\t\t\thostSnapshotOptions,\n\t\t\tloadingGroupIds,\n\t\t\tscenarioName,\n\t\t).catch((error) => {\n\t\t\t// Issue #5895:\n\t\t\t// If we are offline, this error is retryable. But that means that RetriableDocumentStorageService\n\t\t\t// will run in circles calling getSnapshotTree, which would result in OdspDocumentStorageService class\n\t\t\t// going getVersions / individual blob download path. This path is very slow, and will not work with\n\t\t\t// delay-loaded data stores and ODSP storage deleting old snapshots and blobs.\n\t\t\tif (typeof error === \"object\" && error !== null) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\terror.canRetry = false;\n\t\t\t}\n\t\t\tthrow error;\n\t\t});\n\t}\n\n\tprivate async fetchSnapshotFromNetworkCore(\n\t\thostSnapshotOptions: ISnapshotOptions | undefined,\n\t\tloadingGroupIds: string[] | undefined,\n\t\tscenarioName?: string,\n\t): Promise<ISnapshot | IPrefetchSnapshotContents> {\n\t\t// Don't look into cache, if the host specifically tells us so. Also, if request is\n\t\t// for initial snapshot, don't consult the prefetch cache.\n\t\tif (!this.hostPolicy.avoidPrefetchSnapshotCache && this.firstSnapshotFetchCall) {\n\t\t\tconst prefetchCacheKey = getKeyForCacheEntry(\n\t\t\t\tcreateCacheSnapshotKey(\n\t\t\t\t\tthis.odspResolvedUrl,\n\t\t\t\t\tsnapshotWithLoadingGroupIdSupported(this.config),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst result = await this.cache.snapshotPrefetchResultCache\n\t\t\t\t?.get(prefetchCacheKey)\n\t\t\t\t?.then(async (response) => {\n\t\t\t\t\t// Remove it from cache once used.\n\t\t\t\t\tthis.cache.snapshotPrefetchResultCache.remove(prefetchCacheKey);\n\t\t\t\t\t// Validate the epoch from the prefetched snapshot result.\n\t\t\t\t\tawait this.epochTracker.validateEpoch(response.fluidEpoch, \"treesLatest\");\n\t\t\t\t\treturn response;\n\t\t\t\t})\n\t\t\t\t.catch(async (error) => {\n\t\t\t\t\tthis.logger.sendTelemetryEvent(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"PrefetchSnapshotError\",\n\t\t\t\t\t\t\tconcurrentSnapshotFetch: this.hostPolicy.concurrentSnapshotFetch,\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t\treturn undefined;\n\t\t\t\t});\n\t\t\t// If the prefetch call, is successful, then return the contents otherwise as backup for now, just\n\t\t\t// proceed with the old snapshot fetch flow.\n\t\t\tif (result !== undefined) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\tconst snapshotOptions: ISnapshotOptions = {\n\t\t\tmds: this.maxSnapshotSizeLimit,\n\t\t\t...hostSnapshotOptions,\n\t\t\ttimeout: hostSnapshotOptions?.timeout\n\t\t\t\t? Math.min(hostSnapshotOptions.timeout, this.maxSnapshotFetchTimeout)\n\t\t\t\t: this.maxSnapshotFetchTimeout,\n\t\t};\n\n\t\t// No limit on size of snapshot or time to fetch, as otherwise we fail all clients to summarize\n\t\tif (this.hostPolicy.summarizerClient) {\n\t\t\tsnapshotOptions.mds = undefined;\n\t\t\tsnapshotOptions.timeout = undefined;\n\t\t}\n\n\t\tconst snapshotDownloader = async (\n\t\t\tfinalOdspResolvedUrl: IOdspResolvedUrl,\n\t\t\ttokenFetcher: InstrumentedStorageTokenFetcher,\n\t\t\ttokenFetchOptions: TokenFetchOptionsEx,\n\t\t\tloadingGroupId: string[] | undefined,\n\t\t\toptions: ISnapshotOptions | undefined,\n\t\t\tcontroller?: AbortController,\n\t\t): Promise<ISnapshotRequestAndResponseOptions> => {\n\t\t\treturn downloadSnapshot(\n\t\t\t\tfinalOdspResolvedUrl,\n\t\t\t\ttokenFetcher,\n\t\t\t\ttokenFetchOptions,\n\t\t\t\tloadingGroupId,\n\t\t\t\toptions,\n\t\t\t\tthis.snapshotFormatFetchType,\n\t\t\t\tcontroller,\n\t\t\t\tthis.epochTracker,\n\t\t\t\tscenarioName,\n\t\t\t);\n\t\t};\n\t\tconst putInCache = async (valueWithEpoch: IVersionedValueWithEpoch): Promise<void> => {\n\t\t\treturn this.cache.persistedCache.put(\n\t\t\t\tcreateCacheSnapshotKey(\n\t\t\t\t\tthis.odspResolvedUrl,\n\t\t\t\t\tsnapshotWithLoadingGroupIdSupported(this.config),\n\t\t\t\t),\n\t\t\t\t// Epoch tracker will add the epoch and version to the value here. So just send value to cache.\n\t\t\t\tvalueWithEpoch.value,\n\t\t\t);\n\t\t};\n\t\tconst removeEntries = async (): Promise<void> => this.cache.persistedCache.removeEntries();\n\t\ttry {\n\t\t\tconst odspSnapshot = await fetchSnapshotWithRedeem(\n\t\t\t\tthis.odspResolvedUrl,\n\t\t\t\tthis.getAuthHeader,\n\t\t\t\tsnapshotOptions,\n\t\t\t\t!!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,\n\t\t\t\tthis.logger,\n\t\t\t\tsnapshotDownloader,\n\t\t\t\tputInCache,\n\t\t\t\tremoveEntries,\n\t\t\t\tloadingGroupIds,\n\t\t\t\tthis.hostPolicy.enableRedeemFallback,\n\t\t\t);\n\t\t\treturn odspSnapshot;\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t} catch (error: any) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n\t\t\tconst errorType = error.errorType;\n\t\t\t// If the snapshot size is too big and the host specified the size limitation(specified in hostSnapshotOptions), then don't try to fetch the snapshot again.\n\t\t\tif (\n\t\t\t\terrorType === OdspErrorTypes.snapshotTooBig &&\n\t\t\t\thostSnapshotOptions?.mds !== undefined &&\n\t\t\t\tthis.hostPolicy.summarizerClient !== true\n\t\t\t) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\t// If the first snapshot request was with blobs and we either timed out or the size was too big, then try to fetch without blobs.\n\t\t\tif (\n\t\t\t\t(errorType === OdspErrorTypes.snapshotTooBig ||\n\t\t\t\t\terrorType === OdspErrorTypes.fetchTimeout) &&\n\t\t\t\tsnapshotOptions.blobs\n\t\t\t) {\n\t\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\t\teventName: \"TreeLatest_SecondCall\",\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\terrorType,\n\t\t\t\t});\n\t\t\t\tconst snapshotOptionsWithoutBlobs: ISnapshotOptions = {\n\t\t\t\t\t...snapshotOptions,\n\t\t\t\t\tblobs: 0,\n\t\t\t\t\tmds: undefined,\n\t\t\t\t\ttimeout: undefined,\n\t\t\t\t};\n\t\t\t\tconst odspSnapshot = await fetchSnapshotWithRedeem(\n\t\t\t\t\tthis.odspResolvedUrl,\n\t\t\t\t\tthis.getAuthHeader,\n\t\t\t\t\tsnapshotOptionsWithoutBlobs,\n\t\t\t\t\t!!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,\n\t\t\t\t\tthis.logger,\n\t\t\t\t\tsnapshotDownloader,\n\t\t\t\t\tputInCache,\n\t\t\t\t\tremoveEntries,\n\t\t\t\t\tloadingGroupIds,\n\t\t\t\t\tthis.hostPolicy.enableRedeemFallback,\n\t\t\t\t);\n\t\t\t\treturn odspSnapshot;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic async uploadSummaryWithContext(\n\t\tsummary: ISummaryTree,\n\t\tcontext: ISummaryContext,\n\t): Promise<string> {\n\t\tthis.checkSnapshotUrl();\n\n\t\t// Set the module promise right away, so as to not call it twice.\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (this.summaryModuleP === undefined) {\n\t\t\tthis.summaryModuleP = this.getDelayLoadedSummaryManager();\n\t\t}\n\n\t\t// Enable flushing only if we have single commit summary and this is not the initial summary for an empty file\n\t\tif (\".protocol\" in summary.tree && context.ackHandle !== undefined) {\n\t\t\tlet retry = 1;\n\t\t\tfor (;;) {\n\t\t\t\tconst result = await this.flushCallback();\n\t\t\t\tconst seq = result.lastPersistedSequenceNumber;\n\t\t\t\tif (seq !== undefined && seq >= context.referenceSequenceNumber) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (retry > 3) {\n\t\t\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\t\t\teventName: \"FlushFailure\",\n\t\t\t\t\t\t...result,\n\t\t\t\t\t\tretry,\n\t\t\t\t\t\treferenceSequenceNumber: context.referenceSequenceNumber,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\teventName: \"FlushExtraCall\",\n\t\t\t\t\t...result,\n\t\t\t\t\tretry,\n\t\t\t\t\treferenceSequenceNumber: context.referenceSequenceNumber,\n\t\t\t\t});\n\n\t\t\t\tretry++;\n\t\t\t\tawait delay(1000 * (result.retryAfter ?? 1));\n\t\t\t}\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (!this.odspSummaryUploadManager) {\n\t\t\tthis.odspSummaryUploadManager = await this.summaryModuleP\n\t\t\t\t.then(async (m) => {\n\t\t\t\t\tthis.odspSummaryModuleLoaded = true;\n\t\t\t\t\treturn m;\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tthis.odspSummaryModuleLoaded = false;\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t}\n\n\t\tassert(\n\t\t\tthis.odspSummaryUploadManager !== undefined,\n\t\t\t0x56e /* summary upload manager should have been initialized */,\n\t\t);\n\t\tconst id = await this.odspSummaryUploadManager.writeSummaryTree(summary, context);\n\t\tconst { pendingRename } = this.odspResolvedUrl;\n\t\tif (\n\t\t\tpendingRename !== undefined &&\n\t\t\tthis.config.getBoolean(\"Fluid.Driver.Odsp.disablePendingRename\") !== true\n\t\t) {\n\t\t\t// This is a temporary file, so we need to rename it to remove the .tmp extension\n\t\t\t// This should only happen for the initial summary upload for a new file\n\t\t\tassert(\n\t\t\t\tcontext.ackHandle === undefined &&\n\t\t\t\t\tcontext.proposalHandle === undefined &&\n\t\t\t\t\tcontext.referenceSequenceNumber === 0,\n\t\t\t\t0xa88 /* temporaryFileName should only be set for new file creation in the empty file create flow */,\n\t\t\t);\n\n\t\t\tconst renameResponse = await useCreateNewModule(this.logger, async (m) =>\n\t\t\t\tm.renameEmptyFluidFile(\n\t\t\t\t\tthis.getAuthHeader,\n\t\t\t\t\tthis.odspResolvedUrl,\n\t\t\t\t\tpendingRename,\n\t\t\t\t\tthis.logger,\n\t\t\t\t\tthis.epochTracker,\n\t\t\t\t),\n\t\t\t);\n\t\t\tthis.odspResolvedUrl.pendingRename = undefined;\n\t\t\tthis.odspResolvedUrl.fileName = renameResponse.name;\n\t\t}\n\n\t\treturn id;\n\t}\n\n\tprivate async getDelayLoadedSummaryManager(): Promise<OdspSummaryUploadManager> {\n\t\tassert(this.odspSummaryModuleLoaded === false, 0x56f /* Should be loaded only once */);\n\t\tconst module = await import(\n\t\t\t/* webpackChunkName: \"summaryModule\" */ \"./odspSummaryUploadManager.js\"\n\t\t)\n\t\t\t.then((m) => {\n\t\t\t\tthis.logger.sendTelemetryEvent({ eventName: \"SummaryModuleLoaded\" });\n\t\t\t\treturn m;\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tthis.logger.sendErrorEvent({ eventName: \"SummaryModuleLoadFailed\" }, error);\n\t\t\t\tthrow error;\n\t\t\t});\n\t\tthis.odspSummaryUploadManager = new module.OdspSummaryUploadManager(\n\t\t\tthis.odspResolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\tthis.getAuthHeader,\n\t\t\tthis.logger,\n\t\t\tthis.epochTracker,\n\t\t\tthis.relayServiceTenantAndSessionId,\n\t\t);\n\t\treturn this.odspSummaryUploadManager;\n\t}\n\n\tprivate checkSnapshotUrl(): void {\n\t\tif (!this.snapshotUrl) {\n\t\t\tthrow new NonRetryableError(\n\t\t\t\t\"Method failed because no snapshot url was available\",\n\t\t\t\tOdspErrorTypes.genericError,\n\t\t\t\t{ driverVersion },\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate checkAttachmentPOSTUrl(): void {\n\t\tif (!this.attachmentPOSTUrl) {\n\t\t\tthrow new NonRetryableError(\n\t\t\t\t\"Method failed because no attachment POST url was available\",\n\t\t\t\tOdspErrorTypes.genericError,\n\t\t\t\t{ driverVersion },\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate checkAttachmentGETUrl(): void {\n\t\tif (!this.attachmentGETUrl) {\n\t\t\tthrow new NonRetryableError(\n\t\t\t\t\"Method failed because no attachment GET url was available\",\n\t\t\t\tOdspErrorTypes.genericError,\n\t\t\t\t{ driverVersion },\n\t\t\t);\n\t\t}\n\t}\n\n\tprotected async fetchTreeFromSnapshot(\n\t\tid: string,\n\t\tscenarioName?: string,\n\t): Promise<ISnapshotTree | undefined> {\n\t\treturn getWithRetryForTokenRefresh(async (options) => {\n\t\t\tconst snapshotDownloader = async (url: string): Promise<IOdspResponse<unknown>> => {\n\t\t\t\tconst authHeader = await this.getAuthHeader(\n\t\t\t\t\t{ ...options, request: { url, method: \"GET\" } },\n\t\t\t\t\t\"ReadCommit\",\n\t\t\t\t);\n\t\t\t\tconst headers = getHeadersWithAuth(authHeader);\n\t\t\t\treturn this.epochTracker.fetchAndParseAsJSON(\n\t\t\t\t\turl,\n\t\t\t\t\t{ headers },\n\t\t\t\t\t\"snapshotTree\",\n\t\t\t\t\tundefined,\n\t\t\t\t\tscenarioName,\n\t\t\t\t);\n\t\t\t};\n\t\t\tconst snapshot = await fetchSnapshot(\n\t\t\t\tthis.snapshotUrl!,\n\t\t\t\tid,\n\t\t\t\tthis.fetchFullSnapshot,\n\t\t\t\t!!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,\n\t\t\t\tthis.logger,\n\t\t\t\tsnapshotDownloader,\n\t\t\t);\n\t\t\tlet treeId = \"\";\n\t\t\tif (snapshot.snapshotTree) {\n\t\t\t\tassert(\n\t\t\t\t\tsnapshot.snapshotTree.id !== undefined,\n\t\t\t\t\t0x222 /* \"Root tree should contain the id!!\" */,\n\t\t\t\t);\n\t\t\t\ttreeId = snapshot.snapshotTree.id;\n\t\t\t\tthis.setRootTree(treeId, snapshot.snapshotTree);\n\t\t\t}\n\t\t\tif (snapshot.blobContents) {\n\t\t\t\tthis.initBlobsCache(snapshot.blobContents);\n\t\t\t}\n\t\t\t// If the version id doesn't match with the id of the tree, then use the id of first tree which in that case\n\t\t\t// will be the actual id of tree to be fetched.\n\t\t\treturn this.commitCache.get(id) ?? this.commitCache.get(treeId);\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"file":"odspDocumentStorageManager.js","sourceRoot":"","sources":["../src/odspDocumentStorageManager.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 { performanceNow } from \"@fluid-internal/client-utils\";\nimport { LogLevel } from \"@fluidframework/core-interfaces\";\nimport { assert, delay } from \"@fluidframework/core-utils/internal\";\nimport { promiseRaceWithWinner } from \"@fluidframework/driver-base/internal\";\nimport type { ISummaryTree } from \"@fluidframework/driver-definitions\";\nimport {\n\tFetchSource,\n\ttype ISnapshot,\n\ttype ISnapshotFetchOptions,\n\ttype ISummaryContext,\n\ttype ICreateBlobResponse,\n\ttype IVersion,\n\ttype ISnapshotTree,\n} from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tgetKeyForCacheEntry,\n\tNonRetryableError,\n\tRateLimiter,\n} from \"@fluidframework/driver-utils/internal\";\nimport {\n\ttype IOdspResolvedUrl,\n\ttype ISnapshotOptions,\n\ttype InstrumentedStorageTokenFetcher,\n\tOdspErrorTypes,\n} from \"@fluidframework/odsp-driver-definitions/internal\";\nimport {\n\ttype ITelemetryLoggerExt,\n\tPerformanceEvent,\n\tgenerateStack,\n\tloggerToMonitoringContext,\n\tnormalizeError,\n\toverwriteStack,\n\ttype IConfigProvider,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport type {\n\tHostStoragePolicyInternal,\n\tIDocumentStorageGetVersionsResponse,\n\t// eslint-disable-next-line import-x/no-deprecated\n\tISnapshotCachedEntry,\n\tISnapshotCachedEntry2,\n\tIVersionedValueWithEpoch,\n} from \"./contracts.js\";\nimport { useCreateNewModule } from \"./createFile/index.js\";\nimport type { EpochTracker } from \"./epochTracker.js\";\nimport {\n\ttype ISnapshotRequestAndResponseOptions,\n\ttype SnapshotFormatSupportType,\n\tdownloadSnapshot,\n\tgetTreeStats,\n\tfetchSnapshot,\n\tfetchSnapshotWithRedeem,\n} from \"./fetchSnapshot.js\";\nimport { getHeadersWithAuth } from \"./getUrlAndHeadersWithAuth.js\";\nimport type { IOdspCache, IPrefetchSnapshotContents } from \"./odspCache.js\";\nimport type { FlushResult } from \"./odspDocumentDeltaConnection.js\";\nimport { OdspDocumentStorageServiceBase } from \"./odspDocumentStorageServiceBase.js\";\nimport type { OdspSummaryUploadManager } from \"./odspSummaryUploadManager.js\";\nimport {\n\ttype IOdspResponse,\n\tcreateCacheSnapshotKey,\n\tgetWithRetryForTokenRefresh,\n\tisInstanceOfISnapshot,\n\tisSnapshotFetchForLoadingGroup,\n\tsnapshotWithLoadingGroupIdSupported,\n\tuseLegacyFlowWithoutGroupsForSnapshotFetch,\n\ttype TokenFetchOptionsEx,\n} from \"./odspUtils.js\";\nimport { pkgVersion as driverVersion } from \"./packageVersion.js\";\n\nexport const defaultSummarizerCacheExpiryTimeout: number = 60 * 1000; // 60 seconds.\n\ninterface GetVersionsTelemetryProps {\n\tcacheEntryAge?: number;\n\tcacheSummarizerExpired?: boolean;\n}\n\nexport class OdspDocumentStorageService extends OdspDocumentStorageServiceBase {\n\tprivate odspSummaryModuleLoaded: boolean = false;\n\tprivate summaryModuleP: Promise<OdspSummaryUploadManager> | undefined;\n\tprivate odspSummaryUploadManager: OdspSummaryUploadManager | undefined;\n\n\tprivate firstSnapshotFetchCall = true;\n\tprivate _isFirstSnapshotFromNetwork: boolean | undefined;\n\tprivate readonly documentId: string;\n\tprivate readonly snapshotUrl: string | undefined;\n\tprivate readonly attachmentPOSTUrl: string | undefined;\n\tprivate readonly attachmentGETUrl: string | undefined;\n\tprivate readonly config: IConfigProvider;\n\t// Driver specified limits for snapshot size and time.\n\t/**\n\t * NOTE: While commit cfff6e3 added restrictions to prevent large payloads, snapshot failures will continue to\n\t * happen until blob request throttling is implemented. Until then, as a temporary fix we set arbitrarily large\n\t * snapshot size and timeout limits so that such failures are unlikely to occur.\n\t */\n\tprivate readonly maxSnapshotSizeLimit = 500000000; // 500 MB\n\tprivate readonly maxSnapshotFetchTimeout = 120000; // 2 min\n\n\t// limits the amount of parallel \"attachment\" blob uploads\n\tprivate readonly createBlobRateLimiter = new RateLimiter(1);\n\n\tconstructor(\n\t\tprivate readonly odspResolvedUrl: IOdspResolvedUrl,\n\t\tprivate readonly getAuthHeader: InstrumentedStorageTokenFetcher,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tprivate readonly fetchFullSnapshot: boolean,\n\t\tprivate readonly cache: IOdspCache,\n\t\tprivate readonly hostPolicy: HostStoragePolicyInternal,\n\t\tprivate readonly epochTracker: EpochTracker,\n\t\tprivate readonly flushCallback: () => Promise<FlushResult>,\n\t\tprivate readonly relayServiceTenantAndSessionId: () => string | undefined,\n\t\tprivate readonly snapshotFormatFetchType?: SnapshotFormatSupportType,\n\t) {\n\t\tsuper(loggerToMonitoringContext(logger).config);\n\n\t\tthis.documentId = this.odspResolvedUrl.hashedDocumentId;\n\t\tthis.snapshotUrl = this.odspResolvedUrl.endpoints.snapshotStorageUrl;\n\t\tthis.attachmentPOSTUrl = this.odspResolvedUrl.endpoints.attachmentPOSTStorageUrl;\n\t\tthis.attachmentGETUrl = this.odspResolvedUrl.endpoints.attachmentGETStorageUrl;\n\t\tthis.config = loggerToMonitoringContext(logger).config;\n\t}\n\n\tpublic get isFirstSnapshotFromNetwork(): boolean | undefined {\n\t\treturn this._isFirstSnapshotFromNetwork;\n\t}\n\n\tpublic async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n\t\tthis.checkAttachmentPOSTUrl();\n\n\t\tconst response = await getWithRetryForTokenRefresh(async (options) => {\n\t\t\tconst url = `${this.attachmentPOSTUrl}/content`;\n\t\t\tconst method = \"POST\";\n\t\t\tconst authHeader = await this.getAuthHeader(\n\t\t\t\t{ ...options, request: { url, method } },\n\t\t\t\t\"CreateBlob\",\n\t\t\t);\n\t\t\tconst headers = getHeadersWithAuth(authHeader);\n\t\t\theaders[\"Content-Type\"] = \"application/octet-stream\";\n\t\t\tif (this.config.getBoolean(\"Fluid.Driver.Odsp.enableLargeBlobUpload\")) {\n\t\t\t\t// Enable the large blob upload feature\n\t\t\t\theaders.Prefer = \"Increase-Attachment-Size-Limit\";\n\t\t\t}\n\n\t\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\t\tthis.logger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"createBlob\",\n\t\t\t\t\tsize: file.byteLength,\n\t\t\t\t\twaitQueueLength: this.createBlobRateLimiter.waitQueueLength,\n\t\t\t\t},\n\t\t\t\tasync (event) => {\n\t\t\t\t\tconst res = await this.createBlobRateLimiter.schedule(async () =>\n\t\t\t\t\t\tthis.epochTracker.fetchAndParseAsJSON<ICreateBlobResponse>(\n\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbody: file,\n\t\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"createBlob\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tevent.end({\n\t\t\t\t\t\tblobId: res.content.id,\n\t\t\t\t\t\t...res.propsToLog,\n\t\t\t\t\t});\n\t\t\t\t\treturn res;\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\n\t\treturn response.content;\n\t}\n\n\tprotected async fetchBlobFromStorage(\n\t\tblobId: string,\n\t\tevicted: boolean,\n\t): Promise<ArrayBuffer> {\n\t\tthis.checkAttachmentGETUrl();\n\n\t\tconst blob = await getWithRetryForTokenRefresh(async (options) => {\n\t\t\tconst url = `${this.attachmentGETUrl}/${encodeURIComponent(blobId)}/content`;\n\t\t\tconst method = \"GET\";\n\t\t\tconst authHeader = await this.getAuthHeader(\n\t\t\t\t{ ...options, request: { url, method } },\n\t\t\t\t\"GetBlob\",\n\t\t\t);\n\t\t\tconst headers = getHeadersWithAuth(authHeader);\n\n\t\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\t\tthis.logger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"readDataBlob\",\n\t\t\t\t\tblobId,\n\t\t\t\t\tevicted,\n\t\t\t\t\twaitQueueLength: this.epochTracker.rateLimiter.waitQueueLength,\n\t\t\t\t},\n\t\t\t\tasync (event) => {\n\t\t\t\t\tconst res = await this.epochTracker.fetchArray(url, { headers }, \"blob\");\n\t\t\t\t\tevent.end({\n\t\t\t\t\t\twaitQueueLength: this.epochTracker.rateLimiter.waitQueueLength,\n\t\t\t\t\t\t...res.propsToLog,\n\t\t\t\t\t\tattempts: options.refresh ? 2 : 1,\n\t\t\t\t\t});\n\t\t\t\t\tconst cacheControl = res.headers.get(\"cache-control\");\n\t\t\t\t\tif (\n\t\t\t\t\t\tcacheControl === undefined ||\n\t\t\t\t\t\t!(cacheControl.includes(\"private\") || cacheControl.includes(\"public\"))\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\t\t\t\teventName: \"NonCacheableBlob\",\n\t\t\t\t\t\t\tcacheControl,\n\t\t\t\t\t\t\tblobId,\n\t\t\t\t\t\t\t...res.propsToLog,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn res.content;\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t\tthis.blobCache.setBlob(blobId, blob);\n\t\treturn blob;\n\t}\n\n\tpublic async getSnapshotTree(\n\t\tversion?: IVersion,\n\t\tscenarioName?: string,\n\t\t// eslint-disable-next-line @rushstack/no-new-null\n\t): Promise<ISnapshotTree | null> {\n\t\tif (!this.snapshotUrl) {\n\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\treturn null;\n\t\t}\n\t\treturn super.getSnapshotTree(version, scenarioName);\n\t}\n\n\t/**\n\t * Fetches and returns the snapshot. If no loadingGroupIds or empty loadingGroupIds is provided, then snapshot for all\n\t * ungrouped data will be provided.\n\t * @param snapshotFetchOptions - fetch options for snapshot.\n\t */\n\tpublic async getSnapshot(snapshotFetchOptions?: ISnapshotFetchOptions): Promise<ISnapshot> {\n\t\t// Don't consult cache if request is not for a particular loading group.\n\t\tconst { snapshot } = await this.fetchSnapshot({\n\t\t\t...snapshotFetchOptions,\n\t\t\tfetchSource: isSnapshotFetchForLoadingGroup(snapshotFetchOptions?.loadingGroupIds)\n\t\t\t\t? FetchSource.noCache\n\t\t\t\t: snapshotFetchOptions?.fetchSource,\n\t\t\tloadingGroupIds: snapshotFetchOptions?.loadingGroupIds ?? [],\n\t\t});\n\n\t\treturn {\n\t\t\t...snapshot,\n\t\t\tsnapshotTree: this.combineProtocolAndAppSnapshotTree(snapshot.snapshotTree),\n\t\t};\n\t}\n\n\tprivate async fetchSnapshot(\n\t\tsnapshotFetchOptions: ISnapshotFetchOptions,\n\t): Promise<{ snapshot: ISnapshot; id: string | undefined }> {\n\t\tconst hostSnapshotOptions = this.hostPolicy.snapshotOptions;\n\t\tconst odspSnapshotCacheValue: ISnapshot = await PerformanceEvent.timedExecAsync(\n\t\t\tthis.logger,\n\t\t\t{\n\t\t\t\teventName: isSnapshotFetchForLoadingGroup(snapshotFetchOptions.loadingGroupIds)\n\t\t\t\t\t? \"ObtainSnapshotForGroup\"\n\t\t\t\t\t: \"ObtainSnapshot\",\n\t\t\t\tfetchSource: snapshotFetchOptions?.fetchSource,\n\t\t\t},\n\t\t\tasync (event: PerformanceEvent) => {\n\t\t\t\tconst props: GetVersionsTelemetryProps = {};\n\t\t\t\tlet cacheLookupTimeInSerialFetch = 0;\n\t\t\t\tlet retrievedSnapshot: ISnapshot | IPrefetchSnapshotContents | undefined;\n\n\t\t\t\tlet method: string;\n\t\t\t\tlet prefetchWaitStartTime: number = performanceNow();\n\t\t\t\tif (snapshotFetchOptions.fetchSource === FetchSource.noCache) {\n\t\t\t\t\tretrievedSnapshot = await this.fetchSnapshotFromNetwork(\n\t\t\t\t\t\thostSnapshotOptions,\n\t\t\t\t\t\tsnapshotFetchOptions.loadingGroupIds,\n\t\t\t\t\t\tsnapshotFetchOptions.scenarioName,\n\t\t\t\t\t);\n\t\t\t\t\tmethod = \"networkOnly\";\n\t\t\t\t} else {\n\t\t\t\t\t// Here's the logic to grab the persistent cache snapshot implemented by the host\n\t\t\t\t\t// Epoch tracker is responsible for communicating with the persistent cache, handling epochs and cache versions\n\t\t\t\t\tconst cachedSnapshotP: Promise<ISnapshot | undefined> = this.epochTracker\n\t\t\t\t\t\t.get(\n\t\t\t\t\t\t\tcreateCacheSnapshotKey(\n\t\t\t\t\t\t\t\tthis.odspResolvedUrl,\n\t\t\t\t\t\t\t\tsnapshotWithLoadingGroupIdSupported(this.config),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.then(\n\t\t\t\t\t\t\tasync (\n\t\t\t\t\t\t\t\t// eslint-disable-next-line import-x/no-deprecated\n\t\t\t\t\t\t\t\tsnapshotCachedEntry: ISnapshotCachedEntry | ISnapshotCachedEntry2,\n\t\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\t\tif (snapshotCachedEntry !== undefined) {\n\t\t\t\t\t\t\t\t\t// If the cached entry does not contain the entry time, then assign it a default of 30 days old.\n\t\t\t\t\t\t\t\t\tconst age =\n\t\t\t\t\t\t\t\t\t\tDate.now() -\n\t\t\t\t\t\t\t\t\t\t(snapshotCachedEntry.cacheEntryTime ??\n\t\t\t\t\t\t\t\t\t\t\tDate.now() - 30 * 24 * 60 * 60 * 1000);\n\n\t\t\t\t\t\t\t\t\t// In order to decrease the number of times we have to execute a snapshot refresh,\n\t\t\t\t\t\t\t\t\t// if this is the summarizer and we have a cache entry but it is past the defaultSummarizerCacheExpiryTimeout,\n\t\t\t\t\t\t\t\t\t// force the network retrieval instead as there might be a more recent snapshot available.\n\t\t\t\t\t\t\t\t\t// See: https://github.com/microsoft/FluidFramework/issues/8995 for additional information.\n\t\t\t\t\t\t\t\t\tif (this.hostPolicy.summarizerClient) {\n\t\t\t\t\t\t\t\t\t\tif (age > defaultSummarizerCacheExpiryTimeout) {\n\t\t\t\t\t\t\t\t\t\t\tprops.cacheSummarizerExpired = true;\n\t\t\t\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tprops.cacheSummarizerExpired = false;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Record the cache age\n\t\t\t\t\t\t\t\t\tprops.cacheEntryAge = age;\n\t\t\t\t\t\t\t\t\t// Snapshot from cache could be in older format, so transform that before returning.\n\t\t\t\t\t\t\t\t\tif (isInstanceOfISnapshot(snapshotCachedEntry)) {\n\t\t\t\t\t\t\t\t\t\treturn snapshotCachedEntry;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tconst snapshot: ISnapshot = {\n\t\t\t\t\t\t\t\t\t\t\tsnapshotTree: snapshotCachedEntry.snapshotTree,\n\t\t\t\t\t\t\t\t\t\t\tblobContents: snapshotCachedEntry.blobs,\n\t\t\t\t\t\t\t\t\t\t\tops: snapshotCachedEntry.ops,\n\t\t\t\t\t\t\t\t\t\t\tlatestSequenceNumber: snapshotCachedEntry.latestSequenceNumber,\n\t\t\t\t\t\t\t\t\t\t\tsequenceNumber: snapshotCachedEntry.sequenceNumber,\n\t\t\t\t\t\t\t\t\t\t\tsnapshotFormatV: 1,\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\treturn snapshot;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t// Based on the concurrentSnapshotFetch policy:\n\t\t\t\t\t// Either retrieve both the network and cache snapshots concurrently and pick the first to return,\n\t\t\t\t\t// or grab the cache value and then the network value if the cache value returns undefined.\n\t\t\t\t\t// For summarizer which could call this during refreshing of summary parent, always use the cache\n\t\t\t\t\t// first. Also for other clients, if it is not critical path which is determined by firstSnapshotFetchCall,\n\t\t\t\t\t// then also check the cache first.\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.firstSnapshotFetchCall &&\n\t\t\t\t\t\tthis.hostPolicy.concurrentSnapshotFetch &&\n\t\t\t\t\t\t!this.hostPolicy.summarizerClient\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst networkSnapshotP = this.fetchSnapshotFromNetwork(\n\t\t\t\t\t\t\thostSnapshotOptions,\n\t\t\t\t\t\t\tsnapshotFetchOptions.loadingGroupIds,\n\t\t\t\t\t\t\tsnapshotFetchOptions.scenarioName,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// Ensure that failures on both paths are ignored initially.\n\t\t\t\t\t\t// I.e. if cache fails for some reason, we will proceed with network result.\n\t\t\t\t\t\t// And vice versa - if (for example) client is offline and network request fails first, we\n\t\t\t\t\t\t// do want to attempt to succeed with cached data!\n\t\t\t\t\t\tconst promiseRaceWinner = await promiseRaceWithWinner([\n\t\t\t\t\t\t\tcachedSnapshotP.catch(() => undefined),\n\t\t\t\t\t\t\tnetworkSnapshotP.catch(() => undefined),\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tretrievedSnapshot = promiseRaceWinner.value;\n\t\t\t\t\t\tmethod = promiseRaceWinner.index === 0 ? \"cache\" : \"network\";\n\n\t\t\t\t\t\tif (retrievedSnapshot === undefined) {\n\t\t\t\t\t\t\t// if network failed -> wait for cache ( then return network failure)\n\t\t\t\t\t\t\t// If cache returned empty or failed -> wait for network (success of failure)\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tif (promiseRaceWinner.index === 1) {\n\t\t\t\t\t\t\t\t\tretrievedSnapshot = await cachedSnapshotP;\n\t\t\t\t\t\t\t\t\tmethod = \"cache\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (retrievedSnapshot === undefined) {\n\t\t\t\t\t\t\t\t\tretrievedSnapshot = await networkSnapshotP;\n\t\t\t\t\t\t\t\t\tmethod = \"network\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\t\t\t// The call stacks of any errors thrown by cached snapshot or network snapshot aren't very useful:\n\t\t\t\t\t\t\t\t// they get truncated at this stack frame due to the promise race and how v8 tracks async stack traces--\n\t\t\t\t\t\t\t\t// see https://v8.dev/docs/stack-trace-api#async-stack-traces and the \"zero-cost async stack traces\" document\n\t\t\t\t\t\t\t\t// linked there. https://v8.dev/blog/fast-async#await-under-the-hood may also be helpful for context on internals.\n\t\t\t\t\t\t\t\t// Regenerating the stack at this level provides more information for logged errors.\n\t\t\t\t\t\t\t\t// Once FF uses an ES2021 target, we could convert the above promise race to use `Promise.any` + AggregateError and\n\t\t\t\t\t\t\t\t// get similar quality stacks with less hand-crafted code.\n\t\t\t\t\t\t\t\tconst innerStack = (error as Error).stack;\n\t\t\t\t\t\t\t\tconst normalizedError = normalizeError(error);\n\t\t\t\t\t\t\t\tnormalizedError.addTelemetryProperties({ innerStack });\n\n\t\t\t\t\t\t\t\tconst newStack = `<<STACK TRUNCATED: see innerStack property>> \\n${generateStack()}`;\n\t\t\t\t\t\t\t\toverwriteStack(normalizedError, newStack);\n\n\t\t\t\t\t\t\t\tthrow normalizedError;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Note: There's a race condition here - another caller may come past the undefined check\n\t\t\t\t\t\t// while the first caller is awaiting later async code in this block.\n\t\t\t\t\t\tconst startTime = performanceNow();\n\t\t\t\t\t\tretrievedSnapshot = await cachedSnapshotP;\n\t\t\t\t\t\tcacheLookupTimeInSerialFetch = performanceNow() - startTime;\n\t\t\t\t\t\tmethod = retrievedSnapshot === undefined ? \"network\" : \"cache\";\n\n\t\t\t\t\t\tif (retrievedSnapshot === undefined) {\n\t\t\t\t\t\t\tprefetchWaitStartTime = performanceNow();\n\t\t\t\t\t\t\tretrievedSnapshot = await this.fetchSnapshotFromNetwork(\n\t\t\t\t\t\t\t\thostSnapshotOptions,\n\t\t\t\t\t\t\t\tsnapshotFetchOptions.loadingGroupIds,\n\t\t\t\t\t\t\t\tsnapshotFetchOptions.scenarioName,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (method === \"network\") {\n\t\t\t\t\tprops.cacheEntryAge = undefined;\n\t\t\t\t}\n\t\t\t\tif (this.firstSnapshotFetchCall) {\n\t\t\t\t\tthis._isFirstSnapshotFromNetwork = method === \"cache\" ? false : true;\n\t\t\t\t}\n\t\t\t\tconst prefetchStartTime: number | undefined = (\n\t\t\t\t\tretrievedSnapshot as IPrefetchSnapshotContents\n\t\t\t\t).prefetchStartTime;\n\t\t\t\tevent.end({\n\t\t\t\t\t...props,\n\t\t\t\t\tmethod,\n\t\t\t\t\tfetchSnapshotForInitialLoad: this.firstSnapshotFetchCall,\n\t\t\t\t\tuseLegacyFlowWithoutGroups: useLegacyFlowWithoutGroupsForSnapshotFetch(\n\t\t\t\t\t\tsnapshotFetchOptions.loadingGroupIds,\n\t\t\t\t\t),\n\t\t\t\t\tavoidPrefetchSnapshotCache: this.hostPolicy.avoidPrefetchSnapshotCache,\n\t\t\t\t\t...getTreeStats(retrievedSnapshot),\n\t\t\t\t\tcacheLookupTimeInSerialFetch,\n\t\t\t\t\tprefetchSavedDuration:\n\t\t\t\t\t\tprefetchStartTime !== undefined && method !== \"cache\"\n\t\t\t\t\t\t\t? prefetchWaitStartTime - prefetchStartTime\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t});\n\t\t\t\treturn retrievedSnapshot;\n\t\t\t},\n\t\t);\n\n\t\tconst stTime = performanceNow();\n\t\t// Don't override ops which were fetched during initial load, since we could still need them.\n\t\tconst id = this.initializeFromSnapshot(\n\t\t\todspSnapshotCacheValue,\n\t\t\tthis.firstSnapshotFetchCall,\n\t\t\tsnapshotFetchOptions?.cacheSnapshot ?? this.firstSnapshotFetchCall,\n\t\t);\n\t\tthis.logger.sendTelemetryEvent(\n\t\t\t{\n\t\t\t\teventName: \"SnapshotInitializeTime\",\n\t\t\t\tduration: performanceNow() - stTime,\n\t\t\t},\n\t\t\tundefined,\n\t\t\tLogLevel.verbose,\n\t\t);\n\t\tthis.firstSnapshotFetchCall = false;\n\n\t\treturn { snapshot: odspSnapshotCacheValue, id };\n\t}\n\n\tpublic async getVersions(\n\t\t// eslint-disable-next-line @rushstack/no-new-null\n\t\tblobid: string | null,\n\t\tcount: number,\n\t\tscenarioName?: string,\n\t\tfetchSource?: FetchSource,\n\t): Promise<IVersion[]> {\n\t\t// Regular load workflow uses blobId === documentID to indicate \"latest\".\n\t\tif (blobid !== this.documentId && blobid) {\n\t\t\t// FluidFetch & FluidDebugger tools use empty sting to query for versions\n\t\t\t// In such case we need to make a call against SPO to give full picture to the tool.\n\t\t\t// Otherwise, each commit calls getVersions but odsp doesn't have a history for each commit\n\t\t\t// return the blobid as is\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: blobid,\n\t\t\t\t\ttreeId: undefined!,\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\n\t\t// Can't really make a call if we do not have URL\n\t\tif (!this.snapshotUrl) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// If count is one, we can use the trees/latest API, which returns the latest version and trees in a single request for better performance\n\t\tif (count === 1 && (blobid === null || blobid === this.documentId)) {\n\t\t\tconst { id } = await this.fetchSnapshot({\n\t\t\t\tcacheSnapshot: true,\n\t\t\t\tscenarioName,\n\t\t\t\tversionId: blobid ?? undefined,\n\t\t\t\tfetchSource,\n\t\t\t});\n\t\t\treturn id ? [{ id, treeId: undefined! }] : [];\n\t\t}\n\n\t\treturn getWithRetryForTokenRefresh(async (options) => {\n\t\t\tconst url = `${this.snapshotUrl}/versions?top=${count}`;\n\t\t\tconst method = \"GET\";\n\t\t\tconst storageToken = await this.getAuthHeader(\n\t\t\t\t{ ...options, request: { url, method } },\n\t\t\t\t\"GetVersions\",\n\t\t\t);\n\t\t\tconst headers = getHeadersWithAuth(storageToken);\n\n\t\t\t// Fetch the latest snapshot versions for the document\n\t\t\tconst response = await PerformanceEvent.timedExecAsync(\n\t\t\t\tthis.logger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"getVersions\",\n\t\t\t\t},\n\t\t\t\tasync () =>\n\t\t\t\t\tthis.epochTracker.fetchAndParseAsJSON<IDocumentStorageGetVersionsResponse>(\n\t\t\t\t\t\turl,\n\t\t\t\t\t\t{ headers },\n\t\t\t\t\t\t\"versions\",\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tscenarioName,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tconst versionsResponse = response.content;\n\t\t\tif (!versionsResponse) {\n\t\t\t\tthrow new NonRetryableError(\n\t\t\t\t\t\"No response from /versions endpoint\",\n\t\t\t\t\tOdspErrorTypes.genericNetworkError,\n\t\t\t\t\t{ driverVersion },\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!Array.isArray(versionsResponse.value)) {\n\t\t\t\tthrow new NonRetryableError(\n\t\t\t\t\t\"Incorrect response from /versions endpoint, expected an array\",\n\t\t\t\t\tOdspErrorTypes.genericNetworkError,\n\t\t\t\t\t{ driverVersion },\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn versionsResponse.value.map((version) => {\n\t\t\t\treturn {\n\t\t\t\t\tid: version.id,\n\t\t\t\t\ttreeId: undefined!,\n\t\t\t\t};\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async fetchSnapshotFromNetwork(\n\t\thostSnapshotOptions: ISnapshotOptions | undefined,\n\t\tloadingGroupIds: string[] | undefined,\n\t\tscenarioName?: string,\n\t): Promise<ISnapshot | IPrefetchSnapshotContents> {\n\t\treturn this.fetchSnapshotFromNetworkCore(\n\t\t\thostSnapshotOptions,\n\t\t\tloadingGroupIds,\n\t\t\tscenarioName,\n\t\t).catch((error) => {\n\t\t\t// Issue #5895:\n\t\t\t// If we are offline, this error is retryable. But that means that RetriableDocumentStorageService\n\t\t\t// will run in circles calling getSnapshotTree, which would result in OdspDocumentStorageService class\n\t\t\t// going getVersions / individual blob download path. This path is very slow, and will not work with\n\t\t\t// delay-loaded data stores and ODSP storage deleting old snapshots and blobs.\n\t\t\tif (typeof error === \"object\" && error !== null) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\terror.canRetry = false;\n\t\t\t}\n\t\t\tthrow error;\n\t\t});\n\t}\n\n\tprivate async fetchSnapshotFromNetworkCore(\n\t\thostSnapshotOptions: ISnapshotOptions | undefined,\n\t\tloadingGroupIds: string[] | undefined,\n\t\tscenarioName?: string,\n\t): Promise<ISnapshot | IPrefetchSnapshotContents> {\n\t\t// Don't look into cache, if the host specifically tells us so. Also, if request is\n\t\t// for initial snapshot, don't consult the prefetch cache.\n\t\tif (!this.hostPolicy.avoidPrefetchSnapshotCache && this.firstSnapshotFetchCall) {\n\t\t\tconst prefetchCacheKey = getKeyForCacheEntry(\n\t\t\t\tcreateCacheSnapshotKey(\n\t\t\t\t\tthis.odspResolvedUrl,\n\t\t\t\t\tsnapshotWithLoadingGroupIdSupported(this.config),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst result = await this.cache.snapshotPrefetchResultCache\n\t\t\t\t?.get(prefetchCacheKey)\n\t\t\t\t?.then(async (response) => {\n\t\t\t\t\t// Remove it from cache once used.\n\t\t\t\t\tthis.cache.snapshotPrefetchResultCache.remove(prefetchCacheKey);\n\t\t\t\t\t// Validate the epoch from the prefetched snapshot result.\n\t\t\t\t\tawait this.epochTracker.validateEpoch(response.fluidEpoch, \"treesLatest\");\n\t\t\t\t\treturn response;\n\t\t\t\t})\n\t\t\t\t.catch(async (error) => {\n\t\t\t\t\tthis.logger.sendTelemetryEvent(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\teventName: \"PrefetchSnapshotError\",\n\t\t\t\t\t\t\tconcurrentSnapshotFetch: this.hostPolicy.concurrentSnapshotFetch,\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t\treturn undefined;\n\t\t\t\t});\n\t\t\t// If the prefetch call, is successful, then return the contents otherwise as backup for now, just\n\t\t\t// proceed with the old snapshot fetch flow.\n\t\t\tif (result !== undefined) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\tconst snapshotOptions: ISnapshotOptions = {\n\t\t\tmds: this.maxSnapshotSizeLimit,\n\t\t\t...hostSnapshotOptions,\n\t\t\ttimeout: hostSnapshotOptions?.timeout\n\t\t\t\t? Math.min(hostSnapshotOptions.timeout, this.maxSnapshotFetchTimeout)\n\t\t\t\t: this.maxSnapshotFetchTimeout,\n\t\t};\n\n\t\t// No limit on size of snapshot or time to fetch, as otherwise we fail all clients to summarize\n\t\tif (this.hostPolicy.summarizerClient) {\n\t\t\tsnapshotOptions.mds = undefined;\n\t\t\tsnapshotOptions.timeout = undefined;\n\t\t}\n\n\t\tconst snapshotDownloader = async (\n\t\t\tfinalOdspResolvedUrl: IOdspResolvedUrl,\n\t\t\ttokenFetcher: InstrumentedStorageTokenFetcher,\n\t\t\ttokenFetchOptions: TokenFetchOptionsEx,\n\t\t\tloadingGroupId: string[] | undefined,\n\t\t\toptions: ISnapshotOptions | undefined,\n\t\t\tcontroller?: AbortController,\n\t\t): Promise<ISnapshotRequestAndResponseOptions> => {\n\t\t\treturn downloadSnapshot(\n\t\t\t\tfinalOdspResolvedUrl,\n\t\t\t\ttokenFetcher,\n\t\t\t\ttokenFetchOptions,\n\t\t\t\tloadingGroupId,\n\t\t\t\toptions,\n\t\t\t\tthis.logger,\n\t\t\t\tthis.snapshotFormatFetchType,\n\t\t\t\tcontroller,\n\t\t\t\tthis.epochTracker,\n\t\t\t\tscenarioName,\n\t\t\t);\n\t\t};\n\t\tconst putInCache = async (valueWithEpoch: IVersionedValueWithEpoch): Promise<void> => {\n\t\t\treturn this.cache.persistedCache.put(\n\t\t\t\tcreateCacheSnapshotKey(\n\t\t\t\t\tthis.odspResolvedUrl,\n\t\t\t\t\tsnapshotWithLoadingGroupIdSupported(this.config),\n\t\t\t\t),\n\t\t\t\t// Epoch tracker will add the epoch and version to the value here. So just send value to cache.\n\t\t\t\tvalueWithEpoch.value,\n\t\t\t);\n\t\t};\n\t\tconst removeEntries = async (): Promise<void> => this.cache.persistedCache.removeEntries();\n\t\ttry {\n\t\t\tconst odspSnapshot = await fetchSnapshotWithRedeem(\n\t\t\t\tthis.odspResolvedUrl,\n\t\t\t\tthis.getAuthHeader,\n\t\t\t\tsnapshotOptions,\n\t\t\t\t!!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,\n\t\t\t\tthis.logger,\n\t\t\t\tsnapshotDownloader,\n\t\t\t\tputInCache,\n\t\t\t\tremoveEntries,\n\t\t\t\tloadingGroupIds,\n\t\t\t\tthis.hostPolicy.enableRedeemFallback,\n\t\t\t);\n\t\t\treturn odspSnapshot;\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t} catch (error: any) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n\t\t\tconst errorType = error.errorType;\n\t\t\t// If the snapshot size is too big and the host specified the size limitation(specified in hostSnapshotOptions), then don't try to fetch the snapshot again.\n\t\t\tif (\n\t\t\t\terrorType === OdspErrorTypes.snapshotTooBig &&\n\t\t\t\thostSnapshotOptions?.mds !== undefined &&\n\t\t\t\tthis.hostPolicy.summarizerClient !== true\n\t\t\t) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\t// If the first snapshot request was with blobs and we either timed out or the size was too big, then try to fetch without blobs.\n\t\t\tif (\n\t\t\t\t(errorType === OdspErrorTypes.snapshotTooBig ||\n\t\t\t\t\terrorType === OdspErrorTypes.fetchTimeout) &&\n\t\t\t\tsnapshotOptions.blobs\n\t\t\t) {\n\t\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\t\teventName: \"TreeLatest_SecondCall\",\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\terrorType,\n\t\t\t\t});\n\t\t\t\tconst snapshotOptionsWithoutBlobs: ISnapshotOptions = {\n\t\t\t\t\t...snapshotOptions,\n\t\t\t\t\tblobs: 0,\n\t\t\t\t\tmds: undefined,\n\t\t\t\t\ttimeout: undefined,\n\t\t\t\t};\n\t\t\t\tconst odspSnapshot = await fetchSnapshotWithRedeem(\n\t\t\t\t\tthis.odspResolvedUrl,\n\t\t\t\t\tthis.getAuthHeader,\n\t\t\t\t\tsnapshotOptionsWithoutBlobs,\n\t\t\t\t\t!!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,\n\t\t\t\t\tthis.logger,\n\t\t\t\t\tsnapshotDownloader,\n\t\t\t\t\tputInCache,\n\t\t\t\t\tremoveEntries,\n\t\t\t\t\tloadingGroupIds,\n\t\t\t\t\tthis.hostPolicy.enableRedeemFallback,\n\t\t\t\t);\n\t\t\t\treturn odspSnapshot;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic async uploadSummaryWithContext(\n\t\tsummary: ISummaryTree,\n\t\tcontext: ISummaryContext,\n\t): Promise<string> {\n\t\tthis.checkSnapshotUrl();\n\n\t\t// Set the module promise right away, so as to not call it twice.\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (this.summaryModuleP === undefined) {\n\t\t\tthis.summaryModuleP = this.getDelayLoadedSummaryManager();\n\t\t}\n\n\t\t// Enable flushing only if we have single commit summary and this is not the initial summary for an empty file\n\t\tif (\".protocol\" in summary.tree && context.ackHandle !== undefined) {\n\t\t\tlet retry = 1;\n\t\t\tfor (;;) {\n\t\t\t\tconst result = await this.flushCallback();\n\t\t\t\tconst seq = result.lastPersistedSequenceNumber;\n\t\t\t\tif (seq !== undefined && seq >= context.referenceSequenceNumber) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (retry > 3) {\n\t\t\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\t\t\teventName: \"FlushFailure\",\n\t\t\t\t\t\t...result,\n\t\t\t\t\t\tretry,\n\t\t\t\t\t\treferenceSequenceNumber: context.referenceSequenceNumber,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\teventName: \"FlushExtraCall\",\n\t\t\t\t\t...result,\n\t\t\t\t\tretry,\n\t\t\t\t\treferenceSequenceNumber: context.referenceSequenceNumber,\n\t\t\t\t});\n\n\t\t\t\tretry++;\n\t\t\t\tawait delay(1000 * (result.retryAfter ?? 1));\n\t\t\t}\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (!this.odspSummaryUploadManager) {\n\t\t\tthis.odspSummaryUploadManager = await this.summaryModuleP\n\t\t\t\t.then(async (m) => {\n\t\t\t\t\tthis.odspSummaryModuleLoaded = true;\n\t\t\t\t\treturn m;\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tthis.odspSummaryModuleLoaded = false;\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t}\n\n\t\tassert(\n\t\t\tthis.odspSummaryUploadManager !== undefined,\n\t\t\t0x56e /* summary upload manager should have been initialized */,\n\t\t);\n\t\tconst id = await this.odspSummaryUploadManager.writeSummaryTree(summary, context);\n\t\tconst { pendingRename } = this.odspResolvedUrl;\n\t\tif (\n\t\t\tpendingRename !== undefined &&\n\t\t\tthis.config.getBoolean(\"Fluid.Driver.Odsp.disablePendingRename\") !== true\n\t\t) {\n\t\t\t// This is a temporary file, so we need to rename it to remove the .tmp extension\n\t\t\t// This should only happen for the initial summary upload for a new file\n\t\t\tassert(\n\t\t\t\tcontext.ackHandle === undefined &&\n\t\t\t\t\tcontext.proposalHandle === undefined &&\n\t\t\t\t\tcontext.referenceSequenceNumber === 0,\n\t\t\t\t0xa88 /* temporaryFileName should only be set for new file creation in the empty file create flow */,\n\t\t\t);\n\n\t\t\tconst renameResponse = await useCreateNewModule(this.logger, async (m) =>\n\t\t\t\tm.renameEmptyFluidFile(\n\t\t\t\t\tthis.getAuthHeader,\n\t\t\t\t\tthis.odspResolvedUrl,\n\t\t\t\t\tpendingRename,\n\t\t\t\t\tthis.logger,\n\t\t\t\t\tthis.epochTracker,\n\t\t\t\t),\n\t\t\t);\n\t\t\tthis.odspResolvedUrl.pendingRename = undefined;\n\t\t\tthis.odspResolvedUrl.fileName = renameResponse.name;\n\t\t}\n\n\t\treturn id;\n\t}\n\n\tprivate async getDelayLoadedSummaryManager(): Promise<OdspSummaryUploadManager> {\n\t\tassert(this.odspSummaryModuleLoaded === false, 0x56f /* Should be loaded only once */);\n\t\tconst module = await import(\n\t\t\t/* webpackChunkName: \"summaryModule\" */ \"./odspSummaryUploadManager.js\"\n\t\t)\n\t\t\t.then((m) => {\n\t\t\t\tthis.logger.sendTelemetryEvent({ eventName: \"SummaryModuleLoaded\" });\n\t\t\t\treturn m;\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tthis.logger.sendErrorEvent({ eventName: \"SummaryModuleLoadFailed\" }, error);\n\t\t\t\tthrow error;\n\t\t\t});\n\t\tthis.odspSummaryUploadManager = new module.OdspSummaryUploadManager(\n\t\t\tthis.odspResolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\tthis.getAuthHeader,\n\t\t\tthis.logger,\n\t\t\tthis.epochTracker,\n\t\t\tthis.relayServiceTenantAndSessionId,\n\t\t);\n\t\treturn this.odspSummaryUploadManager;\n\t}\n\n\tprivate checkSnapshotUrl(): void {\n\t\tif (!this.snapshotUrl) {\n\t\t\tthrow new NonRetryableError(\n\t\t\t\t\"Method failed because no snapshot url was available\",\n\t\t\t\tOdspErrorTypes.genericError,\n\t\t\t\t{ driverVersion },\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate checkAttachmentPOSTUrl(): void {\n\t\tif (!this.attachmentPOSTUrl) {\n\t\t\tthrow new NonRetryableError(\n\t\t\t\t\"Method failed because no attachment POST url was available\",\n\t\t\t\tOdspErrorTypes.genericError,\n\t\t\t\t{ driverVersion },\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate checkAttachmentGETUrl(): void {\n\t\tif (!this.attachmentGETUrl) {\n\t\t\tthrow new NonRetryableError(\n\t\t\t\t\"Method failed because no attachment GET url was available\",\n\t\t\t\tOdspErrorTypes.genericError,\n\t\t\t\t{ driverVersion },\n\t\t\t);\n\t\t}\n\t}\n\n\tprotected async fetchTreeFromSnapshot(\n\t\tid: string,\n\t\tscenarioName?: string,\n\t): Promise<ISnapshotTree | undefined> {\n\t\treturn getWithRetryForTokenRefresh(async (options) => {\n\t\t\tconst snapshotDownloader = async (url: string): Promise<IOdspResponse<unknown>> => {\n\t\t\t\tconst authHeader = await this.getAuthHeader(\n\t\t\t\t\t{ ...options, request: { url, method: \"GET\" } },\n\t\t\t\t\t\"ReadCommit\",\n\t\t\t\t);\n\t\t\t\tconst headers = getHeadersWithAuth(authHeader);\n\t\t\t\treturn this.epochTracker.fetchAndParseAsJSON(\n\t\t\t\t\turl,\n\t\t\t\t\t{ headers },\n\t\t\t\t\t\"snapshotTree\",\n\t\t\t\t\tundefined,\n\t\t\t\t\tscenarioName,\n\t\t\t\t);\n\t\t\t};\n\t\t\tconst snapshot = await fetchSnapshot(\n\t\t\t\tthis.snapshotUrl!,\n\t\t\t\tid,\n\t\t\t\tthis.fetchFullSnapshot,\n\t\t\t\t!!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,\n\t\t\t\tthis.logger,\n\t\t\t\tsnapshotDownloader,\n\t\t\t);\n\t\t\tlet treeId = \"\";\n\t\t\tif (snapshot.snapshotTree) {\n\t\t\t\tassert(\n\t\t\t\t\tsnapshot.snapshotTree.id !== undefined,\n\t\t\t\t\t0x222 /* \"Root tree should contain the id!!\" */,\n\t\t\t\t);\n\t\t\t\ttreeId = snapshot.snapshotTree.id;\n\t\t\t\tthis.setRootTree(treeId, snapshot.snapshotTree);\n\t\t\t}\n\t\t\tif (snapshot.blobContents) {\n\t\t\t\tthis.initBlobsCache(snapshot.blobContents);\n\t\t\t}\n\t\t\t// If the version id doesn't match with the id of the tree, then use the id of first tree which in that case\n\t\t\t// will be the actual id of tree to be fetched.\n\t\t\treturn this.commitCache.get(id) ?? this.commitCache.get(treeId);\n\t\t});\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.93.0";
8
+ export declare const pkgVersion = "2.100.0";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,gCAAgC,CAAC;AACrD,eAAO,MAAM,UAAU,WAAW,CAAC"}
1
+ {"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,gCAAgC,CAAC;AACrD,eAAO,MAAM,UAAU,YAAY,CAAC"}
@@ -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.93.0";
8
+ export const pkgVersion = "2.100.0";
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,QAAQ,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.93.0\";\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,SAAS,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.100.0\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"prefetchLatestSnapshot.d.ts","sourceRoot":"","sources":["../src/prefetchLatestSnapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,OAAO,KAAK,EACX,eAAe,EACf,YAAY,EACZ,MAAM,6CAA6C,CAAC;AAErD,OAAO,KAAK,EAGX,gBAAgB,EAChB,6BAA6B,EAC7B,YAAY,EAEZ,MAAM,kDAAkD,CAAC;AAO1D,OAAO,EAEN,KAAK,yBAAyB,EAG9B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAUlF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,sBAAsB,CAC3C,WAAW,EAAE,YAAY,EACzB,eAAe,EAAE,YAAY,CAAC,6BAA6B,CAAC,EAC5D,cAAc,EAAE,eAAe,EAC/B,sCAAsC,EAAE,OAAO,EAC/C,MAAM,EAAE,oBAAoB,EAC5B,wBAAwB,EAAE,gBAAgB,GAAG,SAAS,EACtD,oBAAoB,GAAE,OAAc,EACpC,yBAAyB,CAAC,EAAE,OAAO,EACnC,uBAAuB,CAAC,EAAE,yBAAyB,EACnD,0BAA0B,CAAC,EAAE,0BAA0B,GACrD,OAAO,CAAC,OAAO,CAAC,CA6GlB"}
1
+ {"version":3,"file":"prefetchLatestSnapshot.d.ts","sourceRoot":"","sources":["../src/prefetchLatestSnapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,OAAO,KAAK,EACX,eAAe,EACf,YAAY,EACZ,MAAM,6CAA6C,CAAC;AAErD,OAAO,KAAK,EAGX,gBAAgB,EAChB,6BAA6B,EAC7B,YAAY,EAEZ,MAAM,kDAAkD,CAAC;AAO1D,OAAO,EAEN,KAAK,yBAAyB,EAG9B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAUlF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,sBAAsB,CAC3C,WAAW,EAAE,YAAY,EACzB,eAAe,EAAE,YAAY,CAAC,6BAA6B,CAAC,EAC5D,cAAc,EAAE,eAAe,EAC/B,sCAAsC,EAAE,OAAO,EAC/C,MAAM,EAAE,oBAAoB,EAC5B,wBAAwB,EAAE,gBAAgB,GAAG,SAAS,EACtD,oBAAoB,GAAE,OAAc,EACpC,yBAAyB,CAAC,EAAE,OAAO,EACnC,uBAAuB,CAAC,EAAE,yBAAyB,EACnD,0BAA0B,CAAC,EAAE,0BAA0B,GACrD,OAAO,CAAC,OAAO,CAAC,CA8GlB"}
@@ -46,7 +46,7 @@ export async function prefetchLatestSnapshot(resolvedUrl, getStorageToken, persi
46
46
  };
47
47
  const getAuthHeader = toInstrumentedOdspStorageTokenFetcher(odspLogger, resolvedUrlData, getStorageToken);
48
48
  const snapshotDownloader = async (finalOdspResolvedUrl, storageTokenFetcher, tokenFetchOptions, loadingGroupId, snapshotOptions, controller) => {
49
- return downloadSnapshot(finalOdspResolvedUrl, storageTokenFetcher, tokenFetchOptions, loadingGroupId, snapshotOptions, undefined, controller);
49
+ return downloadSnapshot(finalOdspResolvedUrl, storageTokenFetcher, tokenFetchOptions, loadingGroupId, snapshotOptions, odspLogger, undefined, controller);
50
50
  };
51
51
  const snapshotKey = createCacheSnapshotKey(odspResolvedUrl, useGroupIdsForSnapshotFetch);
52
52
  let cacheP;
@@ -88,7 +88,7 @@ export async function prefetchLatestSnapshot(resolvedUrl, getStorageToken, persi
88
88
  }, 5000);
89
89
  })
90
90
  .catch((error) => {
91
- // Remove it from the non persistent cache if an error occured.
91
+ // Remove it from the non persistent cache if an error occurred.
92
92
  snapshotNonPersistentCache?.remove(nonPersistentCacheKey);
93
93
  snapshotContentsWithEpochP.reject(error);
94
94
  throw error;
@@ -1 +1 @@
1
- {"version":3,"file":"prefetchLatestSnapshot.js","sourceRoot":"","sources":["../src/prefetchLatestSnapshot.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 { performanceNow } from \"@fluid-internal/client-utils\";\nimport type { ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\nimport { assert, Deferred } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tIPersistedCache,\n\tIResolvedUrl,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { getKeyForCacheEntry } from \"@fluidframework/driver-utils/internal\";\nimport type {\n\tIOdspResolvedUrl,\n\tIOdspUrlParts,\n\tISnapshotOptions,\n\tOdspResourceTokenFetchOptions,\n\tTokenFetcher,\n\tInstrumentedStorageTokenFetcher,\n} from \"@fluidframework/odsp-driver-definitions/internal\";\nimport {\n\tPerformanceEvent,\n\tcreateChildMonitoringContext,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport type { IVersionedValueWithEpoch } from \"./contracts.js\";\nimport {\n\ttype ISnapshotRequestAndResponseOptions,\n\ttype SnapshotFormatSupportType,\n\tdownloadSnapshot,\n\tfetchSnapshotWithRedeem,\n} from \"./fetchSnapshot.js\";\nimport type { IPrefetchSnapshotContents } from \"./odspCache.js\";\nimport type { OdspDocumentServiceFactory } from \"./odspDocumentServiceFactory.js\";\nimport {\n\tcreateCacheSnapshotKey,\n\tcreateOdspLogger,\n\tgetOdspResolvedUrl,\n\tsnapshotWithLoadingGroupIdSupported,\n\ttoInstrumentedOdspStorageTokenFetcher,\n\ttype TokenFetchOptionsEx,\n} from \"./odspUtils.js\";\n\n/**\n * Function to prefetch the snapshot and cached it in the persistant cache, so that when the container is loaded\n * the cached latest snapshot could be used and removes the network call from the critical path.\n *\n * @param resolvedUrl - Resolved url to fetch the snapshot.\n * @param getStorageToken - function that can provide the storage token for a given site. This is\n * is also referred to as the \"VROOM\" token in SPO.\n * @param persistedCache - Cache to store the fetched snapshot.\n * @param forceAccessTokenViaAuthorizationHeader - @deprecated Not used, true value always used instead. Whether to force passing given token via authorization header.\n * @param logger - Logger to have telemetry events.\n * @param hostSnapshotFetchOptions - Options to fetch the snapshot if any. Otherwise default will be used.\n * @param enableRedeemFallback - True to have the sharing link redeem fallback in case the Trees Latest/Redeem\n * 1RT call fails with redeem error. During fallback it will first redeem the sharing link and then make\n * the Trees latest call.\n * Note: this can be considered deprecated - it will be replaced with `snapshotFormatFetchType`.\n * @param fetchBinarySnapshotFormat - Control if we want to fetch binary format snapshot.\n * @param snapshotFormatFetchType - Snapshot format to fetch.\n * @param odspDocumentServiceFactory - factory to access the non persistent cache and store the prefetch promise.\n *\n * @returns `true` if the snapshot is cached, `false` otherwise.\n * @legacy\n * @beta\n */\nexport async function prefetchLatestSnapshot(\n\tresolvedUrl: IResolvedUrl,\n\tgetStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>,\n\tpersistedCache: IPersistedCache,\n\tforceAccessTokenViaAuthorizationHeader: boolean,\n\tlogger: ITelemetryBaseLogger,\n\thostSnapshotFetchOptions: ISnapshotOptions | undefined,\n\tenableRedeemFallback: boolean = true,\n\tfetchBinarySnapshotFormat?: boolean,\n\tsnapshotFormatFetchType?: SnapshotFormatSupportType,\n\todspDocumentServiceFactory?: OdspDocumentServiceFactory,\n): Promise<boolean> {\n\tconst mc = createChildMonitoringContext({ logger, namespace: \"PrefetchSnapshot\" });\n\tconst odspLogger = createOdspLogger(mc.logger);\n\tconst useGroupIdsForSnapshotFetch = snapshotWithLoadingGroupIdSupported(mc.config);\n\t// For prefetch, we just want to fetch the ungrouped data and want to use the new API if the\n\t// feature gate is set, so provide an empty array.\n\tconst loadingGroupIds = useGroupIdsForSnapshotFetch ? [] : undefined;\n\tconst odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\n\tconst resolvedUrlData: IOdspUrlParts = {\n\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\tdriveId: odspResolvedUrl.driveId,\n\t\titemId: odspResolvedUrl.itemId,\n\t};\n\tconst getAuthHeader = toInstrumentedOdspStorageTokenFetcher(\n\t\todspLogger,\n\t\tresolvedUrlData,\n\t\tgetStorageToken,\n\t);\n\n\tconst snapshotDownloader = async (\n\t\tfinalOdspResolvedUrl: IOdspResolvedUrl,\n\t\tstorageTokenFetcher: InstrumentedStorageTokenFetcher,\n\t\ttokenFetchOptions: TokenFetchOptionsEx,\n\t\tloadingGroupId: string[] | undefined,\n\t\tsnapshotOptions: ISnapshotOptions | undefined,\n\t\tcontroller?: AbortController,\n\t): Promise<ISnapshotRequestAndResponseOptions> => {\n\t\treturn downloadSnapshot(\n\t\t\tfinalOdspResolvedUrl,\n\t\t\tstorageTokenFetcher,\n\t\t\ttokenFetchOptions,\n\t\t\tloadingGroupId,\n\t\t\tsnapshotOptions,\n\t\t\tundefined,\n\t\t\tcontroller,\n\t\t);\n\t};\n\tconst snapshotKey = createCacheSnapshotKey(odspResolvedUrl, useGroupIdsForSnapshotFetch);\n\tlet cacheP: Promise<void> | undefined;\n\tlet snapshotEpoch: string | undefined;\n\tconst putInCache = async (valueWithEpoch: IVersionedValueWithEpoch): Promise<void> => {\n\t\tsnapshotEpoch = valueWithEpoch.fluidEpoch;\n\t\tcacheP = persistedCache.put(snapshotKey, valueWithEpoch);\n\t\treturn cacheP;\n\t};\n\n\tconst removeEntries = async (): Promise<void> =>\n\t\tpersistedCache.removeEntries(snapshotKey.file);\n\treturn PerformanceEvent.timedExecAsync(\n\t\todspLogger,\n\t\t{ eventName: \"PrefetchLatestSnapshot\" },\n\t\tasync () => {\n\t\t\tconst prefetchStartTime = performanceNow();\n\t\t\t// Add the deferred promise to the cache, so that it can be leveraged while loading the container.\n\t\t\tconst snapshotContentsWithEpochP = new Deferred<IPrefetchSnapshotContents>();\n\t\t\tconst nonPersistentCacheKey = getKeyForCacheEntry(snapshotKey);\n\t\t\tconst snapshotNonPersistentCache =\n\t\t\t\todspDocumentServiceFactory?.snapshotPrefetchResultCache;\n\t\t\tsnapshotNonPersistentCache?.add(\n\t\t\t\tnonPersistentCacheKey,\n\t\t\t\tasync () => snapshotContentsWithEpochP.promise,\n\t\t\t);\n\t\t\tawait fetchSnapshotWithRedeem(\n\t\t\t\todspResolvedUrl,\n\t\t\t\tgetAuthHeader,\n\t\t\t\thostSnapshotFetchOptions,\n\t\t\t\tforceAccessTokenViaAuthorizationHeader,\n\t\t\t\todspLogger,\n\t\t\t\tsnapshotDownloader,\n\t\t\t\tputInCache,\n\t\t\t\tremoveEntries,\n\t\t\t\tloadingGroupIds,\n\t\t\t\tenableRedeemFallback,\n\t\t\t)\n\t\t\t\t.then(async (value) => {\n\t\t\t\t\tassert(!!snapshotEpoch, 0x585 /* prefetched snapshot should have a valid epoch */);\n\t\t\t\t\tsnapshotContentsWithEpochP.resolve({\n\t\t\t\t\t\t...value,\n\t\t\t\t\t\tfluidEpoch: snapshotEpoch,\n\t\t\t\t\t\tprefetchStartTime,\n\t\t\t\t\t});\n\t\t\t\t\tassert(cacheP !== undefined, 0x1e7 /* \"caching was not performed!\" */);\n\t\t\t\t\tawait cacheP;\n\t\t\t\t\t// Schedule it to remove from cache after 5s.\n\t\t\t\t\t// 1. While it's in snapshotNonPersistentCache: Load flow will use this value and will not attempt\n\t\t\t\t\t// to fetch snapshot from network again. That's the best from perf POV, but cache will not be\n\t\t\t\t\t// updated if we keep it in this cache, thus we want to eventually remove snapshot from this cache.\n\t\t\t\t\t// 2. After it's removed from snapshotNonPersistentCache: snapshot is present in persistent cache,\n\t\t\t\t\t// so we sill still use it (in accordance with cache policy controlled by host). But load flow will\n\t\t\t\t\t// also fetch snapshot (in parallel) from storage and update cache. This is fine long term,\n\t\t\t\t\t// but is an extra cost (unneeded network call). However since it is 5s older, new network call\n\t\t\t\t\t// will update the snapshot in cache.\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tsnapshotNonPersistentCache?.remove(nonPersistentCacheKey);\n\t\t\t\t\t}, 5000);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\t// Remove it from the non persistent cache if an error occured.\n\t\t\t\t\tsnapshotNonPersistentCache?.remove(nonPersistentCacheKey);\n\t\t\t\t\tsnapshotContentsWithEpochP.reject(error);\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t\treturn true;\n\t\t},\n\t).catch(async (error) => {\n\t\todspLogger.sendErrorEvent({ eventName: \"PrefetchLatestSnapshotError\" }, error);\n\t\treturn false;\n\t});\n}\n"]}
1
+ {"version":3,"file":"prefetchLatestSnapshot.js","sourceRoot":"","sources":["../src/prefetchLatestSnapshot.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 { performanceNow } from \"@fluid-internal/client-utils\";\nimport type { ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\nimport { assert, Deferred } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tIPersistedCache,\n\tIResolvedUrl,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { getKeyForCacheEntry } from \"@fluidframework/driver-utils/internal\";\nimport type {\n\tIOdspResolvedUrl,\n\tIOdspUrlParts,\n\tISnapshotOptions,\n\tOdspResourceTokenFetchOptions,\n\tTokenFetcher,\n\tInstrumentedStorageTokenFetcher,\n} from \"@fluidframework/odsp-driver-definitions/internal\";\nimport {\n\tPerformanceEvent,\n\tcreateChildMonitoringContext,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport type { IVersionedValueWithEpoch } from \"./contracts.js\";\nimport {\n\ttype ISnapshotRequestAndResponseOptions,\n\ttype SnapshotFormatSupportType,\n\tdownloadSnapshot,\n\tfetchSnapshotWithRedeem,\n} from \"./fetchSnapshot.js\";\nimport type { IPrefetchSnapshotContents } from \"./odspCache.js\";\nimport type { OdspDocumentServiceFactory } from \"./odspDocumentServiceFactory.js\";\nimport {\n\tcreateCacheSnapshotKey,\n\tcreateOdspLogger,\n\tgetOdspResolvedUrl,\n\tsnapshotWithLoadingGroupIdSupported,\n\ttoInstrumentedOdspStorageTokenFetcher,\n\ttype TokenFetchOptionsEx,\n} from \"./odspUtils.js\";\n\n/**\n * Function to prefetch the snapshot and cached it in the persistant cache, so that when the container is loaded\n * the cached latest snapshot could be used and removes the network call from the critical path.\n *\n * @param resolvedUrl - Resolved url to fetch the snapshot.\n * @param getStorageToken - function that can provide the storage token for a given site. This is\n * is also referred to as the \"VROOM\" token in SPO.\n * @param persistedCache - Cache to store the fetched snapshot.\n * @param forceAccessTokenViaAuthorizationHeader - @deprecated Not used, true value always used instead. Whether to force passing given token via authorization header.\n * @param logger - Logger to have telemetry events.\n * @param hostSnapshotFetchOptions - Options to fetch the snapshot if any. Otherwise default will be used.\n * @param enableRedeemFallback - True to have the sharing link redeem fallback in case the Trees Latest/Redeem\n * 1RT call fails with redeem error. During fallback it will first redeem the sharing link and then make\n * the Trees latest call.\n * Note: this can be considered deprecated - it will be replaced with `snapshotFormatFetchType`.\n * @param fetchBinarySnapshotFormat - Control if we want to fetch binary format snapshot.\n * @param snapshotFormatFetchType - Snapshot format to fetch.\n * @param odspDocumentServiceFactory - factory to access the non persistent cache and store the prefetch promise.\n *\n * @returns `true` if the snapshot is cached, `false` otherwise.\n * @legacy\n * @beta\n */\nexport async function prefetchLatestSnapshot(\n\tresolvedUrl: IResolvedUrl,\n\tgetStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>,\n\tpersistedCache: IPersistedCache,\n\tforceAccessTokenViaAuthorizationHeader: boolean,\n\tlogger: ITelemetryBaseLogger,\n\thostSnapshotFetchOptions: ISnapshotOptions | undefined,\n\tenableRedeemFallback: boolean = true,\n\tfetchBinarySnapshotFormat?: boolean,\n\tsnapshotFormatFetchType?: SnapshotFormatSupportType,\n\todspDocumentServiceFactory?: OdspDocumentServiceFactory,\n): Promise<boolean> {\n\tconst mc = createChildMonitoringContext({ logger, namespace: \"PrefetchSnapshot\" });\n\tconst odspLogger = createOdspLogger(mc.logger);\n\tconst useGroupIdsForSnapshotFetch = snapshotWithLoadingGroupIdSupported(mc.config);\n\t// For prefetch, we just want to fetch the ungrouped data and want to use the new API if the\n\t// feature gate is set, so provide an empty array.\n\tconst loadingGroupIds = useGroupIdsForSnapshotFetch ? [] : undefined;\n\tconst odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\n\tconst resolvedUrlData: IOdspUrlParts = {\n\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\tdriveId: odspResolvedUrl.driveId,\n\t\titemId: odspResolvedUrl.itemId,\n\t};\n\tconst getAuthHeader = toInstrumentedOdspStorageTokenFetcher(\n\t\todspLogger,\n\t\tresolvedUrlData,\n\t\tgetStorageToken,\n\t);\n\n\tconst snapshotDownloader = async (\n\t\tfinalOdspResolvedUrl: IOdspResolvedUrl,\n\t\tstorageTokenFetcher: InstrumentedStorageTokenFetcher,\n\t\ttokenFetchOptions: TokenFetchOptionsEx,\n\t\tloadingGroupId: string[] | undefined,\n\t\tsnapshotOptions: ISnapshotOptions | undefined,\n\t\tcontroller?: AbortController,\n\t): Promise<ISnapshotRequestAndResponseOptions> => {\n\t\treturn downloadSnapshot(\n\t\t\tfinalOdspResolvedUrl,\n\t\t\tstorageTokenFetcher,\n\t\t\ttokenFetchOptions,\n\t\t\tloadingGroupId,\n\t\t\tsnapshotOptions,\n\t\t\todspLogger,\n\t\t\tundefined,\n\t\t\tcontroller,\n\t\t);\n\t};\n\tconst snapshotKey = createCacheSnapshotKey(odspResolvedUrl, useGroupIdsForSnapshotFetch);\n\tlet cacheP: Promise<void> | undefined;\n\tlet snapshotEpoch: string | undefined;\n\tconst putInCache = async (valueWithEpoch: IVersionedValueWithEpoch): Promise<void> => {\n\t\tsnapshotEpoch = valueWithEpoch.fluidEpoch;\n\t\tcacheP = persistedCache.put(snapshotKey, valueWithEpoch);\n\t\treturn cacheP;\n\t};\n\n\tconst removeEntries = async (): Promise<void> =>\n\t\tpersistedCache.removeEntries(snapshotKey.file);\n\treturn PerformanceEvent.timedExecAsync(\n\t\todspLogger,\n\t\t{ eventName: \"PrefetchLatestSnapshot\" },\n\t\tasync () => {\n\t\t\tconst prefetchStartTime = performanceNow();\n\t\t\t// Add the deferred promise to the cache, so that it can be leveraged while loading the container.\n\t\t\tconst snapshotContentsWithEpochP = new Deferred<IPrefetchSnapshotContents>();\n\t\t\tconst nonPersistentCacheKey = getKeyForCacheEntry(snapshotKey);\n\t\t\tconst snapshotNonPersistentCache =\n\t\t\t\todspDocumentServiceFactory?.snapshotPrefetchResultCache;\n\t\t\tsnapshotNonPersistentCache?.add(\n\t\t\t\tnonPersistentCacheKey,\n\t\t\t\tasync () => snapshotContentsWithEpochP.promise,\n\t\t\t);\n\t\t\tawait fetchSnapshotWithRedeem(\n\t\t\t\todspResolvedUrl,\n\t\t\t\tgetAuthHeader,\n\t\t\t\thostSnapshotFetchOptions,\n\t\t\t\tforceAccessTokenViaAuthorizationHeader,\n\t\t\t\todspLogger,\n\t\t\t\tsnapshotDownloader,\n\t\t\t\tputInCache,\n\t\t\t\tremoveEntries,\n\t\t\t\tloadingGroupIds,\n\t\t\t\tenableRedeemFallback,\n\t\t\t)\n\t\t\t\t.then(async (value) => {\n\t\t\t\t\tassert(!!snapshotEpoch, 0x585 /* prefetched snapshot should have a valid epoch */);\n\t\t\t\t\tsnapshotContentsWithEpochP.resolve({\n\t\t\t\t\t\t...value,\n\t\t\t\t\t\tfluidEpoch: snapshotEpoch,\n\t\t\t\t\t\tprefetchStartTime,\n\t\t\t\t\t});\n\t\t\t\t\tassert(cacheP !== undefined, 0x1e7 /* \"caching was not performed!\" */);\n\t\t\t\t\tawait cacheP;\n\t\t\t\t\t// Schedule it to remove from cache after 5s.\n\t\t\t\t\t// 1. While it's in snapshotNonPersistentCache: Load flow will use this value and will not attempt\n\t\t\t\t\t// to fetch snapshot from network again. That's the best from perf POV, but cache will not be\n\t\t\t\t\t// updated if we keep it in this cache, thus we want to eventually remove snapshot from this cache.\n\t\t\t\t\t// 2. After it's removed from snapshotNonPersistentCache: snapshot is present in persistent cache,\n\t\t\t\t\t// so we sill still use it (in accordance with cache policy controlled by host). But load flow will\n\t\t\t\t\t// also fetch snapshot (in parallel) from storage and update cache. This is fine long term,\n\t\t\t\t\t// but is an extra cost (unneeded network call). However since it is 5s older, new network call\n\t\t\t\t\t// will update the snapshot in cache.\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tsnapshotNonPersistentCache?.remove(nonPersistentCacheKey);\n\t\t\t\t\t}, 5000);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\t// Remove it from the non persistent cache if an error occurred.\n\t\t\t\t\tsnapshotNonPersistentCache?.remove(nonPersistentCacheKey);\n\t\t\t\t\tsnapshotContentsWithEpochP.reject(error);\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t\treturn true;\n\t\t},\n\t).catch(async (error) => {\n\t\todspLogger.sendErrorEvent({ eventName: \"PrefetchLatestSnapshotError\" }, error);\n\t\treturn false;\n\t});\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/odsp-driver",
3
- "version": "2.93.0",
3
+ "version": "2.100.0",
4
4
  "description": "Socket storage implementation for SPO and ODC",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -69,25 +69,25 @@
69
69
  "temp-directory": "nyc/.nyc_output"
70
70
  },
71
71
  "dependencies": {
72
- "@fluid-internal/client-utils": "~2.93.0",
73
- "@fluidframework/core-interfaces": "~2.93.0",
74
- "@fluidframework/core-utils": "~2.93.0",
75
- "@fluidframework/driver-base": "~2.93.0",
76
- "@fluidframework/driver-definitions": "~2.93.0",
77
- "@fluidframework/driver-utils": "~2.93.0",
78
- "@fluidframework/odsp-doclib-utils": "~2.93.0",
79
- "@fluidframework/odsp-driver-definitions": "~2.93.0",
80
- "@fluidframework/telemetry-utils": "~2.93.0",
72
+ "@fluid-internal/client-utils": "~2.100.0",
73
+ "@fluidframework/core-interfaces": "~2.100.0",
74
+ "@fluidframework/core-utils": "~2.100.0",
75
+ "@fluidframework/driver-base": "~2.100.0",
76
+ "@fluidframework/driver-definitions": "~2.100.0",
77
+ "@fluidframework/driver-utils": "~2.100.0",
78
+ "@fluidframework/odsp-doclib-utils": "~2.100.0",
79
+ "@fluidframework/odsp-driver-definitions": "~2.100.0",
80
+ "@fluidframework/telemetry-utils": "~2.100.0",
81
81
  "socket.io-client": "^4.8.3",
82
82
  "uuid": "^11.1.0"
83
83
  },
84
84
  "devDependencies": {
85
85
  "@arethetypeswrong/cli": "^0.18.2",
86
86
  "@biomejs/biome": "~2.4.5",
87
- "@fluid-internal/mocha-test-setup": "~2.93.0",
88
- "@fluid-tools/build-cli": "^0.64.0",
87
+ "@fluid-internal/mocha-test-setup": "~2.100.0",
88
+ "@fluid-tools/build-cli": "^0.65.0",
89
89
  "@fluidframework/build-common": "^2.0.3",
90
- "@fluidframework/build-tools": "^0.64.0",
90
+ "@fluidframework/build-tools": "^0.65.0",
91
91
  "@fluidframework/eslint-config-fluid": "^9.0.0",
92
92
  "@fluidframework/odsp-driver-previous": "npm:@fluidframework/odsp-driver@2.92.0",
93
93
  "@microsoft/api-extractor": "7.58.1",
@@ -9,7 +9,7 @@ import type {
9
9
  ISnapshotTree,
10
10
  ISequencedDocumentMessage,
11
11
  } from "@fluidframework/driver-definitions/internal";
12
- import type { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
12
+ import type { TelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
13
13
 
14
14
  import { ReadBuffer } from "./ReadBufferUtils.js";
15
15
  import { measure } from "./odspUtils.js";
@@ -261,7 +261,7 @@ function readSnapshotSection(node: NodeTypes): {
261
261
  */
262
262
  export function parseCompactSnapshotResponse(
263
263
  buffer: Uint8Array,
264
- logger: ITelemetryLoggerExt,
264
+ logger: TelemetryLoggerExt,
265
265
  ): ISnapshotContentsWithProps {
266
266
  const { builder, telemetryProps } = TreeBuilder.load(new ReadBuffer(buffer), logger);
267
267
  assert(builder.length === 1, 0x219 /* "1 root should be there" */);
@@ -25,14 +25,18 @@ import {
25
25
  snapshotKey,
26
26
  snapshotWithLoadingGroupIdKey,
27
27
  } from "@fluidframework/odsp-driver-definitions/internal";
28
+ import type { TelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
28
29
  import {
29
- type ITelemetryLoggerExt,
30
30
  PerformanceEvent,
31
+ extractTelemetryLoggerExt,
31
32
  isFluidError,
32
33
  loggerToMonitoringContext,
33
34
  normalizeError,
35
+ toITelemetryLoggerExt,
34
36
  wrapError,
35
37
  } from "@fluidframework/telemetry-utils/internal";
38
+ // eslint-disable-next-line import-x/no-internal-modules -- Needed to avoid specialized /internal ITelemetryLoggerExt
39
+ import type { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/legacy";
36
40
  import { v4 as uuid } from "uuid";
37
41
 
38
42
  import { type IVersionedValueWithEpoch, persistedCacheValueVersion } from "./contracts.js";
@@ -90,6 +94,9 @@ export const Odsp409Error = "Odsp409Error";
90
94
  * then it also clears all the cached entries for the given container.
91
95
  * @legacy
92
96
  * @beta
97
+ *
98
+ * @privateRemarks
99
+ * This class should be hidden and an interface exposed to better manage internal types like telemetry logger.
93
100
  */
94
101
  export class EpochTracker implements IPersistedFileCache {
95
102
  private _fluidEpoch: string | undefined;
@@ -99,12 +106,15 @@ export class EpochTracker implements IPersistedFileCache {
99
106
  private readonly driverId = uuid();
100
107
  // This tracks the request number made by the driver instance.
101
108
  private networkCallNumber = 1;
109
+ private readonly loggerInternal: TelemetryLoggerExt;
102
110
  constructor(
103
111
  protected readonly cache: IPersistedCache,
104
112
  protected readonly fileEntry: IFileEntry,
105
113
  protected readonly logger: ITelemetryLoggerExt,
106
114
  protected readonly clientIsSummarizer?: boolean,
107
115
  ) {
116
+ this.loggerInternal = extractTelemetryLoggerExt(logger);
117
+
108
118
  // Limits the max number of concurrent requests to 24.
109
119
  this.rateLimiter = new RateLimiter(24);
110
120
 
@@ -121,7 +131,7 @@ export class EpochTracker implements IPersistedFileCache {
121
131
  assert(this._fluidEpoch === undefined, 0x1db /* "epoch exists" */);
122
132
  this._fluidEpoch = epoch;
123
133
 
124
- this.logger.sendTelemetryEvent({
134
+ this.loggerInternal.sendTelemetryEvent({
125
135
  eventName: "EpochLearnedFirstTime",
126
136
  epoch,
127
137
  fetchType,
@@ -137,7 +147,7 @@ export class EpochTracker implements IPersistedFileCache {
137
147
  const value = (await this.cache.get(
138
148
  this.fileEntryFromEntry(entry),
139
149
  )) as IVersionedValueWithEpoch;
140
- // Version mismatch between what the runtime expects and what it recieved.
150
+ // Version mismatch between what the runtime expects and what it received.
141
151
  // The cached value should not be used
142
152
  // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- using ?. could change behavior
143
153
  if (value === undefined || value.version !== persistedCacheValueVersion) {
@@ -161,7 +171,7 @@ export class EpochTracker implements IPersistedFileCache {
161
171
  cacheTime === undefined ||
162
172
  currentTime - cacheTime >= this.snapshotCacheExpiryTimeoutMs
163
173
  ) {
164
- this.logger.sendTelemetryEvent({
174
+ this.loggerInternal.sendTelemetryEvent({
165
175
  eventName: "odspVersionsCacheExpired",
166
176
  duration: currentTime - cacheTime,
167
177
  maxCacheAgeMs: this.snapshotCacheExpiryTimeoutMs,
@@ -172,7 +182,10 @@ export class EpochTracker implements IPersistedFileCache {
172
182
  }
173
183
  return value.value;
174
184
  } catch (error) {
175
- this.logger.sendErrorEvent({ eventName: "cacheFetchError", type: entry.type }, error);
185
+ this.loggerInternal.sendErrorEvent(
186
+ { eventName: "cacheFetchError", type: entry.type },
187
+ error,
188
+ );
176
189
  return undefined;
177
190
  }
178
191
  }
@@ -194,7 +207,10 @@ export class EpochTracker implements IPersistedFileCache {
194
207
  fluidEpoch: this._fluidEpoch,
195
208
  };
196
209
  return this.cache.put(this.fileEntryFromEntry(entry), data).catch((error) => {
197
- this.logger.sendErrorEvent({ eventName: "cachePutError", type: entry.type }, error);
210
+ this.loggerInternal.sendErrorEvent(
211
+ { eventName: "cachePutError", type: entry.type },
212
+ error,
213
+ );
198
214
  throw error;
199
215
  });
200
216
  }
@@ -203,7 +219,7 @@ export class EpochTracker implements IPersistedFileCache {
203
219
  try {
204
220
  return await this.cache.removeEntries(this.fileEntry);
205
221
  } catch (error) {
206
- this.logger.sendErrorEvent({ eventName: "removeCacheEntries" }, error);
222
+ this.loggerInternal.sendErrorEvent({ eventName: "removeCacheEntries" }, error);
207
223
  }
208
224
  }
209
225
 
@@ -456,7 +472,10 @@ export class EpochTracker implements IPersistedFileCache {
456
472
  fromCache,
457
473
  fetchType,
458
474
  });
459
- this.logger.sendErrorEvent({ eventName: "fileOverwrittenInStorage" }, epochError);
475
+ this.loggerInternal.sendErrorEvent(
476
+ { eventName: "fileOverwrittenInStorage" },
477
+ epochError,
478
+ );
460
479
  // If the epoch mismatches, then clear all entries for such file entry from cache.
461
480
  await this.removeEntries();
462
481
  throw epochError;
@@ -502,10 +521,10 @@ export class EpochTrackerWithRedemption extends EpochTracker {
502
521
  constructor(
503
522
  protected readonly cache: IPersistedCache,
504
523
  protected readonly fileEntry: IFileEntry,
505
- protected readonly logger: ITelemetryLoggerExt,
524
+ logger: TelemetryLoggerExt,
506
525
  protected readonly clientIsSummarizer?: boolean,
507
526
  ) {
508
- super(cache, fileEntry, logger, clientIsSummarizer);
527
+ super(cache, fileEntry, toITelemetryLoggerExt(logger), clientIsSummarizer);
509
528
  // Handles the rejected promise within treesLatestDeferral.
510
529
  this.treesLatestDeferral.promise.catch(() => {});
511
530
  }
@@ -635,7 +654,7 @@ export function createOdspCacheAndTracker(
635
654
  persistedCacheArg: IPersistedCache,
636
655
  nonpersistentCache: INonPersistentCache,
637
656
  fileEntry: IFileEntry,
638
- logger: ITelemetryLoggerExt,
657
+ logger: TelemetryLoggerExt,
639
658
  clientIsSummarizer?: boolean,
640
659
  ): ICacheAndTracker {
641
660
  const epochTracker = new EpochTrackerWithRedemption(