"use strict";
/*!
 * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
 * Licensed under the MIT License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateDatastoreCompatibility = exports.validateLoaderCompatibility = exports.dataStoreSupportRequirementsForRuntime = exports.runtimeCompatDetailsForDataStore = exports.loaderSupportRequirementsForRuntime = exports.runtimeCompatDetailsForLoader = exports.runtimeCoreCompatDetails = exports.disableStrictLoaderLayerCompatibilityCheckKey = void 0;
const client_utils_1 = require("@fluid-internal/client-utils");
const internal_1 = require("@fluidframework/runtime-definitions/internal");
const internal_2 = require("@fluidframework/telemetry-utils/internal");
const packageVersion_js_1 = require("./packageVersion.js");
/**
 * The config key to disable strict loader layer compatibility check.
 */
exports.disableStrictLoaderLayerCompatibilityCheckKey = "Fluid.ContainerRuntime.DisableStrictLoaderLayerCompatibilityCheck";
/**
 * The core compatibility details of the Runtime layer that is the same across all layer boundaries.
 * @internal
 */
exports.runtimeCoreCompatDetails = {
    /**
     * The package version of the Runtime layer.
     */
    pkgVersion: packageVersion_js_1.pkgVersion,
    /**
     * The current generation of the Runtime layer.
     */
    generation: client_utils_1.generation,
};
/**
 * Runtime's compatibility details that is exposed to the Loader layer.
 * @internal
 */
exports.runtimeCompatDetailsForLoader = {
    ...exports.runtimeCoreCompatDetails,
    /**
     * The features supported by the Runtime layer across the Runtime / Loader boundary.
     */
    supportedFeatures: new Set(),
};
/**
 * The requirements that the Loader layer must meet to be compatible with this Runtime.
 * @internal
 */
exports.loaderSupportRequirementsForRuntime = {
    /**
     * Minimum generation that Loader must be at to be compatible with Runtime. Note that 0 is used here so
     * that Loader layers before the introduction of the layer compatibility enforcement are compatible.
     */
    minSupportedGeneration: 0,
    /**
     * The features that the Loader must support to be compatible with Runtime.
     */
    requiredFeatures: [],
};
/**
 * Runtime's compatibility details that is exposed to the DataStore layer.
 * @internal
 */
exports.runtimeCompatDetailsForDataStore = {
    ...exports.runtimeCoreCompatDetails,
    /**
     * The features supported by the Runtime layer across the Runtime / DataStore boundary.
     */
    supportedFeatures: new Set([internal_1.encodeHandlesInContainerRuntime, internal_1.notifiesReadOnlyState]),
};
/**
 * The requirements that the DataStore layer must meet to be compatible with this Runtime.
 * @internal
 */
exports.dataStoreSupportRequirementsForRuntime = {
    /**
     * Minimum generation that DataStore must be at to be compatible with Runtime. Note that 0 is used here so
     * that DataStore layers before the introduction of the layer compatibility enforcement are compatible.
     */
    minSupportedGeneration: 0,
    /**
     * The features that the DataStore must support to be compatible with Runtime.
     */
    requiredFeatures: [],
};
/**
 * Validates that the Loader layer is compatible with this Runtime.
 * @internal
 */
function validateLoaderCompatibility(maybeLoaderCompatDetailsForRuntime, disposeFn, mc) {
    // By default, use strictCompatibilityCheck here - If the Loader doesn't provide compatibility details,
    // assume it's a very old version and should be considered incompatible,
    // since Loader can drift far from the Runtime causing issues.
    // Can be disabled via config `disableStrictLoaderLayerCompatibilityCheckKey`.
    const disableStrictLoaderLayerCompatibilityCheck = mc.config.getBoolean(exports.disableStrictLoaderLayerCompatibilityCheckKey);
    (0, internal_2.validateLayerCompatibility)("runtime", "loader", exports.runtimeCompatDetailsForLoader, exports.loaderSupportRequirementsForRuntime, maybeLoaderCompatDetailsForRuntime, disposeFn, mc, disableStrictLoaderLayerCompatibilityCheck !== true /* strictCompatibilityCheck */);
}
exports.validateLoaderCompatibility = validateLoaderCompatibility;
/**
 * Validates that the DataStore layer is compatible with this Runtime.
 * @internal
 */
function validateDatastoreCompatibility(maybeDataStoreCompatDetailsForRuntime, disposeFn, mc) {
    (0, internal_2.validateLayerCompatibility)("runtime", "dataStore", exports.runtimeCompatDetailsForDataStore, exports.dataStoreSupportRequirementsForRuntime, maybeDataStoreCompatDetailsForRuntime, disposeFn, mc);
}
exports.validateDatastoreCompatibility = validateDatastoreCompatibility;
//# sourceMappingURL=runtimeLayerCompatState.js.map