diff --git a/runtime/settings-defaults.js b/runtime/settings-defaults.js index 497f95c..409d8b4 100644 --- a/runtime/settings-defaults.js +++ b/runtime/settings-defaults.js @@ -9,6 +9,8 @@ function clampIntValue(value, fallback = 0, min = 0, max = 9999) { return Math.min(max, Math.max(min, Math.trunc(numeric))); } +const NATIVE_ROLLOUT_VERSION = 1; + export const defaultSettings = { enabled: true, debugLoggingEnabled: false, @@ -124,6 +126,7 @@ export const defaultSettings = { persistNativeDeltaBridgeMode: "json", loadUseNativeHydrate: true, loadNativeHydrateThresholdRecords: 12000, + nativeRolloutVersion: NATIVE_ROLLOUT_VERSION, nativeEngineFailOpen: true, graphNativeForceDisable: false, @@ -237,8 +240,31 @@ export function migrateLegacyAutoMaintenanceSettings(loaded = {}) { return migrated; } +export function migrateNativeRolloutSettings(loaded = {}) { + if (!loaded || typeof loaded !== "object" || Array.isArray(loaded)) { + return {}; + } + + const migrated = { ...loaded }; + const rolloutVersion = clampIntValue( + migrated.nativeRolloutVersion, + 0, + 0, + NATIVE_ROLLOUT_VERSION, + ); + if (rolloutVersion < NATIVE_ROLLOUT_VERSION) { + migrated.graphUseNativeLayout = defaultSettings.graphUseNativeLayout; + migrated.persistUseNativeDelta = defaultSettings.persistUseNativeDelta; + migrated.loadUseNativeHydrate = defaultSettings.loadUseNativeHydrate; + } + migrated.nativeRolloutVersion = NATIVE_ROLLOUT_VERSION; + return migrated; +} + export function mergePersistedSettings(loaded = {}) { - const compatibleLoaded = migrateLegacyAutoMaintenanceSettings(loaded); + const compatibleLoaded = migrateNativeRolloutSettings( + migrateLegacyAutoMaintenanceSettings(loaded), + ); const merged = { ...defaultSettings }; for (const key of DEFAULT_SETTING_KEYS) { if (Object.prototype.hasOwnProperty.call(compatibleLoaded, key)) { diff --git a/tests/default-settings.mjs b/tests/default-settings.mjs index bde079c..3c763d2 100644 --- a/tests/default-settings.mjs +++ b/tests/default-settings.mjs @@ -78,6 +78,7 @@ assert.equal(defaultSettings.persistNativeDeltaThresholdSerializedChars, 4000000 assert.equal(defaultSettings.persistNativeDeltaBridgeMode, "json"); assert.equal(defaultSettings.loadUseNativeHydrate, true); assert.equal(defaultSettings.loadNativeHydrateThresholdRecords, 12000); +assert.equal(defaultSettings.nativeRolloutVersion, 1); assert.equal(defaultSettings.nativeEngineFailOpen, true); assert.equal(defaultSettings.graphNativeForceDisable, false); assert.equal(defaultSettings.taskProfilesVersion, 3); @@ -116,4 +117,29 @@ assert.equal( defaultSettings.compressionEveryN, ); +const migratedLegacyNativeDisabled = mergePersistedSettings({ + graphUseNativeLayout: false, + persistUseNativeDelta: false, + loadUseNativeHydrate: false, + graphNativeForceDisable: true, +}); +assert.equal(migratedLegacyNativeDisabled.graphUseNativeLayout, true); +assert.equal(migratedLegacyNativeDisabled.persistUseNativeDelta, true); +assert.equal(migratedLegacyNativeDisabled.loadUseNativeHydrate, true); +assert.equal(migratedLegacyNativeDisabled.graphNativeForceDisable, true); +assert.equal(migratedLegacyNativeDisabled.nativeRolloutVersion, 1); + +const migratedVersionedManualNativeDisabled = mergePersistedSettings({ + nativeRolloutVersion: 1, + graphUseNativeLayout: false, + persistUseNativeDelta: false, + loadUseNativeHydrate: false, + graphNativeForceDisable: true, +}); +assert.equal(migratedVersionedManualNativeDisabled.graphUseNativeLayout, false); +assert.equal(migratedVersionedManualNativeDisabled.persistUseNativeDelta, false); +assert.equal(migratedVersionedManualNativeDisabled.loadUseNativeHydrate, false); +assert.equal(migratedVersionedManualNativeDisabled.graphNativeForceDisable, true); +assert.equal(migratedVersionedManualNativeDisabled.nativeRolloutVersion, 1); + console.log("default-settings tests passed"); diff --git a/tests/graph-persistence.mjs b/tests/graph-persistence.mjs index 489ef8b..26edb9e 100644 --- a/tests/graph-persistence.mjs +++ b/tests/graph-persistence.mjs @@ -3157,6 +3157,7 @@ result = { writesBlocked: false, }); harness.runtimeContext.extension_settings[MODULE_NAME] = { + nativeRolloutVersion: 1, persistUseNativeDelta: false, }; harness.runtimeContext.__scheduleUploadShouldThrow = true;