@fluidframework/odsp-driver 0.55.0 → 0.56.1

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 (134) hide show
  1. package/dist/checkUrl.d.ts.map +1 -1
  2. package/dist/checkUrl.js +0 -1
  3. package/dist/checkUrl.js.map +1 -1
  4. package/dist/contractsPublic.d.ts +7 -1
  5. package/dist/contractsPublic.d.ts.map +1 -1
  6. package/dist/contractsPublic.js +7 -1
  7. package/dist/contractsPublic.js.map +1 -1
  8. package/dist/createFile.d.ts +3 -3
  9. package/dist/createFile.d.ts.map +1 -1
  10. package/dist/createFile.js +7 -7
  11. package/dist/createFile.js.map +1 -1
  12. package/dist/epochTracker.d.ts +3 -3
  13. package/dist/epochTracker.d.ts.map +1 -1
  14. package/dist/epochTracker.js +20 -8
  15. package/dist/epochTracker.js.map +1 -1
  16. package/dist/fetchSnapshot.d.ts +3 -2
  17. package/dist/fetchSnapshot.d.ts.map +1 -1
  18. package/dist/fetchSnapshot.js +28 -16
  19. package/dist/fetchSnapshot.js.map +1 -1
  20. package/dist/getFileLink.js +4 -4
  21. package/dist/getFileLink.js.map +1 -1
  22. package/dist/getUrlAndHeadersWithAuth.d.ts +1 -1
  23. package/dist/getUrlAndHeadersWithAuth.d.ts.map +1 -1
  24. package/dist/getUrlAndHeadersWithAuth.js +20 -33
  25. package/dist/getUrlAndHeadersWithAuth.js.map +1 -1
  26. package/dist/odspDeltaStorageService.d.ts.map +1 -1
  27. package/dist/odspDeltaStorageService.js +1 -4
  28. package/dist/odspDeltaStorageService.js.map +1 -1
  29. package/dist/odspDocumentServiceFactoryCore.d.ts.map +1 -1
  30. package/dist/odspDocumentServiceFactoryCore.js +2 -2
  31. package/dist/odspDocumentServiceFactoryCore.js.map +1 -1
  32. package/dist/odspDocumentStorageManager.d.ts +1 -0
  33. package/dist/odspDocumentStorageManager.d.ts.map +1 -1
  34. package/dist/odspDocumentStorageManager.js +16 -9
  35. package/dist/odspDocumentStorageManager.js.map +1 -1
  36. package/dist/odspDriverUrlResolver.d.ts.map +1 -1
  37. package/dist/odspDriverUrlResolver.js +5 -2
  38. package/dist/odspDriverUrlResolver.js.map +1 -1
  39. package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  40. package/dist/odspDriverUrlResolverForShareLink.js +1 -2
  41. package/dist/odspDriverUrlResolverForShareLink.js.map +1 -1
  42. package/dist/odspSummaryUploadManager.d.ts +2 -1
  43. package/dist/odspSummaryUploadManager.d.ts.map +1 -1
  44. package/dist/odspSummaryUploadManager.js +3 -2
  45. package/dist/odspSummaryUploadManager.js.map +1 -1
  46. package/dist/odspUtils.d.ts.map +1 -1
  47. package/dist/odspUtils.js +4 -1
  48. package/dist/odspUtils.js.map +1 -1
  49. package/dist/packageVersion.d.ts +1 -1
  50. package/dist/packageVersion.js +1 -1
  51. package/dist/packageVersion.js.map +1 -1
  52. package/dist/prefetchLatestSnapshot.d.ts +2 -1
  53. package/dist/prefetchLatestSnapshot.d.ts.map +1 -1
  54. package/dist/prefetchLatestSnapshot.js +3 -2
  55. package/dist/prefetchLatestSnapshot.js.map +1 -1
  56. package/dist/retryErrorsStorageAdapter.d.ts +1 -1
  57. package/dist/retryErrorsStorageAdapter.d.ts.map +1 -1
  58. package/dist/retryErrorsStorageAdapter.js.map +1 -1
  59. package/lib/checkUrl.d.ts.map +1 -1
  60. package/lib/checkUrl.js +0 -1
  61. package/lib/checkUrl.js.map +1 -1
  62. package/lib/contractsPublic.d.ts +7 -1
  63. package/lib/contractsPublic.d.ts.map +1 -1
  64. package/lib/contractsPublic.js +6 -0
  65. package/lib/contractsPublic.js.map +1 -1
  66. package/lib/createFile.d.ts +3 -3
  67. package/lib/createFile.d.ts.map +1 -1
  68. package/lib/createFile.js +7 -7
  69. package/lib/createFile.js.map +1 -1
  70. package/lib/epochTracker.d.ts +3 -3
  71. package/lib/epochTracker.d.ts.map +1 -1
  72. package/lib/epochTracker.js +21 -9
  73. package/lib/epochTracker.js.map +1 -1
  74. package/lib/fetchSnapshot.d.ts +3 -2
  75. package/lib/fetchSnapshot.d.ts.map +1 -1
  76. package/lib/fetchSnapshot.js +28 -16
  77. package/lib/fetchSnapshot.js.map +1 -1
  78. package/lib/getFileLink.js +4 -4
  79. package/lib/getFileLink.js.map +1 -1
  80. package/lib/getUrlAndHeadersWithAuth.d.ts +1 -1
  81. package/lib/getUrlAndHeadersWithAuth.d.ts.map +1 -1
  82. package/lib/getUrlAndHeadersWithAuth.js +20 -33
  83. package/lib/getUrlAndHeadersWithAuth.js.map +1 -1
  84. package/lib/odspDeltaStorageService.d.ts.map +1 -1
  85. package/lib/odspDeltaStorageService.js +1 -4
  86. package/lib/odspDeltaStorageService.js.map +1 -1
  87. package/lib/odspDocumentServiceFactoryCore.d.ts.map +1 -1
  88. package/lib/odspDocumentServiceFactoryCore.js +2 -2
  89. package/lib/odspDocumentServiceFactoryCore.js.map +1 -1
  90. package/lib/odspDocumentStorageManager.d.ts +1 -0
  91. package/lib/odspDocumentStorageManager.d.ts.map +1 -1
  92. package/lib/odspDocumentStorageManager.js +16 -9
  93. package/lib/odspDocumentStorageManager.js.map +1 -1
  94. package/lib/odspDriverUrlResolver.d.ts.map +1 -1
  95. package/lib/odspDriverUrlResolver.js +5 -2
  96. package/lib/odspDriverUrlResolver.js.map +1 -1
  97. package/lib/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  98. package/lib/odspDriverUrlResolverForShareLink.js +1 -2
  99. package/lib/odspDriverUrlResolverForShareLink.js.map +1 -1
  100. package/lib/odspSummaryUploadManager.d.ts +2 -1
  101. package/lib/odspSummaryUploadManager.d.ts.map +1 -1
  102. package/lib/odspSummaryUploadManager.js +3 -2
  103. package/lib/odspSummaryUploadManager.js.map +1 -1
  104. package/lib/odspUtils.d.ts.map +1 -1
  105. package/lib/odspUtils.js +5 -2
  106. package/lib/odspUtils.js.map +1 -1
  107. package/lib/packageVersion.d.ts +1 -1
  108. package/lib/packageVersion.js +1 -1
  109. package/lib/packageVersion.js.map +1 -1
  110. package/lib/prefetchLatestSnapshot.d.ts +2 -1
  111. package/lib/prefetchLatestSnapshot.d.ts.map +1 -1
  112. package/lib/prefetchLatestSnapshot.js +3 -2
  113. package/lib/prefetchLatestSnapshot.js.map +1 -1
  114. package/lib/retryErrorsStorageAdapter.d.ts +1 -1
  115. package/lib/retryErrorsStorageAdapter.d.ts.map +1 -1
  116. package/lib/retryErrorsStorageAdapter.js.map +1 -1
  117. package/package.json +9 -9
  118. package/src/checkUrl.ts +0 -1
  119. package/src/contractsPublic.ts +11 -1
  120. package/src/createFile.ts +16 -4
  121. package/src/epochTracker.ts +21 -6
  122. package/src/fetchSnapshot.ts +33 -16
  123. package/src/getFileLink.ts +7 -2
  124. package/src/getUrlAndHeadersWithAuth.ts +24 -38
  125. package/src/odspDeltaStorageService.ts +1 -3
  126. package/src/odspDocumentServiceFactoryCore.ts +1 -0
  127. package/src/odspDocumentStorageManager.ts +39 -8
  128. package/src/odspDriverUrlResolver.ts +3 -0
  129. package/src/odspDriverUrlResolverForShareLink.ts +1 -2
  130. package/src/odspSummaryUploadManager.ts +6 -1
  131. package/src/odspUtils.ts +13 -3
  132. package/src/packageVersion.ts +1 -1
  133. package/src/prefetchLatestSnapshot.ts +3 -0
  134. package/src/retryErrorsStorageAdapter.ts +1 -1
