@fluidframework/odsp-driver 2.117.0 → 3.0.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.
- package/CHANGELOG.md +92 -2
- package/README.md +53 -50
- package/api-extractor/api-extractor-lint-pointInTime.cjs.json +5 -0
- package/api-extractor/api-extractor-lint-pointInTime.esm.json +5 -0
- package/{api-extractor.json → api-extractor/api-extractor-model.json} +1 -1
- package/api-extractor/api-extractor-report.pointInTime.json +9 -0
- package/api-report/odsp-driver.legacy.alpha.api.md +28 -3
- package/api-report/odsp-driver.legacy.beta.api.md +28 -3
- package/api-report/odsp-driver.point-in-time.legacy.beta.api.md +117 -0
- package/dist/ReadBufferUtils.js +2 -1
- package/dist/ReadBufferUtils.js.map +1 -1
- package/dist/WriteBufferUtils.js +4 -6
- package/dist/WriteBufferUtils.js.map +1 -1
- package/dist/checkUrl.js +1 -2
- package/dist/checkUrl.js.map +1 -1
- package/dist/compactSnapshotParser.d.ts.map +1 -1
- package/dist/compactSnapshotParser.js +5 -4
- package/dist/compactSnapshotParser.js.map +1 -1
- package/dist/compactSnapshotWriter.js +1 -2
- package/dist/compactSnapshotWriter.js.map +1 -1
- package/dist/createFile/createFile.js +4 -5
- package/dist/createFile/createFile.js.map +1 -1
- package/dist/createFile/createNewContainerOnExistingFile.js +1 -2
- package/dist/createFile/createNewContainerOnExistingFile.js.map +1 -1
- package/dist/createFile/createNewUtils.d.ts.map +1 -1
- package/dist/createFile/createNewUtils.js +4 -5
- package/dist/createFile/createNewUtils.js.map +1 -1
- package/dist/createFile/index.js +1 -2
- package/dist/createFile/index.js.map +1 -1
- package/dist/createOdspCreateContainerRequest.js +1 -2
- package/dist/createOdspCreateContainerRequest.js.map +1 -1
- package/dist/createOdspUrl.js +1 -2
- package/dist/createOdspUrl.js.map +1 -1
- package/dist/epochTracker.d.ts.map +1 -1
- package/dist/epochTracker.js +17 -6
- package/dist/epochTracker.js.map +1 -1
- package/dist/fetchSnapshot.d.ts.map +1 -1
- package/dist/fetchSnapshot.js +5 -5
- package/dist/fetchSnapshot.js.map +1 -1
- package/dist/getFileLink.d.ts.map +1 -1
- package/dist/getQueryString.js +1 -2
- package/dist/getQueryString.js.map +1 -1
- package/dist/getUrlAndHeadersWithAuth.js +1 -2
- package/dist/getUrlAndHeadersWithAuth.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +4 -1
- package/dist/legacyAlpha.d.ts +4 -1
- package/dist/localOdspDriver/localOdspDeltaStorageService.js +2 -0
- package/dist/localOdspDriver/localOdspDeltaStorageService.js.map +1 -1
- package/dist/localOdspDriver/localOdspDocumentService.js +5 -1
- package/dist/localOdspDriver/localOdspDocumentService.js.map +1 -1
- package/dist/localOdspDriver/localOdspDocumentServiceFactory.js +2 -1
- package/dist/localOdspDriver/localOdspDocumentServiceFactory.js.map +1 -1
- package/dist/localOdspDriver/localOdspDocumentStorageManager.js +4 -1
- package/dist/localOdspDriver/localOdspDocumentStorageManager.js.map +1 -1
- package/dist/mockify.js +2 -2
- package/dist/mockify.js.map +1 -1
- package/dist/odspCache.js +7 -8
- package/dist/odspCache.js.map +1 -1
- package/dist/odspDelayLoadedDeltaStream.d.ts.map +1 -1
- package/dist/odspDelayLoadedDeltaStream.js +42 -26
- package/dist/odspDelayLoadedDeltaStream.js.map +1 -1
- package/dist/odspDeltaStorageService.js +14 -1
- package/dist/odspDeltaStorageService.js.map +1 -1
- package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
- package/dist/odspDocumentDeltaConnection.js +58 -41
- package/dist/odspDocumentDeltaConnection.js.map +1 -1
- package/dist/odspDocumentService.js +16 -1
- package/dist/odspDocumentService.js.map +1 -1
- package/dist/odspDocumentServiceFactory.d.ts +30 -1
- package/dist/odspDocumentServiceFactory.d.ts.map +1 -1
- package/dist/odspDocumentServiceFactory.js +30 -2
- package/dist/odspDocumentServiceFactory.js.map +1 -1
- package/dist/odspDocumentServiceFactoryCore.d.ts +83 -3
- package/dist/odspDocumentServiceFactoryCore.d.ts.map +1 -1
- package/dist/odspDocumentServiceFactoryCore.js +38 -12
- package/dist/odspDocumentServiceFactoryCore.js.map +1 -1
- package/dist/odspDocumentStorageManager.d.ts.map +1 -1
- package/dist/odspDocumentStorageManager.js +31 -13
- package/dist/odspDocumentStorageManager.js.map +1 -1
- package/dist/odspDocumentStorageServiceBase.js +23 -20
- package/dist/odspDocumentStorageServiceBase.js.map +1 -1
- package/dist/odspDriverUrlResolver.js +2 -2
- package/dist/odspDriverUrlResolver.js.map +1 -1
- package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
- package/dist/odspDriverUrlResolverForShareLink.js +6 -1
- package/dist/odspDriverUrlResolverForShareLink.js.map +1 -1
- package/dist/odspError.js +1 -2
- package/dist/odspError.js.map +1 -1
- package/dist/odspFluidFileLink.js +4 -4
- package/dist/odspFluidFileLink.js.map +1 -1
- package/dist/odspLayerCompatState.d.ts +8 -1
- package/dist/odspLayerCompatState.d.ts.map +1 -1
- package/dist/odspLayerCompatState.js +20 -1
- package/dist/odspLayerCompatState.js.map +1 -1
- package/dist/odspLocationRedirection.js +1 -2
- package/dist/odspLocationRedirection.js.map +1 -1
- package/dist/odspPublicUtils.js +1 -2
- package/dist/odspPublicUtils.js.map +1 -1
- package/dist/odspSnapshotParser.js +1 -2
- package/dist/odspSnapshotParser.js.map +1 -1
- package/dist/odspSummaryUploadManager.js +7 -0
- package/dist/odspSummaryUploadManager.js.map +1 -1
- package/dist/odspUrlHelper.js +6 -7
- package/dist/odspUrlHelper.js.map +1 -1
- package/dist/odspUtils.d.ts.map +1 -1
- package/dist/odspUtils.js +21 -21
- package/dist/odspUtils.js.map +1 -1
- package/dist/odspVersionManager/odspFileVersionFetcher.js +1 -2
- package/dist/odspVersionManager/odspFileVersionFetcher.js.map +1 -1
- package/dist/odspVersionManager/odspVersionManager.js +9 -8
- package/dist/odspVersionManager/odspVersionManager.js.map +1 -1
- package/dist/opsCaching.js +7 -1
- package/dist/opsCaching.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pointInTime.d.ts +15 -0
- package/dist/pointInTime.d.ts.map +1 -0
- package/dist/pointInTime.js +16 -0
- package/dist/pointInTime.js.map +1 -0
- package/dist/pointInTimeDriver/createPointInTimeDocumentService.d.ts +34 -0
- package/dist/pointInTimeDriver/createPointInTimeDocumentService.d.ts.map +1 -0
- package/dist/pointInTimeDriver/createPointInTimeDocumentService.js +101 -0
- package/dist/pointInTimeDriver/createPointInTimeDocumentService.js.map +1 -0
- package/dist/pointInTimeDriver/odspPointInTimeDocumentService.js +10 -6
- package/dist/pointInTimeDriver/odspPointInTimeDocumentService.js.map +1 -1
- package/dist/prefetchLatestSnapshot.js +1 -2
- package/dist/prefetchLatestSnapshot.js.map +1 -1
- package/dist/retryErrorsStorageAdapter.js +3 -1
- package/dist/retryErrorsStorageAdapter.js.map +1 -1
- package/dist/retryUtils.js +1 -2
- package/dist/retryUtils.js.map +1 -1
- package/dist/vroom.d.ts.map +1 -1
- package/dist/zipItDataRepresentationUtils.d.ts.map +1 -1
- package/dist/zipItDataRepresentationUtils.js +20 -15
- package/dist/zipItDataRepresentationUtils.js.map +1 -1
- package/lib/ReadBufferUtils.js +2 -1
- package/lib/ReadBufferUtils.js.map +1 -1
- package/lib/WriteBufferUtils.js +2 -4
- package/lib/WriteBufferUtils.js.map +1 -1
- package/lib/compactSnapshotParser.d.ts.map +1 -1
- package/lib/compactSnapshotParser.js +3 -2
- package/lib/compactSnapshotParser.js.map +1 -1
- package/lib/createFile/createNewUtils.d.ts.map +1 -1
- package/lib/createFile/createNewUtils.js +2 -2
- package/lib/createFile/createNewUtils.js.map +1 -1
- package/lib/epochTracker.d.ts.map +1 -1
- package/lib/epochTracker.js +15 -4
- package/lib/epochTracker.js.map +1 -1
- package/lib/fetchSnapshot.d.ts.map +1 -1
- package/lib/getFileLink.d.ts.map +1 -1
- package/lib/index.d.ts +3 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -6
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +5 -2
- package/lib/legacyAlpha.d.ts +5 -2
- package/lib/localOdspDriver/localOdspDeltaStorageService.js +2 -0
- package/lib/localOdspDriver/localOdspDeltaStorageService.js.map +1 -1
- package/lib/localOdspDriver/localOdspDocumentService.js +5 -1
- package/lib/localOdspDriver/localOdspDocumentService.js.map +1 -1
- package/lib/localOdspDriver/localOdspDocumentServiceFactory.js +2 -1
- package/lib/localOdspDriver/localOdspDocumentServiceFactory.js.map +1 -1
- package/lib/localOdspDriver/localOdspDocumentStorageManager.js +4 -1
- package/lib/localOdspDriver/localOdspDocumentStorageManager.js.map +1 -1
- package/lib/odspCache.js +7 -8
- package/lib/odspCache.js.map +1 -1
- package/lib/odspDelayLoadedDeltaStream.d.ts.map +1 -1
- package/lib/odspDelayLoadedDeltaStream.js +42 -26
- package/lib/odspDelayLoadedDeltaStream.js.map +1 -1
- package/lib/odspDeltaStorageService.js +14 -1
- package/lib/odspDeltaStorageService.js.map +1 -1
- package/lib/odspDocumentDeltaConnection.d.ts.map +1 -1
- package/lib/odspDocumentDeltaConnection.js +58 -41
- package/lib/odspDocumentDeltaConnection.js.map +1 -1
- package/lib/odspDocumentService.js +16 -1
- package/lib/odspDocumentService.js.map +1 -1
- package/lib/odspDocumentServiceFactory.d.ts +30 -1
- package/lib/odspDocumentServiceFactory.d.ts.map +1 -1
- package/lib/odspDocumentServiceFactory.js +28 -1
- package/lib/odspDocumentServiceFactory.js.map +1 -1
- package/lib/odspDocumentServiceFactoryCore.d.ts +83 -3
- package/lib/odspDocumentServiceFactoryCore.d.ts.map +1 -1
- package/lib/odspDocumentServiceFactoryCore.js +39 -13
- package/lib/odspDocumentServiceFactoryCore.js.map +1 -1
- package/lib/odspDocumentStorageManager.d.ts.map +1 -1
- package/lib/odspDocumentStorageManager.js +32 -14
- package/lib/odspDocumentStorageManager.js.map +1 -1
- package/lib/odspDocumentStorageServiceBase.js +23 -20
- package/lib/odspDocumentStorageServiceBase.js.map +1 -1
- package/lib/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
- package/lib/odspDriverUrlResolverForShareLink.js +6 -1
- package/lib/odspDriverUrlResolverForShareLink.js.map +1 -1
- package/lib/odspLayerCompatState.d.ts +8 -1
- package/lib/odspLayerCompatState.d.ts.map +1 -1
- package/lib/odspLayerCompatState.js +20 -1
- package/lib/odspLayerCompatState.js.map +1 -1
- package/lib/odspSummaryUploadManager.js +7 -0
- package/lib/odspSummaryUploadManager.js.map +1 -1
- package/lib/odspUtils.d.ts.map +1 -1
- package/lib/odspVersionManager/odspVersionManager.js +7 -6
- package/lib/odspVersionManager/odspVersionManager.js.map +1 -1
- package/lib/opsCaching.js +7 -1
- package/lib/opsCaching.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pointInTime.d.ts +15 -0
- package/lib/pointInTime.d.ts.map +1 -0
- package/lib/pointInTime.js +12 -0
- package/lib/pointInTime.js.map +1 -0
- package/lib/pointInTimeDriver/createPointInTimeDocumentService.d.ts +34 -0
- package/lib/pointInTimeDriver/createPointInTimeDocumentService.d.ts.map +1 -0
- package/lib/pointInTimeDriver/createPointInTimeDocumentService.js +99 -0
- package/lib/pointInTimeDriver/createPointInTimeDocumentService.js.map +1 -0
- package/lib/pointInTimeDriver/odspPointInTimeDocumentService.js +10 -6
- package/lib/pointInTimeDriver/odspPointInTimeDocumentService.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/retryErrorsStorageAdapter.js +3 -1
- package/lib/retryErrorsStorageAdapter.js.map +1 -1
- package/lib/vroom.d.ts.map +1 -1
- package/lib/zipItDataRepresentationUtils.d.ts.map +1 -1
- package/lib/zipItDataRepresentationUtils.js +10 -5
- package/lib/zipItDataRepresentationUtils.js.map +1 -1
- package/package.json +49 -54
- package/src/compactSnapshotParser.ts +6 -2
- package/src/createFile/createNewUtils.ts +6 -2
- package/src/index.ts +10 -6
- package/src/odspDocumentServiceFactory.ts +69 -1
- package/src/odspDocumentServiceFactoryCore.ts +105 -4
- package/src/odspDocumentStorageManager.ts +2 -2
- package/src/odspLayerCompatState.ts +29 -1
- package/src/odspVersionManager/DEV.md +9 -8
- package/src/packageVersion.ts +1 -1
- package/src/pointInTime.ts +30 -0
- package/src/pointInTimeDriver/createPointInTimeDocumentService.ts +193 -0
- package/src/zipItDataRepresentationUtils.ts +3 -3
- package/tsconfig.json +1 -1
- package/dist/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.d.ts +0 -41
- package/dist/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.d.ts.map +0 -1
- package/dist/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.js +0 -132
- package/dist/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.js.map +0 -1
- package/internal.d.ts +0 -11
- package/legacy/alpha.d.ts +0 -11
- package/legacy.d.ts +0 -11
- package/lib/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.d.ts +0 -41
- package/lib/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.d.ts.map +0 -1
- package/lib/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.js +0 -128
- package/lib/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.js.map +0 -1
- package/src/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.ts +0 -260
- /package/api-extractor/{api-extractor.current.json → api-extractor-report.current.json} +0 -0
- /package/api-extractor/{api-extractor.legacy.json → api-extractor-report.legacy.json} +0 -0
package/src/index.ts
CHANGED
|
@@ -27,15 +27,16 @@ export { prefetchLatestSnapshot } from "./prefetchLatestSnapshot.js";
|
|
|
27
27
|
// Factory
|
|
28
28
|
export {
|
|
29
29
|
createLocalOdspDocumentServiceFactory,
|
|
30
|
+
createOdspDocumentServiceFactory,
|
|
31
|
+
type IOdspDocumentServiceFactoryOptions,
|
|
30
32
|
OdspDocumentServiceFactory,
|
|
31
33
|
} from "./odspDocumentServiceFactory.js";
|
|
32
|
-
export { OdspDocumentServiceFactoryCore } from "./odspDocumentServiceFactoryCore.js";
|
|
33
|
-
/* eslint-disable import-x/no-internal-modules */
|
|
34
34
|
export {
|
|
35
|
-
|
|
35
|
+
type IOdspPointInTimeDocumentServiceImplementationProps,
|
|
36
36
|
type IPointInTimeDocumentServiceFactory,
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
type OdspPointInTimeDocumentServiceImplementation,
|
|
38
|
+
OdspDocumentServiceFactoryCore,
|
|
39
|
+
} from "./odspDocumentServiceFactoryCore.js";
|
|
39
40
|
|
|
40
41
|
// File creation
|
|
41
42
|
export { createOdspCreateContainerRequest } from "./createOdspCreateContainerRequest.js";
|
|
@@ -75,4 +76,7 @@ export {
|
|
|
75
76
|
} from "./compactSnapshotParser.js";
|
|
76
77
|
|
|
77
78
|
// Layer Compat details
|
|
78
|
-
export {
|
|
79
|
+
export {
|
|
80
|
+
odspDriverCompatDetailsForLoader,
|
|
81
|
+
odspDriverCompatRequirementsForLoader,
|
|
82
|
+
} from "./odspLayerCompatState.js";
|
|
@@ -15,7 +15,35 @@ import type {
|
|
|
15
15
|
|
|
16
16
|
// eslint-disable-next-line import-x/no-internal-modules
|
|
17
17
|
import { LocalOdspDocumentServiceFactory } from "./localOdspDriver/localOdspDocumentServiceFactory.js";
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
type IPointInTimeDocumentServiceFactory,
|
|
20
|
+
type OdspPointInTimeDocumentServiceImplementation,
|
|
21
|
+
OdspDocumentServiceFactoryCore,
|
|
22
|
+
} from "./odspDocumentServiceFactoryCore.js";
|
|
23
|
+
import { LocalPersistentCache } from "./odspCache.js";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Options for creating an ODSP document service factory.
|
|
27
|
+
*
|
|
28
|
+
* @legacy @beta
|
|
29
|
+
*/
|
|
30
|
+
export interface IOdspDocumentServiceFactoryOptions {
|
|
31
|
+
/** Fetches storage access tokens. */
|
|
32
|
+
readonly getStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>;
|
|
33
|
+
/** Fetches websocket access tokens, or `undefined` when unavailable. */
|
|
34
|
+
readonly getWebsocketToken: TokenFetcher<OdspResourceTokenFetchOptions> | undefined;
|
|
35
|
+
/** Persisted ODSP cache. When omitted, a local in-memory cache is used. */
|
|
36
|
+
readonly persistedCache?: IPersistedCache | undefined;
|
|
37
|
+
/** Host storage policy. When omitted, the default driver policies are used. */
|
|
38
|
+
readonly hostPolicy?: HostStoragePolicy | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Enables point-in-time loading. Consumers that omit this implementation do not include the
|
|
41
|
+
* feature code in their dependency graph.
|
|
42
|
+
*/
|
|
43
|
+
readonly pointInTimeDocumentServiceImplementation?:
|
|
44
|
+
| OdspPointInTimeDocumentServiceImplementation
|
|
45
|
+
| undefined;
|
|
46
|
+
}
|
|
19
47
|
|
|
20
48
|
/**
|
|
21
49
|
* Factory for creating the sharepoint document service. Use this if you want to
|
|
@@ -34,6 +62,46 @@ export class OdspDocumentServiceFactory extends OdspDocumentServiceFactoryCore {
|
|
|
34
62
|
}
|
|
35
63
|
}
|
|
36
64
|
|
|
65
|
+
/**
|
|
66
|
+
* Creates an ODSP document service factory with optional consumer-provided features.
|
|
67
|
+
*
|
|
68
|
+
* @param options - Tokens, cache, host policy, and optional feature implementations.
|
|
69
|
+
* @returns The configured ODSP document service factory.
|
|
70
|
+
*
|
|
71
|
+
* @legacy @beta
|
|
72
|
+
*/
|
|
73
|
+
export function createOdspDocumentServiceFactory(
|
|
74
|
+
options: IOdspDocumentServiceFactoryOptions,
|
|
75
|
+
): OdspDocumentServiceFactory {
|
|
76
|
+
const persistedCache = options.persistedCache ?? new LocalPersistentCache();
|
|
77
|
+
const pointInTimeImplementation = options.pointInTimeDocumentServiceImplementation;
|
|
78
|
+
|
|
79
|
+
class ConfiguredOdspDocumentServiceFactory extends OdspDocumentServiceFactory {
|
|
80
|
+
public override readonly createPointInTimeDocumentService:
|
|
81
|
+
| IPointInTimeDocumentServiceFactory["createPointInTimeDocumentService"]
|
|
82
|
+
| undefined =
|
|
83
|
+
pointInTimeImplementation === undefined
|
|
84
|
+
? undefined
|
|
85
|
+
: async (resolvedUrl, targetSequenceNumber, logger, clientIsSummarizer) =>
|
|
86
|
+
pointInTimeImplementation({
|
|
87
|
+
resolvedUrl,
|
|
88
|
+
targetSequenceNumber,
|
|
89
|
+
logger,
|
|
90
|
+
clientIsSummarizer,
|
|
91
|
+
persistedCache,
|
|
92
|
+
getStorageToken: options.getStorageToken,
|
|
93
|
+
createDocumentService: async (url, odspLogger, cacheAndTracker, isSummarizer) =>
|
|
94
|
+
this.createDocumentServiceCore(url, odspLogger, cacheAndTracker, isSummarizer),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return new ConfiguredOdspDocumentServiceFactory(
|
|
99
|
+
options.getStorageToken,
|
|
100
|
+
options.getWebsocketToken,
|
|
101
|
+
persistedCache,
|
|
102
|
+
options.hostPolicy,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
37
105
|
/**
|
|
38
106
|
* Creates a factory instance for creating a sharepoint document service from a provided snapshot.
|
|
39
107
|
*
|
|
@@ -41,7 +41,10 @@ import {
|
|
|
41
41
|
NonPersistentCache,
|
|
42
42
|
} from "./odspCache.js";
|
|
43
43
|
import { OdspDocumentService } from "./odspDocumentService.js";
|
|
44
|
-
import {
|
|
44
|
+
import {
|
|
45
|
+
odspDriverCompatDetailsForLoader,
|
|
46
|
+
odspDriverCompatRequirementsForLoader,
|
|
47
|
+
} from "./odspLayerCompatState.js";
|
|
45
48
|
import {
|
|
46
49
|
type IExistingFileInfo,
|
|
47
50
|
type INewFileInfo,
|
|
@@ -53,12 +56,83 @@ import {
|
|
|
53
56
|
toInstrumentedOdspTokenFetcher,
|
|
54
57
|
} from "./odspUtils.js";
|
|
55
58
|
|
|
59
|
+
/**
|
|
60
|
+
* An ODSP document service factory that supports point-in-time (sequence-number-based) loading.
|
|
61
|
+
*
|
|
62
|
+
* @remarks
|
|
63
|
+
* The loader detects this capability structurally, so hosts can pass this factory directly to
|
|
64
|
+
* {@link @fluidframework/container-loader#loadContainerToSequenceNumber}.
|
|
65
|
+
*
|
|
66
|
+
* @legacy @beta
|
|
67
|
+
*/
|
|
68
|
+
export interface IPointInTimeDocumentServiceFactory extends IDocumentServiceFactory {
|
|
69
|
+
/**
|
|
70
|
+
* Creates a document service that materializes the document at the requested sequence number.
|
|
71
|
+
*
|
|
72
|
+
* @param resolvedUrl - The resolved ODSP {@link @fluidframework/driver-definitions#IResolvedUrl}.
|
|
73
|
+
* @param targetSequenceNumber - The sequence number at which to materialize the document. See
|
|
74
|
+
* {@link @fluidframework/container-loader#ILoadContainerToSequenceNumberProps.loadToSequenceNumber}.
|
|
75
|
+
* @param logger - Optional {@link @fluidframework/core-interfaces#ITelemetryBaseLogger}.
|
|
76
|
+
* @param clientIsSummarizer - Whether to apply summarizer policies and telemetry to the
|
|
77
|
+
* underlying document services. Defaults to `false`.
|
|
78
|
+
* @returns A read-only {@link @fluidframework/driver-definitions#IDocumentService} materialized
|
|
79
|
+
* at the requested sequence number.
|
|
80
|
+
*/
|
|
81
|
+
createPointInTimeDocumentService(
|
|
82
|
+
resolvedUrl: IResolvedUrl,
|
|
83
|
+
targetSequenceNumber: number,
|
|
84
|
+
logger?: ITelemetryBaseLogger,
|
|
85
|
+
clientIsSummarizer?: boolean,
|
|
86
|
+
): Promise<IDocumentService>;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Inputs supplied by the ODSP document service factory to an injected point-in-time implementation.
|
|
91
|
+
*
|
|
92
|
+
* @legacy @beta
|
|
93
|
+
*/
|
|
94
|
+
export interface IOdspPointInTimeDocumentServiceImplementationProps {
|
|
95
|
+
/** The resolved ODSP URL for the document to materialize. */
|
|
96
|
+
readonly resolvedUrl: IResolvedUrl;
|
|
97
|
+
/** The sequence number at which to materialize the document. */
|
|
98
|
+
readonly targetSequenceNumber: number;
|
|
99
|
+
/** Optional telemetry logger for the point-in-time load. */
|
|
100
|
+
readonly logger?: ITelemetryBaseLogger;
|
|
101
|
+
/** Whether to apply summarizer policies and telemetry. Defaults to `false`. */
|
|
102
|
+
readonly clientIsSummarizer?: boolean;
|
|
103
|
+
/** The persisted ODSP cache supplied to the document service factory. */
|
|
104
|
+
readonly persistedCache: IPersistedCache;
|
|
105
|
+
/** Fetches storage access tokens for ODSP requests. */
|
|
106
|
+
readonly getStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>;
|
|
107
|
+
/**
|
|
108
|
+
* Creates an ODSP document service for a resolved URL.
|
|
109
|
+
*
|
|
110
|
+
* @param resolvedUrl - The resolved URL for the document or file version to load.
|
|
111
|
+
* @param logger - The telemetry logger for the document service.
|
|
112
|
+
* @param cacheAndTracker - The cache and epoch tracker shared by the point-in-time load.
|
|
113
|
+
* @param clientIsSummarizer - Whether to apply summarizer policies and telemetry.
|
|
114
|
+
* @returns The document service for the resolved URL.
|
|
115
|
+
*/
|
|
116
|
+
readonly createDocumentService: (
|
|
117
|
+
resolvedUrl: IResolvedUrl,
|
|
118
|
+
logger: ITelemetryBaseLogger,
|
|
119
|
+
cacheAndTracker: ICacheAndTracker,
|
|
120
|
+
clientIsSummarizer?: boolean,
|
|
121
|
+
) => Promise<IDocumentService>;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Consumer-provided implementation of ODSP point-in-time loading.
|
|
126
|
+
*
|
|
127
|
+
* @legacy @beta
|
|
128
|
+
*/
|
|
129
|
+
export type OdspPointInTimeDocumentServiceImplementation = (
|
|
130
|
+
props: IOdspPointInTimeDocumentServiceImplementationProps,
|
|
131
|
+
) => Promise<IDocumentService>;
|
|
132
|
+
|
|
56
133
|
/**
|
|
57
134
|
* Factory for creating the sharepoint document service. Use this if you want to
|
|
58
135
|
* use the sharepoint implementation.
|
|
59
|
-
*
|
|
60
|
-
* This constructor should be used by environments that support dynamic imports and that wish
|
|
61
|
-
* to leverage code splitting as a means to keep bundles as small as possible.
|
|
62
136
|
* @legacy
|
|
63
137
|
* @beta
|
|
64
138
|
*/
|
|
@@ -256,6 +330,17 @@ export class OdspDocumentServiceFactoryCore
|
|
|
256
330
|
*/
|
|
257
331
|
public readonly ILayerCompatDetails?: unknown = odspDriverCompatDetailsForLoader;
|
|
258
332
|
|
|
333
|
+
/**
|
|
334
|
+
* The requirements that the Loader layer must meet to be compatible with this ODSP Driver. This is exposed to
|
|
335
|
+
* the Loader layer so that it can validate Loader / Driver compatibility on this Driver's behalf (the Driver has
|
|
336
|
+
* no reference to the Loader to validate it directly).
|
|
337
|
+
* @remarks This is for internal use only.
|
|
338
|
+
* The type of this should be ILayerCompatSupportRequirements. However, ILayerCompatSupportRequirements is
|
|
339
|
+
* internal and this class is currently marked as legacy alpha. So, using unknown here.
|
|
340
|
+
*/
|
|
341
|
+
public readonly ILayerCompatSupportRequirements?: unknown =
|
|
342
|
+
odspDriverCompatRequirementsForLoader;
|
|
343
|
+
|
|
259
344
|
public async createDocumentService(
|
|
260
345
|
resolvedUrl: IResolvedUrl,
|
|
261
346
|
logger?: ITelemetryBaseLogger,
|
|
@@ -269,6 +354,22 @@ export class OdspDocumentServiceFactoryCore
|
|
|
269
354
|
);
|
|
270
355
|
}
|
|
271
356
|
|
|
357
|
+
/**
|
|
358
|
+
* Creates a document service that reads its snapshot from the closest file version at or before
|
|
359
|
+
* the target and its deltas from the live document, materializing a requested sequence number
|
|
360
|
+
* through replay.
|
|
361
|
+
*
|
|
362
|
+
* @param resolvedUrl - The resolved ODSP {@link @fluidframework/driver-definitions#IResolvedUrl}.
|
|
363
|
+
* @param targetSequenceNumber - The sequence number at which to materialize the document. See
|
|
364
|
+
* {@link @fluidframework/container-loader#ILoadContainerToSequenceNumberProps.loadToSequenceNumber}.
|
|
365
|
+
* @param logger - Optional {@link @fluidframework/core-interfaces#ITelemetryBaseLogger}.
|
|
366
|
+
* @param clientIsSummarizer - Whether to apply summarizer policies and telemetry to the
|
|
367
|
+
* underlying document services. Defaults to `false`.
|
|
368
|
+
* @returns A read-only {@link @fluidframework/driver-definitions#IDocumentService} materialized
|
|
369
|
+
* at the requested sequence number.
|
|
370
|
+
*/
|
|
371
|
+
public readonly createPointInTimeDocumentService?: IPointInTimeDocumentServiceFactory["createPointInTimeDocumentService"];
|
|
372
|
+
|
|
272
373
|
protected async createDocumentServiceCore(
|
|
273
374
|
resolvedUrl: IResolvedUrl,
|
|
274
375
|
odspLogger: ITelemetryBaseLogger,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { performanceNow } from "@fluid-internal/client-utils";
|
|
6
|
+
import { ArrayBufferLikeToArrayBuffer, performanceNow } from "@fluid-internal/client-utils";
|
|
7
7
|
import { LogLevel } from "@fluidframework/core-interfaces";
|
|
8
8
|
import { assert, delay } from "@fluidframework/core-utils/internal";
|
|
9
9
|
import { promiseRaceWithWinner } from "@fluidframework/driver-base/internal";
|
|
@@ -158,7 +158,7 @@ export class OdspDocumentStorageService extends OdspDocumentStorageServiceBase {
|
|
|
158
158
|
this.epochTracker.fetchAndParseAsJSON<ICreateBlobResponse>(
|
|
159
159
|
url,
|
|
160
160
|
{
|
|
161
|
-
body: file,
|
|
161
|
+
body: ArrayBufferLikeToArrayBuffer(file),
|
|
162
162
|
headers,
|
|
163
163
|
method,
|
|
164
164
|
},
|
|
@@ -3,7 +3,12 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
generation,
|
|
8
|
+
LayerCompatibilityPolicyWindowMonths,
|
|
9
|
+
type ILayerCompatDetails,
|
|
10
|
+
type ILayerCompatSupportRequirements,
|
|
11
|
+
} from "@fluid-internal/client-utils";
|
|
7
12
|
|
|
8
13
|
import { pkgVersion } from "./packageVersion.js";
|
|
9
14
|
|
|
@@ -25,3 +30,26 @@ export const odspDriverCompatDetailsForLoader: ILayerCompatDetails = {
|
|
|
25
30
|
*/
|
|
26
31
|
supportedFeatures: new Set<string>(),
|
|
27
32
|
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The requirements that the Loader layer must meet to be compatible with this ODSP Driver. This is published to
|
|
36
|
+
* the Loader layer (which holds the reference to this Driver) so that it can validate Loader / Driver compatibility
|
|
37
|
+
* on this Driver's behalf.
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
export const odspDriverCompatRequirementsForLoader: ILayerCompatSupportRequirements = {
|
|
41
|
+
/**
|
|
42
|
+
* Minimum generation that Loader must be at to be compatible with this Driver. This is calculated based on the
|
|
43
|
+
* LayerCompatibilityPolicyWindowMonths.NewDriverOldLoader value which defines how many months old can the Loader
|
|
44
|
+
* layer be compared to the Driver layer for them to still be considered compatible.
|
|
45
|
+
* The minimum valid generation value is 0.
|
|
46
|
+
*/
|
|
47
|
+
minSupportedGeneration: Math.max(
|
|
48
|
+
0,
|
|
49
|
+
generation - LayerCompatibilityPolicyWindowMonths.NewDriverOldLoader,
|
|
50
|
+
),
|
|
51
|
+
/**
|
|
52
|
+
* The features that the Loader must support to be compatible with this Driver.
|
|
53
|
+
*/
|
|
54
|
+
requiredFeatures: [],
|
|
55
|
+
};
|
|
@@ -36,8 +36,8 @@ Part 1 is built in three components:
|
|
|
36
36
|
- **Component A — the version manager**: choose which file version to load or replay from. **This
|
|
37
37
|
folder is Component A**, and this document is mostly about it.
|
|
38
38
|
- **Component B — the recomposed driver**: load the chosen version and replay ops forward to the exact
|
|
39
|
-
target. **Built** in `../pointInTimeDriver
|
|
40
|
-
`
|
|
39
|
+
target. **Built** in `../pointInTimeDriver/`, exported through the consumer-injected
|
|
40
|
+
`../pointInTime.ts` entrypoint — see [Part V](#part-v--components-b--c-as-built).
|
|
41
41
|
- **Component C — the loader hookup**: expose Component B through the container loader. **Built** in
|
|
42
42
|
`@fluidframework/container-loader` (`loadContainerToSequenceNumber`) — see
|
|
43
43
|
[Part V](#part-v--components-b--c-as-built). This is the current prototype-era package
|
|
@@ -556,9 +556,10 @@ is what ships today.
|
|
|
556
556
|
|
|
557
557
|
### Component B — how does the recomposed driver materialize the target?
|
|
558
558
|
|
|
559
|
-
The
|
|
560
|
-
|
|
561
|
-
`createPointInTimeDocumentService(resolvedUrl, targetSequenceNumber)
|
|
559
|
+
The host imports `createPointInTimeDocumentService` from the dedicated point-in-time entrypoint and
|
|
560
|
+
injects it through `createOdspDocumentServiceFactory`. The returned factory exposes the optional
|
|
561
|
+
`createPointInTimeDocumentService(resolvedUrl, targetSequenceNumber)` capability as a thin delegate.
|
|
562
|
+
The injected implementation:
|
|
562
563
|
|
|
563
564
|
1. Build a version manager (Component A), sharing the single `EpochTracker` described below, and call
|
|
564
565
|
`findBaseForSeq(target)`. It picks the closest version *and* proves that base shares the live
|
|
@@ -661,9 +662,9 @@ and the `opStream` endpoint is queried for exactly `[from, target]`.
|
|
|
661
662
|
|
|
662
663
|
1. Validates `loadToSequenceNumber` is a non-negative integer (`UsageError` otherwise).
|
|
663
664
|
2. Detects the point-in-time capability with `asPointInTimeCapableFactory`, which checks the passed
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
665
|
+
`documentServiceFactory` exposes `createPointInTimeDocumentService`. A plain factory is a
|
|
666
|
+
`UsageError` — the caller must inject the dedicated ODSP implementation through
|
|
667
|
+
`createOdspDocumentServiceFactory` options and pass that factory directly with no wrapping.
|
|
667
668
|
3. Wraps it in a `PointInTimeDocumentServiceFactory` adapter so the container's normal
|
|
668
669
|
`createDocumentService(resolvedUrl)` routes to `createPointInTimeDocumentService(resolvedUrl, target)`.
|
|
669
670
|
(`createContainer` throws — the adapter is load-only.)
|
package/src/packageVersion.ts
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Optional ODSP point-in-time loading implementation for consumer injection.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// eslint-disable-next-line import-x/no-internal-modules -- Dedicated entrypoint for the optional point-in-time implementation.
|
|
13
|
+
export { createPointInTimeDocumentService } from "./pointInTimeDriver/createPointInTimeDocumentService.js";
|
|
14
|
+
export type {
|
|
15
|
+
IOdspPointInTimeDocumentServiceImplementationProps,
|
|
16
|
+
OdspPointInTimeDocumentServiceImplementation,
|
|
17
|
+
} from "./odspDocumentServiceFactoryCore.js";
|
|
18
|
+
export type {
|
|
19
|
+
EpochTracker,
|
|
20
|
+
FetchType,
|
|
21
|
+
FetchTypeInternal,
|
|
22
|
+
ICacheAndTracker,
|
|
23
|
+
} from "./epochTracker.js";
|
|
24
|
+
export type {
|
|
25
|
+
INonPersistentCache,
|
|
26
|
+
IOdspCache,
|
|
27
|
+
IPersistedFileCache,
|
|
28
|
+
IPrefetchSnapshotContents,
|
|
29
|
+
} from "./odspCache.js";
|
|
30
|
+
export type { IOdspResponse } from "./odspUtils.js";
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
IDocumentService,
|
|
8
|
+
IResolvedUrl,
|
|
9
|
+
} from "@fluidframework/driver-definitions/internal";
|
|
10
|
+
import { UsageError } from "@fluidframework/driver-utils/internal";
|
|
11
|
+
import type {
|
|
12
|
+
IOdspResolvedUrl,
|
|
13
|
+
IOdspUrlParts,
|
|
14
|
+
} from "@fluidframework/odsp-driver-definitions/internal";
|
|
15
|
+
import {
|
|
16
|
+
createChildLogger,
|
|
17
|
+
type TelemetryLoggerExt,
|
|
18
|
+
} from "@fluidframework/telemetry-utils/internal";
|
|
19
|
+
|
|
20
|
+
import { createOdspCacheAndTracker, type EpochTracker } from "../epochTracker.js";
|
|
21
|
+
import { NonPersistentCache } from "../odspCache.js";
|
|
22
|
+
import { OdspDriverUrlResolver } from "../odspDriverUrlResolver.js";
|
|
23
|
+
import type { IOdspPointInTimeDocumentServiceImplementationProps } from "../odspDocumentServiceFactoryCore.js";
|
|
24
|
+
import {
|
|
25
|
+
createOdspLogger,
|
|
26
|
+
getOdspResolvedUrl,
|
|
27
|
+
toInstrumentedOdspStorageTokenFetcher,
|
|
28
|
+
} from "../odspUtils.js";
|
|
29
|
+
import {
|
|
30
|
+
createOdspVersionManager,
|
|
31
|
+
type IOdspVersionManager,
|
|
32
|
+
// eslint-disable-next-line import-x/no-internal-modules -- the feature implementation owns version selection
|
|
33
|
+
} from "../odspVersionManager/odspVersionManager.js";
|
|
34
|
+
|
|
35
|
+
import { OdspPointInTimeDocumentService } from "./odspPointInTimeDocumentService.js";
|
|
36
|
+
|
|
37
|
+
interface IPointInTimeDocumentServiceDependencies {
|
|
38
|
+
readonly createVersionManager?: (
|
|
39
|
+
odspResolvedUrl: IOdspResolvedUrl,
|
|
40
|
+
logger: TelemetryLoggerExt,
|
|
41
|
+
epochTracker: EpochTracker,
|
|
42
|
+
) => IOdspVersionManager | Promise<IOdspVersionManager>;
|
|
43
|
+
readonly resolveFileVersion?: (
|
|
44
|
+
resolvedUrl: IResolvedUrl,
|
|
45
|
+
fileVersion: string,
|
|
46
|
+
) => IResolvedUrl | Promise<IResolvedUrl>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function createVersionManager(
|
|
50
|
+
odspResolvedUrl: IOdspResolvedUrl,
|
|
51
|
+
logger: TelemetryLoggerExt,
|
|
52
|
+
epochTracker: EpochTracker,
|
|
53
|
+
getStorageToken: IOdspPointInTimeDocumentServiceImplementationProps["getStorageToken"],
|
|
54
|
+
): Promise<IOdspVersionManager> {
|
|
55
|
+
const urlParts: IOdspUrlParts = {
|
|
56
|
+
siteUrl: odspResolvedUrl.siteUrl,
|
|
57
|
+
driveId: odspResolvedUrl.driveId,
|
|
58
|
+
itemId: odspResolvedUrl.itemId,
|
|
59
|
+
};
|
|
60
|
+
const getAuthHeader = toInstrumentedOdspStorageTokenFetcher(
|
|
61
|
+
logger,
|
|
62
|
+
urlParts,
|
|
63
|
+
getStorageToken,
|
|
64
|
+
);
|
|
65
|
+
return createOdspVersionManager({
|
|
66
|
+
urlParts,
|
|
67
|
+
getAuthHeader,
|
|
68
|
+
epochTracker,
|
|
69
|
+
logger,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function resolveFileVersion(
|
|
74
|
+
resolvedUrl: IResolvedUrl,
|
|
75
|
+
fileVersion: string,
|
|
76
|
+
): Promise<IResolvedUrl> {
|
|
77
|
+
const odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);
|
|
78
|
+
const query = new URLSearchParams({
|
|
79
|
+
driveId: odspResolvedUrl.driveId,
|
|
80
|
+
itemId: odspResolvedUrl.itemId,
|
|
81
|
+
fileVersion,
|
|
82
|
+
});
|
|
83
|
+
if (odspResolvedUrl.dataStorePath !== undefined) {
|
|
84
|
+
query.set("path", odspResolvedUrl.dataStorePath);
|
|
85
|
+
}
|
|
86
|
+
if (odspResolvedUrl.codeHint?.containerPackageName !== undefined) {
|
|
87
|
+
query.set("containerPackageName", odspResolvedUrl.codeHint.containerPackageName);
|
|
88
|
+
}
|
|
89
|
+
return new OdspDriverUrlResolver().resolve({
|
|
90
|
+
url: `${odspResolvedUrl.siteUrl}?${query.toString()}`,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* ODSP's point-in-time document service implementation.
|
|
96
|
+
*
|
|
97
|
+
* @remarks Import this function from the dedicated point-in-time entrypoint and inject it through
|
|
98
|
+
* {@link IOdspDocumentServiceFactoryOptions.pointInTimeDocumentServiceImplementation}.
|
|
99
|
+
*
|
|
100
|
+
* @param props - ODSP service dependencies and point-in-time load parameters supplied by the factory.
|
|
101
|
+
* @returns A read-only ODSP document service materialized at the requested sequence number.
|
|
102
|
+
*
|
|
103
|
+
* @legacy @beta
|
|
104
|
+
*/
|
|
105
|
+
export async function createPointInTimeDocumentService(
|
|
106
|
+
props: IOdspPointInTimeDocumentServiceImplementationProps,
|
|
107
|
+
): Promise<IDocumentService> {
|
|
108
|
+
return createPointInTimeDocumentServiceCore(props);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Creates the point-in-time service with replaceable dependencies for testing.
|
|
113
|
+
* @internal
|
|
114
|
+
*/
|
|
115
|
+
export async function createPointInTimeDocumentServiceCore(
|
|
116
|
+
{
|
|
117
|
+
resolvedUrl,
|
|
118
|
+
targetSequenceNumber,
|
|
119
|
+
logger,
|
|
120
|
+
clientIsSummarizer,
|
|
121
|
+
persistedCache,
|
|
122
|
+
getStorageToken,
|
|
123
|
+
createDocumentService,
|
|
124
|
+
}: IOdspPointInTimeDocumentServiceImplementationProps,
|
|
125
|
+
dependencies: IPointInTimeDocumentServiceDependencies = {},
|
|
126
|
+
): Promise<OdspPointInTimeDocumentService> {
|
|
127
|
+
const odspLogger = createOdspLogger(logger);
|
|
128
|
+
const extLogger = createChildLogger({ logger: odspLogger });
|
|
129
|
+
const odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);
|
|
130
|
+
const cacheAndTracker = createOdspCacheAndTracker(
|
|
131
|
+
persistedCache,
|
|
132
|
+
new NonPersistentCache(),
|
|
133
|
+
{
|
|
134
|
+
resolvedUrl: odspResolvedUrl,
|
|
135
|
+
docId: odspResolvedUrl.hashedDocumentId,
|
|
136
|
+
fileVersion: odspResolvedUrl.fileVersion,
|
|
137
|
+
},
|
|
138
|
+
extLogger,
|
|
139
|
+
clientIsSummarizer,
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
const versionManager = await (
|
|
143
|
+
dependencies.createVersionManager ??
|
|
144
|
+
(async (url, versionLogger, epochTracker) =>
|
|
145
|
+
createVersionManager(url, versionLogger, epochTracker, getStorageToken))
|
|
146
|
+
)(odspResolvedUrl, extLogger, cacheAndTracker.epochTracker);
|
|
147
|
+
const baseResult = await versionManager.findBaseForSeq(targetSequenceNumber);
|
|
148
|
+
if (baseResult.kind === "noBaseVersion") {
|
|
149
|
+
const oldestResolvedSequenceDetail =
|
|
150
|
+
baseResult.oldestResolvedSeq === undefined
|
|
151
|
+
? ""
|
|
152
|
+
: ` The oldest resolved file version is at sequence number ${baseResult.oldestResolvedSeq}.`;
|
|
153
|
+
throw new UsageError(
|
|
154
|
+
`No ODSP file version is available at or before sequence number ${targetSequenceNumber}.${oldestResolvedSequenceDetail}`,
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const recoverableResolvedUrl = await (dependencies.resolveFileVersion ?? resolveFileVersion)(
|
|
159
|
+
resolvedUrl,
|
|
160
|
+
baseResult.base.versionId,
|
|
161
|
+
);
|
|
162
|
+
const recoverableDocumentService = await createDocumentService(
|
|
163
|
+
recoverableResolvedUrl,
|
|
164
|
+
odspLogger,
|
|
165
|
+
cacheAndTracker,
|
|
166
|
+
clientIsSummarizer,
|
|
167
|
+
);
|
|
168
|
+
let liveDocumentService: IDocumentService;
|
|
169
|
+
try {
|
|
170
|
+
liveDocumentService = await createDocumentService(
|
|
171
|
+
resolvedUrl,
|
|
172
|
+
odspLogger,
|
|
173
|
+
cacheAndTracker,
|
|
174
|
+
clientIsSummarizer,
|
|
175
|
+
);
|
|
176
|
+
} catch (error) {
|
|
177
|
+
try {
|
|
178
|
+
recoverableDocumentService.dispose();
|
|
179
|
+
} catch (disposeError) {
|
|
180
|
+
extLogger.sendErrorEvent(
|
|
181
|
+
{ eventName: "PointInTimeRecoverableDocumentServiceDisposeError" },
|
|
182
|
+
disposeError,
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
return new OdspPointInTimeDocumentService(
|
|
188
|
+
recoverableResolvedUrl,
|
|
189
|
+
recoverableDocumentService,
|
|
190
|
+
liveDocumentService,
|
|
191
|
+
targetSequenceNumber,
|
|
192
|
+
);
|
|
193
|
+
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* https://microsoft.sharepoint-df.com/:w:/t/ODSPFileStore/ER06b64K_XdDjEyAKl-UT60BJiId39SCVkYSyo_2pvH9gQ?e=KYQ0c5
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import { Uint8ArrayToArrayBufferLike, Uint8ArrayToString } from "@fluid-internal/client-utils";
|
|
12
12
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
13
13
|
import { NonRetryableError } from "@fluidframework/driver-utils/internal";
|
|
14
14
|
import { OdspErrorTypes } from "@fluidframework/odsp-driver-definitions/internal";
|
|
@@ -186,7 +186,7 @@ class BlobDeepCopy extends BlobCore {
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
public get arrayBuffer(): ArrayBufferLike {
|
|
189
|
-
return
|
|
189
|
+
return Uint8ArrayToArrayBufferLike(this.buffer);
|
|
190
190
|
}
|
|
191
191
|
|
|
192
192
|
public static read(buffer: ReadBuffer, lengthLen: number): BlobCore {
|
|
@@ -222,7 +222,7 @@ export class BlobShallowCopy extends BlobCore {
|
|
|
222
222
|
return this.data.subarray(this.start, this.end);
|
|
223
223
|
}
|
|
224
224
|
|
|
225
|
-
// Equivalent to
|
|
225
|
+
// Equivalent to Uint8ArrayToArrayBufferLike(this.buffer)
|
|
226
226
|
public get arrayBuffer(): ArrayBufferLike {
|
|
227
227
|
const offset = this.data.byteOffset;
|
|
228
228
|
return this.data.buffer.slice(this.start + offset, this.end + offset);
|
package/tsconfig.json
CHANGED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import type { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
6
|
-
import type { IDocumentService, IDocumentServiceFactory, IPersistedCache, IResolvedUrl } from "@fluidframework/driver-definitions/internal";
|
|
7
|
-
import type { HostStoragePolicy, OdspResourceTokenFetchOptions, TokenFetcher } from "@fluidframework/odsp-driver-definitions/internal";
|
|
8
|
-
/**
|
|
9
|
-
* An ODSP document service factory that supports point-in-time (sequence-number-based) loading.
|
|
10
|
-
*
|
|
11
|
-
* @remarks
|
|
12
|
-
* The loader detects this capability structurally, so hosts can pass this factory directly to
|
|
13
|
-
* `loadContainerToSequenceNumber`.
|
|
14
|
-
*
|
|
15
|
-
* @legacy @beta
|
|
16
|
-
*/
|
|
17
|
-
export interface IPointInTimeDocumentServiceFactory extends IDocumentServiceFactory {
|
|
18
|
-
/**
|
|
19
|
-
* Creates a document service that materializes the document at the requested sequence number.
|
|
20
|
-
*
|
|
21
|
-
* @param resolvedUrl - The resolved ODSP document URL.
|
|
22
|
-
* @param targetSequenceNumber - The sequence number at which to materialize the document.
|
|
23
|
-
* @param logger - Optional telemetry logger.
|
|
24
|
-
* @param clientIsSummarizer - Whether the requesting client is a summarizer.
|
|
25
|
-
* @returns A read-only document service materialized at the requested sequence number.
|
|
26
|
-
*/
|
|
27
|
-
createPointInTimeDocumentService(resolvedUrl: IResolvedUrl, targetSequenceNumber: number, logger?: ITelemetryBaseLogger, clientIsSummarizer?: boolean): Promise<IDocumentService>;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Creates an ODSP document service factory that supports point-in-time loading.
|
|
31
|
-
*
|
|
32
|
-
* @param getStorageToken - Fetches storage access tokens.
|
|
33
|
-
* @param getWebsocketToken - Fetches websocket access tokens, or `undefined` when unavailable.
|
|
34
|
-
* @param persistedCache - Optional persisted ODSP cache.
|
|
35
|
-
* @param hostPolicy - Optional host storage policy.
|
|
36
|
-
* @returns An ODSP document service factory with point-in-time loading capability.
|
|
37
|
-
*
|
|
38
|
-
* @legacy @beta
|
|
39
|
-
*/
|
|
40
|
-
export declare function getOdspPointInTimeDocumentServiceFactory(getStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>, getWebsocketToken: TokenFetcher<OdspResourceTokenFetchOptions> | undefined, persistedCache?: IPersistedCache, hostPolicy?: HostStoragePolicy): IPointInTimeDocumentServiceFactory;
|
|
41
|
-
//# sourceMappingURL=odspPointInTimeDocumentServiceFactory.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"odspPointInTimeDocumentServiceFactory.d.ts","sourceRoot":"","sources":["../../src/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,KAAK,EACX,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,YAAY,EACZ,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EACX,iBAAiB,EAGjB,6BAA6B,EAC7B,YAAY,EACZ,MAAM,kDAAkD,CAAC;AAuB1D;;;;;;;;GAQG;AACH,MAAM,WAAW,kCAAmC,SAAQ,uBAAuB;IAClF;;;;;;;;OAQG;IACH,gCAAgC,CAC/B,WAAW,EAAE,YAAY,EACzB,oBAAoB,EAAE,MAAM,EAC5B,MAAM,CAAC,EAAE,oBAAoB,EAC7B,kBAAkB,CAAC,EAAE,OAAO,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC7B;AA0KD;;;;;;;;;;GAUG;AACH,wBAAgB,wCAAwC,CACvD,eAAe,EAAE,YAAY,CAAC,6BAA6B,CAAC,EAC5D,iBAAiB,EAAE,YAAY,CAAC,6BAA6B,CAAC,GAAG,SAAS,EAC1E,cAAc,CAAC,EAAE,eAAe,EAChC,UAAU,CAAC,EAAE,iBAAiB,GAC5B,kCAAkC,CAOpC"}
|