loadAndMigrateStorageManagedState function

Future<StorageManagedStateLoadResult> loadAndMigrateStorageManagedState(
  1. Map<String, dynamic> secrets, {
  2. String configuredSecret = "",
  3. String generateSecret()?,
})

Loads Storage state and migrates the legacy automatically managed secret.

Implementation

Future<StorageManagedStateLoadResult> loadAndMigrateStorageManagedState(
  Map<String, dynamic> secrets, {
  String configuredSecret = "",
  String Function()? generateSecret,
}) async {
  final file = File(storageManagedStatePath);
  final loaded = file.existsSync()
      ? Map<String, dynamic>.from(
          modifize(loadYaml(await file.readAsString())) as Map? ?? {},
        )
      : <String, dynamic>{};
  final state = _stringMap(loaded);
  final cloudflare = _nestedMap(secrets, "cloudflare");
  final storage = _nestedMap(cloudflare, "storage");
  final legacySecret = storage["download_url_secret"]?.toString() ?? "";
  final storedSecret = state["download_url_secret"]?.toString() ?? "";
  if (legacySecret.isNotEmpty &&
      storedSecret.isNotEmpty &&
      legacySecret != storedSecret) {
    throw StateError(
      "Cloudflare Storage managed state differs between "
      "`katana_secrets.yaml` and `$storageManagedStatePath` at "
      "`download_url_secret`. Resolve the conflict before running "
      "`katana apply` again.",
    );
  }
  final downloadUrlSecret = configuredSecret.isNotEmpty
      ? configuredSecret
      : storedSecret.isNotEmpty
          ? storedSecret
          : legacySecret.isNotEmpty
              ? legacySecret
              : (generateSecret ?? _generateDownloadUrlSecret)();
  var secretsChanged = false;
  var stateChanged = !file.existsSync();
  if (storage.containsKey("download_url_secret")) {
    storage.remove("download_url_secret");
    secretsChanged = true;
  }
  if (state["version"] != 1) {
    state["version"] = 1;
    stateChanged = true;
  }
  if (state["download_url_secret"] != downloadUrlSecret) {
    state["download_url_secret"] = downloadUrlSecret;
    stateChanged = true;
  }
  return StorageManagedStateLoadResult(
    state: state,
    downloadUrlSecret: downloadUrlSecret,
    secretsChanged: secretsChanged,
    stateChanged: stateChanged,
  );
}