kiarina-lib-firebase-rtdb
English | 日本語
[!NOTE] What is this? An asynchronous package for reading, querying and updating Firebase Realtime Database, and watching real-time changes.
Dependencies
| Package | Version | License |
|---|---|---|
| HTTPX | >=0.28.1 |
BSD-3-Clause |
| kiarina-lib-firebase | >=2.1.0 |
MIT |
| Pydantic | >=2.10.6 |
MIT |
| Pydantic Settings | >=2.10.1 |
MIT |
| pydantic-settings-manager | >=3.2.0 |
MIT |
Installation
pip install kiarina-lib-firebase-rtdb
Features
- Retrieving Data Retrieves data at a path through the Firebase Realtime Database REST API.
- Querying Data
Orders, limits and ranges the result with
RTDBQuery, which encodes the REST query parameters. - Updating Data
Writes a multi-path update, and deletes keys by sending
None. - Watching Data Changes
Receives
putandpatchevents through Server-Sent Events. - Recovering the Stream Refreshes the ID token after authentication revocation and reconnects with exponential backoff after network errors and token refresh failures.
- Stopping the Stream
Stops a watch with an
asyncio.Event. - Resolving the Token
Passes a token explicitly, or uses the token manager of the named
kiarina.lib.firebasesettings. - Configuring Retries Configures retry intervals through environment variables or pydantic-settings-manager.
Retrieving Data
Get an ID token from TokenManager and specify a database path.
from kiarina.lib.firebase import TokenManager, refresh_id_token
from kiarina.lib.firebase_rtdb import get_data
token_data = await refresh_id_token(
refresh_token="firebase-refresh-token",
api_key="firebase-web-api-key",
)
token_manager = TokenManager(
api_key="firebase-web-api-key",
token_store=token_data,
)
data = await get_data(
"https://your-project-default-rtdb.firebaseio.com",
"/agents/state",
id_token=await token_manager.get_id_token(),
)
Querying Data
RTDBQuery builds the REST query parameters and JSON-encodes their values, which the REST API requires. Ordering by $key needs no index and is chronological when keys are ULIDs.
from kiarina.lib.firebase_rtdb import RTDBQuery, get_data
data = await get_data(
"https://your-project-default-rtdb.firebaseio.com",
"/agents/messages",
query=RTDBQuery(order_by="$key", limit_to_last=5),
id_token=await token_manager.get_id_token(),
)
Pass start_after to fetch only the entries added after the last key already seen.
query = RTDBQuery(order_by="$key", start_after="01ABCDEF...")
shallow truncates every value to true and returns the keys alone. The REST API rejects it together with any other parameter, so RTDBQuery raises a validation error for that combination.
keys = await get_data(
"https://your-project-default-rtdb.firebaseio.com",
"/agents/messages",
query=RTDBQuery(shallow=True),
id_token=await token_manager.get_id_token(),
)
Updating Data
update_data sends a multi-path update. Keys are paths relative to the given path, and a None value deletes the key.
from kiarina.lib.firebase_rtdb import update_data
await update_data(
"https://your-project-default-rtdb.firebaseio.com",
"/agents/messages",
{"01ABCDEF.../read": True, "01OLDEST...": None},
id_token=await token_manager.get_id_token(),
)
Watching Data Changes
watch_data yields put events for complete replacements and patch events for partial updates.
from kiarina.lib.firebase_rtdb import watch_data
async for event in watch_data(
"https://your-project-default-rtdb.firebaseio.com",
"/agents/state",
token_manager=token_manager,
):
print(event.event_type, event.path, event.data)
When authentication is revoked, it calls TokenManager.refresh() and reconnects. An ID token lives for one hour, so this reconnect happens periodically for as long as the watch runs. Right after a reconnect Firebase sends the whole path as a put, so changes made while disconnected are reflected in that snapshot.
Network errors and transient token refresh failures use the configured exponential backoff. Errors that retrying cannot recover from, such as an invalidated refresh token, are propagated to the caller.
Stopping the Stream
Setting stop_event ends the watch when the stream next receives data. Cancel the watch task when an immediate stop is required.
import asyncio
from kiarina.lib.firebase_rtdb import watch_data
stop_event = asyncio.Event()
async for event in watch_data(
"https://your-project-default-rtdb.firebaseio.com",
"/agents/state",
stop_event=stop_event,
token_manager=token_manager,
):
print(event.data)
if event.data == "stop":
stop_event.set()
Resolving the Token
Omitting id_token and token_manager uses the TokenManager of the kiarina.lib.firebase settings named by firebase_settings_key.
kiarina.lib.firebase:
configs:
production:
project_id: production-project
api_key: production-api-key
token_data_file_path: ~/.config/your-app/token.json
kiarina.lib.firebase_rtdb:
firebase_settings_key: production
data = await get_data(
"https://your-project-default-rtdb.firebaseio.com",
"/agents/state",
)
token_manager_registry builds the token manager from those settings. Register an instance under the same key to use a different TokenStore.
Omitting firebase_settings_key uses the default of token_manager_registry, which is the kiarina.lib.firebase settings that its settings_manager resolves.
Configuring Retries
Retry settings use a single-mode settings_manager.
kiarina.lib.firebase_rtdb:
max_retry_delay: 60.0
initial_retry_delay: 1.0
retry_delay_multiplier: 2.0
Load the settings when the application starts.
import yaml
from pydantic_settings_manager import load_user_configs
from kiarina.lib.firebase_rtdb import settings_manager
with open("config.yaml", encoding="utf-8") as file:
load_user_configs(yaml.safe_load(file) or {})
settings = settings_manager.get_settings()
To configure only this package, assign the values directly to settings_manager.user_config.
from kiarina.lib.firebase_rtdb import settings_manager
settings_manager.user_config = {
"max_retry_delay": 60.0,
"initial_retry_delay": 1.0,
"retry_delay_multiplier": 2.0,
}
The same values are available as environment variables.
export KIARINA_LIB_FIREBASE_RTDB_MAX_RETRY_DELAY=60.0
export KIARINA_LIB_FIREBASE_RTDB_INITIAL_RETRY_DELAY=1.0
export KIARINA_LIB_FIREBASE_RTDB_RETRY_DELAY_MULTIPLIER=2.0
API Reference
kiarina.lib.firebase_rtdb
from kiarina.lib.firebase_rtdb import (
DataChangeEvent,
RTDBQuery,
RTDBSettings,
RTDBStreamCancelledError,
get_data,
settings_manager,
update_data,
watch_data,
)
get_data
async def get_data(
database_url: str,
path: str,
*,
query: RTDBQuery | None = None,
id_token: str | None = None,
) -> Any: ...
Retrieves JSON data at the specified path.
Parameters
database_url(str): Firebase Realtime Database URLpath(str): Path of the data to retrievequery(RTDBQuery | None): Query parameters appended to the requestid_token(str | None): Firebase ID token. Resolved fromtoken_manager_registrywhen omitted
Returns
Any: JSON value from the response
Raises
ValueError: The token is omitted andtoken_manager_registrycannot resolve aTokenManagerhttpx.HTTPStatusError: The HTTP response indicates an errorhttpx.HTTPError: The request fails
update_data
async def update_data(
database_url: str,
path: str,
values: Mapping[str, Any],
*,
id_token: str | None = None,
) -> Any: ...
Applies a multi-path update at the specified path.
Parameters
database_url(str): Firebase Realtime Database URLpath(str): Path the update is applied tovalues(Mapping[str, Any]): Keys relative topathand their new values.Nonedeletes the keyid_token(str | None): Firebase ID token. Resolved fromtoken_manager_registrywhen omitted
Returns
Any: JSON value from the response
Raises
ValueError: The token is omitted andtoken_manager_registrycannot resolve aTokenManagerhttpx.HTTPStatusError: The HTTP response indicates an errorhttpx.HTTPError: The request fails
watch_data
async def watch_data(
database_url: str,
path: str,
*,
stop_event: asyncio.Event | None = None,
token_manager: TokenManager | None = None,
) -> AsyncIterator[DataChangeEvent]: ...
Watches the specified path and yields data changes from the Firebase SSE stream.
Parameters
database_url(str): Firebase Realtime Database URLpath(str): Path of the data to watchstop_event(asyncio.Event | None): Event that requests the watch to stoptoken_manager(TokenManager | None): Instance that manages the ID token. Resolved fromtoken_manager_registrywhen omitted
Yields
DataChangeEvent: Aputorpatchdata change
Raises
ValueError: The token is omitted andtoken_manager_registrycannot resolve aTokenManagerRTDBStreamCancelledError: Firebase cancels the streamInvalidRefreshTokenError: The refresh token is no longer usableFirebaseAPIError: Token refresh fails with an error that retrying cannot recover from
Network errors and transient token refresh failures are retried internally. Other unexpected exceptions are propagated to the caller.
DataChangeEvent
@dataclass
class DataChangeEvent:
event_type: Literal["put", "patch"]
path: str
data: Any
A data change received from Firebase Realtime Database.
Fields
event_type(Literal["put", "patch"]): Event typepath(str): Relative path that changeddata(Any): Updated data
RTDBQuery
class RTDBQuery(BaseModel):
order_by: str | None = None
limit_to_first: int | None = None
limit_to_last: int | None = None
start_at: QueryValue | None = None
start_after: QueryValue | None = None
end_at: QueryValue | None = None
end_before: QueryValue | None = None
equal_to: QueryValue | None = None
shallow: bool = False
Query parameters for the Firebase Realtime Database REST API. QueryValue is str | bool | int | float.
Fields
order_by(str | None): Child key to order by, or"$key","$value"or"$priority"limit_to_first(int | None): Number of items to take from the beginning of the ordered resultlimit_to_last(int | None): Number of items to take from the end of the ordered resultstart_at(QueryValue | None): Inclusive lower bound of the ordered resultstart_after(QueryValue | None): Exclusive lower bound of the ordered resultend_at(QueryValue | None): Inclusive upper bound of the ordered resultend_before(QueryValue | None): Exclusive upper bound of the ordered resultequal_to(QueryValue | None): Exact value the ordered child must matchshallow(bool): Truncate each value totrue
Methods
to_params() -> dict[str, str]: Returns the REST query parameters with JSON-encoded values
Raises
ValidationError:shallowis combined with another parameter, a filter is used withoutorder_by, or mutually exclusive parameters are set together
RTDBSettings
class RTDBSettings(BaseSettings):
firebase_settings_key: str | None = None
max_retry_delay: float = 60.0
initial_retry_delay: float = 1.0
retry_delay_multiplier: float = 2.0
Settings used when resolving the token and reconnecting a stream.
Fields
firebase_settings_key(str | None): Key of thekiarina.lib.firebasesettings whoseTokenManageris used when no token is passed. An alias ofkiarina.lib.firebaseis also accepted. The default oftoken_manager_registryis used when this is not setmax_retry_delay(float): Maximum retry interval in secondsinitial_retry_delay(float): Initial retry interval in secondsretry_delay_multiplier(float): Value multiplied by the retry interval after a network error
settings_manager
settings_manager: SettingsManager[RTDBSettings]
Manages a single RTDBSettings configuration.
RTDBStreamCancelledError
class RTDBStreamCancelledError(Exception): ...
Indicates that Firebase cancelled the SSE stream.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kiarina_lib_firebase_rtdb-2.25.0.tar.gz.
File metadata
- Download URL: kiarina_lib_firebase_rtdb-2.25.0.tar.gz
- Upload date:
- Size: 20.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
daa4f88de2825f5c574576d5b525880ccf24b888429bfa940c014a452f1ad870
|
|
| MD5 |
50aed94d2c168a2f18d0cdbf23597d9e
|
|
| BLAKE2b-256 |
c4bab82d13b82882086693ef6e2bdcf8872971a16b8b945fba80ca11a5314549
|
Provenance
The following attestation bundles were made for kiarina_lib_firebase_rtdb-2.25.0.tar.gz:
Publisher:
release-pypi.yml on kiarina/kiarina-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kiarina_lib_firebase_rtdb-2.25.0.tar.gz -
Subject digest:
daa4f88de2825f5c574576d5b525880ccf24b888429bfa940c014a452f1ad870 - Sigstore transparency entry: 2534524697
- Sigstore integration time:
-
Permalink:
kiarina/kiarina-python@32969ccc79e2be0900884e2356b94ec5dbab1cdc -
Branch / Tag:
refs/tags/v2.25.0 - Owner: https://github.com/kiarina
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-pypi.yml@32969ccc79e2be0900884e2356b94ec5dbab1cdc -
Trigger Event:
push
-
Statement type:
File details
Details for the file kiarina_lib_firebase_rtdb-2.25.0-py3-none-any.whl.
File metadata
- Download URL: kiarina_lib_firebase_rtdb-2.25.0-py3-none-any.whl
- Upload date:
- Size: 13.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24960dece8e6569d777ca32dd1185d13eb770a9722507adfd97668d554dc0b4e
|
|
| MD5 |
2a7071505646011d7b92d3f6bc74b393
|
|
| BLAKE2b-256 |
a8426523a425f2279c40856b9ce8433e35efa0387035534cb787d8b9eb0f84f2
|
Provenance
The following attestation bundles were made for kiarina_lib_firebase_rtdb-2.25.0-py3-none-any.whl:
Publisher:
release-pypi.yml on kiarina/kiarina-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kiarina_lib_firebase_rtdb-2.25.0-py3-none-any.whl -
Subject digest:
24960dece8e6569d777ca32dd1185d13eb770a9722507adfd97668d554dc0b4e - Sigstore transparency entry: 2534524857
- Sigstore integration time:
-
Permalink:
kiarina/kiarina-python@32969ccc79e2be0900884e2356b94ec5dbab1cdc -
Branch / Tag:
refs/tags/v2.25.0 - Owner: https://github.com/kiarina
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-pypi.yml@32969ccc79e2be0900884e2356b94ec5dbab1cdc -
Trigger Event:
push
-
Statement type: