@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
@@ -4,16 +4,45 @@
4
4
  */
5
5
 
6
6
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
7
- import type {
8
- IClient,
9
- IDocumentDeltaConnection,
10
- IDocumentDeltaStorageService,
11
- IDocumentService,
12
- IDocumentServiceEvents,
13
- IDocumentServicePolicies,
14
- IDocumentStorageService,
15
- IResolvedUrl,
7
+ import {
8
+ FetchSource,
9
+ type IClient,
10
+ type IDocumentDeltaConnection,
11
+ type IDocumentDeltaStorageService,
12
+ type IDocumentService,
13
+ type IDocumentServiceEvents,
14
+ type IDocumentServicePolicies,
15
+ type IDocumentStorageService,
16
+ type IResolvedUrl,
17
+ type ISnapshot,
18
+ type ISnapshotFetchOptions,
19
+ type IVersion,
16
20
  } from "@fluidframework/driver-definitions/internal";
21
+ import { DocumentStorageServiceProxy } from "@fluidframework/driver-utils/internal";
22
+
23
+ /**
24
+ * Forces point-in-time snapshot reads to bypass caches while forwarding all other storage operations
25
+ * to the selected historical document service.
26
+ */
27
+ class PointInTimeDocumentStorageService extends DocumentStorageServiceProxy {
28
+ public override async getSnapshot(
29
+ snapshotFetchOptions?: ISnapshotFetchOptions,
30
+ ): Promise<ISnapshot> {
31
+ return super.getSnapshot({
32
+ ...snapshotFetchOptions,
33
+ fetchSource: FetchSource.noCache,
34
+ });
35
+ }
36
+
37
+ public override async getVersions(
38
+ // eslint-disable-next-line @rushstack/no-new-null -- IDocumentStorageService is a legacy API that requires null.
39
+ versionId: string | null,
40
+ count: number,
41
+ scenarioName?: string,
42
+ ): Promise<IVersion[]> {
43
+ return super.getVersions(versionId, count, scenarioName, FetchSource.noCache);
44
+ }
45
+ }
17
46
 
18
47
  /**
19
48
  * A read-only document service that materializes a document at a target sequence number by combining
@@ -64,7 +93,8 @@ export class OdspPointInTimeDocumentService
64
93
  }
65
94
 
66
95
  public async connectToStorage(): Promise<IDocumentStorageService> {
67
- return this.recoverableDocumentService.connectToStorage();
96
+ const storage = await this.recoverableDocumentService.connectToStorage();
97
+ return new PointInTimeDocumentStorageService(storage);
68
98
  }
69
99
 
70
100
  public async connectToDeltaStorage(): Promise<IDocumentDeltaStorageService> {
@@ -113,6 +113,9 @@ export async function prefetchLatestSnapshot(
113
113
  odspLogger,
114
114
  undefined,
115
115
  controller,
116
+ undefined,
117
+ undefined,
118
+ odspDocumentServiceFactory?.requestHeaders,
116
119
  );
117
120
  };
118
121
  const snapshotKey = createCacheSnapshotKey(odspResolvedUrl, useGroupIdsForSnapshotFetch);
@@ -150,6 +153,7 @@ export async function prefetchLatestSnapshot(
150
153
  removeEntries,
151
154
  loadingGroupIds,
152
155
  enableRedeemFallback,
156
+ odspDocumentServiceFactory?.requestHeaders,
153
157
  )
154
158
  .then(async (value) => {
155
159
  assert(!!snapshotEpoch, 0x585 /* prefetched snapshot should have a valid epoch */);
@@ -0,0 +1,56 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ const driverOwnedHeaderNames = new Set([
7
+ "authorization",
8
+ "content-type",
9
+ "x-fluid-epoch",
10
+ "x-http-method-override",
11
+ "x-requeststats",
12
+ ]);
13
+
14
+ /**
15
+ * Creates an immutable snapshot of host-provided per-session headers after removing names owned by
16
+ * the ODSP driver. The factory, URL resolver, epoch tracker, and Socket.IO connection use the
17
+ * returned value so later host mutations cannot change an active document session or override
18
+ * authentication and protocol headers.
19
+ */
20
+ export function copyRequestHeaders(
21
+ requestHeaders: Readonly<Record<string, string>> | undefined,
22
+ ): Readonly<Record<string, string>> | undefined {
23
+ if (requestHeaders === undefined || Object.keys(requestHeaders).length === 0) {
24
+ return undefined;
25
+ }
26
+ const copiedHeaders = Object.fromEntries(
27
+ Object.entries(requestHeaders).filter(
28
+ ([name]) => !driverOwnedHeaderNames.has(name.toLowerCase()),
29
+ ),
30
+ );
31
+ return Object.keys(copiedHeaders).length === 0 ? undefined : Object.freeze(copiedHeaders);
32
+ }
33
+
34
+ /**
35
+ * Adds sanitized host headers to one ODSP request. Request-specific headers are applied last, so
36
+ * driver-generated values win case-insensitive collisions. ODSP fetch paths use this helper for
37
+ * snapshot, delta, blob, share-link, file-link, and version requests; Socket.IO applies the copied
38
+ * headers separately as Node.js `extraHeaders`.
39
+ */
40
+ export function mergeRequestHeaders(
41
+ hostHeaders: Readonly<Record<string, string>> | undefined,
42
+ requestHeaders: HeadersInit | undefined,
43
+ ): HeadersInit | undefined {
44
+ const safeHostHeaders = copyRequestHeaders(hostHeaders);
45
+ if (safeHostHeaders === undefined) {
46
+ return requestHeaders;
47
+ }
48
+
49
+ const merged = new Headers(safeHostHeaders);
50
+ if (requestHeaders !== undefined) {
51
+ for (const [key, value] of new Headers(requestHeaders)) {
52
+ merged.set(key, value);
53
+ }
54
+ }
55
+ return Object.fromEntries(merged);
56
+ }