loadOrCreateTursoServerAccessToken function
Loads or generates the server access token of the shared Turso database for flavor.
A non-empty cloudflare.turso.shared.server_access_token in katana_secrets.yaml
(a single value or a {dev:, prod:} map) takes precedence. Otherwise the value
stored in tursoManagedStatePath is reused, or a new random token is generated and
saved there. The state file is added to cloudflare/.gitignore.
flavor用の共用Turso DBのサーバーアクセストークンを読み込むか生成します。
katana_secrets.yamlのcloudflare.turso.shared.server_access_token(単一値または
{dev:, prod:}形式)が空でなければ優先します。それ以外はtursoManagedStatePathの値を
再利用し、なければランダムなトークンを生成して保存します。状態ファイルは
cloudflare/.gitignoreに追加します。
Implementation
Future<String> loadOrCreateTursoServerAccessToken({
required Map secrets,
required String flavor,
String Function()? generate,
}) async {
final configured = secrets
.getAsMap("cloudflare")
.getAsMap("turso")
.getAsMap("shared")["server_access_token"];
final configuredValue = configured is Map
? configured[flavor]?.toString().trim() ?? ""
: configured?.toString().trim() ?? "";
if (configuredValue.isNotEmpty) {
return configuredValue;
}
await _ensureTursoManagedStateIsGitIgnored();
final file = File(tursoManagedStatePath);
final state = file.existsSync()
? Map<String, dynamic>.from(
modifize(loadYaml(await file.readAsString())) as Map? ?? {},
)
: <String, dynamic>{};
final tokens = state["shared_server_access_token"] is Map
? Map<String, dynamic>.from(state["shared_server_access_token"] as Map)
: <String, dynamic>{};
final stored = tokens[flavor]?.toString() ?? "";
if (stored.isNotEmpty) {
return stored;
}
final token = (generate ?? _generateTursoServerAccessToken)();
tokens[flavor] = token;
state["version"] = 1;
state["shared_server_access_token"] = tokens;
await file.parent.create(recursive: true);
await file.writeAsString(YamlWriter().write(state));
label(
"Generated $tursoServerAccessTokenSecret ($flavor) and stored it in `$tursoManagedStatePath` (git-ignored).",
);
return token;
}