From 8af09da5081c4e0c537609f5374ee4b3eb970315 Mon Sep 17 00:00:00 2001 From: Navin Agarwal Date: Mon, 16 Jun 2025 12:19:45 -0700 Subject: [PATCH 1/5] (compat) Added supported features and generation across Loader / Driver boundary --- .../localOdspDocumentService.ts | 11 +++++++- .../localOdspRuntimeLayerCompatState.ts | 27 +++++++++++++++++++ .../odsp-driver/src/odspDocumentService.ts | 11 +++++++- .../src/odspRuntimeLayerCompatState.ts | 27 +++++++++++++++++++ .../src/replayDocumentService.ts | 15 +++++++++-- .../src/documentService.ts | 11 +++++++- .../src/runtimeLayerCompatState.ts | 27 +++++++++++++++++++ .../driver-utils/src/documentServiceProxy.ts | 11 +++++++- .../src/test/layerCompat.spec.ts | 4 --- 9 files changed, 134 insertions(+), 10 deletions(-) create mode 100644 packages/drivers/odsp-driver/src/localOdspDriver/localOdspRuntimeLayerCompatState.ts create mode 100644 packages/drivers/odsp-driver/src/odspRuntimeLayerCompatState.ts create mode 100644 packages/drivers/routerlicious-driver/src/runtimeLayerCompatState.ts diff --git a/packages/drivers/odsp-driver/src/localOdspDriver/localOdspDocumentService.ts b/packages/drivers/odsp-driver/src/localOdspDriver/localOdspDocumentService.ts index 613e8761d222..aadd1b165fc7 100644 --- a/packages/drivers/odsp-driver/src/localOdspDriver/localOdspDocumentService.ts +++ b/packages/drivers/odsp-driver/src/localOdspDriver/localOdspDocumentService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. */ -import { TypedEventEmitter } from "@fluid-internal/client-utils"; +import { TypedEventEmitter, type ILayerCompatDetails } from "@fluid-internal/client-utils"; import { IClient } from "@fluidframework/driver-definitions"; import { IDocumentDeltaStorageService, @@ -18,6 +18,7 @@ import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal"; import { LocalOdspDeltaStorageService } from "./localOdspDeltaStorageService.js"; import { LocalOdspDocumentStorageService } from "./localOdspDocumentStorageManager.js"; +import { localOdspDriverCompatDetailsForLoader } from "./localOdspRuntimeLayerCompatState.js"; /** * IDocumentService implementation that provides explicit snapshot to the document storage service. @@ -37,6 +38,14 @@ export class LocalOdspDocumentService super(); } + /** + * The compatibility details of the Local ODSP Driver layer that is exposed to the Loader layer + * for validating Loader-Driver compatibility. + */ + public get ILayerCompatDetails(): ILayerCompatDetails { + return localOdspDriverCompatDetailsForLoader; + } + public get resolvedUrl(): IResolvedUrl { return this.odspResolvedUrl; } diff --git a/packages/drivers/odsp-driver/src/localOdspDriver/localOdspRuntimeLayerCompatState.ts b/packages/drivers/odsp-driver/src/localOdspDriver/localOdspRuntimeLayerCompatState.ts new file mode 100644 index 000000000000..ae62aca86eed --- /dev/null +++ b/packages/drivers/odsp-driver/src/localOdspDriver/localOdspRuntimeLayerCompatState.ts @@ -0,0 +1,27 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ + +import { type ILayerCompatDetails } from "@fluid-internal/client-utils"; + +import { pkgVersion } from "../packageVersion.js"; + +/** + * Local ODSP Driver's compatibility details that is exposed to the Loader layer. + * @internal + */ +export const localOdspDriverCompatDetailsForLoader: ILayerCompatDetails = { + /** + * The package version of the Local ODSP Driver layer. + */ + pkgVersion, + /** + * The current generation of the Local ODSP Driver layer. + */ + generation: 1, + /** + * The features supported by the Local ODSP Driver layer across the Driver / Loader boundary. + */ + supportedFeatures: new Set(), +}; diff --git a/packages/drivers/odsp-driver/src/odspDocumentService.ts b/packages/drivers/odsp-driver/src/odspDocumentService.ts index 8fb951872452..06dc50be6b14 100644 --- a/packages/drivers/odsp-driver/src/odspDocumentService.ts +++ b/packages/drivers/odsp-driver/src/odspDocumentService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. */ -import { TypedEventEmitter } from "@fluid-internal/client-utils"; +import { TypedEventEmitter, type ILayerCompatDetails } from "@fluid-internal/client-utils"; import { assert } from "@fluidframework/core-utils/internal"; import { IClient } from "@fluidframework/driver-definitions"; import { @@ -38,6 +38,7 @@ import { OdspDeltaStorageWithCache, } from "./odspDeltaStorageService.js"; import { OdspDocumentStorageService } from "./odspDocumentStorageManager.js"; +import { odspDriverCompatDetailsForLoader } from "./odspRuntimeLayerCompatState.js"; import { hasOdcOrigin } from "./odspUrlHelper.js"; import { getOdspResolvedUrl } from "./odspUtils.js"; import { OpsCache } from "./opsCaching.js"; @@ -100,6 +101,14 @@ export class OdspDocumentService ); } + /** + * The compatibility details of the ODSP Driver layer that is exposed to the Loader layer + * for validating Loader-Driver compatibility. + */ + public get ILayerCompatDetails(): ILayerCompatDetails { + return odspDriverCompatDetailsForLoader; + } + private storageManager?: OdspDocumentStorageService; private readonly mc: MonitoringContext; diff --git a/packages/drivers/odsp-driver/src/odspRuntimeLayerCompatState.ts b/packages/drivers/odsp-driver/src/odspRuntimeLayerCompatState.ts new file mode 100644 index 000000000000..54069133a1c1 --- /dev/null +++ b/packages/drivers/odsp-driver/src/odspRuntimeLayerCompatState.ts @@ -0,0 +1,27 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ + +import { type ILayerCompatDetails } from "@fluid-internal/client-utils"; + +import { pkgVersion } from "./packageVersion.js"; + +/** + * ODSP Driver's compatibility details that is exposed to the Loader layer. + * @internal + */ +export const odspDriverCompatDetailsForLoader: ILayerCompatDetails = { + /** + * The package version of the ODSP Driver layer. + */ + pkgVersion, + /** + * The current generation of the ODSP Driver layer. + */ + generation: 1, + /** + * The features supported by the ODSP Driver layer across the Driver / Loader boundary. + */ + supportedFeatures: new Set(), +}; diff --git a/packages/drivers/replay-driver/src/replayDocumentService.ts b/packages/drivers/replay-driver/src/replayDocumentService.ts index 8c4eef7324c5..d98844ddd539 100644 --- a/packages/drivers/replay-driver/src/replayDocumentService.ts +++ b/packages/drivers/replay-driver/src/replayDocumentService.ts @@ -3,7 +3,8 @@ * Licensed under the MIT License. */ -import { TypedEventEmitter } from "@fluid-internal/client-utils"; +import { TypedEventEmitter, type ILayerCompatDetails } from "@fluid-internal/client-utils"; +import type { FluidObject } from "@fluidframework/core-interfaces"; import { IClient } from "@fluidframework/driver-definitions"; import { IDocumentServiceEvents, @@ -41,12 +42,22 @@ export class ReplayDocumentService await documentService.connectToDeltaStorage(), controller, ); - return new ReplayDocumentService(controller, deltaConnection); + const maybeDriverCompatDetails = documentService as FluidObject; + return new ReplayDocumentService( + controller, + deltaConnection, + maybeDriverCompatDetails.ILayerCompatDetails, + ); } constructor( private readonly controller: IDocumentStorageService, private readonly deltaStorage: IDocumentDeltaConnection, + /** + * The compatibility details of the base Driver layer that is exposed to the Loader layer + * for validating Loader-Driver compatibility. + */ + public readonly ILayerCompatDetails: ILayerCompatDetails | undefined, ) { super(); } diff --git a/packages/drivers/routerlicious-driver/src/documentService.ts b/packages/drivers/routerlicious-driver/src/documentService.ts index 71642c821f85..575462049feb 100644 --- a/packages/drivers/routerlicious-driver/src/documentService.ts +++ b/packages/drivers/routerlicious-driver/src/documentService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. */ -import { TypedEventEmitter } from "@fluid-internal/client-utils"; +import { TypedEventEmitter, type ILayerCompatDetails } from "@fluid-internal/client-utils"; import { assert } from "@fluidframework/core-utils/internal"; import { IClient } from "@fluidframework/driver-definitions"; import { @@ -45,6 +45,7 @@ import { TokenFetcher, } from "./restWrapper.js"; import { RestWrapper } from "./restWrapperBase.js"; +import { r11sDriverCompatDetailsForLoader } from "./runtimeLayerCompatState.js"; import type { IGetSessionInfoResponse } from "./sessionInfoManager.js"; import { SocketIOClientStatic } from "./socketModule.js"; import { ITokenProvider } from "./tokens.js"; @@ -96,6 +97,14 @@ export class DocumentService return this._policies; } + /** + * The compatibility details of the ODSP Driver layer that is exposed to the Loader layer + * for validating Loader-Driver compatibility. + */ + public get ILayerCompatDetails(): ILayerCompatDetails { + return r11sDriverCompatDetailsForLoader; + } + public dispose() {} /** diff --git a/packages/drivers/routerlicious-driver/src/runtimeLayerCompatState.ts b/packages/drivers/routerlicious-driver/src/runtimeLayerCompatState.ts new file mode 100644 index 000000000000..cc92b6985521 --- /dev/null +++ b/packages/drivers/routerlicious-driver/src/runtimeLayerCompatState.ts @@ -0,0 +1,27 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ + +import { type ILayerCompatDetails } from "@fluid-internal/client-utils"; + +import { pkgVersion } from "./packageVersion.js"; + +/** + * Routerlicious Driver's compatibility details that is exposed to the Loader layer. + * @internal + */ +export const r11sDriverCompatDetailsForLoader: ILayerCompatDetails = { + /** + * The package version of the Routerlicious Driver layer. + */ + pkgVersion, + /** + * The current generation of the Routerlicious Driver layer. + */ + generation: 1, + /** + * The features supported by the Routerlicious Driver layer across the Driver / Loader boundary. + */ + supportedFeatures: new Set(), +}; diff --git a/packages/loader/driver-utils/src/documentServiceProxy.ts b/packages/loader/driver-utils/src/documentServiceProxy.ts index 1ed17661497d..24818d053163 100644 --- a/packages/loader/driver-utils/src/documentServiceProxy.ts +++ b/packages/loader/driver-utils/src/documentServiceProxy.ts @@ -3,7 +3,8 @@ * Licensed under the MIT License. */ -import { TypedEventEmitter } from "@fluid-internal/client-utils"; +import { TypedEventEmitter, type ILayerCompatDetails } from "@fluid-internal/client-utils"; +import type { FluidObject } from "@fluidframework/core-interfaces"; import { IClient } from "@fluidframework/driver-definitions"; import { IDocumentDeltaConnection, @@ -23,8 +24,16 @@ export abstract class DocumentServiceProxy extends TypedEventEmitter implements IDocumentService { + /** + * The compatibility details of the base Driver layer that is exposed to the Loader layer + * for validating Loader-Driver compatibility. + */ + public readonly ILayerCompatDetails: ILayerCompatDetails | undefined; + constructor(private readonly _service: IDocumentService) { super(); + const maybeDriverCompatDetails = _service as FluidObject; + this.ILayerCompatDetails = maybeDriverCompatDetails.ILayerCompatDetails; } public get service(): IDocumentService { diff --git a/packages/test/test-end-to-end-tests/src/test/layerCompat.spec.ts b/packages/test/test-end-to-end-tests/src/test/layerCompat.spec.ts index ed09078bc08b..d28099eb3c76 100644 --- a/packages/test/test-end-to-end-tests/src/test/layerCompat.spec.ts +++ b/packages/test/test-end-to-end-tests/src/test/layerCompat.spec.ts @@ -89,10 +89,6 @@ describeCompat("Layer compatibility", "NoCompat", (getTestObjectProvider) => { let provider: ITestObjectProvider; beforeEach("getTestObjectProvider", function () { provider = getTestObjectProvider(); - - if (provider.driver.type !== "local") { - this.skip(); - } }); describe("Loader / Driver compat", () => { From 7d72d5fed6883906cd859cfcaed1197990ab8ea8 Mon Sep 17 00:00:00 2001 From: Navin Agarwal Date: Mon, 16 Jun 2025 12:53:56 -0700 Subject: [PATCH 2/5] Fix type test --- packages/drivers/replay-driver/package.json | 6 +++++- .../test/types/validateReplayDriverPrevious.generated.ts | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/drivers/replay-driver/package.json b/packages/drivers/replay-driver/package.json index 18e434c2b9f4..fdab2e7f997f 100644 --- a/packages/drivers/replay-driver/package.json +++ b/packages/drivers/replay-driver/package.json @@ -102,7 +102,11 @@ } }, "typeValidation": { - "broken": {}, + "broken": { + "Class_ReplayDocumentService": { + "forwardCompat": false + } + }, "entrypoint": "internal" } } diff --git a/packages/drivers/replay-driver/src/test/types/validateReplayDriverPrevious.generated.ts b/packages/drivers/replay-driver/src/test/types/validateReplayDriverPrevious.generated.ts index b59ca945fe5e..b6a3efc3e635 100644 --- a/packages/drivers/replay-driver/src/test/types/validateReplayDriverPrevious.generated.ts +++ b/packages/drivers/replay-driver/src/test/types/validateReplayDriverPrevious.generated.ts @@ -76,6 +76,7 @@ declare type current_as_old_for_Class_ReplayController = requireAssignableTo, TypeOnly> /* From 6b9c1e5113624a912c2b341a37397beb057c537b Mon Sep 17 00:00:00 2001 From: Navin Agarwal Date: Mon, 16 Jun 2025 13:45:58 -0700 Subject: [PATCH 3/5] Update end to end test for all drivers --- packages/drivers/odsp-driver/src/index.ts | 3 ++ .../drivers/routerlicious-driver/src/index.ts | 3 ++ .../test/test-end-to-end-tests/package.json | 2 + .../src/test/layerCompat.spec.ts | 43 +++++++++++++++---- pnpm-lock.yaml | 6 +++ 5 files changed, 49 insertions(+), 8 deletions(-) diff --git a/packages/drivers/odsp-driver/src/index.ts b/packages/drivers/odsp-driver/src/index.ts index 12b909ae96d2..dffae943c8e7 100644 --- a/packages/drivers/odsp-driver/src/index.ts +++ b/packages/drivers/odsp-driver/src/index.ts @@ -66,3 +66,6 @@ export { ISnapshotContentsWithProps, parseCompactSnapshotResponse, } from "./compactSnapshotParser.js"; + +// Layer Compat details +export { odspDriverCompatDetailsForLoader } from "./odspRuntimeLayerCompatState.js"; diff --git a/packages/drivers/routerlicious-driver/src/index.ts b/packages/drivers/routerlicious-driver/src/index.ts index f15c4a40ce3b..8b7f272387ce 100644 --- a/packages/drivers/routerlicious-driver/src/index.ts +++ b/packages/drivers/routerlicious-driver/src/index.ts @@ -22,3 +22,6 @@ export { // Configuration export { IRouterliciousDriverPolicies } from "./policies.js"; + +// Layer Compat details +export { r11sDriverCompatDetailsForLoader } from "./runtimeLayerCompatState.js"; diff --git a/packages/test/test-end-to-end-tests/package.json b/packages/test/test-end-to-end-tests/package.json index 4266c4ee2b54..5f0a6f9d6dd9 100644 --- a/packages/test/test-end-to-end-tests/package.json +++ b/packages/test/test-end-to-end-tests/package.json @@ -107,10 +107,12 @@ "@fluidframework/matrix": "workspace:~", "@fluidframework/merge-tree": "workspace:~", "@fluidframework/odsp-doclib-utils": "workspace:~", + "@fluidframework/odsp-driver": "workspace:~", "@fluidframework/odsp-driver-definitions": "workspace:~", "@fluidframework/ordered-collection": "workspace:~", "@fluidframework/register-collection": "workspace:~", "@fluidframework/request-handler": "workspace:~", + "@fluidframework/routerlicious-driver": "workspace:~", "@fluidframework/runtime-definitions": "workspace:~", "@fluidframework/runtime-utils": "workspace:~", "@fluidframework/sequence": "workspace:~", diff --git a/packages/test/test-end-to-end-tests/src/test/layerCompat.spec.ts b/packages/test/test-end-to-end-tests/src/test/layerCompat.spec.ts index d28099eb3c76..b4a32695b355 100644 --- a/packages/test/test-end-to-end-tests/src/test/layerCompat.spec.ts +++ b/packages/test/test-end-to-end-tests/src/test/layerCompat.spec.ts @@ -5,7 +5,11 @@ import { strict as assert } from "assert"; -import type { ILayerCompatSupportRequirements } from "@fluid-internal/client-utils"; +import type { + ILayerCompatDetails, + ILayerCompatSupportRequirements, +} from "@fluid-internal/client-utils"; +import type { TestDriverTypes } from "@fluid-internal/test-driver-definitions"; import { describeCompat, itExpects } from "@fluid-private/test-version-utils"; import { driverSupportRequirements, @@ -13,6 +17,8 @@ import { } from "@fluidframework/container-loader/internal"; import { type ITelemetryBaseProperties } from "@fluidframework/core-interfaces/internal"; import { localDriverCompatDetailsForLoader } from "@fluidframework/local-driver/internal"; +import { odspDriverCompatDetailsForLoader } from "@fluidframework/odsp-driver/internal"; +import { r11sDriverCompatDetailsForLoader } from "@fluidframework/routerlicious-driver/internal"; import { isUsageError, ITestObjectProvider } from "@fluidframework/test-utils/internal"; type ILayerCompatSupportRequirementsOverride = Omit< @@ -30,6 +36,7 @@ function validateFailureProperties( isGenerationCompatible: boolean, layerTypes: LayerType[], minSupportedGeneration: number, + driverCompatDetailsForLoader: ILayerCompatDetails, unsupportedFeatures?: string[], ): boolean { assert(isUsageError(error), "Error should be a usageError"); @@ -69,12 +76,12 @@ function validateFailureProperties( case "Driver": assert.strictEqual( properties.driverVersion, - localDriverCompatDetailsForLoader.pkgVersion, + driverCompatDetailsForLoader.pkgVersion, "Driver version not as expected", ); assert.strictEqual( properties.driverGeneration, - localDriverCompatDetailsForLoader.generation, + driverCompatDetailsForLoader.generation, "Driver generation not as expected", ); break; @@ -85,6 +92,22 @@ function validateFailureProperties( return true; } +function getDriverCompatDetailsForLoader(driverType: TestDriverTypes): ILayerCompatDetails { + switch (driverType) { + case "tinylicious": + case "t9s": + case "routerlicious": + case "r11s": + return r11sDriverCompatDetailsForLoader; + case "odsp": + return odspDriverCompatDetailsForLoader; + case "local": + return localDriverCompatDetailsForLoader; + default: + assert.fail(`Unexpected driver type: ${driverType}`); + } +} + describeCompat("Layer compatibility", "NoCompat", (getTestObjectProvider) => { let provider: ITestObjectProvider; beforeEach("getTestObjectProvider", function () { @@ -92,12 +115,14 @@ describeCompat("Layer compatibility", "NoCompat", (getTestObjectProvider) => { }); describe("Loader / Driver compat", () => { + let driverCompatDetailsForLoader: ILayerCompatDetails; const driverSupportRequirementsOverride = driverSupportRequirements as ILayerCompatSupportRequirementsOverride; let originalRequiredFeatures: readonly string[]; let originalMinSupportedGeneration: number; beforeEach(() => { + driverCompatDetailsForLoader = getDriverCompatDetailsForLoader(provider.driver.type); originalRequiredFeatures = [...driverSupportRequirementsOverride.requiredFeatures]; originalMinSupportedGeneration = driverSupportRequirementsOverride.minSupportedGeneration; @@ -111,10 +136,10 @@ describeCompat("Layer compatibility", "NoCompat", (getTestObjectProvider) => { it(`Driver is compatible with Loader`, async () => { driverSupportRequirementsOverride.requiredFeatures = [ - ...localDriverCompatDetailsForLoader.supportedFeatures, + ...driverCompatDetailsForLoader.supportedFeatures, ]; driverSupportRequirementsOverride.minSupportedGeneration = - localDriverCompatDetailsForLoader.generation; + driverCompatDetailsForLoader.generation; await assert.doesNotReject( async () => provider.makeTestContainer(), @@ -127,10 +152,10 @@ describeCompat("Layer compatibility", "NoCompat", (getTestObjectProvider) => { [{ eventName: "fluid:telemetry:Container:ContainerDispose", errorType: "usageError" }], async () => { driverSupportRequirementsOverride.requiredFeatures = [ - ...localDriverCompatDetailsForLoader.supportedFeatures, + ...driverCompatDetailsForLoader.supportedFeatures, ]; driverSupportRequirementsOverride.minSupportedGeneration = - localDriverCompatDetailsForLoader.generation + 1; + driverCompatDetailsForLoader.generation + 1; await assert.rejects( async () => provider.makeTestContainer(), (e: Error) => @@ -139,6 +164,7 @@ describeCompat("Layer compatibility", "NoCompat", (getTestObjectProvider) => { false /* isGenerationCompatible */, ["Loader", "Driver"] /* layerTypes */, driverSupportRequirementsOverride.minSupportedGeneration, + driverCompatDetailsForLoader, ), `Driver's generation should not be compatible with Loader`, ); @@ -152,7 +178,7 @@ describeCompat("Layer compatibility", "NoCompat", (getTestObjectProvider) => { const requiredFeatures = ["feature2", "feature3"]; driverSupportRequirementsOverride.requiredFeatures = requiredFeatures; driverSupportRequirementsOverride.minSupportedGeneration = - localDriverCompatDetailsForLoader.generation; + driverCompatDetailsForLoader.generation; await assert.rejects( async () => provider.makeTestContainer(), (e: Error) => @@ -161,6 +187,7 @@ describeCompat("Layer compatibility", "NoCompat", (getTestObjectProvider) => { true /* isGenerationCompatible */, ["Loader", "Driver"] /* layerTypes */, driverSupportRequirementsOverride.minSupportedGeneration, + driverCompatDetailsForLoader, requiredFeatures, ), `Driver's supported features should not be compatible with Loader`, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9df600e4c2c4..d3537cc5f08b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14349,6 +14349,9 @@ importers: '@fluidframework/odsp-doclib-utils': specifier: workspace:~ version: link:../../utils/odsp-doclib-utils + '@fluidframework/odsp-driver': + specifier: workspace:~ + version: link:../../drivers/odsp-driver '@fluidframework/odsp-driver-definitions': specifier: workspace:~ version: link:../../drivers/odsp-driver-definitions @@ -14361,6 +14364,9 @@ importers: '@fluidframework/request-handler': specifier: workspace:~ version: link:../../framework/request-handler + '@fluidframework/routerlicious-driver': + specifier: workspace:~ + version: link:../../drivers/routerlicious-driver '@fluidframework/runtime-definitions': specifier: workspace:~ version: link:../../runtime/runtime-definitions From d5a59475a0975a27409afdf60b5d19815a1bae21 Mon Sep 17 00:00:00 2001 From: Navin Agarwal Date: Mon, 16 Jun 2025 17:51:26 -0700 Subject: [PATCH 4/5] Fix file names --- packages/drivers/local-driver/src/index.ts | 2 +- packages/drivers/local-driver/src/localDocumentService.ts | 2 +- ...localRuntimeLayerCompatState.ts => localLayerCompatState.ts} | 0 packages/drivers/odsp-driver/src/index.ts | 2 +- .../odsp-driver/src/localOdspDriver/localOdspDocumentService.ts | 2 +- ...pRuntimeLayerCompatState.ts => localOdspLayerCompatState.ts} | 0 packages/drivers/odsp-driver/src/odspDocumentService.ts | 2 +- .../{odspRuntimeLayerCompatState.ts => odspLayerCompatState.ts} | 0 packages/drivers/routerlicious-driver/src/documentService.ts | 2 +- packages/drivers/routerlicious-driver/src/index.ts | 2 +- ...timeLayerCompatState.ts => routerliciousLayerCompatState.ts} | 0 11 files changed, 7 insertions(+), 7 deletions(-) rename packages/drivers/local-driver/src/{localRuntimeLayerCompatState.ts => localLayerCompatState.ts} (100%) rename packages/drivers/odsp-driver/src/localOdspDriver/{localOdspRuntimeLayerCompatState.ts => localOdspLayerCompatState.ts} (100%) rename packages/drivers/odsp-driver/src/{odspRuntimeLayerCompatState.ts => odspLayerCompatState.ts} (100%) rename packages/drivers/routerlicious-driver/src/{runtimeLayerCompatState.ts => routerliciousLayerCompatState.ts} (100%) diff --git a/packages/drivers/local-driver/src/index.ts b/packages/drivers/local-driver/src/index.ts index 1de2afb26975..530355a4122c 100644 --- a/packages/drivers/local-driver/src/index.ts +++ b/packages/drivers/local-driver/src/index.ts @@ -9,5 +9,5 @@ export { createLocalDocumentService, LocalDocumentService } from "./localDocumen export { LocalDocumentServiceFactory } from "./localDocumentServiceFactory.js"; export { LocalDocumentStorageService } from "./localDocumentStorageService.js"; export { createLocalResolverCreateNewRequest, LocalResolver } from "./localResolver.js"; -export { localDriverCompatDetailsForLoader } from "./localRuntimeLayerCompatState.js"; +export { localDriverCompatDetailsForLoader } from "./localLayerCompatState.js"; export { LocalSessionStorageDbFactory } from "./localSessionStorageDb.js"; diff --git a/packages/drivers/local-driver/src/localDocumentService.ts b/packages/drivers/local-driver/src/localDocumentService.ts index 1a15d2e45b0a..2518c3d420ec 100644 --- a/packages/drivers/local-driver/src/localDocumentService.ts +++ b/packages/drivers/local-driver/src/localDocumentService.ts @@ -27,7 +27,7 @@ import { TestHistorian } from "@fluidframework/server-test-utils"; import { LocalDeltaStorageService } from "./localDeltaStorageService.js"; import { LocalDocumentDeltaConnection } from "./localDocumentDeltaConnection.js"; import { LocalDocumentStorageService } from "./localDocumentStorageService.js"; -import { localDriverCompatDetailsForLoader } from "./localRuntimeLayerCompatState.js"; +import { localDriverCompatDetailsForLoader } from "./localLayerCompatState.js"; /** * Basic implementation of a document service for local use. diff --git a/packages/drivers/local-driver/src/localRuntimeLayerCompatState.ts b/packages/drivers/local-driver/src/localLayerCompatState.ts similarity index 100% rename from packages/drivers/local-driver/src/localRuntimeLayerCompatState.ts rename to packages/drivers/local-driver/src/localLayerCompatState.ts diff --git a/packages/drivers/odsp-driver/src/index.ts b/packages/drivers/odsp-driver/src/index.ts index dffae943c8e7..f4be1cb56c52 100644 --- a/packages/drivers/odsp-driver/src/index.ts +++ b/packages/drivers/odsp-driver/src/index.ts @@ -68,4 +68,4 @@ export { } from "./compactSnapshotParser.js"; // Layer Compat details -export { odspDriverCompatDetailsForLoader } from "./odspRuntimeLayerCompatState.js"; +export { odspDriverCompatDetailsForLoader } from "./odspLayerCompatState.js"; diff --git a/packages/drivers/odsp-driver/src/localOdspDriver/localOdspDocumentService.ts b/packages/drivers/odsp-driver/src/localOdspDriver/localOdspDocumentService.ts index aadd1b165fc7..d0bf53aec7d2 100644 --- a/packages/drivers/odsp-driver/src/localOdspDriver/localOdspDocumentService.ts +++ b/packages/drivers/odsp-driver/src/localOdspDriver/localOdspDocumentService.ts @@ -18,7 +18,7 @@ import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal"; import { LocalOdspDeltaStorageService } from "./localOdspDeltaStorageService.js"; import { LocalOdspDocumentStorageService } from "./localOdspDocumentStorageManager.js"; -import { localOdspDriverCompatDetailsForLoader } from "./localOdspRuntimeLayerCompatState.js"; +import { localOdspDriverCompatDetailsForLoader } from "./localOdspLayerCompatState.js"; /** * IDocumentService implementation that provides explicit snapshot to the document storage service. diff --git a/packages/drivers/odsp-driver/src/localOdspDriver/localOdspRuntimeLayerCompatState.ts b/packages/drivers/odsp-driver/src/localOdspDriver/localOdspLayerCompatState.ts similarity index 100% rename from packages/drivers/odsp-driver/src/localOdspDriver/localOdspRuntimeLayerCompatState.ts rename to packages/drivers/odsp-driver/src/localOdspDriver/localOdspLayerCompatState.ts diff --git a/packages/drivers/odsp-driver/src/odspDocumentService.ts b/packages/drivers/odsp-driver/src/odspDocumentService.ts index 06dc50be6b14..5c01e924ba84 100644 --- a/packages/drivers/odsp-driver/src/odspDocumentService.ts +++ b/packages/drivers/odsp-driver/src/odspDocumentService.ts @@ -38,7 +38,7 @@ import { OdspDeltaStorageWithCache, } from "./odspDeltaStorageService.js"; import { OdspDocumentStorageService } from "./odspDocumentStorageManager.js"; -import { odspDriverCompatDetailsForLoader } from "./odspRuntimeLayerCompatState.js"; +import { odspDriverCompatDetailsForLoader } from "./odspLayerCompatState.js"; import { hasOdcOrigin } from "./odspUrlHelper.js"; import { getOdspResolvedUrl } from "./odspUtils.js"; import { OpsCache } from "./opsCaching.js"; diff --git a/packages/drivers/odsp-driver/src/odspRuntimeLayerCompatState.ts b/packages/drivers/odsp-driver/src/odspLayerCompatState.ts similarity index 100% rename from packages/drivers/odsp-driver/src/odspRuntimeLayerCompatState.ts rename to packages/drivers/odsp-driver/src/odspLayerCompatState.ts diff --git a/packages/drivers/routerlicious-driver/src/documentService.ts b/packages/drivers/routerlicious-driver/src/documentService.ts index 575462049feb..3a4657a11ae6 100644 --- a/packages/drivers/routerlicious-driver/src/documentService.ts +++ b/packages/drivers/routerlicious-driver/src/documentService.ts @@ -45,7 +45,7 @@ import { TokenFetcher, } from "./restWrapper.js"; import { RestWrapper } from "./restWrapperBase.js"; -import { r11sDriverCompatDetailsForLoader } from "./runtimeLayerCompatState.js"; +import { r11sDriverCompatDetailsForLoader } from "./routerliciousLayerCompatState.js"; import type { IGetSessionInfoResponse } from "./sessionInfoManager.js"; import { SocketIOClientStatic } from "./socketModule.js"; import { ITokenProvider } from "./tokens.js"; diff --git a/packages/drivers/routerlicious-driver/src/index.ts b/packages/drivers/routerlicious-driver/src/index.ts index 8b7f272387ce..dbea74f18785 100644 --- a/packages/drivers/routerlicious-driver/src/index.ts +++ b/packages/drivers/routerlicious-driver/src/index.ts @@ -24,4 +24,4 @@ export { export { IRouterliciousDriverPolicies } from "./policies.js"; // Layer Compat details -export { r11sDriverCompatDetailsForLoader } from "./runtimeLayerCompatState.js"; +export { r11sDriverCompatDetailsForLoader } from "./routerliciousLayerCompatState.js"; diff --git a/packages/drivers/routerlicious-driver/src/runtimeLayerCompatState.ts b/packages/drivers/routerlicious-driver/src/routerliciousLayerCompatState.ts similarity index 100% rename from packages/drivers/routerlicious-driver/src/runtimeLayerCompatState.ts rename to packages/drivers/routerlicious-driver/src/routerliciousLayerCompatState.ts From c950d058cfe163401c82c71da12bc2f9f80adef4 Mon Sep 17 00:00:00 2001 From: Navin Agarwal Date: Tue, 17 Jun 2025 11:25:02 -0700 Subject: [PATCH 5/5] Add comment to generation increment --- packages/common/client-utils/src/layerCompat.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/common/client-utils/src/layerCompat.ts b/packages/common/client-utils/src/layerCompat.ts index 63175e88e704..ca6bdfbd4c33 100644 --- a/packages/common/client-utils/src/layerCompat.ts +++ b/packages/common/client-utils/src/layerCompat.ts @@ -47,6 +47,13 @@ export interface ILayerCompatDetails extends Partial /** * The generation of the layer. The other layer at the layer boundary uses this to check if this satisfies * the minimum generation it requires to be compatible. + * + * @remarks Generation is updated on a regular cadence, say, monthly. This will allow us to determine how + * far apart two layers are in terms of time and whether they are compatible. + * For example, say generation is updated every month and the compatibility window between layer1 and layer2 is + * 6 months. Now, if layer1 is at generation 1 and layer2 is at generation 5, then they are 4 months apart and are + * compatible. But if layer1 is at generation 1 and layer2 is at generation 8, then they are 7 months apart and + * are not compatible. */ readonly generation: number; /**