@fluidframework/odsp-driver 3.0.2 → 3.1.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 (132) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +30 -34
  3. package/api-report/odsp-driver.legacy.alpha.api.md +5 -1
  4. package/api-report/odsp-driver.legacy.beta.api.md +5 -1
  5. package/api-report/odsp-driver.point-in-time.legacy.beta.api.md +2 -1
  6. package/dist/epochTracker.d.ts +4 -3
  7. package/dist/epochTracker.d.ts.map +1 -1
  8. package/dist/epochTracker.js +9 -5
  9. package/dist/epochTracker.js.map +1 -1
  10. package/dist/fetchSnapshot.d.ts +2 -2
  11. package/dist/fetchSnapshot.d.ts.map +1 -1
  12. package/dist/fetchSnapshot.js +12 -7
  13. package/dist/fetchSnapshot.js.map +1 -1
  14. package/dist/getFileLink.d.ts +1 -1
  15. package/dist/getFileLink.d.ts.map +1 -1
  16. package/dist/getFileLink.js +16 -11
  17. package/dist/getFileLink.js.map +1 -1
  18. package/dist/odspDelayLoadedDeltaStream.d.ts.map +1 -1
  19. package/dist/odspDelayLoadedDeltaStream.js +1 -1
  20. package/dist/odspDelayLoadedDeltaStream.js.map +1 -1
  21. package/dist/odspDocumentDeltaConnection.d.ts +1 -1
  22. package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
  23. package/dist/odspDocumentDeltaConnection.js +6 -3
  24. package/dist/odspDocumentDeltaConnection.js.map +1 -1
  25. package/dist/odspDocumentServiceFactory.d.ts.map +1 -1
  26. package/dist/odspDocumentServiceFactory.js +1 -0
  27. package/dist/odspDocumentServiceFactory.js.map +1 -1
  28. package/dist/odspDocumentServiceFactoryCore.d.ts +4 -1
  29. package/dist/odspDocumentServiceFactoryCore.d.ts.map +1 -1
  30. package/dist/odspDocumentServiceFactoryCore.js +11 -5
  31. package/dist/odspDocumentServiceFactoryCore.js.map +1 -1
  32. package/dist/odspDocumentStorageManager.d.ts.map +1 -1
  33. package/dist/odspDocumentStorageManager.js +11 -11
  34. package/dist/odspDocumentStorageManager.js.map +1 -1
  35. package/dist/odspDriverUrlResolverForShareLink.d.ts +5 -0
  36. package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  37. package/dist/odspDriverUrlResolverForShareLink.js +3 -1
  38. package/dist/odspDriverUrlResolverForShareLink.js.map +1 -1
  39. package/dist/odspVersionManager/odspFileVersionFetcher.d.ts +1 -0
  40. package/dist/odspVersionManager/odspFileVersionFetcher.d.ts.map +1 -1
  41. package/dist/odspVersionManager/odspFileVersionFetcher.js +6 -2
  42. package/dist/odspVersionManager/odspFileVersionFetcher.js.map +1 -1
  43. package/dist/packageVersion.d.ts +1 -1
  44. package/dist/packageVersion.js +1 -1
  45. package/dist/packageVersion.js.map +1 -1
  46. package/dist/pointInTimeDriver/createPointInTimeDocumentService.d.ts +1 -1
  47. package/dist/pointInTimeDriver/createPointInTimeDocumentService.d.ts.map +1 -1
  48. package/dist/pointInTimeDriver/createPointInTimeDocumentService.js +5 -4
  49. package/dist/pointInTimeDriver/createPointInTimeDocumentService.js.map +1 -1
  50. package/dist/pointInTimeDriver/odspPointInTimeDocumentService.d.ts +1 -1
  51. package/dist/pointInTimeDriver/odspPointInTimeDocumentService.d.ts.map +1 -1
  52. package/dist/pointInTimeDriver/odspPointInTimeDocumentService.js +21 -1
  53. package/dist/pointInTimeDriver/odspPointInTimeDocumentService.js.map +1 -1
  54. package/dist/prefetchLatestSnapshot.d.ts.map +1 -1
  55. package/dist/prefetchLatestSnapshot.js +2 -2
  56. package/dist/prefetchLatestSnapshot.js.map +1 -1
  57. package/dist/requestHeaders.d.ts +19 -0
  58. package/dist/requestHeaders.d.ts.map +1 -0
  59. package/dist/requestHeaders.js +48 -0
  60. package/dist/requestHeaders.js.map +1 -0
  61. package/lib/epochTracker.d.ts +4 -3
  62. package/lib/epochTracker.d.ts.map +1 -1
  63. package/lib/epochTracker.js +9 -5
  64. package/lib/epochTracker.js.map +1 -1
  65. package/lib/fetchSnapshot.d.ts +2 -2
  66. package/lib/fetchSnapshot.d.ts.map +1 -1
  67. package/lib/fetchSnapshot.js +12 -7
  68. package/lib/fetchSnapshot.js.map +1 -1
  69. package/lib/getFileLink.d.ts +1 -1
  70. package/lib/getFileLink.d.ts.map +1 -1
  71. package/lib/getFileLink.js +16 -11
  72. package/lib/getFileLink.js.map +1 -1
  73. package/lib/odspDelayLoadedDeltaStream.d.ts.map +1 -1
  74. package/lib/odspDelayLoadedDeltaStream.js +1 -1
  75. package/lib/odspDelayLoadedDeltaStream.js.map +1 -1
  76. package/lib/odspDocumentDeltaConnection.d.ts +1 -1
  77. package/lib/odspDocumentDeltaConnection.d.ts.map +1 -1
  78. package/lib/odspDocumentDeltaConnection.js +6 -3
  79. package/lib/odspDocumentDeltaConnection.js.map +1 -1
  80. package/lib/odspDocumentServiceFactory.d.ts.map +1 -1
  81. package/lib/odspDocumentServiceFactory.js +1 -0
  82. package/lib/odspDocumentServiceFactory.js.map +1 -1
  83. package/lib/odspDocumentServiceFactoryCore.d.ts +4 -1
  84. package/lib/odspDocumentServiceFactoryCore.d.ts.map +1 -1
  85. package/lib/odspDocumentServiceFactoryCore.js +11 -5
  86. package/lib/odspDocumentServiceFactoryCore.js.map +1 -1
  87. package/lib/odspDocumentStorageManager.d.ts.map +1 -1
  88. package/lib/odspDocumentStorageManager.js +11 -11
  89. package/lib/odspDocumentStorageManager.js.map +1 -1
  90. package/lib/odspDriverUrlResolverForShareLink.d.ts +5 -0
  91. package/lib/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  92. package/lib/odspDriverUrlResolverForShareLink.js +3 -1
  93. package/lib/odspDriverUrlResolverForShareLink.js.map +1 -1
  94. package/lib/odspVersionManager/odspFileVersionFetcher.d.ts +1 -0
  95. package/lib/odspVersionManager/odspFileVersionFetcher.d.ts.map +1 -1
  96. package/lib/odspVersionManager/odspFileVersionFetcher.js +6 -2
  97. package/lib/odspVersionManager/odspFileVersionFetcher.js.map +1 -1
  98. package/lib/packageVersion.d.ts +1 -1
  99. package/lib/packageVersion.js +1 -1
  100. package/lib/packageVersion.js.map +1 -1
  101. package/lib/pointInTimeDriver/createPointInTimeDocumentService.d.ts +1 -1
  102. package/lib/pointInTimeDriver/createPointInTimeDocumentService.d.ts.map +1 -1
  103. package/lib/pointInTimeDriver/createPointInTimeDocumentService.js +5 -4
  104. package/lib/pointInTimeDriver/createPointInTimeDocumentService.js.map +1 -1
  105. package/lib/pointInTimeDriver/odspPointInTimeDocumentService.d.ts +1 -1
  106. package/lib/pointInTimeDriver/odspPointInTimeDocumentService.d.ts.map +1 -1
  107. package/lib/pointInTimeDriver/odspPointInTimeDocumentService.js +21 -1
  108. package/lib/pointInTimeDriver/odspPointInTimeDocumentService.js.map +1 -1
  109. package/lib/prefetchLatestSnapshot.d.ts.map +1 -1
  110. package/lib/prefetchLatestSnapshot.js +2 -2
  111. package/lib/prefetchLatestSnapshot.js.map +1 -1
  112. package/lib/requestHeaders.d.ts +19 -0
  113. package/lib/requestHeaders.d.ts.map +1 -0
  114. package/lib/requestHeaders.js +44 -0
  115. package/lib/requestHeaders.js.map +1 -0
  116. package/package.json +11 -11
  117. package/src/epochTracker.ts +9 -1
  118. package/src/fetchSnapshot.ts +17 -4
  119. package/src/getFileLink.ts +21 -7
  120. package/src/odspDelayLoadedDeltaStream.ts +1 -0
  121. package/src/odspDocumentDeltaConnection.ts +6 -0
  122. package/src/odspDocumentServiceFactory.ts +1 -0
  123. package/src/odspDocumentServiceFactoryCore.ts +14 -2
  124. package/src/odspDocumentStorageManager.ts +13 -3
  125. package/src/odspDriverUrlResolverForShareLink.ts +8 -0
  126. package/src/odspVersionManager/DEV.md +5 -1
  127. package/src/odspVersionManager/odspFileVersionFetcher.ts +7 -2
  128. package/src/packageVersion.ts +1 -1
  129. package/src/pointInTimeDriver/createPointInTimeDocumentService.ts +5 -1
  130. package/src/pointInTimeDriver/odspPointInTimeDocumentService.ts +40 -10
  131. package/src/prefetchLatestSnapshot.ts +4 -0
  132. package/src/requestHeaders.ts +56 -0
