@fluidframework/odsp-driver 2.111.0 → 2.113.0-411909

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 (66) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +4 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/odspVersionManager/index.d.ts +6 -0
  7. package/dist/odspVersionManager/index.d.ts.map +1 -0
  8. package/dist/odspVersionManager/index.js +10 -0
  9. package/dist/odspVersionManager/index.js.map +1 -0
  10. package/dist/odspVersionManager/odspFileVersionFetcher.d.ts +22 -0
  11. package/dist/odspVersionManager/odspFileVersionFetcher.d.ts.map +1 -0
  12. package/dist/odspVersionManager/odspFileVersionFetcher.js +81 -0
  13. package/dist/odspVersionManager/odspFileVersionFetcher.js.map +1 -0
  14. package/dist/odspVersionManager/odspVersionManager.d.ts +98 -0
  15. package/dist/odspVersionManager/odspVersionManager.d.ts.map +1 -0
  16. package/dist/odspVersionManager/odspVersionManager.js +87 -0
  17. package/dist/odspVersionManager/odspVersionManager.js.map +1 -0
  18. package/dist/packageVersion.d.ts +1 -1
  19. package/dist/packageVersion.d.ts.map +1 -1
  20. package/dist/packageVersion.js +1 -1
  21. package/dist/packageVersion.js.map +1 -1
  22. package/dist/pointInTimeDriver/odspPointInTimeDocumentService.d.ts +37 -0
  23. package/dist/pointInTimeDriver/odspPointInTimeDocumentService.d.ts.map +1 -0
  24. package/dist/pointInTimeDriver/odspPointInTimeDocumentService.js +70 -0
  25. package/dist/pointInTimeDriver/odspPointInTimeDocumentService.js.map +1 -0
  26. package/dist/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.d.ts +49 -0
  27. package/dist/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.d.ts.map +1 -0
  28. package/dist/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.js +108 -0
  29. package/dist/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.js.map +1 -0
  30. package/lib/index.d.ts +1 -0
  31. package/lib/index.d.ts.map +1 -1
  32. package/lib/index.js +2 -0
  33. package/lib/index.js.map +1 -1
  34. package/lib/odspVersionManager/index.d.ts +6 -0
  35. package/lib/odspVersionManager/index.d.ts.map +1 -0
  36. package/lib/odspVersionManager/index.js +6 -0
  37. package/lib/odspVersionManager/index.js.map +1 -0
  38. package/lib/odspVersionManager/odspFileVersionFetcher.d.ts +22 -0
  39. package/lib/odspVersionManager/odspFileVersionFetcher.d.ts.map +1 -0
  40. package/lib/odspVersionManager/odspFileVersionFetcher.js +77 -0
  41. package/lib/odspVersionManager/odspFileVersionFetcher.js.map +1 -0
  42. package/lib/odspVersionManager/odspVersionManager.d.ts +98 -0
  43. package/lib/odspVersionManager/odspVersionManager.d.ts.map +1 -0
  44. package/lib/odspVersionManager/odspVersionManager.js +82 -0
  45. package/lib/odspVersionManager/odspVersionManager.js.map +1 -0
  46. package/lib/packageVersion.d.ts +1 -1
  47. package/lib/packageVersion.d.ts.map +1 -1
  48. package/lib/packageVersion.js +1 -1
  49. package/lib/packageVersion.js.map +1 -1
  50. package/lib/pointInTimeDriver/odspPointInTimeDocumentService.d.ts +37 -0
  51. package/lib/pointInTimeDriver/odspPointInTimeDocumentService.d.ts.map +1 -0
  52. package/lib/pointInTimeDriver/odspPointInTimeDocumentService.js +66 -0
  53. package/lib/pointInTimeDriver/odspPointInTimeDocumentService.js.map +1 -0
  54. package/lib/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.d.ts +49 -0
  55. package/lib/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.d.ts.map +1 -0
  56. package/lib/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.js +104 -0
  57. package/lib/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.js.map +1 -0
  58. package/package.json +12 -12
  59. package/src/index.ts +2 -0
  60. package/src/odspVersionManager/DEV.md +349 -0
  61. package/src/odspVersionManager/index.ts +12 -0
  62. package/src/odspVersionManager/odspFileVersionFetcher.ts +138 -0
  63. package/src/odspVersionManager/odspVersionManager.ts +170 -0
  64. package/src/packageVersion.ts +1 -1
  65. package/src/pointInTimeDriver/odspPointInTimeDocumentService.ts +94 -0
  66. package/src/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.ts +185 -0
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,6BAA6B,CAAC;AACrD,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/odsp-driver\";\nexport const pkgVersion = \"2.111.0\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,6BAA6B,CAAC;AACrD,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/odsp-driver\";\nexport const pkgVersion = \"2.113.0-411909\";\n"]}
@@ -0,0 +1,37 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { TypedEventEmitter } from "@fluid-internal/client-utils";
6
+ import type { IClient, IDocumentDeltaConnection, IDocumentDeltaStorageService, IDocumentService, IDocumentServiceEvents, IDocumentServicePolicies, IDocumentStorageService, IResolvedUrl } from "@fluidframework/driver-definitions/internal";
7
+ /**
8
+ * A read-only document service that materializes a document at a target sequence number by combining
9
+ * a recoverable snapshot with a bounded replay of live ops.
10
+ *
11
+ * @remarks
12
+ * Storage (the snapshot) is served from the closest file version at or before the target sequence
13
+ * number. The ops needed to advance from that snapshot to the target are read from the live
14
+ * document's delta storage, bounded so that no op past the target is ever fetched.
15
+ *
16
+ * The service advertises the {@link IDocumentServicePolicies.storageOnly} policy. This reuses the
17
+ * loader's "frozen" load mechanism: the connection manager synthesizes a read-only frozen delta
18
+ * stream instead of opening a live socket, and forces the container read-only. The delta manager
19
+ * still catches up from the snapshot's sequence number through delta storage, which is exactly the
20
+ * bounded replay we want. As a result no live delta-stream connection is ever established.
21
+ *
22
+ * @internal
23
+ */
24
+ export declare class OdspPointInTimeDocumentService extends TypedEventEmitter<IDocumentServiceEvents> implements IDocumentService {
25
+ readonly resolvedUrl: IResolvedUrl;
26
+ private readonly recoverableDocumentService;
27
+ private readonly liveDocumentService;
28
+ private readonly targetSequenceNumber;
29
+ constructor(resolvedUrl: IResolvedUrl, recoverableDocumentService: IDocumentService, liveDocumentService: IDocumentService, targetSequenceNumber: number);
30
+ readonly policies: IDocumentServicePolicies;
31
+ dispose(): void;
32
+ connectToStorage(): Promise<IDocumentStorageService>;
33
+ connectToDeltaStorage(): Promise<IDocumentDeltaStorageService>;
34
+ connectToDeltaStream(_client: IClient): Promise<IDocumentDeltaConnection>;
35
+ private readonly metadataUpdateHandler;
36
+ }
37
+ //# sourceMappingURL=odspPointInTimeDocumentService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odspPointInTimeDocumentService.d.ts","sourceRoot":"","sources":["../../src/pointInTimeDriver/odspPointInTimeDocumentService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EACX,OAAO,EACP,wBAAwB,EACxB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,YAAY,EACZ,MAAM,6CAA6C,CAAC;AAErD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,8BACZ,SAAQ,iBAAiB,CAAC,sBAAsB,CAChD,YAAW,gBAAgB;aAGV,WAAW,EAAE,YAAY;IAGzC,OAAO,CAAC,QAAQ,CAAC,0BAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;gBALrB,WAAW,EAAE,YAAY,EAGxB,0BAA0B,EAAE,gBAAgB,EAC5C,mBAAmB,EAAE,gBAAgB,EACrC,oBAAoB,EAAE,MAAM;IAQ9C,SAAgB,QAAQ,EAAE,wBAAwB,CAAyB;IAEpE,OAAO,IAAI,IAAI;IAMT,gBAAgB,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAIpD,qBAAqB,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAiB9D,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAStF,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAEpC;CACF"}
@@ -0,0 +1,66 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { TypedEventEmitter } from "@fluid-internal/client-utils";
6
+ /**
7
+ * A read-only document service that materializes a document at a target sequence number by combining
8
+ * a recoverable snapshot with a bounded replay of live ops.
9
+ *
10
+ * @remarks
11
+ * Storage (the snapshot) is served from the closest file version at or before the target sequence
12
+ * number. The ops needed to advance from that snapshot to the target are read from the live
13
+ * document's delta storage, bounded so that no op past the target is ever fetched.
14
+ *
15
+ * The service advertises the {@link IDocumentServicePolicies.storageOnly} policy. This reuses the
16
+ * loader's "frozen" load mechanism: the connection manager synthesizes a read-only frozen delta
17
+ * stream instead of opening a live socket, and forces the container read-only. The delta manager
18
+ * still catches up from the snapshot's sequence number through delta storage, which is exactly the
19
+ * bounded replay we want. As a result no live delta-stream connection is ever established.
20
+ *
21
+ * @internal
22
+ */
23
+ export class OdspPointInTimeDocumentService extends TypedEventEmitter {
24
+ constructor(resolvedUrl,
25
+ // Serves the snapshot: a read-only document service bound to the closest file version at or
26
+ // before the target sequence number. Its storage is the base we replay ops on top of.
27
+ recoverableDocumentService, liveDocumentService, targetSequenceNumber) {
28
+ super();
29
+ this.resolvedUrl = resolvedUrl;
30
+ this.recoverableDocumentService = recoverableDocumentService;
31
+ this.liveDocumentService = liveDocumentService;
32
+ this.targetSequenceNumber = targetSequenceNumber;
33
+ // storageOnly makes the connection manager synthesize a read-only frozen delta stream (no live
34
+ // socket) and force the container read-only - see the class remarks.
35
+ this.policies = { storageOnly: true };
36
+ this.metadataUpdateHandler = (metadata) => {
37
+ this.emit("metadataUpdate", metadata);
38
+ };
39
+ this.liveDocumentService.on("metadataUpdate", this.metadataUpdateHandler);
40
+ }
41
+ dispose() {
42
+ this.liveDocumentService.off("metadataUpdate", this.metadataUpdateHandler);
43
+ this.recoverableDocumentService.dispose();
44
+ this.liveDocumentService.dispose();
45
+ }
46
+ async connectToStorage() {
47
+ return this.recoverableDocumentService.connectToStorage();
48
+ }
49
+ async connectToDeltaStorage() {
50
+ const liveDeltaStorage = await this.liveDocumentService.connectToDeltaStorage();
51
+ // The exclusive upper bound needed to include the target op itself.
52
+ const boundedTo = this.targetSequenceNumber + 1;
53
+ return {
54
+ fetchMessages: (from, to, abortSignal, cachedOnly, fetchReason) => {
55
+ return liveDeltaStorage.fetchMessages(from, to === undefined ? boundedTo : Math.min(to, boundedTo), abortSignal, cachedOnly, fetchReason);
56
+ },
57
+ };
58
+ }
59
+ async connectToDeltaStream(_client) {
60
+ // Unreachable under normal flow: the connection manager short-circuits on the storageOnly
61
+ // policy and synthesizes a frozen delta stream before ever calling connectToDeltaStream.
62
+ // Reaching here indicates a regression of that short-circuit.
63
+ throw new Error("OdspPointInTimeDocumentService is storage-only; connectToDeltaStream should not be called");
64
+ }
65
+ }
66
+ //# sourceMappingURL=odspPointInTimeDocumentService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odspPointInTimeDocumentService.js","sourceRoot":"","sources":["../../src/pointInTimeDriver/odspPointInTimeDocumentService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAYjE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,8BACZ,SAAQ,iBAAyC;IAGjD,YACiB,WAAyB;IACzC,4FAA4F;IAC5F,sFAAsF;IACrE,0BAA4C,EAC5C,mBAAqC,EACrC,oBAA4B;QAE7C,KAAK,EAAE,CAAC;QAPQ,gBAAW,GAAX,WAAW,CAAc;QAGxB,+BAA0B,GAA1B,0BAA0B,CAAkB;QAC5C,wBAAmB,GAAnB,mBAAmB,CAAkB;QACrC,yBAAoB,GAApB,oBAAoB,CAAQ;QAM9C,+FAA+F;QAC/F,qEAAqE;QACrD,aAAQ,GAA6B,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAsC1D,0BAAqB,GAAG,CAAC,QAAgC,EAAQ,EAAE;YACnF,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC,CAAC;QA7CD,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC3E,CAAC;IAMM,OAAO;QACb,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC3E,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,CAAC;QAC1C,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;IACpC,CAAC;IAEM,KAAK,CAAC,gBAAgB;QAC5B,OAAO,IAAI,CAAC,0BAA0B,CAAC,gBAAgB,EAAE,CAAC;IAC3D,CAAC;IAEM,KAAK,CAAC,qBAAqB;QACjC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,CAAC;QAChF,oEAAoE;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;QAChD,OAAO;YACN,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE;gBACjE,OAAO,gBAAgB,CAAC,aAAa,CACpC,IAAI,EACJ,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,EACtD,WAAW,EACX,UAAU,EACV,WAAW,CACX,CAAC;YACH,CAAC;SACD,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAAC,OAAgB;QACjD,0FAA0F;QAC1F,yFAAyF;QACzF,8DAA8D;QAC9D,MAAM,IAAI,KAAK,CACd,2FAA2F,CAC3F,CAAC;IACH,CAAC;CAKD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type {\n\tIClient,\n\tIDocumentDeltaConnection,\n\tIDocumentDeltaStorageService,\n\tIDocumentService,\n\tIDocumentServiceEvents,\n\tIDocumentServicePolicies,\n\tIDocumentStorageService,\n\tIResolvedUrl,\n} from \"@fluidframework/driver-definitions/internal\";\n\n/**\n * A read-only document service that materializes a document at a target sequence number by combining\n * a recoverable snapshot with a bounded replay of live ops.\n *\n * @remarks\n * Storage (the snapshot) is served from the closest file version at or before the target sequence\n * number. The ops needed to advance from that snapshot to the target are read from the live\n * document's delta storage, bounded so that no op past the target is ever fetched.\n *\n * The service advertises the {@link IDocumentServicePolicies.storageOnly} policy. This reuses the\n * loader's \"frozen\" load mechanism: the connection manager synthesizes a read-only frozen delta\n * stream instead of opening a live socket, and forces the container read-only. The delta manager\n * still catches up from the snapshot's sequence number through delta storage, which is exactly the\n * bounded replay we want. As a result no live delta-stream connection is ever established.\n *\n * @internal\n */\nexport class OdspPointInTimeDocumentService\n\textends TypedEventEmitter<IDocumentServiceEvents>\n\timplements IDocumentService\n{\n\tpublic constructor(\n\t\tpublic readonly resolvedUrl: IResolvedUrl,\n\t\t// Serves the snapshot: a read-only document service bound to the closest file version at or\n\t\t// before the target sequence number. Its storage is the base we replay ops on top of.\n\t\tprivate readonly recoverableDocumentService: IDocumentService,\n\t\tprivate readonly liveDocumentService: IDocumentService,\n\t\tprivate readonly targetSequenceNumber: number,\n\t) {\n\t\tsuper();\n\t\tthis.liveDocumentService.on(\"metadataUpdate\", this.metadataUpdateHandler);\n\t}\n\n\t// storageOnly makes the connection manager synthesize a read-only frozen delta stream (no live\n\t// socket) and force the container read-only - see the class remarks.\n\tpublic readonly policies: IDocumentServicePolicies = { storageOnly: true };\n\n\tpublic dispose(): void {\n\t\tthis.liveDocumentService.off(\"metadataUpdate\", this.metadataUpdateHandler);\n\t\tthis.recoverableDocumentService.dispose();\n\t\tthis.liveDocumentService.dispose();\n\t}\n\n\tpublic async connectToStorage(): Promise<IDocumentStorageService> {\n\t\treturn this.recoverableDocumentService.connectToStorage();\n\t}\n\n\tpublic async connectToDeltaStorage(): Promise<IDocumentDeltaStorageService> {\n\t\tconst liveDeltaStorage = await this.liveDocumentService.connectToDeltaStorage();\n\t\t// The exclusive upper bound needed to include the target op itself.\n\t\tconst boundedTo = this.targetSequenceNumber + 1;\n\t\treturn {\n\t\t\tfetchMessages: (from, to, abortSignal, cachedOnly, fetchReason) => {\n\t\t\t\treturn liveDeltaStorage.fetchMessages(\n\t\t\t\t\tfrom,\n\t\t\t\t\tto === undefined ? boundedTo : Math.min(to, boundedTo),\n\t\t\t\t\tabortSignal,\n\t\t\t\t\tcachedOnly,\n\t\t\t\t\tfetchReason,\n\t\t\t\t);\n\t\t\t},\n\t\t};\n\t}\n\n\tpublic async connectToDeltaStream(_client: IClient): Promise<IDocumentDeltaConnection> {\n\t\t// Unreachable under normal flow: the connection manager short-circuits on the storageOnly\n\t\t// policy and synthesizes a frozen delta stream before ever calling connectToDeltaStream.\n\t\t// Reaching here indicates a regression of that short-circuit.\n\t\tthrow new Error(\n\t\t\t\"OdspPointInTimeDocumentService is storage-only; connectToDeltaStream should not be called\",\n\t\t);\n\t}\n\n\tprivate readonly metadataUpdateHandler = (metadata: Record<string, string>): void => {\n\t\tthis.emit(\"metadataUpdate\", metadata);\n\t};\n}\n"]}
@@ -0,0 +1,49 @@
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, IPersistedCache, IResolvedUrl } from "@fluidframework/driver-definitions/internal";
7
+ import type { HostStoragePolicy, OdspResourceTokenFetchOptions, TokenFetcher } from "@fluidframework/odsp-driver-definitions/internal";
8
+ import { OdspDocumentServiceFactoryCore } from "../odspDocumentServiceFactoryCore.js";
9
+ /**
10
+ * ODSP document service factory that additionally supports point-in-time (sequence-number-based)
11
+ * loading.
12
+ *
13
+ * @remarks
14
+ * This extends {@link OdspDocumentServiceFactoryCore} with the ability to materialize a read-only
15
+ * document service at a requested Fluid sequence number. The loader detects this capability via the
16
+ * presence of {@link OdspPointInTimeDocumentServiceFactory.createPointInTimeDocumentService}, so
17
+ * hosts that want to load a container to a target sequence number must construct this factory
18
+ * (rather than the legacy `OdspDocumentServiceFactory`) and pass it to the loader.
19
+ *
20
+ * @internal
21
+ */
22
+ export declare class OdspPointInTimeDocumentServiceFactory extends OdspDocumentServiceFactoryCore {
23
+ /**
24
+ * The storage token fetcher, captured here because the base class keeps it private.
25
+ */
26
+ private readonly getStorageTokenForVersions;
27
+ constructor(getStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>, getWebsocketToken: TokenFetcher<OdspResourceTokenFetchOptions> | undefined, persistedCache?: IPersistedCache, hostPolicy?: HostStoragePolicy);
28
+ /**
29
+ * Creates a document service that reads its snapshot from the closest file version at or before
30
+ * the target and its deltas from the live document, materializing a requested sequence number
31
+ * through replay.
32
+ */
33
+ createPointInTimeDocumentService(resolvedUrl: IResolvedUrl, targetSequenceNumber: number, logger?: ITelemetryBaseLogger, clientIsSummarizer?: boolean): Promise<IDocumentService>;
34
+ /**
35
+ * Builds an IOdspVersionManager for the given file, which enumerates the file's stored
36
+ * versions and resolves the closest version at or before a target sequence number.
37
+ *
38
+ * @remarks
39
+ * This wires up the plumbing the version manager needs to talk to ODSP: it resolves the URL to
40
+ * its ODSP parts (site/drive/item), creates a scoped child logger, an epoch tracker (from a fresh
41
+ * NonPersistentCache, since only the tracker is needed for consistency checks), and an
42
+ * instrumented storage-token/auth-header fetcher. The resulting manager is used by
43
+ * {@link OdspPointInTimeDocumentServiceFactory.createPointInTimeDocumentService} to pick the base
44
+ * snapshot for point-in-time loading.
45
+ */
46
+ private createVersionManager;
47
+ private resolveFileVersion;
48
+ }
49
+ //# sourceMappingURL=odspPointInTimeDocumentServiceFactory.d.ts.map
@@ -0,0 +1 @@
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,eAAe,EACf,YAAY,EACZ,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EACX,iBAAiB,EAEjB,6BAA6B,EAC7B,YAAY,EACZ,MAAM,kDAAkD,CAAC;AAK1D,OAAO,EAAE,8BAA8B,EAAE,MAAM,sCAAsC,CAAC;AActF;;;;;;;;;;;;GAYG;AACH,qBAAa,qCAAsC,SAAQ,8BAA8B;IACxF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAA8C;gBAGxF,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;IAM/B;;;;OAIG;IACU,gCAAgC,CAC5C,WAAW,EAAE,YAAY,EACzB,oBAAoB,EAAE,MAAM,EAC5B,MAAM,CAAC,EAAE,oBAAoB,EAC7B,kBAAkB,CAAC,EAAE,OAAO,GAC1B,OAAO,CAAC,gBAAgB,CAAC;IAuC5B;;;;;;;;;;;OAWG;YACW,oBAAoB;YAuCpB,kBAAkB;CAoBhC"}
@@ -0,0 +1,104 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { UsageError, createChildLogger } from "@fluidframework/telemetry-utils/internal";
6
+ import { createOdspCacheAndTracker } from "../epochTracker.js";
7
+ import { NonPersistentCache } from "../odspCache.js";
8
+ import { OdspDocumentServiceFactoryCore } from "../odspDocumentServiceFactoryCore.js";
9
+ import { OdspDriverUrlResolver } from "../odspDriverUrlResolver.js";
10
+ import { createOdspLogger, getOdspResolvedUrl, toInstrumentedOdspStorageTokenFetcher, } from "../odspUtils.js";
11
+ import { createOdspVersionManager, } from "../odspVersionManager/index.js";
12
+ import { OdspPointInTimeDocumentService } from "./odspPointInTimeDocumentService.js";
13
+ /**
14
+ * ODSP document service factory that additionally supports point-in-time (sequence-number-based)
15
+ * loading.
16
+ *
17
+ * @remarks
18
+ * This extends {@link OdspDocumentServiceFactoryCore} with the ability to materialize a read-only
19
+ * document service at a requested Fluid sequence number. The loader detects this capability via the
20
+ * presence of {@link OdspPointInTimeDocumentServiceFactory.createPointInTimeDocumentService}, so
21
+ * hosts that want to load a container to a target sequence number must construct this factory
22
+ * (rather than the legacy `OdspDocumentServiceFactory`) and pass it to the loader.
23
+ *
24
+ * @internal
25
+ */
26
+ export class OdspPointInTimeDocumentServiceFactory extends OdspDocumentServiceFactoryCore {
27
+ constructor(getStorageToken, getWebsocketToken, persistedCache, hostPolicy) {
28
+ super(getStorageToken, getWebsocketToken, persistedCache, hostPolicy);
29
+ this.getStorageTokenForVersions = getStorageToken;
30
+ }
31
+ /**
32
+ * Creates a document service that reads its snapshot from the closest file version at or before
33
+ * the target and its deltas from the live document, materializing a requested sequence number
34
+ * through replay.
35
+ */
36
+ async createPointInTimeDocumentService(resolvedUrl, targetSequenceNumber, logger, clientIsSummarizer) {
37
+ const versionManager = await this.createVersionManager(resolvedUrl, logger, clientIsSummarizer);
38
+ const baseResult = await versionManager.findBaseForSeq(targetSequenceNumber);
39
+ if (baseResult.kind === "noBaseVersion") {
40
+ const oldestResolvedSequenceDetail = baseResult.oldestResolvedSeq === undefined
41
+ ? ""
42
+ : ` The oldest resolved file version is at sequence number ${baseResult.oldestResolvedSeq}.`;
43
+ throw new UsageError(`No ODSP file version is available at or before sequence number ${targetSequenceNumber}.${oldestResolvedSequenceDetail}`);
44
+ }
45
+ const recoverableResolvedUrl = await this.resolveFileVersion(resolvedUrl, baseResult.base.versionId);
46
+ const recoverableDocumentService = await this.createDocumentService(recoverableResolvedUrl, logger, clientIsSummarizer);
47
+ const liveDocumentService = await this.createDocumentService(resolvedUrl, logger, clientIsSummarizer);
48
+ return new OdspPointInTimeDocumentService(recoverableResolvedUrl, recoverableDocumentService, liveDocumentService, targetSequenceNumber);
49
+ }
50
+ /**
51
+ * Builds an IOdspVersionManager for the given file, which enumerates the file's stored
52
+ * versions and resolves the closest version at or before a target sequence number.
53
+ *
54
+ * @remarks
55
+ * This wires up the plumbing the version manager needs to talk to ODSP: it resolves the URL to
56
+ * its ODSP parts (site/drive/item), creates a scoped child logger, an epoch tracker (from a fresh
57
+ * NonPersistentCache, since only the tracker is needed for consistency checks), and an
58
+ * instrumented storage-token/auth-header fetcher. The resulting manager is used by
59
+ * {@link OdspPointInTimeDocumentServiceFactory.createPointInTimeDocumentService} to pick the base
60
+ * snapshot for point-in-time loading.
61
+ */
62
+ async createVersionManager(resolvedUrl, logger, clientIsSummarizer) {
63
+ const odspLogger = createOdspLogger(logger);
64
+ const extLogger = createChildLogger({ logger: odspLogger });
65
+ const odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);
66
+ const urlParts = {
67
+ siteUrl: odspResolvedUrl.siteUrl,
68
+ driveId: odspResolvedUrl.driveId,
69
+ itemId: odspResolvedUrl.itemId,
70
+ };
71
+ // Only the epochTracker from the returned cacheAndTracker is used below, so a fresh
72
+ // NonPersistentCache is sufficient here.
73
+ const cacheAndTracker = createOdspCacheAndTracker(this.persistedCache, new NonPersistentCache(), {
74
+ resolvedUrl: odspResolvedUrl,
75
+ docId: odspResolvedUrl.hashedDocumentId,
76
+ fileVersion: odspResolvedUrl.fileVersion,
77
+ }, extLogger, clientIsSummarizer);
78
+ const getAuthHeader = toInstrumentedOdspStorageTokenFetcher(extLogger, urlParts, this.getStorageTokenForVersions);
79
+ return createOdspVersionManager({
80
+ urlParts,
81
+ getAuthHeader,
82
+ epochTracker: cacheAndTracker.epochTracker,
83
+ logger: extLogger,
84
+ });
85
+ }
86
+ async resolveFileVersion(resolvedUrl, fileVersion) {
87
+ const odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);
88
+ const query = new URLSearchParams({
89
+ driveId: odspResolvedUrl.driveId,
90
+ itemId: odspResolvedUrl.itemId,
91
+ fileVersion,
92
+ });
93
+ if (odspResolvedUrl.dataStorePath !== undefined) {
94
+ query.set("path", odspResolvedUrl.dataStorePath);
95
+ }
96
+ if (odspResolvedUrl.codeHint?.containerPackageName !== undefined) {
97
+ query.set("containerPackageName", odspResolvedUrl.codeHint.containerPackageName);
98
+ }
99
+ return new OdspDriverUrlResolver().resolve({
100
+ url: `${odspResolvedUrl.siteUrl}?${query.toString()}`,
101
+ });
102
+ }
103
+ }
104
+ //# sourceMappingURL=odspPointInTimeDocumentServiceFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odspPointInTimeDocumentServiceFactory.js","sourceRoot":"","sources":["../../src/pointInTimeDriver/odspPointInTimeDocumentServiceFactory.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 {\n\tIDocumentService,\n\tIPersistedCache,\n\tIResolvedUrl,\n} from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tHostStoragePolicy,\n\tIOdspUrlParts,\n\tOdspResourceTokenFetchOptions,\n\tTokenFetcher,\n} from \"@fluidframework/odsp-driver-definitions/internal\";\nimport { UsageError, createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { createOdspCacheAndTracker } from \"../epochTracker.js\";\nimport { NonPersistentCache } from \"../odspCache.js\";\nimport { OdspDocumentServiceFactoryCore } from \"../odspDocumentServiceFactoryCore.js\";\nimport { OdspDriverUrlResolver } from \"../odspDriverUrlResolver.js\";\nimport {\n\tcreateOdspLogger,\n\tgetOdspResolvedUrl,\n\ttoInstrumentedOdspStorageTokenFetcher,\n} from \"../odspUtils.js\";\nimport {\n\tcreateOdspVersionManager,\n\ttype IOdspVersionManager,\n} from \"../odspVersionManager/index.js\";\n\nimport { OdspPointInTimeDocumentService } from \"./odspPointInTimeDocumentService.js\";\n\n/**\n * ODSP document service factory that additionally supports point-in-time (sequence-number-based)\n * loading.\n *\n * @remarks\n * This extends {@link OdspDocumentServiceFactoryCore} with the ability to materialize a read-only\n * document service at a requested Fluid sequence number. The loader detects this capability via the\n * presence of {@link OdspPointInTimeDocumentServiceFactory.createPointInTimeDocumentService}, so\n * hosts that want to load a container to a target sequence number must construct this factory\n * (rather than the legacy `OdspDocumentServiceFactory`) and pass it to the loader.\n *\n * @internal\n */\nexport class OdspPointInTimeDocumentServiceFactory extends OdspDocumentServiceFactoryCore {\n\t/**\n\t * The storage token fetcher, captured here because the base class keeps it private.\n\t */\n\tprivate readonly getStorageTokenForVersions: TokenFetcher<OdspResourceTokenFetchOptions>;\n\n\tconstructor(\n\t\tgetStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>,\n\t\tgetWebsocketToken: TokenFetcher<OdspResourceTokenFetchOptions> | undefined,\n\t\tpersistedCache?: IPersistedCache,\n\t\thostPolicy?: HostStoragePolicy,\n\t) {\n\t\tsuper(getStorageToken, getWebsocketToken, persistedCache, hostPolicy);\n\t\tthis.getStorageTokenForVersions = getStorageToken;\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\tpublic async createPointInTimeDocumentService(\n\t\tresolvedUrl: IResolvedUrl,\n\t\ttargetSequenceNumber: number,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tclientIsSummarizer?: boolean,\n\t): Promise<IDocumentService> {\n\t\tconst versionManager = await this.createVersionManager(\n\t\t\tresolvedUrl,\n\t\t\tlogger,\n\t\t\tclientIsSummarizer,\n\t\t);\n\t\tconst baseResult = await versionManager.findBaseForSeq(targetSequenceNumber);\n\t\tif (baseResult.kind === \"noBaseVersion\") {\n\t\t\tconst oldestResolvedSequenceDetail =\n\t\t\t\tbaseResult.oldestResolvedSeq === undefined\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: ` The oldest resolved file version is at sequence number ${baseResult.oldestResolvedSeq}.`;\n\t\t\tthrow new UsageError(\n\t\t\t\t`No ODSP file version is available at or before sequence number ${targetSequenceNumber}.${oldestResolvedSequenceDetail}`,\n\t\t\t);\n\t\t}\n\n\t\tconst recoverableResolvedUrl = await this.resolveFileVersion(\n\t\t\tresolvedUrl,\n\t\t\tbaseResult.base.versionId,\n\t\t);\n\t\tconst recoverableDocumentService = await this.createDocumentService(\n\t\t\trecoverableResolvedUrl,\n\t\t\tlogger,\n\t\t\tclientIsSummarizer,\n\t\t);\n\t\tconst liveDocumentService = await this.createDocumentService(\n\t\t\tresolvedUrl,\n\t\t\tlogger,\n\t\t\tclientIsSummarizer,\n\t\t);\n\t\treturn new OdspPointInTimeDocumentService(\n\t\t\trecoverableResolvedUrl,\n\t\t\trecoverableDocumentService,\n\t\t\tliveDocumentService,\n\t\t\ttargetSequenceNumber,\n\t\t);\n\t}\n\n\t/**\n\t * Builds an IOdspVersionManager for the given file, which enumerates the file's stored\n\t * versions and resolves the closest version at or before a target sequence number.\n\t *\n\t * @remarks\n\t * This wires up the plumbing the version manager needs to talk to ODSP: it resolves the URL to\n\t * its ODSP parts (site/drive/item), creates a scoped child logger, an epoch tracker (from a fresh\n\t * NonPersistentCache, since only the tracker is needed for consistency checks), and an\n\t * instrumented storage-token/auth-header fetcher. The resulting manager is used by\n\t * {@link OdspPointInTimeDocumentServiceFactory.createPointInTimeDocumentService} to pick the base\n\t * snapshot for point-in-time loading.\n\t */\n\tprivate async createVersionManager(\n\t\tresolvedUrl: IResolvedUrl,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tclientIsSummarizer?: boolean,\n\t): Promise<IOdspVersionManager> {\n\t\tconst odspLogger = createOdspLogger(logger);\n\t\tconst extLogger = createChildLogger({ logger: odspLogger });\n\t\tconst odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\t\tconst urlParts: IOdspUrlParts = {\n\t\t\tsiteUrl: odspResolvedUrl.siteUrl,\n\t\t\tdriveId: odspResolvedUrl.driveId,\n\t\t\titemId: odspResolvedUrl.itemId,\n\t\t};\n\t\t// Only the epochTracker from the returned cacheAndTracker is used below, so a fresh\n\t\t// NonPersistentCache is sufficient here.\n\t\tconst cacheAndTracker = createOdspCacheAndTracker(\n\t\t\tthis.persistedCache,\n\t\t\tnew NonPersistentCache(),\n\t\t\t{\n\t\t\t\tresolvedUrl: odspResolvedUrl,\n\t\t\t\tdocId: odspResolvedUrl.hashedDocumentId,\n\t\t\t\tfileVersion: odspResolvedUrl.fileVersion,\n\t\t\t},\n\t\t\textLogger,\n\t\t\tclientIsSummarizer,\n\t\t);\n\t\tconst getAuthHeader = toInstrumentedOdspStorageTokenFetcher(\n\t\t\textLogger,\n\t\t\turlParts,\n\t\t\tthis.getStorageTokenForVersions,\n\t\t);\n\t\treturn createOdspVersionManager({\n\t\t\turlParts,\n\t\t\tgetAuthHeader,\n\t\t\tepochTracker: cacheAndTracker.epochTracker,\n\t\t\tlogger: extLogger,\n\t\t});\n\t}\n\n\tprivate async resolveFileVersion(\n\t\tresolvedUrl: IResolvedUrl,\n\t\tfileVersion: string,\n\t): Promise<IResolvedUrl> {\n\t\tconst odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\t\tconst query = new URLSearchParams({\n\t\t\tdriveId: odspResolvedUrl.driveId,\n\t\t\titemId: odspResolvedUrl.itemId,\n\t\t\tfileVersion,\n\t\t});\n\t\tif (odspResolvedUrl.dataStorePath !== undefined) {\n\t\t\tquery.set(\"path\", odspResolvedUrl.dataStorePath);\n\t\t}\n\t\tif (odspResolvedUrl.codeHint?.containerPackageName !== undefined) {\n\t\t\tquery.set(\"containerPackageName\", odspResolvedUrl.codeHint.containerPackageName);\n\t\t}\n\t\treturn new OdspDriverUrlResolver().resolve({\n\t\t\turl: `${odspResolvedUrl.siteUrl}?${query.toString()}`,\n\t\t});\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/odsp-driver",
3
- "version": "2.111.0",
3
+ "version": "2.113.0-411909",
4
4
  "description": "Socket storage implementation for SPO and ODC",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -69,27 +69,27 @@
69
69
  "temp-directory": "nyc/.nyc_output"
70
70
  },
71
71
  "dependencies": {
72
- "@fluid-internal/client-utils": "~2.111.0",
73
- "@fluidframework/core-interfaces": "~2.111.0",
74
- "@fluidframework/core-utils": "~2.111.0",
75
- "@fluidframework/driver-base": "~2.111.0",
76
- "@fluidframework/driver-definitions": "~2.111.0",
77
- "@fluidframework/driver-utils": "~2.111.0",
78
- "@fluidframework/odsp-doclib-utils": "~2.111.0",
79
- "@fluidframework/odsp-driver-definitions": "~2.111.0",
80
- "@fluidframework/telemetry-utils": "~2.111.0",
72
+ "@fluid-internal/client-utils": "2.113.0-411909",
73
+ "@fluidframework/core-interfaces": "2.113.0-411909",
74
+ "@fluidframework/core-utils": "2.113.0-411909",
75
+ "@fluidframework/driver-base": "2.113.0-411909",
76
+ "@fluidframework/driver-definitions": "2.113.0-411909",
77
+ "@fluidframework/driver-utils": "2.113.0-411909",
78
+ "@fluidframework/odsp-doclib-utils": "2.113.0-411909",
79
+ "@fluidframework/odsp-driver-definitions": "2.113.0-411909",
80
+ "@fluidframework/telemetry-utils": "2.113.0-411909",
81
81
  "socket.io-client": "^4.8.3",
82
82
  "uuid": "^11.1.0"
83
83
  },
