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};