@@ -15,6 +15,7 @@ const odspCache_js_1 = require("./odspCache.js");
15
15
  const odspDocumentService_js_1 = require("./odspDocumentService.js");
16
16
  const odspLayerCompatState_js_1 = require("./odspLayerCompatState.js");
17
17
  const odspUtils_js_1 = require("./odspUtils.js");
18
+ const requestHeaders_js_1 = require("./requestHeaders.js");
18
19
  /**
19
20
  * Factory for creating the sharepoint document service. Use this if you want to
20
21
  * use the sharepoint implementation.
@@ -25,9 +26,10 @@ class OdspDocumentServiceFactoryCore {
25
26
  getStorageToken;
26
27
  getWebsocketToken;
27
28
  persistedCache;
28
- hostPolicy;
29
29
  nonPersistentCache = new odspCache_js_1.NonPersistentCache();
30
30
  socketReferenceKeyPrefix;
31
+ hostPolicy;
32
+ requestHeaders;
31
33
  get snapshotPrefetchResultCache() {
32
34
  return this.nonPersistentCache.snapshotPrefetchResultCache;
33
35
  }
@@ -95,7 +97,7 @@ class OdspDocumentServiceFactoryCore {
95
97
  docId: odspResolvedUrl.hashedDocumentId,
96
98
  fileVersion: undefined,
97
99
  };
98
- const cacheAndTracker = (0, epochTracker_js_1.createOdspCacheAndTracker)(this.persistedCache, this.nonPersistentCache, fileEntry, odspLogger, clientIsSummarizer);
100
+ const cacheAndTracker = (0, epochTracker_js_1.createOdspCacheAndTracker)(this.persistedCache, this.nonPersistentCache, fileEntry, odspLogger, clientIsSummarizer, this.requestHeaders);
99
101
  return internal_3.PerformanceEvent.timedExecAsync(odspLogger, {
100
102
  eventName: "CreateNew",
101
103
  isWithSummaryUpload: true,
@@ -130,8 +132,12 @@ class OdspDocumentServiceFactoryCore {
130
132
  this.getStorageToken = getStorageToken;
131
133
  this.getWebsocketToken = getWebsocketToken;
132
134
  this.persistedCache = persistedCache;
133
- this.hostPolicy = hostPolicy;
134
- if (this.hostPolicy.isolateSocketCache === true) {
135
+ this.requestHeaders = (0, requestHeaders_js_1.copyRequestHeaders)(hostPolicy.hostProvidedRequestHeaders);
136
+ this.hostPolicy =
137
+ this.requestHeaders === undefined
138
+ ? hostPolicy
139
+ : { ...hostPolicy, hostProvidedRequestHeaders: this.requestHeaders };
140
+ if (this.hostPolicy.isolateSocketCache === true || this.requestHeaders !== undefined) {
135
141
  // create the key to separate the socket reuse cache
136
142
  this.socketReferenceKeyPrefix = (0, uuid_1.v4)();
137
143
  }
@@ -190,7 +196,7 @@ class OdspDocumentServiceFactoryCore {
190
196
  resolvedUrl: odspResolvedUrl,
191
197
  docId: odspResolvedUrl.hashedDocumentId,
192
198
  fileVersion: odspResolvedUrl.fileVersion,
193
- }, extLogger, clientIsSummarizer);
199
+ }, extLogger, clientIsSummarizer, this.requestHeaders);
194
200
  const storageTokenFetcher = (0, odspUtils_js_1.toInstrumentedOdspStorageTokenFetcher)(extLogger, resolvedUrlData, this.getStorageToken);
195
201
  const webSocketTokenFetcher = this.getWebsocketToken === undefined
196
202
  ? undefined
@@ -1 +1 @@
1
- {"version":3,"file":"odspDocumentServiceFactoryCore.js","sourceRoot":"","sources":["../src/odspDocumentServiceFactoryCore.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 type { ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\nimport type { PromiseCache } from \"@fluidframework/core-utils/internal\";\nimport type { ISummaryTree } from \"@fluidframework/driver-definitions\";\nimport type {\n\tIDocumentService,\n\tIDocumentServiceFactory,\n\tIFileEntry,\n\tIPersistedCache,\n\tIResolvedUrl,\n} from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tgetDocAttributesFromProtocolSummary,\n\tisCombinedAppAndProtocolSummary,\n} from \"@fluidframework/driver-utils/internal\";\nimport {\n\ttype HostStoragePolicy,\n\ttype IOdspUrlParts,\n\ttype IRelaySessionAwareDriverFactory,\n\ttype ISharingLinkKind,\n\ttype ISocketStorageDiscovery,\n\ttype OdspResourceTokenFetchOptions,\n\tSharingLinkRole,\n\tSharingLinkScope,\n\ttype TokenFetchOptions,\n\ttype TokenFetcher,\n} from \"@fluidframework/odsp-driver-definitions/internal\";\nimport { PerformanceEvent, createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { useCreateNewModule } from \"./createFile/index.js\";\nimport { type ICacheAndTracker, createOdspCacheAndTracker } from \"./epochTracker.js\";\nimport {\n\ttype INonPersistentCache,\n\ttype IPrefetchSnapshotContents,\n\tLocalPersistentCache,\n\tNonPersistentCache,\n} from \"./odspCache.js\";\nimport { OdspDocumentService } from \"./odspDocumentService.js\";\nimport {\n\todspDriverCompatDetailsForLoader,\n\todspDriverCompatRequirementsForLoader,\n} from \"./odspLayerCompatState.js\";\nimport {\n\ttype IExistingFileInfo,\n\ttype INewFileInfo,\n\tcreateOdspLogger,\n\tgetJoinSessionCacheKey,\n\tgetOdspResolvedUrl,\n\tisNewFileInfo,\n\ttoInstrumentedOdspStorageTokenFetcher,\n\ttoInstrumentedOdspTokenFetcher,\n} from \"./odspUtils.js\";\n\n/**\n * An ODSP document service factory that supports point-in-time (sequence-number-based) loading.\n *\n * @remarks\n * The loader detects this capability structurally, so hosts can pass this factory directly to\n * {@link @fluidframework/container-loader#loadContainerToSequenceNumber}.\n *\n * @legacy @beta\n */\nexport interface IPointInTimeDocumentServiceFactory extends IDocumentServiceFactory {\n\t/**\n\t * Creates a document service that materializes the document at the requested sequence number.\n\t *\n\t * @param resolvedUrl - The resolved ODSP {@link @fluidframework/driver-definitions#IResolvedUrl}.\n\t * @param targetSequenceNumber - The sequence number at which to materialize the document. See\n\t * {@link @fluidframework/container-loader#ILoadContainerToSequenceNumberProps.loadToSequenceNumber}.\n\t * @param logger - Optional {@link @fluidframework/core-interfaces#ITelemetryBaseLogger}.\n\t * @param clientIsSummarizer - Whether to apply summarizer policies and telemetry to the\n\t * underlying document services. Defaults to `false`.\n\t * @returns A read-only {@link @fluidframework/driver-definitions#IDocumentService} materialized\n\t * at the requested sequence number.\n\t */\n\tcreatePointInTimeDocumentService(\n\t\tresolvedUrl: IResolvedUrl,\n\t\ttargetSequenceNumber: number,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tclientIsSummarizer?: boolean,\n\t): Promise<IDocumentService>;\n}\n\n/**\n * Inputs supplied by the ODSP document service factory to an injected point-in-time implementation.\n *\n * @legacy @beta\n */\nexport interface IOdspPointInTimeDocumentServiceImplementationProps {\n\t/** The resolved ODSP URL for the document to materialize. */\n\treadonly resolvedUrl: IResolvedUrl;\n\t/** The sequence number at which to materialize the document. */\n\treadonly targetSequenceNumber: number;\n\t/** Optional telemetry logger for the point-in-time load. */\n\treadonly logger?: ITelemetryBaseLogger;\n\t/** Whether to apply summarizer policies and telemetry. Defaults to `false`. */\n\treadonly clientIsSummarizer?: boolean;\n\t/** The persisted ODSP cache supplied to the document service factory. */\n\treadonly persistedCache: IPersistedCache;\n\t/** Fetches storage access tokens for ODSP requests. */\n\treadonly getStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>;\n\t/**\n\t * Creates an ODSP document service for a resolved URL.\n\t *\n\t * @param resolvedUrl - The resolved URL for the document or file version to load.\n\t * @param logger - The telemetry logger for the document service.\n\t * @param cacheAndTracker - The cache and epoch tracker shared by the point-in-time load.\n\t * @param clientIsSummarizer - Whether to apply summarizer policies and telemetry.\n\t * @returns The document service for the resolved URL.\n\t */\n\treadonly createDocumentService: (\n\t\tresolvedUrl: IResolvedUrl,\n\t\tlogger: ITelemetryBaseLogger,\n\t\tcacheAndTracker: ICacheAndTracker,\n\t\tclientIsSummarizer?: boolean,\n\t) => Promise<IDocumentService>;\n}\n\n/**\n * Consumer-provided implementation of ODSP point-in-time loading.\n *\n * @legacy @beta\n */\nexport type OdspPointInTimeDocumentServiceImplementation = (\n\tprops: IOdspPointInTimeDocumentServiceImplementationProps,\n) => Promise<IDocumentService>;\n\n/**\n * Factory for creating the sharepoint document service. Use this if you want to\n * use the sharepoint implementation.\n * @legacy\n * @beta\n */\nexport class OdspDocumentServiceFactoryCore\n\timplements IDocumentServiceFactory, IRelaySessionAwareDriverFactory\n{\n\tprivate readonly nonPersistentCache: INonPersistentCache = new NonPersistentCache();\n\tprivate readonly socketReferenceKeyPrefix?: string;\n\n\tpublic get snapshotPrefetchResultCache(): PromiseCache<string, IPrefetchSnapshotContents> {\n\t\treturn this.nonPersistentCache.snapshotPrefetchResultCache;\n\t}\n\n\t// TODO: return `IRelaySessionAwareDriverFactory` instead of `this` (breaking change)\n\tpublic get IRelaySessionAwareDriverFactory(): this {\n\t\treturn this;\n\t}\n\n\t/**\n\t * This function would return info about relay service session only if this factory established (or attempted to\n\t * establish) connection very recently. Otherwise, it will return undefined.\n\t * @param resolvedUrl - resolved url for container\n\t * @returns The current join session response stored in cache. `undefined` if not present.\n\t */\n\tpublic async getRelayServiceSessionInfo(\n\t\tresolvedUrl: IResolvedUrl,\n\t): Promise<ISocketStorageDiscovery | undefined> {\n\t\tconst odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\t\tconst joinSessionResponse = await this.nonPersistentCache.sessionJoinCache.get(\n\t\t\tgetJoinSessionCacheKey(odspResolvedUrl),\n\t\t);\n\t\treturn joinSessionResponse?.joinSessionResponse;\n\t}\n\n\tpublic async createContainer(\n\t\tcreateNewSummary: ISummaryTree | undefined,\n\t\tcreateNewResolvedUrl: IResolvedUrl,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tclientIsSummarizer?: boolean,\n\t): Promise<IDocumentService> {\n\t\tconst odspResolvedUrl = getOdspResolvedUrl(createNewResolvedUrl);\n\t\tconst resolvedUrlData: IOdspUrlParts = {\n\t\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\t\tdriveId: odspResolvedUrl.driveId,\n\t\t\titemId: odspResolvedUrl.itemId,\n\t\t};\n\n\t\tlet fileInfo: INewFileInfo | IExistingFileInfo;\n\t\tlet createShareLinkParam: ISharingLinkKind | undefined;\n\t\tif (odspResolvedUrl.itemId) {\n\t\t\tfileInfo = {\n\t\t\t\ttype: \"Existing\",\n\t\t\t\tdriveId: odspResolvedUrl.driveId,\n\t\t\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\t\t\titemId: odspResolvedUrl.itemId,\n\t\t\t};\n\t\t} else if (odspResolvedUrl.fileName) {\n\t\t\tconst [, queryString] = odspResolvedUrl.url.split(\"?\");\n\t\t\tconst searchParams = new URLSearchParams(queryString);\n\t\t\tconst filePath = searchParams.get(\"path\");\n\t\t\tif (filePath === undefined || filePath === null) {\n\t\t\t\tthrow new Error(\"File path should be provided!!\");\n\t\t\t}\n\t\t\tcreateShareLinkParam = getSharingLinkParams(this.hostPolicy, searchParams);\n\t\t\tfileInfo = {\n\t\t\t\ttype: \"New\",\n\t\t\t\tdriveId: odspResolvedUrl.driveId,\n\t\t\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\t\t\tfilePath,\n\t\t\t\tfilename: odspResolvedUrl.fileName,\n\t\t\t\tcreateLinkType: createShareLinkParam,\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new Error(\"A new or existing file must be specified to create container!\");\n\t\t}\n\n\t\tif (isCombinedAppAndProtocolSummary(createNewSummary)) {\n\t\t\tconst documentAttributes = getDocAttributesFromProtocolSummary(\n\t\t\t\tcreateNewSummary.tree[\".protocol\"],\n\t\t\t);\n\t\t\tif (documentAttributes?.sequenceNumber !== 0) {\n\t\t\t\tthrow new Error(\"Seq number in detached ODSP container should be 0\");\n\t\t\t}\n\t\t}\n\n\t\tconst odspLogger = createOdspLogger(logger);\n\n\t\tconst fileEntry: IFileEntry = {\n\t\t\tresolvedUrl: odspResolvedUrl,\n\t\t\tdocId: odspResolvedUrl.hashedDocumentId,\n\t\t\tfileVersion: undefined,\n\t\t};\n\t\tconst cacheAndTracker = createOdspCacheAndTracker(\n\t\t\tthis.persistedCache,\n\t\t\tthis.nonPersistentCache,\n\t\t\tfileEntry,\n\t\t\todspLogger,\n\t\t\tclientIsSummarizer,\n\t\t);\n\n\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\todspLogger,\n\t\t\t{\n\t\t\t\teventName: \"CreateNew\",\n\t\t\t\tisWithSummaryUpload: true,\n\t\t\t\tcreateShareLinkParam: createShareLinkParam\n\t\t\t\t\t? JSON.stringify(createShareLinkParam)\n\t\t\t\t\t: undefined,\n\t\t\t\tenableSingleRequestForShareLinkWithCreate:\n\t\t\t\t\tthis.hostPolicy.enableSingleRequestForShareLinkWithCreate,\n\t\t\t},\n\t\t\tasync (event) => {\n\t\t\t\tconst getAuthHeader = toInstrumentedOdspStorageTokenFetcher(\n\t\t\t\t\todspLogger,\n\t\t\t\t\tresolvedUrlData,\n\t\t\t\t\tthis.getStorageToken,\n\t\t\t\t);\n\t\t\t\tconst _odspResolvedUrl = await useCreateNewModule(odspLogger, async (module) => {\n\t\t\t\t\treturn isNewFileInfo(fileInfo)\n\t\t\t\t\t\t? module.createNewFluidFile(\n\t\t\t\t\t\t\t\tgetAuthHeader,\n\t\t\t\t\t\t\t\tfileInfo,\n\t\t\t\t\t\t\t\todspLogger,\n\t\t\t\t\t\t\t\tcreateNewSummary,\n\t\t\t\t\t\t\t\tcacheAndTracker.epochTracker,\n\t\t\t\t\t\t\t\tfileEntry,\n\t\t\t\t\t\t\t\tthis.hostPolicy.cacheCreateNewSummary ?? true,\n\t\t\t\t\t\t\t\t!!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,\n\t\t\t\t\t\t\t\todspResolvedUrl.isClpCompliantApp,\n\t\t\t\t\t\t\t\tthis.hostPolicy.enableSingleRequestForShareLinkWithCreate,\n\t\t\t\t\t\t\t\todspResolvedUrl,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: module.createNewContainerOnExistingFile(\n\t\t\t\t\t\t\t\tgetAuthHeader,\n\t\t\t\t\t\t\t\tfileInfo,\n\t\t\t\t\t\t\t\todspLogger,\n\t\t\t\t\t\t\t\tcreateNewSummary,\n\t\t\t\t\t\t\t\tcacheAndTracker.epochTracker,\n\t\t\t\t\t\t\t\tfileEntry,\n\t\t\t\t\t\t\t\tthis.hostPolicy.cacheCreateNewSummary ?? true,\n\t\t\t\t\t\t\t\t!!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,\n\t\t\t\t\t\t\t\todspResolvedUrl.isClpCompliantApp,\n\t\t\t\t\t\t\t\todspResolvedUrl.fileMetadata?.eTag,\n\t\t\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tconst docService = this.createDocumentServiceCore(\n\t\t\t\t\t_odspResolvedUrl,\n\t\t\t\t\todspLogger,\n\t\t\t\t\tcacheAndTracker,\n\t\t\t\t\tclientIsSummarizer,\n\t\t\t\t);\n\t\t\t\tevent.end({\n\t\t\t\t\tdocId: _odspResolvedUrl.hashedDocumentId,\n\t\t\t\t});\n\t\t\t\treturn docService;\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * @param getStorageToken - function that can provide the storage token for a given site. This is\n\t * is also referred to as the \"Vroom\" token in SPO.\n\t * @param getWebsocketToken - function that can provide a token for accessing the web socket. This is also\n\t * to as the \"Push\" token in SPO. If undefined then websocket token is expected to be returned with joinSession\n\t * response payload.\n\t * @param persistedCache - PersistedCache provided by host for use in this session.\n\t * @param hostPolicy - Policy for storage provided by host.\n\t */\n\tconstructor(\n\t\tprivate readonly getStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>,\n\t\tprivate readonly getWebsocketToken:\n\t\t\t| TokenFetcher<OdspResourceTokenFetchOptions>\n\t\t\t| undefined,\n\t\tprotected persistedCache: IPersistedCache = new LocalPersistentCache(),\n\t\tprivate readonly hostPolicy: HostStoragePolicy = {},\n\t) {\n\t\tif (this.hostPolicy.isolateSocketCache === true) {\n\t\t\t// create the key to separate the socket reuse cache\n\t\t\tthis.socketReferenceKeyPrefix = uuid();\n\t\t}\n\t\t// Set enableRedeemFallback by default as true.\n\t\tthis.hostPolicy.enableRedeemFallback = this.hostPolicy.enableRedeemFallback ?? true;\n\t\tthis.hostPolicy.sessionOptions = {\n\t\t\tforceAccessTokenViaAuthorizationHeader: true,\n\t\t\t...this.hostPolicy.sessionOptions,\n\t\t};\n\t}\n\n\t/**\n\t * The compatibility details of the ODSP Driver layer that is exposed to the Loader layer\n\t * for validating Loader-Driver compatibility.\n\t * @remarks This is for internal use only.\n\t * The type of this should be ILayerCompatDetails. However, ILayerCompatDetails is internal and this class\n\t * is currently marked as legacy alpha. So, using unknown here.\n\t */\n\tpublic readonly ILayerCompatDetails?: unknown = odspDriverCompatDetailsForLoader;\n\n\t/**\n\t * The requirements that the Loader layer must meet to be compatible with this ODSP Driver. This is exposed to\n\t * the Loader layer so that it can validate Loader / Driver compatibility on this Driver's behalf (the Driver has\n\t * no reference to the Loader to validate it directly).\n\t * @remarks This is for internal use only.\n\t * The type of this should be ILayerCompatSupportRequirements. However, ILayerCompatSupportRequirements is\n\t * internal and this class is currently marked as legacy alpha. So, using unknown here.\n\t */\n\tpublic readonly ILayerCompatSupportRequirements?: unknown =\n\t\todspDriverCompatRequirementsForLoader;\n\n\tpublic async createDocumentService(\n\t\tresolvedUrl: IResolvedUrl,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tclientIsSummarizer?: boolean,\n\t): Promise<IDocumentService> {\n\t\treturn this.createDocumentServiceCore(\n\t\t\tresolvedUrl,\n\t\t\tcreateOdspLogger(logger),\n\t\t\tundefined,\n\t\t\tclientIsSummarizer,\n\t\t);\n\t}\n\n\t/**\n\t * Creates a document service that reads its snapshot from the closest file version at or before\n\t * the target and its deltas from the live document, materializing a requested sequence number\n\t * through replay.\n\t *\n\t * @param resolvedUrl - The resolved ODSP {@link @fluidframework/driver-definitions#IResolvedUrl}.\n\t * @param targetSequenceNumber - The sequence number at which to materialize the document. See\n\t * {@link @fluidframework/container-loader#ILoadContainerToSequenceNumberProps.loadToSequenceNumber}.\n\t * @param logger - Optional {@link @fluidframework/core-interfaces#ITelemetryBaseLogger}.\n\t * @param clientIsSummarizer - Whether to apply summarizer policies and telemetry to the\n\t * underlying document services. Defaults to `false`.\n\t * @returns A read-only {@link @fluidframework/driver-definitions#IDocumentService} materialized\n\t * at the requested sequence number.\n\t */\n\tpublic readonly createPointInTimeDocumentService?: IPointInTimeDocumentServiceFactory[\"createPointInTimeDocumentService\"];\n\n\tprotected async createDocumentServiceCore(\n\t\tresolvedUrl: IResolvedUrl,\n\t\todspLogger: ITelemetryBaseLogger,\n\t\tcacheAndTrackerArg?: ICacheAndTracker,\n\t\tclientIsSummarizer?: boolean,\n\t): Promise<IDocumentService> {\n\t\tconst extLogger = createChildLogger({ logger: odspLogger });\n\t\tconst odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\t\tconst resolvedUrlData: IOdspUrlParts = {\n\t\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\t\tdriveId: odspResolvedUrl.driveId,\n\t\t\titemId: odspResolvedUrl.itemId,\n\t\t};\n\n\t\tconst cacheAndTracker =\n\t\t\tcacheAndTrackerArg ??\n\t\t\tcreateOdspCacheAndTracker(\n\t\t\t\tthis.persistedCache,\n\t\t\t\tthis.nonPersistentCache,\n\t\t\t\t{\n\t\t\t\t\tresolvedUrl: odspResolvedUrl,\n\t\t\t\t\tdocId: odspResolvedUrl.hashedDocumentId,\n\t\t\t\t\tfileVersion: odspResolvedUrl.fileVersion,\n\t\t\t\t},\n\t\t\t\textLogger,\n\t\t\t\tclientIsSummarizer,\n\t\t\t);\n\n\t\tconst storageTokenFetcher = toInstrumentedOdspStorageTokenFetcher(\n\t\t\textLogger,\n\t\t\tresolvedUrlData,\n\t\t\tthis.getStorageToken,\n\t\t);\n\n\t\tconst webSocketTokenFetcher =\n\t\t\tthis.getWebsocketToken === undefined\n\t\t\t\t? undefined\n\t\t\t\t: async (options: TokenFetchOptions): Promise<string | null> =>\n\t\t\t\t\t\t// websocket expects a plain token\n\t\t\t\t\t\ttoInstrumentedOdspTokenFetcher(\n\t\t\t\t\t\t\textLogger,\n\t\t\t\t\t\t\tresolvedUrlData,\n\t\t\t\t\t\t\tthis.getWebsocketToken!,\n\t\t\t\t\t\t\tfalse /* throwOnNullToken */,\n\t\t\t\t\t\t\ttrue /* returnPlainToken */,\n\t\t\t\t\t\t)(options, \"GetWebsocketToken\");\n\n\t\treturn OdspDocumentService.create(\n\t\t\tresolvedUrl,\n\t\t\tstorageTokenFetcher,\n\t\t\twebSocketTokenFetcher,\n\t\t\textLogger,\n\t\t\tcacheAndTracker.cache,\n\t\t\tthis.hostPolicy,\n\t\t\tcacheAndTracker.epochTracker,\n\t\t\tthis.socketReferenceKeyPrefix,\n\t\t\tclientIsSummarizer,\n\t\t);\n\t}\n}\n\n/**\n * Extract the sharing link kind from the resolved URL's query paramerters\n */\nfunction getSharingLinkParams(\n\thostPolicy: HostStoragePolicy,\n\tsearchParams: URLSearchParams,\n): ISharingLinkKind | undefined {\n\t// extract request parameters for creation of sharing link (if provided) if the feature is enabled\n\tlet createShareLinkParam: ISharingLinkKind | undefined;\n\tif (hostPolicy.enableSingleRequestForShareLinkWithCreate) {\n\t\tconst createLinkScope = searchParams.get(\"createLinkScope\");\n\t\tconst createLinkRole = searchParams.get(\"createLinkRole\");\n\t\tif (createLinkScope && SharingLinkScope[createLinkScope]) {\n\t\t\tcreateShareLinkParam = {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tscope: SharingLinkScope[createLinkScope],\n\t\t\t\t...(createLinkRole && SharingLinkRole[createLinkRole]\n\t\t\t\t\t? // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\t\t{ role: SharingLinkRole[createLinkRole] }\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t}\n\t}\n\treturn createShareLinkParam;\n}\n"]}
1
+ {"version":3,"file":"odspDocumentServiceFactoryCore.js","sourceRoot":"","sources":["../src/odspDocumentServiceFactoryCore.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 type { ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\nimport type { PromiseCache } from \"@fluidframework/core-utils/internal\";\nimport type { ISummaryTree } from \"@fluidframework/driver-definitions\";\nimport type {\n\tIDocumentService,\n\tIDocumentServiceFactory,\n\tIFileEntry,\n\tIPersistedCache,\n\tIResolvedUrl,\n} from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tgetDocAttributesFromProtocolSummary,\n\tisCombinedAppAndProtocolSummary,\n} from \"@fluidframework/driver-utils/internal\";\nimport {\n\ttype HostStoragePolicy,\n\ttype IOdspUrlParts,\n\ttype IRelaySessionAwareDriverFactory,\n\ttype ISharingLinkKind,\n\ttype ISocketStorageDiscovery,\n\ttype OdspResourceTokenFetchOptions,\n\tSharingLinkRole,\n\tSharingLinkScope,\n\ttype TokenFetchOptions,\n\ttype TokenFetcher,\n} from \"@fluidframework/odsp-driver-definitions/internal\";\nimport { PerformanceEvent, createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { useCreateNewModule } from \"./createFile/index.js\";\nimport { type ICacheAndTracker, createOdspCacheAndTracker } from \"./epochTracker.js\";\nimport {\n\ttype INonPersistentCache,\n\ttype IPrefetchSnapshotContents,\n\tLocalPersistentCache,\n\tNonPersistentCache,\n} from \"./odspCache.js\";\nimport { OdspDocumentService } from \"./odspDocumentService.js\";\nimport {\n\todspDriverCompatDetailsForLoader,\n\todspDriverCompatRequirementsForLoader,\n} from \"./odspLayerCompatState.js\";\nimport {\n\ttype IExistingFileInfo,\n\ttype INewFileInfo,\n\tcreateOdspLogger,\n\tgetJoinSessionCacheKey,\n\tgetOdspResolvedUrl,\n\tisNewFileInfo,\n\ttoInstrumentedOdspStorageTokenFetcher,\n\ttoInstrumentedOdspTokenFetcher,\n} from \"./odspUtils.js\";\nimport { copyRequestHeaders } from \"./requestHeaders.js\";\n\n/**\n * An ODSP document service factory that supports point-in-time (sequence-number-based) loading.\n *\n * @remarks\n * The loader detects this capability structurally, so hosts can pass this factory directly to\n * {@link @fluidframework/container-loader#loadContainerToSequenceNumber}.\n *\n * @legacy @beta\n */\nexport interface IPointInTimeDocumentServiceFactory extends IDocumentServiceFactory {\n\t/**\n\t * Creates a document service that materializes the document at the requested sequence number.\n\t *\n\t * @param resolvedUrl - The resolved ODSP {@link @fluidframework/driver-definitions#IResolvedUrl}.\n\t * @param targetSequenceNumber - The sequence number at which to materialize the document. See\n\t * {@link @fluidframework/container-loader#ILoadContainerToSequenceNumberProps.loadToSequenceNumber}.\n\t * @param logger - Optional {@link @fluidframework/core-interfaces#ITelemetryBaseLogger}.\n\t * @param clientIsSummarizer - Whether to apply summarizer policies and telemetry to the\n\t * underlying document services. Defaults to `false`.\n\t * @returns A read-only {@link @fluidframework/driver-definitions#IDocumentService} materialized\n\t * at the requested sequence number.\n\t */\n\tcreatePointInTimeDocumentService(\n\t\tresolvedUrl: IResolvedUrl,\n\t\ttargetSequenceNumber: number,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tclientIsSummarizer?: boolean,\n\t): Promise<IDocumentService>;\n}\n\n/**\n * Inputs supplied by the ODSP document service factory to an injected point-in-time implementation.\n *\n * @legacy @beta\n */\nexport interface IOdspPointInTimeDocumentServiceImplementationProps {\n\t/** The resolved ODSP URL for the document to materialize. */\n\treadonly resolvedUrl: IResolvedUrl;\n\t/** The sequence number at which to materialize the document. */\n\treadonly targetSequenceNumber: number;\n\t/** Optional telemetry logger for the point-in-time load. */\n\treadonly logger?: ITelemetryBaseLogger;\n\t/** Whether to apply summarizer policies and telemetry. Defaults to `false`. */\n\treadonly clientIsSummarizer?: boolean;\n\t/** The persisted ODSP cache supplied to the document service factory. */\n\treadonly persistedCache: IPersistedCache;\n\t/** Fetches storage access tokens for ODSP requests. */\n\treadonly getStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>;\n\t/** Host-owned attribution metadata for ODSP requests. */\n\treadonly requestHeaders?: Readonly<Record<string, string>>;\n\t/**\n\t * Creates an ODSP document service for a resolved URL.\n\t *\n\t * @param resolvedUrl - The resolved URL for the document or file version to load.\n\t * @param logger - The telemetry logger for the document service.\n\t * @param cacheAndTracker - The cache and epoch tracker shared by the point-in-time load.\n\t * @param clientIsSummarizer - Whether to apply summarizer policies and telemetry.\n\t * @returns The document service for the resolved URL.\n\t */\n\treadonly createDocumentService: (\n\t\tresolvedUrl: IResolvedUrl,\n\t\tlogger: ITelemetryBaseLogger,\n\t\tcacheAndTracker: ICacheAndTracker,\n\t\tclientIsSummarizer?: boolean,\n\t) => Promise<IDocumentService>;\n}\n\n/**\n * Consumer-provided implementation of ODSP point-in-time loading.\n *\n * @legacy @beta\n */\nexport type OdspPointInTimeDocumentServiceImplementation = (\n\tprops: IOdspPointInTimeDocumentServiceImplementationProps,\n) => Promise<IDocumentService>;\n\n/**\n * Factory for creating the sharepoint document service. Use this if you want to\n * use the sharepoint implementation.\n * @legacy\n * @beta\n */\nexport class OdspDocumentServiceFactoryCore\n\timplements IDocumentServiceFactory, IRelaySessionAwareDriverFactory\n{\n\tprivate readonly nonPersistentCache: INonPersistentCache = new NonPersistentCache();\n\tprivate readonly socketReferenceKeyPrefix?: string;\n\tprivate readonly hostPolicy: HostStoragePolicy;\n\tpublic readonly requestHeaders?: Readonly<Record<string, string>>;\n\n\tpublic get snapshotPrefetchResultCache(): PromiseCache<string, IPrefetchSnapshotContents> {\n\t\treturn this.nonPersistentCache.snapshotPrefetchResultCache;\n\t}\n\n\t// TODO: return `IRelaySessionAwareDriverFactory` instead of `this` (breaking change)\n\tpublic get IRelaySessionAwareDriverFactory(): this {\n\t\treturn this;\n\t}\n\n\t/**\n\t * This function would return info about relay service session only if this factory established (or attempted to\n\t * establish) connection very recently. Otherwise, it will return undefined.\n\t * @param resolvedUrl - resolved url for container\n\t * @returns The current join session response stored in cache. `undefined` if not present.\n\t */\n\tpublic async getRelayServiceSessionInfo(\n\t\tresolvedUrl: IResolvedUrl,\n\t): Promise<ISocketStorageDiscovery | undefined> {\n\t\tconst odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\t\tconst joinSessionResponse = await this.nonPersistentCache.sessionJoinCache.get(\n\t\t\tgetJoinSessionCacheKey(odspResolvedUrl),\n\t\t);\n\t\treturn joinSessionResponse?.joinSessionResponse;\n\t}\n\n\tpublic async createContainer(\n\t\tcreateNewSummary: ISummaryTree | undefined,\n\t\tcreateNewResolvedUrl: IResolvedUrl,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tclientIsSummarizer?: boolean,\n\t): Promise<IDocumentService> {\n\t\tconst odspResolvedUrl = getOdspResolvedUrl(createNewResolvedUrl);\n\t\tconst resolvedUrlData: IOdspUrlParts = {\n\t\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\t\tdriveId: odspResolvedUrl.driveId,\n\t\t\titemId: odspResolvedUrl.itemId,\n\t\t};\n\n\t\tlet fileInfo: INewFileInfo | IExistingFileInfo;\n\t\tlet createShareLinkParam: ISharingLinkKind | undefined;\n\t\tif (odspResolvedUrl.itemId) {\n\t\t\tfileInfo = {\n\t\t\t\ttype: \"Existing\",\n\t\t\t\tdriveId: odspResolvedUrl.driveId,\n\t\t\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\t\t\titemId: odspResolvedUrl.itemId,\n\t\t\t};\n\t\t} else if (odspResolvedUrl.fileName) {\n\t\t\tconst [, queryString] = odspResolvedUrl.url.split(\"?\");\n\t\t\tconst searchParams = new URLSearchParams(queryString);\n\t\t\tconst filePath = searchParams.get(\"path\");\n\t\t\tif (filePath === undefined || filePath === null) {\n\t\t\t\tthrow new Error(\"File path should be provided!!\");\n\t\t\t}\n\t\t\tcreateShareLinkParam = getSharingLinkParams(this.hostPolicy, searchParams);\n\t\t\tfileInfo = {\n\t\t\t\ttype: \"New\",\n\t\t\t\tdriveId: odspResolvedUrl.driveId,\n\t\t\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\t\t\tfilePath,\n\t\t\t\tfilename: odspResolvedUrl.fileName,\n\t\t\t\tcreateLinkType: createShareLinkParam,\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new Error(\"A new or existing file must be specified to create container!\");\n\t\t}\n\n\t\tif (isCombinedAppAndProtocolSummary(createNewSummary)) {\n\t\t\tconst documentAttributes = getDocAttributesFromProtocolSummary(\n\t\t\t\tcreateNewSummary.tree[\".protocol\"],\n\t\t\t);\n\t\t\tif (documentAttributes?.sequenceNumber !== 0) {\n\t\t\t\tthrow new Error(\"Seq number in detached ODSP container should be 0\");\n\t\t\t}\n\t\t}\n\n\t\tconst odspLogger = createOdspLogger(logger);\n\n\t\tconst fileEntry: IFileEntry = {\n\t\t\tresolvedUrl: odspResolvedUrl,\n\t\t\tdocId: odspResolvedUrl.hashedDocumentId,\n\t\t\tfileVersion: undefined,\n\t\t};\n\t\tconst cacheAndTracker = createOdspCacheAndTracker(\n\t\t\tthis.persistedCache,\n\t\t\tthis.nonPersistentCache,\n\t\t\tfileEntry,\n\t\t\todspLogger,\n\t\t\tclientIsSummarizer,\n\t\t\tthis.requestHeaders,\n\t\t);\n\n\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\todspLogger,\n\t\t\t{\n\t\t\t\teventName: \"CreateNew\",\n\t\t\t\tisWithSummaryUpload: true,\n\t\t\t\tcreateShareLinkParam: createShareLinkParam\n\t\t\t\t\t? JSON.stringify(createShareLinkParam)\n\t\t\t\t\t: undefined,\n\t\t\t\tenableSingleRequestForShareLinkWithCreate:\n\t\t\t\t\tthis.hostPolicy.enableSingleRequestForShareLinkWithCreate,\n\t\t\t},\n\t\t\tasync (event) => {\n\t\t\t\tconst getAuthHeader = toInstrumentedOdspStorageTokenFetcher(\n\t\t\t\t\todspLogger,\n\t\t\t\t\tresolvedUrlData,\n\t\t\t\t\tthis.getStorageToken,\n\t\t\t\t);\n\t\t\t\tconst _odspResolvedUrl = await useCreateNewModule(odspLogger, async (module) => {\n\t\t\t\t\treturn isNewFileInfo(fileInfo)\n\t\t\t\t\t\t? module.createNewFluidFile(\n\t\t\t\t\t\t\t\tgetAuthHeader,\n\t\t\t\t\t\t\t\tfileInfo,\n\t\t\t\t\t\t\t\todspLogger,\n\t\t\t\t\t\t\t\tcreateNewSummary,\n\t\t\t\t\t\t\t\tcacheAndTracker.epochTracker,\n\t\t\t\t\t\t\t\tfileEntry,\n\t\t\t\t\t\t\t\tthis.hostPolicy.cacheCreateNewSummary ?? true,\n\t\t\t\t\t\t\t\t!!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,\n\t\t\t\t\t\t\t\todspResolvedUrl.isClpCompliantApp,\n\t\t\t\t\t\t\t\tthis.hostPolicy.enableSingleRequestForShareLinkWithCreate,\n\t\t\t\t\t\t\t\todspResolvedUrl,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: module.createNewContainerOnExistingFile(\n\t\t\t\t\t\t\t\tgetAuthHeader,\n\t\t\t\t\t\t\t\tfileInfo,\n\t\t\t\t\t\t\t\todspLogger,\n\t\t\t\t\t\t\t\tcreateNewSummary,\n\t\t\t\t\t\t\t\tcacheAndTracker.epochTracker,\n\t\t\t\t\t\t\t\tfileEntry,\n\t\t\t\t\t\t\t\tthis.hostPolicy.cacheCreateNewSummary ?? true,\n\t\t\t\t\t\t\t\t!!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,\n\t\t\t\t\t\t\t\todspResolvedUrl.isClpCompliantApp,\n\t\t\t\t\t\t\t\todspResolvedUrl.fileMetadata?.eTag,\n\t\t\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tconst docService = this.createDocumentServiceCore(\n\t\t\t\t\t_odspResolvedUrl,\n\t\t\t\t\todspLogger,\n\t\t\t\t\tcacheAndTracker,\n\t\t\t\t\tclientIsSummarizer,\n\t\t\t\t);\n\t\t\t\tevent.end({\n\t\t\t\t\tdocId: _odspResolvedUrl.hashedDocumentId,\n\t\t\t\t});\n\t\t\t\treturn docService;\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * @param getStorageToken - function that can provide the storage token for a given site. This is\n\t * is also referred to as the \"Vroom\" token in SPO.\n\t * @param getWebsocketToken - function that can provide a token for accessing the web socket. This is also\n\t * to as the \"Push\" token in SPO. If undefined then websocket token is expected to be returned with joinSession\n\t * response payload.\n\t * @param persistedCache - PersistedCache provided by host for use in this session.\n\t * @param hostPolicy - Policy for storage provided by host.\n\t */\n\tconstructor(\n\t\tprivate readonly getStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>,\n\t\tprivate readonly getWebsocketToken:\n\t\t\t| TokenFetcher<OdspResourceTokenFetchOptions>\n\t\t\t| undefined,\n\t\tprotected persistedCache: IPersistedCache = new LocalPersistentCache(),\n\t\thostPolicy: HostStoragePolicy = {},\n\t) {\n\t\tthis.requestHeaders = copyRequestHeaders(hostPolicy.hostProvidedRequestHeaders);\n\t\tthis.hostPolicy =\n\t\t\tthis.requestHeaders === undefined\n\t\t\t\t? hostPolicy\n\t\t\t\t: { ...hostPolicy, hostProvidedRequestHeaders: this.requestHeaders };\n\t\tif (this.hostPolicy.isolateSocketCache === true || this.requestHeaders !== undefined) {\n\t\t\t// create the key to separate the socket reuse cache\n\t\t\tthis.socketReferenceKeyPrefix = uuid();\n\t\t}\n\t\t// Set enableRedeemFallback by default as true.\n\t\tthis.hostPolicy.enableRedeemFallback = this.hostPolicy.enableRedeemFallback ?? true;\n\t\tthis.hostPolicy.sessionOptions = {\n\t\t\tforceAccessTokenViaAuthorizationHeader: true,\n\t\t\t...this.hostPolicy.sessionOptions,\n\t\t};\n\t}\n\n\t/**\n\t * The compatibility details of the ODSP Driver layer that is exposed to the Loader layer\n\t * for validating Loader-Driver compatibility.\n\t * @remarks This is for internal use only.\n\t * The type of this should be ILayerCompatDetails. However, ILayerCompatDetails is internal and this class\n\t * is currently marked as legacy alpha. So, using unknown here.\n\t */\n\tpublic readonly ILayerCompatDetails?: unknown = odspDriverCompatDetailsForLoader;\n\n\t/**\n\t * The requirements that the Loader layer must meet to be compatible with this ODSP Driver. This is exposed to\n\t * the Loader layer so that it can validate Loader / Driver compatibility on this Driver's behalf (the Driver has\n\t * no reference to the Loader to validate it directly).\n\t * @remarks This is for internal use only.\n\t * The type of this should be ILayerCompatSupportRequirements. However, ILayerCompatSupportRequirements is\n\t * internal and this class is currently marked as legacy alpha. So, using unknown here.\n\t */\n\tpublic readonly ILayerCompatSupportRequirements?: unknown =\n\t\todspDriverCompatRequirementsForLoader;\n\n\tpublic async createDocumentService(\n\t\tresolvedUrl: IResolvedUrl,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tclientIsSummarizer?: boolean,\n\t): Promise<IDocumentService> {\n\t\treturn this.createDocumentServiceCore(\n\t\t\tresolvedUrl,\n\t\t\tcreateOdspLogger(logger),\n\t\t\tundefined,\n\t\t\tclientIsSummarizer,\n\t\t);\n\t}\n\n\t/**\n\t * Creates a document service that reads its snapshot from the closest file version at or before\n\t * the target and its deltas from the live document, materializing a requested sequence number\n\t * through replay.\n\t *\n\t * @param resolvedUrl - The resolved ODSP {@link @fluidframework/driver-definitions#IResolvedUrl}.\n\t * @param targetSequenceNumber - The sequence number at which to materialize the document. See\n\t * {@link @fluidframework/container-loader#ILoadContainerToSequenceNumberProps.loadToSequenceNumber}.\n\t * @param logger - Optional {@link @fluidframework/core-interfaces#ITelemetryBaseLogger}.\n\t * @param clientIsSummarizer - Whether to apply summarizer policies and telemetry to the\n\t * underlying document services. Defaults to `false`.\n\t * @returns A read-only {@link @fluidframework/driver-definitions#IDocumentService} materialized\n\t * at the requested sequence number.\n\t */\n\tpublic readonly createPointInTimeDocumentService?: IPointInTimeDocumentServiceFactory[\"createPointInTimeDocumentService\"];\n\n\tprotected async createDocumentServiceCore(\n\t\tresolvedUrl: IResolvedUrl,\n\t\todspLogger: ITelemetryBaseLogger,\n\t\tcacheAndTrackerArg?: ICacheAndTracker,\n\t\tclientIsSummarizer?: boolean,\n\t): Promise<IDocumentService> {\n\t\tconst extLogger = createChildLogger({ logger: odspLogger });\n\t\tconst odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\t\tconst resolvedUrlData: IOdspUrlParts = {\n\t\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\t\tdriveId: odspResolvedUrl.driveId,\n\t\t\titemId: odspResolvedUrl.itemId,\n\t\t};\n\n\t\tconst cacheAndTracker =\n\t\t\tcacheAndTrackerArg ??\n\t\t\tcreateOdspCacheAndTracker(\n\t\t\t\tthis.persistedCache,\n\t\t\t\tthis.nonPersistentCache,\n\t\t\t\t{\n\t\t\t\t\tresolvedUrl: odspResolvedUrl,\n\t\t\t\t\tdocId: odspResolvedUrl.hashedDocumentId,\n\t\t\t\t\tfileVersion: odspResolvedUrl.fileVersion,\n\t\t\t\t},\n\t\t\t\textLogger,\n\t\t\t\tclientIsSummarizer,\n\t\t\t\tthis.requestHeaders,\n\t\t\t);\n\n\t\tconst storageTokenFetcher = toInstrumentedOdspStorageTokenFetcher(\n\t\t\textLogger,\n\t\t\tresolvedUrlData,\n\t\t\tthis.getStorageToken,\n\t\t);\n\n\t\tconst webSocketTokenFetcher =\n\t\t\tthis.getWebsocketToken === undefined\n\t\t\t\t? undefined\n\t\t\t\t: async (options: TokenFetchOptions): Promise<string | null> =>\n\t\t\t\t\t\t// websocket expects a plain token\n\t\t\t\t\t\ttoInstrumentedOdspTokenFetcher(\n\t\t\t\t\t\t\textLogger,\n\t\t\t\t\t\t\tresolvedUrlData,\n\t\t\t\t\t\t\tthis.getWebsocketToken!,\n\t\t\t\t\t\t\tfalse /* throwOnNullToken */,\n\t\t\t\t\t\t\ttrue /* returnPlainToken */,\n\t\t\t\t\t\t)(options, \"GetWebsocketToken\");\n\n\t\treturn OdspDocumentService.create(\n\t\t\tresolvedUrl,\n\t\t\tstorageTokenFetcher,\n\t\t\twebSocketTokenFetcher,\n\t\t\textLogger,\n\t\t\tcacheAndTracker.cache,\n\t\t\tthis.hostPolicy,\n\t\t\tcacheAndTracker.epochTracker,\n\t\t\tthis.socketReferenceKeyPrefix,\n\t\t\tclientIsSummarizer,\n\t\t);\n\t}\n}\n\n/**\n * Extract the sharing link kind from the resolved URL's query paramerters\n */\nfunction getSharingLinkParams(\n\thostPolicy: HostStoragePolicy,\n\tsearchParams: URLSearchParams,\n): ISharingLinkKind | undefined {\n\t// extract request parameters for creation of sharing link (if provided) if the feature is enabled\n\tlet createShareLinkParam: ISharingLinkKind | undefined;\n\tif (hostPolicy.enableSingleRequestForShareLinkWithCreate) {\n\t\tconst createLinkScope = searchParams.get(\"createLinkScope\");\n\t\tconst createLinkRole = searchParams.get(\"createLinkRole\");\n\t\tif (createLinkScope && SharingLinkScope[createLinkScope]) {\n\t\t\tcreateShareLinkParam = {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tscope: SharingLinkScope[createLinkScope],\n\t\t\t\t...(createLinkRole && SharingLinkRole[createLinkRole]\n\t\t\t\t\t? // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\t\t{ role: SharingLinkRole[createLinkRole] }\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t}\n\t}\n\treturn createShareLinkParam;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"odspDocumentStorageManager.d.ts","sourceRoot":"","sources":["../src/odspDocumentStorageManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"odspDocumentStorageManager.d.ts","sourceRoot":"","sources":["../src/odspDocumentStorageManager.ts"],"names":[],"mappings":"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"}
@@ -178,7 +178,7 @@ class OdspDocumentStorageService extends odspDocumentStorageServiceBase_js_1.Ods
178
178
  let method;
179
179
  let prefetchWaitStartTime = (0, client_utils_1.performanceNow)();
180
180
  if (snapshotFetchOptions.fetchSource === internal_3.FetchSource.noCache) {
181
- retrievedSnapshot = await this.fetchSnapshotFromNetwork(hostSnapshotOptions, snapshotFetchOptions.loadingGroupIds, snapshotFetchOptions.scenarioName);
181
+ retrievedSnapshot = await this.fetchSnapshotFromNetwork(hostSnapshotOptions, snapshotFetchOptions.loadingGroupIds, snapshotFetchOptions.scenarioName, true /* avoidPrefetchSnapshotCache */);
182
182
  method = "networkOnly";
183
183
  }
184
184
  else {
@@ -235,7 +235,7 @@ class OdspDocumentStorageService extends odspDocumentStorageServiceBase_js_1.Ods
235
235
  if (this.firstSnapshotFetchCall &&
236
236
  this.hostPolicy.concurrentSnapshotFetch &&
237
237
  !this.hostPolicy.summarizerClient) {
238
- const networkSnapshotP = this.fetchSnapshotFromNetwork(hostSnapshotOptions, snapshotFetchOptions.loadingGroupIds, snapshotFetchOptions.scenarioName);
238
+ const networkSnapshotP = this.fetchSnapshotFromNetwork(hostSnapshotOptions, snapshotFetchOptions.loadingGroupIds, snapshotFetchOptions.scenarioName, false /* avoidPrefetchSnapshotCache */);
239
239
  // Ensure that failures on both paths are ignored initially.
240
240
  // I.e. if cache fails for some reason, we will proceed with network result.
241
241
  // And vice versa - if (for example) client is offline and network request fails first, we
@@ -285,7 +285,7 @@ class OdspDocumentStorageService extends odspDocumentStorageServiceBase_js_1.Ods
285
285
  method = retrievedSnapshot === undefined ? "network" : "cache";
286
286
  if (retrievedSnapshot === undefined) {
287
287
  prefetchWaitStartTime = (0, client_utils_1.performanceNow)();
288
- retrievedSnapshot = await this.fetchSnapshotFromNetwork(hostSnapshotOptions, snapshotFetchOptions.loadingGroupIds, snapshotFetchOptions.scenarioName);
288
+ retrievedSnapshot = await this.fetchSnapshotFromNetwork(hostSnapshotOptions, snapshotFetchOptions.loadingGroupIds, snapshotFetchOptions.scenarioName, false /* avoidPrefetchSnapshotCache */);
289
289
  }
290
290
  }
291
291
  }
@@ -374,8 +374,8 @@ class OdspDocumentStorageService extends odspDocumentStorageServiceBase_js_1.Ods
374
374
  });
375
375
  });
376
376
  }
377
- async fetchSnapshotFromNetwork(hostSnapshotOptions, loadingGroupIds, scenarioName) {
378
- return this.fetchSnapshotFromNetworkCore(hostSnapshotOptions, loadingGroupIds, scenarioName).catch((error) => {
377
+ async fetchSnapshotFromNetwork(hostSnapshotOptions, loadingGroupIds, scenarioName, avoidPrefetchSnapshotCache = false) {
378
+ return this.fetchSnapshotFromNetworkCore(hostSnapshotOptions, loadingGroupIds, scenarioName, avoidPrefetchSnapshotCache).catch((error) => {
379
379
  // Issue #5895:
380
380
  // If we are offline, this error is retryable. But that means that RetriableDocumentStorageService
381
381
  // will run in circles calling getSnapshotTree, which would result in OdspDocumentStorageService class
@@ -388,10 +388,10 @@ class OdspDocumentStorageService extends odspDocumentStorageServiceBase_js_1.Ods
388
388
  throw error;
389
389
  });
390
390
  }
391
- async fetchSnapshotFromNetworkCore(hostSnapshotOptions, loadingGroupIds, scenarioName) {
392
- // Don't look into cache, if the host specifically tells us so. Also, if request is
393
- // for initial snapshot, don't consult the prefetch cache.
394
- if (!this.hostPolicy.avoidPrefetchSnapshotCache && this.firstSnapshotFetchCall) {
391
+ async fetchSnapshotFromNetworkCore(hostSnapshotOptions, loadingGroupIds, scenarioName, avoidPrefetchSnapshotCache = false) {
392
+ if (!avoidPrefetchSnapshotCache &&
393
+ !this.hostPolicy.avoidPrefetchSnapshotCache &&
394
+ this.firstSnapshotFetchCall) {
395
395
  const prefetchCacheKey = (0, internal_4.getKeyForCacheEntry)((0, odspUtils_js_1.createCacheSnapshotKey)(this.odspResolvedUrl, (0, odspUtils_js_1.snapshotWithLoadingGroupIdSupported)(this.config)));
396
396
  const result = await this.cache.snapshotPrefetchResultCache
397
397
  ?.get(prefetchCacheKey)
@@ -437,7 +437,7 @@ class OdspDocumentStorageService extends odspDocumentStorageServiceBase_js_1.Ods
437
437
  };
438
438
  const removeEntries = async () => this.cache.persistedCache.removeEntries();
439
439
  try {
440
- const odspSnapshot = await (0, fetchSnapshot_js_1.fetchSnapshotWithRedeem)(this.odspResolvedUrl, this.getAuthHeader, snapshotOptions, this.logger, snapshotDownloader, putInCache, removeEntries, loadingGroupIds, this.hostPolicy.enableRedeemFallback);
440
+ const odspSnapshot = await (0, fetchSnapshot_js_1.fetchSnapshotWithRedeem)(this.odspResolvedUrl, this.getAuthHeader, snapshotOptions, this.logger, snapshotDownloader, putInCache, removeEntries, loadingGroupIds, this.hostPolicy.enableRedeemFallback, this.hostPolicy.hostProvidedRequestHeaders);
441
441
  return odspSnapshot;
442
442
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
443
443
  }
@@ -465,7 +465,7 @@ class OdspDocumentStorageService extends odspDocumentStorageServiceBase_js_1.Ods
465
465
  mds: undefined,
466
466
  timeout: undefined,
467
467
  };
468
- const odspSnapshot = await (0, fetchSnapshot_js_1.fetchSnapshotWithRedeem)(this.odspResolvedUrl, this.getAuthHeader, snapshotOptionsWithoutBlobs, this.logger, snapshotDownloader, putInCache, removeEntries, loadingGroupIds, this.hostPolicy.enableRedeemFallback);
468
+ const odspSnapshot = await (0, fetchSnapshot_js_1.fetchSnapshotWithRedeem)(this.odspResolvedUrl, this.getAuthHeader, snapshotOptionsWithoutBlobs, this.logger, snapshotDownloader, putInCache, removeEntries, loadingGroupIds, this.hostPolicy.enableRedeemFallback, this.hostPolicy.hostProvidedRequestHeaders);
469
469
  return odspSnapshot;
470
470
  }
471
471
  throw error;
@@ -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 { ArrayBufferLikeToArrayBuffer, 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\tgenerateStack,\n\ttype IConfigProvider,\n\tloggerToMonitoringContext,\n\tnormalizeError,\n\toverwriteStack,\n\tPerformanceEvent,\n\ttype TelemetryLoggerExt,\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: TelemetryLoggerExt,\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: ArrayBufferLikeToArrayBuffer(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\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\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\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 { ArrayBufferLikeToArrayBuffer, 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\tgenerateStack,\n\ttype IConfigProvider,\n\tloggerToMonitoringContext,\n\tnormalizeError,\n\toverwriteStack,\n\tPerformanceEvent,\n\ttype TelemetryLoggerExt,\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: TelemetryLoggerExt,\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: ArrayBufferLikeToArrayBuffer(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\ttrue /* avoidPrefetchSnapshotCache */,\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\tfalse /* avoidPrefetchSnapshotCache */,\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\tfalse /* avoidPrefetchSnapshotCache */,\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\tavoidPrefetchSnapshotCache: boolean = false,\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\tavoidPrefetchSnapshotCache,\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\tavoidPrefetchSnapshotCache: boolean = false,\n\t): Promise<ISnapshot | IPrefetchSnapshotContents> {\n\t\tif (\n\t\t\t!avoidPrefetchSnapshotCache &&\n\t\t\t!this.hostPolicy.avoidPrefetchSnapshotCache &&\n\t\t\tthis.firstSnapshotFetchCall\n\t\t) {\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\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\tthis.hostPolicy.hostProvidedRequestHeaders,\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\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\tthis.hostPolicy.hostProvidedRequestHeaders,\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\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"]}
@@ -20,6 +20,11 @@ export interface ShareLinkFetcherProps {
20
20
  * Identity type determining the shape of share link as it differs for Enterprise and Consumer users.
21
21
  */
22
22
  identityType: IdentityType;
23
+ /**
24
+ * Host-owned attribution metadata for ODSP requests made while resolving share links.
25
+ * Driver-owned headers take precedence on case-insensitive collisions.
26
+ */
27
+ requestHeaders?: Readonly<Record<string, string>>;
23
28
  }
24
29
  /**
25
30
  * Resolver to resolve urls like the ones created by createOdspUrl which is driver inner
@@ -1 +1 @@
1
- {"version":3,"file":"odspDriverUrlResolverForShareLink.d.ts","sourceRoot":"","sources":["../src/odspDriverUrlResolverForShareLink.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAEtF,OAAO,KAAK,EACX,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EACX,gBAAgB,EAChB,YAAY,EACZ,6BAA6B,EAC7B,YAAY,EACZ,MAAM,kDAAkD,CAAC;AAG1D,OAAO,EAAE,KAAK,yBAAyB,EAAqB,MAAM,sBAAsB,CAAC;AAgBzF;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACrC;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC,6BAA6B,CAAC,CAAC;IAC1D;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,qBAAa,iCAAkC,YAAW,YAAY;IAqBpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAI5B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAzBvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAoC;IAE1E;;;;;;;;;;;;OAYG;gBAEF,qBAAqB,CAAC,EAAE,qBAAqB,GAAG,SAAS,EACzD,MAAM,CAAC,EAAE,oBAAoB,EACZ,OAAO,CAAC,EAAE,MAAM,YAAA,EAChB,UAAU,CAAC,GAAE,CAC7B,WAAW,EAAE,gBAAgB,EAC7B,aAAa,EAAE,MAAM,KACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,aAAA,EACf,oBAAoB,CAAC,EAAE,qBAAqB,YAAA;IAW9D;;;OAGG;IACI,mBAAmB,CAAC,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IA4BrF,OAAO,CAAC,MAAM;IAId;;OAEG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+ClE,OAAO,CAAC,cAAc;YAQR,mBAAmB;IA+BjC;;;;;;;;OAQG;IACU,cAAc,CAC1B,WAAW,EAAE,YAAY,EACzB,aAAa,EAAE,MAAM,EACrB,iBAAiB,CAAC,EAAE,qBAAqB,GACvC,OAAO,CAAC,MAAM,CAAC;IAQlB;;;;;;;;;;OAUG;IACU,mBAAmB,CAC/B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,YAAY,EACzB,aAAa,EAAE,MAAM,EACrB,iBAAiB,CAAC,EAAE,qBAAqB,GACvC,OAAO,CAAC,MAAM,CAAC;IAwBlB;;OAEG;WACW,iBAAiB,CAC9B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,yBAAyB,GACnC,MAAM;CAOT"}
1
+ {"version":3,"file":"odspDriverUrlResolverForShareLink.d.ts","sourceRoot":"","sources":["../src/odspDriverUrlResolverForShareLink.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAEtF,OAAO,KAAK,EACX,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EACX,gBAAgB,EAChB,YAAY,EACZ,6BAA6B,EAC7B,YAAY,EACZ,MAAM,kDAAkD,CAAC;AAG1D,OAAO,EAAE,KAAK,yBAAyB,EAAqB,MAAM,sBAAsB,CAAC;AAiBzF;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACrC;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC,6BAA6B,CAAC,CAAC;IAC1D;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC;IAC3B;;;OAGG;IACH,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAClD;AAED;;;;;;GAMG;AACH,qBAAa,iCAAkC,YAAW,YAAY;IAqBpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAI5B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAzBvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAoC;IAE1E;;;;;;;;;;;;OAYG;gBAEF,qBAAqB,CAAC,EAAE,qBAAqB,GAAG,SAAS,EACzD,MAAM,CAAC,EAAE,oBAAoB,EACZ,OAAO,CAAC,EAAE,MAAM,YAAA,EAChB,UAAU,CAAC,GAAE,CAC7B,WAAW,EAAE,gBAAgB,EAC7B,aAAa,EAAE,MAAM,KACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,aAAA,EACf,oBAAoB,CAAC,EAAE,qBAAqB,YAAA;IAY9D;;;OAGG;IACI,mBAAmB,CAAC,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IA4BrF,OAAO,CAAC,MAAM;IAId;;OAEG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+ClE,OAAO,CAAC,cAAc;YAQR,mBAAmB;IAgCjC;;;;;;;;OAQG;IACU,cAAc,CAC1B,WAAW,EAAE,YAAY,EACzB,aAAa,EAAE,MAAM,EACrB,iBAAiB,CAAC,EAAE,qBAAqB,GACvC,OAAO,CAAC,MAAM,CAAC;IAQlB;;;;;;;;;;OAUG;IACU,mBAAmB,CAC/B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,YAAY,EACzB,aAAa,EAAE,MAAM,EACrB,iBAAiB,CAAC,EAAE,qBAAqB,GACvC,OAAO,CAAC,MAAM,CAAC;IAwBlB;;OAEG;WACW,iBAAiB,CAC9B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,yBAAyB,GACnC,MAAM;CAOT"}
@@ -9,6 +9,7 @@ const internal_1 = require("@fluidframework/core-utils/internal");
9
9
  const contractsPublic_js_1 = require("./contractsPublic.js");
10
10
  const createOdspUrl_js_1 = require("./createOdspUrl.js");
11
11
  const getFileLink_js_1 = require("./getFileLink.js");
12
+ const requestHeaders_js_1 = require("./requestHeaders.js");
12
13
  const odspDriverUrlResolver_js_1 = require("./odspDriverUrlResolver.js");
13
14
  const odspFluidFileLink_js_1 = require("./odspFluidFileLink.js");
14
15
  const odspUtils_js_1 = require("./odspUtils.js");
@@ -48,6 +49,7 @@ class OdspDriverUrlResolverForShareLink {
48
49
  this.shareLinkFetcherProps = {
49
50
  ...shareLinkFetcherProps,
50
51
  tokenFetcher: shareLinkFetcherProps.tokenFetcher,
52
+ requestHeaders: (0, requestHeaders_js_1.copyRequestHeaders)(shareLinkFetcherProps.requestHeaders),
51
53
  };
52
54
  }
53
55
  }
@@ -137,7 +139,7 @@ class OdspDriverUrlResolverForShareLink {
137
139
  if (cachedLinkPromise) {
138
140
  return cachedLinkPromise;
139
141
  }
140
- const newLinkPromise = (0, getFileLink_js_1.getFileLink)(this.shareLinkFetcherProps.tokenFetcher, resolvedUrl, this.logger).catch((error) => {
142
+ const newLinkPromise = (0, getFileLink_js_1.getFileLink)(this.shareLinkFetcherProps.tokenFetcher, resolvedUrl, this.logger, this.shareLinkFetcherProps.requestHeaders).catch((error) => {
141
143
  // This should imply that error is a non-retriable error.
142
144
  this.logger.sendErrorEvent({ eventName: "FluidFileUrlError" }, error);
143
145
  this.sharingLinkCache.remove(key);