84
84
  "devDependencies": {
85
85
  "@arethetypeswrong/cli": "^0.18.2",
86
86
  "@biomejs/biome": "~2.4.5",
87
- "@fluid-internal/mocha-test-setup": "~2.111.0",
87
+ "@fluid-internal/mocha-test-setup": "2.113.0-411909",
88
88
  "@fluid-tools/build-cli": "^0.65.0",
89
89
  "@fluidframework/build-common": "^2.0.3",
90
90
  "@fluidframework/build-tools": "^0.65.0",
91
91
  "@fluidframework/eslint-config-fluid": "^13.0.0",
92
- "@fluidframework/odsp-driver-previous": "npm:@fluidframework/odsp-driver@2.110.0",
92
+ "@fluidframework/odsp-driver-previous": "npm:@fluidframework/odsp-driver@2.111.0",
93
93
  "@microsoft/api-extractor": "7.58.1",
94
94
  "@types/mocha": "^10.0.10",
95
95
  "@types/node": "~22.19.17",
package/src/index.ts CHANGED
@@ -29,6 +29,8 @@ export {
29
29
  OdspDocumentServiceFactory,
30
30
  } from "./odspDocumentServiceFactory.js";
31
31
  export { OdspDocumentServiceFactoryCore } from "./odspDocumentServiceFactoryCore.js";
32
+ // eslint-disable-next-line import-x/no-internal-modules
33
+ export { OdspPointInTimeDocumentServiceFactory } from "./pointInTimeDriver/odspPointInTimeDocumentServiceFactory.js";
32
34
 
33
35
  // File creation
34
36
  export { createOdspCreateContainerRequest } from "./createOdspCreateContainerRequest.js";