mirror of
https://github.com/kuhyx/utils.git
synced 2026-11-10 20:07:18 +01:00
Everything an app needs to move from GitHub to Firebase without each one reinventing the wiring. Python: - _config.py: FirebaseConfig.load() + firebase_client_for(app) + mirror_client_for(app, github). One config file, read in one place. Credential caches stay per-app (~/.config/<app>/firebase_auth.json) -- one file written by several processes is a corruption waiting to happen. - tool/preflight_firebase.py: validates the config before any data moves. Catches a wrong-region databaseUrl (which answers 404 with a correctUrl body rather than an error, so it would otherwise pass every check and break mid-migration) and confirms the uid in the ID token matches the uid the rules pin -- sign_in() returns None and discards localId, so the uid is decoded from the JWT. - tool/interop_seed.py: the missing Python half of the cross-language check. interop_check.dart asserts it can see a record written by Python, but nothing ever wrote one, so it could only ever fail. Dart: - firebase_config.dart: the same config shape, kept free of dart:io so it works on web and Android, where the file does not exist at all and credentials belong in flutter_secure_storage. - PersistedSyncStateStore: the revision cache, persisted. Without it a phone forgets every peer revision on each cold start and re-downloads everything -- the exact traffic the revision scheme exists to avoid, and what the free-tier headroom depends on. Verified live against the real database: preflight passes all five checks, the Dart smoke test passes end to end, and Python <-> Dart interop is OK. Python 226 tests at 100% branch coverage; Dart 218 tests, both new files at 100% line coverage. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJ9sxEw3ymzXNjL7SHNpJc
89 lines
2.1 KiB
Python
89 lines
2.1 KiB
Python
"""Shared CRDT merge scheme + pluggable remote sync transports."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from crdt_sync._config import (
|
|
CONFIG_DIR,
|
|
CONFIG_FILE,
|
|
PASSWORD_FILE,
|
|
ConfigError,
|
|
FirebaseConfig,
|
|
credential_store_for,
|
|
firebase_client_for,
|
|
mirror_client_for,
|
|
)
|
|
from crdt_sync._firebase import (
|
|
DatabaseNotFoundError,
|
|
FirebaseSyncClient,
|
|
FirebaseSyncError,
|
|
)
|
|
from crdt_sync._firebase_auth import (
|
|
CredentialStore,
|
|
FileCredentialStore,
|
|
FirebaseAuthError,
|
|
FirebaseCredentials,
|
|
FirebaseTokenProvider,
|
|
MemoryCredentialStore,
|
|
)
|
|
from crdt_sync._github import GitHubSyncClient, GitHubSyncError, RepoNotFoundError
|
|
from crdt_sync._hlc import Hlc
|
|
from crdt_sync._log import Log, merge_logs
|
|
from crdt_sync._mirror import MirrorSyncClient
|
|
from crdt_sync._record import Field, Record, merge_field, merge_record
|
|
from crdt_sync._remote import RemoteNotFoundError, RemoteStore, RemoteSyncError
|
|
from crdt_sync._store import dump_log, load_log, read_log, write_log
|
|
from crdt_sync._sync import (
|
|
FileSyncStateStore,
|
|
MemorySyncStateStore,
|
|
SyncState,
|
|
SyncStateStore,
|
|
default_revs_path,
|
|
revision_of,
|
|
sync_log,
|
|
)
|
|
|
|
__all__ = [
|
|
"CONFIG_DIR",
|
|
"CONFIG_FILE",
|
|
"PASSWORD_FILE",
|
|
"ConfigError",
|
|
"CredentialStore",
|
|
"DatabaseNotFoundError",
|
|
"Field",
|
|
"FileCredentialStore",
|
|
"FileSyncStateStore",
|
|
"FirebaseAuthError",
|
|
"FirebaseConfig",
|
|
"FirebaseCredentials",
|
|
"FirebaseSyncClient",
|
|
"FirebaseSyncError",
|
|
"FirebaseTokenProvider",
|
|
"GitHubSyncClient",
|
|
"GitHubSyncError",
|
|
"Hlc",
|
|
"Log",
|
|
"MemoryCredentialStore",
|
|
"MemorySyncStateStore",
|
|
"MirrorSyncClient",
|
|
"Record",
|
|
"RemoteNotFoundError",
|
|
"RemoteStore",
|
|
"RemoteSyncError",
|
|
"RepoNotFoundError",
|
|
"SyncState",
|
|
"SyncStateStore",
|
|
"credential_store_for",
|
|
"default_revs_path",
|
|
"dump_log",
|
|
"firebase_client_for",
|
|
"load_log",
|
|
"merge_field",
|
|
"merge_logs",
|
|
"merge_record",
|
|
"mirror_client_for",
|
|
"read_log",
|
|
"revision_of",
|
|
"sync_log",
|
|
"write_log",
|
|
]
|