firebase_rs_sdk/storage/mod.rs
1//! # Firebase Storage module.
2//!
3//! This module ports core pieces of the Firebase Storage Web SDK to Rust so applications
4//! can discover buckets, navigate object paths, and perform common download, metadata,
5//! and upload operations in a synchronous, `reqwest`-powered environment.
6//!
7//! It provides functionality to interact with Firebase Storage, including
8//! uploading and downloading files, managing metadata, and handling storage references.
9//!
10//! It includes error handling, configuration options, and integration with Firebase apps.
11//!
12//! ## Features
13//!
14//! - Connect to Firebase Storage emulator
15//! - Get storage instance for a Firebase app
16//! - Register storage component
17//! - Manage storage references
18//! - Handle file uploads with progress tracking
19//! - List files and directories in storage
20//! - Manage object metadata
21//! - Comprehensive error handling
22//!
23//! ## References to the Firebase JS SDK - storage module
24//!
25//! - QuickStart: <https://firebase.google.com/docs/storage/web/start>
26//! - API: <https://firebase.google.com/docs/reference/js/storage.md#storage_package>
27//! - Github Repo - Module: <https://github.com/firebase/firebase-js-sdk/tree/main/packages/storage>
28//! - Github Repo - API: <https://github.com/firebase/firebase-js-sdk/tree/main/packages/firebase/storage>
29//!
30//! ## Development status as of 14th October 2025
31//!
32//! - Core functionalities: Mostly implemented (see the module's [README](https://github.com/dgasparri/firebase-rs-sdk/tree/main/src/storage) for details)
33//! - Tests: 27 tests (passed)
34//! - Documentation: Lacking documentation on most functions
35//! - Examples: None provided
36//!
37//! DISCLAIMER: This is not an official Firebase product, nor it is guaranteed that it has no bugs or that it will work as intended.
38//!
39//! # Example
40//!
41//! ```rust,no_run
42//! use firebase_rs_sdk::app::*;
43//! use firebase_rs_sdk::storage::*;
44//!
45//! fn main() {
46//! let options = FirebaseOptions {
47//! storage_bucket: Some("BUCKET_NAME".into()),
48//! ..Default::default()
49//! };
50//!
51//! let app = initialize_app(options, Some(FirebaseAppSettings::default()))
52//! .expect("failed to initialize app");
53//!
54//! let storage = get_storage_for_app(Some(app), None)
55//! .expect("storage component not available");
56//!
57//! let photos = storage
58//! .root_reference()
59//! .expect("missing default bucket")
60//! .child("photos");
61//!
62//! // Upload a photo; small payloads are sent via multipart upload while larger blobs use the resumable API.
63//! let image_bytes = vec![/* PNG bytes */];
64//! let mut upload_metadata = UploadMetadata::new().with_content_type("image/png");
65//! upload_metadata.insert_custom_metadata("uploaded-by", "quickstart");
66//!
67//! let metadata = photos
68//! .child("welcome.png")
69//! .upload_bytes(image_bytes, Some(upload_metadata))
70//! .expect("upload failed");
71//! println!("Uploaded {} to bucket {}", metadata.name.unwrap_or_default(), metadata.bucket.unwrap_or_default());
72//!
73//! // List the directory and stream the first few kilobytes of each item.
74//! let listing = photos.list_all().expect("failed to list objects");
75//! for object in listing.items {
76//! let url = object.get_download_url().expect("missing download URL");
77//! let bytes = object
78//! .get_bytes(Some(256 * 1024))
79//! .expect("download limited to 256 KiB");
80//! println!("{} -> {} bytes", url, bytes.len());
81//! }
82//! }
83//! ```
84
85pub mod api;
86mod constants;
87pub mod error;
88mod list;
89mod location;
90mod metadata;
91mod path;
92pub mod reference;
93pub mod request;
94pub mod service;
95mod upload;
96mod util;
97
98#[doc(inline)]
99pub use api::{
100 connect_storage_emulator, delete_storage_instance, get_storage_for_app,
101 register_storage_component, storage_ref_from_reference, storage_ref_from_storage,
102};
103
104#[doc(inline)]
105pub use constants::{
106 DEFAULT_HOST, DEFAULT_MAX_OPERATION_RETRY_TIME_MS, DEFAULT_MAX_UPLOAD_RETRY_TIME_MS,
107 DEFAULT_PROTOCOL, STORAGE_TYPE,
108};
109
110#[doc(inline)]
111pub use error::{StorageError, StorageErrorCode, StorageResult};
112
113#[doc(inline)]
114pub use list::{build_list_options, parse_list_result, ListOptions, ListResult};
115
116#[doc(inline)]
117pub use location::Location;
118
119#[doc(inline)]
120pub use metadata::{ObjectMetadata, SetMetadataRequest, SettableMetadata, UploadMetadata};
121
122#[doc(inline)]
123pub use path::{child, last_component, parent};
124
125#[doc(inline)]
126pub use reference::StorageReference;
127
128#[doc(inline)]
129pub use request::{
130 continue_resumable_upload_request, create_resumable_upload_request, delete_object_request,
131 download_bytes_request, download_url_request, get_metadata_request,
132 get_resumable_upload_status_request, list_request, multipart_upload_request,
133 update_metadata_request, BackoffConfig, BackoffState, HttpClient, RequestBody, RequestError,
134 RequestInfo, ResponseHandler, ResponsePayload, ResumableUploadStatus,
135 RESUMABLE_UPLOAD_CHUNK_SIZE,
136};
137
138// pub use request::builders::{create_resumable_upload_request, delete_object_request, download_bytes_request, download_url_request, get_metadata_request, get_resumable_upload_status_request, list_request, multipart_upload_request, update_metadata_request, RequestInfo, RequestMethod, RequestBuilder, ResumableUploadStatus, RESUMABLE_UPLOAD_CHUNK_SIZE};
139
140#[doc(inline)]
141pub use service::FirebaseStorageImpl;
142
143#[doc(inline)]
144pub use upload::{UploadProgress, UploadTask, UploadTaskState};
145
146#[doc(inline)]
147pub use util::{is_retry_status_code, is_url};