@@ -40,7 +40,7 @@ import {
40
40
  getWithRetryForTokenRefresh,
41
41
  ISnapshotContents,
42
42
  } from "./odspUtils";
43
- import { EpochTracker } from "./epochTracker";
43
+ import { defaultCacheExpiryTimeoutMs, EpochTracker } from "./epochTracker";
44
44
  import { OdspSummaryUploadManager } from "./odspSummaryUploadManager";
45
45
  import { FlushResult } from "./odspDocumentDeltaConnection";
46
46
 
@@ -167,6 +167,7 @@ export class OdspDocumentStorageService implements IDocumentStorageService {
167
167
  // Note that duplication of content should not have significant impact for bytes over wire as
168
168
  // compression of http payload mostly takes care of it, but it does impact storage size and in-memory sizes.
169
169
  minBlobSize: 2048,
170
+ maximumCacheDurationMs: defaultCacheExpiryTimeoutMs,
170
171
  };
171
172
 
172
173
  private readonly commitCache: Map<string, api.ISnapshotTree> = new Map();
@@ -224,7 +225,13 @@ export class OdspDocumentStorageService implements IDocumentStorageService {
224
225
  this.snapshotUrl = this.odspResolvedUrl.endpoints.snapshotStorageUrl;
225
226
  this.attachmentPOSTUrl = this.odspResolvedUrl.endpoints.attachmentPOSTStorageUrl;
226
227
  this.attachmentGETUrl = this.odspResolvedUrl.endpoints.attachmentGETStorageUrl;
227
- this.odspSummaryUploadManager = new OdspSummaryUploadManager(this.snapshotUrl, getStorageToken, logger, epochTracker);
228
+ this.odspSummaryUploadManager = new OdspSummaryUploadManager(
229
+ this.snapshotUrl,
230
+ getStorageToken,
231
+ logger,
232
+ epochTracker,
233
+ !!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,
234
+ );
228
235
  }
229
236
 
230
237
  public get repositoryUrl(): string {
@@ -236,7 +243,11 @@ export class OdspDocumentStorageService implements IDocumentStorageService {
236
243
 
237
244
  const response = await getWithRetryForTokenRefresh(async (options) => {
238
245
  const storageToken = await this.getStorageToken(options, "CreateBlob");
239
- const { url, headers } = getUrlAndHeadersWithAuth(`${this.attachmentPOSTUrl}/content`, storageToken);
246
+ const { url, headers } = getUrlAndHeadersWithAuth(
247
+ `${this.attachmentPOSTUrl}/content`,
248
+ storageToken,
249
+ !!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,
250
+ );
240
251
  headers["Content-Type"] = "application/octet-stream";
241
252
 
242
253
  return PerformanceEvent.timedExecAsync(
@@ -279,7 +290,11 @@ export class OdspDocumentStorageService implements IDocumentStorageService {
279
290
  blob = await getWithRetryForTokenRefresh(async (options) => {
280
291
  const storageToken = await this.getStorageToken(options, "GetBlob");
281
292
  const unAuthedUrl = `${this.attachmentGETUrl}/${encodeURIComponent(blobId)}/content`;
282
- const { url, headers } = getUrlAndHeadersWithAuth(unAuthedUrl, storageToken);
293
+ const { url, headers } = getUrlAndHeadersWithAuth(
294
+ unAuthedUrl,
295
+ storageToken,
296
+ !!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,
297
+ );
283
298
 
284
299
  return PerformanceEvent.timedExecAsync(
285
300
  this.logger,
@@ -495,7 +510,11 @@ export class OdspDocumentStorageService implements IDocumentStorageService {
495
510
 
496
511
  return getWithRetryForTokenRefresh(async (options) => {
497
512
  const storageToken = await this.getStorageToken(options, "GetVersions");
498
- const { url, headers } = getUrlAndHeadersWithAuth(`${this.snapshotUrl}/versions?count=${count}`, storageToken);
513
+ const { url, headers } = getUrlAndHeadersWithAuth(
514
+ `${this.snapshotUrl}/versions?count=${count}`,
515
+ storageToken,
516
+ !!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,
517
+ );
499
518
 
500
519
  // Fetch the latest snapshot versions for the document
501
520
  const response = await PerformanceEvent.timedExecAsync(
@@ -594,11 +613,13 @@ export class OdspDocumentStorageService implements IDocumentStorageService {
594
613
  this.odspResolvedUrl,
595
614
  this.getStorageToken,
596
615
  snapshotOptions,
616
+ !!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,
597
617
  this.logger,
598
618
  snapshotDownloader,
599
619
  putInCache,
600
620
  removeEntries,
601
- this.hostPolicy.enableRedeemFallback);
621
+ this.hostPolicy.enableRedeemFallback,
622
+ );
602
623
  return odspSnapshot;
603
624
  } catch (error) {
604
625
  const errorType = error.errorType;
@@ -617,11 +638,13 @@ export class OdspDocumentStorageService implements IDocumentStorageService {
617
638
  this.odspResolvedUrl,
618
639
  this.getStorageToken,
619
640
  snapshotOptionsWithoutBlobs,
641
+ !!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,
620
642
  this.logger,
621
643
  snapshotDownloader,
622
644
  putInCache,
623
645
  removeEntries,
624
- this.hostPolicy.enableRedeemFallback);
646
+ this.hostPolicy.enableRedeemFallback,
647
+ );
625
648
  return odspSnapshot;
626
649
  }
627
650
  throw error;
@@ -729,7 +752,15 @@ export class OdspDocumentStorageService implements IDocumentStorageService {
729
752
  "snapshotTree",
730
753
  );
731
754
  };
732
- const snapshot = await fetchSnapshot(this.snapshotUrl!, storageToken, id, this.fetchFullSnapshot, this.logger, snapshotDownloader);
755
+ const snapshot = await fetchSnapshot(
756
+ this.snapshotUrl!,
757
+ storageToken,
758
+ id,
759
+ this.fetchFullSnapshot,
760
+ !!this.hostPolicy.sessionOptions?.forceAccessTokenViaAuthorizationHeader,
761
+ this.logger,
762
+ snapshotDownloader,
763
+ );
733
764
  let treeId = "";
734
765
  if (snapshot.snapshotTree) {
735
766
  assert(snapshot.snapshotTree.id !== undefined, 0x222 /* "Root tree should contain the id!!" */);
@@ -11,6 +11,7 @@ import { createOdspUrl } from "./createOdspUrl";
11
11
  import { getApiRoot } from "./odspUrlHelper";
12
12
  import { getOdspResolvedUrl } from "./odspUtils";
13
13
  import { getHashedDocumentId } from "./odspPublicUtils";
14
+ import { ClpCompliantAppHeader } from "./contractsPublic";
14
15
 
15
16
  function getUrlBase(siteUrl: string, driveId: string, itemId: string, fileVersion?: string) {
16
17
  const siteOrigin = new URL(siteUrl).origin;
@@ -101,6 +102,7 @@ export class OdspDriverUrlResolver implements IUrlResolver {
101
102
  },
102
103
  fileVersion: undefined,
103
104
  shareLinkInfo,
105
+ isClpCompliantApp: request.headers?.[ClpCompliantAppHeader.isClpCompliantApp],
104
106
  };
105
107
  }
106
108
  const { siteUrl, driveId, itemId, path, containerPackageName, fileVersion } = decodeOdspUrl(request.url);
@@ -142,6 +144,7 @@ export class OdspDriverUrlResolver implements IUrlResolver {
142
144
  containerPackageName,
143
145
  },
144
146
  fileVersion,
147
+ isClpCompliantApp: request.headers?.[ClpCompliantAppHeader.isClpCompliantApp],
145
148
  };
146
149
  }
147
150
 
@@ -133,9 +133,8 @@ export class OdspDriverUrlResolverForShareLink implements IUrlResolver {
133
133
  // We need to remove the nav param if set by host when setting the sharelink as otherwise the shareLinkId
134
134
  // when redeeming the share link during the redeem fallback for trees latest call becomes greater than
135
135
  // the eligible length.
136
- odspResolvedUrl.sharingLinkToRedeem = this.removeNavParam(request.url);
137
136
  odspResolvedUrl.shareLinkInfo = Object.assign(odspResolvedUrl.shareLinkInfo || {},
138
- {sharingLinkToRedeem: odspResolvedUrl.sharingLinkToRedeem});
137
+ {sharingLinkToRedeem: this.removeNavParam(request.url)});
139
138
  }
140
139
  if (odspResolvedUrl.itemId) {
141
140
  // Kick start the sharing link request if we don't have it already as a performance optimization.
@@ -38,6 +38,7 @@ export class OdspSummaryUploadManager {
38
38
  private readonly getStorageToken: InstrumentedStorageTokenFetcher,
39
39
  logger: ITelemetryLogger,
40
40
  private readonly epochTracker: EpochTracker,
41
+ private readonly forceAccessTokenViaAuthorizationHeader: boolean,
41
42
  ) {
42
43
  this.mc = loggerToMonitoringContext(logger);
43
44
  }
@@ -84,7 +85,11 @@ export class OdspSummaryUploadManager {
84
85
  return getWithRetryForTokenRefresh(async (options) => {
85
86
  const storageToken = await this.getStorageToken(options, "WriteSummaryTree");
86
87
 
87
- const { url, headers } = getUrlAndHeadersWithAuth(`${this.snapshotUrl}/snapshot`, storageToken);
88
+ const { url, headers } = getUrlAndHeadersWithAuth(
89
+ `${this.snapshotUrl}/snapshot`,
90
+ storageToken,
91
+ this.forceAccessTokenViaAuthorizationHeader,
92
+ );
88
93
  headers["Content-Type"] = "application/json";
89
94
  if (parentHandle) {
90
95
  headers["If-Match"] = `fluid:containerid=${parentHandle}`;
package/src/odspUtils.ts CHANGED
@@ -5,7 +5,13 @@
5
5
 
6
6
  import { ITelemetryProperties, ITelemetryBaseLogger, ITelemetryLogger } from "@fluidframework/common-definitions";
7
7
  import { IResolvedUrl, DriverErrorType } from "@fluidframework/driver-definitions";
8
- import { isOnline, OnlineStatus, RetryableError, NonRetryableError } from "@fluidframework/driver-utils";
8
+ import {
9
+ isOnline,
10
+ OnlineStatus,
11
+ RetryableError,
12
+ NonRetryableError,
13
+ NetworkErrorBasic,
14
+ } from "@fluidframework/driver-utils";
9
15
  import { assert, performance } from "@fluidframework/common-utils";
10
16
  import { ISequencedDocumentMessage, ISnapshotTree } from "@fluidframework/protocol-definitions";
11
17
  import { ChildLogger, PerformanceEvent, wrapError } from "@fluidframework/telemetry-utils";
@@ -302,13 +308,17 @@ export function toInstrumentedOdspTokenFetcher(
302
308
  }
303
309
  return token;
304
310
  }, (error) => {
311
+ // There is an important but unofficial contract here where token providers can set canRetry: true
312
+ // to hook into the driver's retry logic (e.g. the retry loop when initiating a connection)
313
+ const rawCanRetry = error?.canRetry;
305
314
  const tokenError = wrapError(
306
315
  error,
307
- (errorMessage) => new NonRetryableError(
316
+ (errorMessage) => new NetworkErrorBasic(
308
317
  "tokenFetcherFailed",
309
318
  errorMessage,
310
319
  OdspErrorType.fetchTokenError,
311
- { method: name }));
320
+ typeof rawCanRetry === "boolean" ? rawCanRetry : false /* canRetry */,
321
+ { method: name, driverVersion: pkgVersion }));
312
322
  throw tokenError;
313
323
  }),
314
324
  { cancel: "generic" });
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/odsp-driver";
9
- export const pkgVersion = "0.55.0";
9
+ export const pkgVersion = "0.56.1";
@@ -31,6 +31,7 @@ import { IVersionedValueWithEpoch } from "./contracts";
31
31
  * @param getStorageToken - function that can provide the storage token for a given site. This is
32
32
  * is also referred to as the "VROOM" token in SPO.
33
33
  * @param persistedCache - Cache to store the fetched snapshot.
34
+ * @param forceAccessTokenViaAuthorizationHeader - whether to force passing given token via authorization header.
34
35
  * @param logger - Logger to have telemetry events.
35
36
  * @param hostSnapshotFetchOptions - Options to fetch the snapshot if any. Otherwise default will be used.
36
37
  * @param enableRedeemFallback - True to have the sharing link redeem fallback in case the Trees Latest/Redeem
@@ -42,6 +43,7 @@ export async function prefetchLatestSnapshot(
42
43
  resolvedUrl: IResolvedUrl,
43
44
  getStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>,
44
45
  persistedCache: IPersistedCache,
46
+ forceAccessTokenViaAuthorizationHeader: boolean,
45
47
  logger: ITelemetryBaseLogger,
46
48
  hostSnapshotFetchOptions: ISnapshotOptions | undefined,
47
49
  enableRedeemFallback?: boolean,
@@ -84,6 +86,7 @@ export async function prefetchLatestSnapshot(
84
86
  odspResolvedUrl,
85
87
  storageTokenFetcher,
86
88
  hostSnapshotFetchOptions,
89
+ forceAccessTokenViaAuthorizationHeader,
87
90
  odspLogger,
88
91
  snapshotDownloader,
89
92
  putInCache,
@@ -54,7 +54,7 @@ export class RetryErrorsStorageAdapter implements IDocumentStorageService, IDisp
54
54
  );
55
55
  }
56
56
 
57
- public async getVersions(versionId: string, count: number): Promise<IVersion[]> {
57
+ public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {
58
58
  return this.runWithRetry(
59
59
  async () => this.internalStorageService.getVersions(versionId, count),
60
60
  "storage_getVersions",