StorageScope class
Tenant-scoping wrapper around a StorageBackend.
Cellar builds one StorageScope per partition and routes calls
through it. The scope's only job: prepend keyPrefix to every key
before delegating to the backend, and validate the key.
// Unscoped — keys pass straight through:
final scope = StorageScope(backend);
scope.write('photos/sunset', bytes); // backend key: "photos/sunset"
// Scoped — every key gets the tenant prefix:
final scope = StorageScope(backend, keyPrefix: 'user/u1');
scope.write('photos/sunset', bytes); // backend key: "user/u1/photos/sunset"
// Two scopes, two tenants, one shared backend:
final alice = StorageScope(backend, keyPrefix: 'user/alice');
final bob = StorageScope(backend, keyPrefix: 'user/bob');
Key structure
The scope does not impose any structure on keys past the prefix.
Paths are /-separated strings; apps choose their own conventions.
Encryption
Encryption is per-write via WriteOptions. The scope passes
WriteOptions through to the backend unchanged; encryption is
applied (or not) by an EncryptedBackend decorator further down
the stack.
Constructors
- StorageScope(StorageBackend _backend, {String? keyPrefix})
- Create a scoped view over backend.
Properties
- backend → StorageBackend
-
The underlying backend (for advanced or raw operations that need
to bypass the prefix layer).
no setter
- hashCode → int
-
The hash code for this object.
no setterinherited
- keyPrefix → String?
-
Optional tenant prefix applied to every key. Null = no prefix.
final
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
Methods
-
copy(
String sourcePath, String destPath) → Future< void> - Copy within this scope, metadata included.
-
copyToScope(
String sourcePath, StorageScope dest, String destPath) → Future< void> - Copy into another scope — the backends must share a substrate (same underlying store) for the raw copy to land.
-
delete(
String path) → Future< void> - Delete the scoped key. No-op when absent.
-
deletePrefix(
String pathPrefix) → Future< void> -
Delete every scoped key under
pathPrefix(raw string prefix). -
exists(
String path) → Future< bool> - Whether the scoped key exists.
-
fileSize(
String path) → Future< int> - File size in bytes (0 if not found).
-
head(
String path) → Future< ObjectInfo?> - Metadata without the body; null when the scoped key is absent.
-
key(
String path) → String - Build the prefixed key for a user-supplied path. No-op when keyPrefix is null.
-
list(
String pathPrefix) → Future< List< ObjectInfo> > -
List every scoped key under
pathPrefix(raw string prefix). -
listKeys(
String pathPrefix) → Future< List< String> > - Like list but returns just the keys.
-
materialize(
String path, {bool decrypt = true, bool exclusive = false}) → Future< MaterializedFile> - Materialize a stored object as a platform-local handle.
-
move(
String sourcePath, String destPath) → Future< void> - Copy then delete the source. Not atomic across the two steps.
-
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
prefix(
String path) → String - Build the prefixed prefix for list/delete operations. Same logic as key — exposed separately for readability at call sites.
-
read(
String path) → Future< Uint8List> -
Read the full body at the scoped key. Throws
FileNotFoundErrorwhen absent. -
readRange(
String path, {required int start, required int length}) → Future< Uint8List> -
Read
lengthbytes starting atstartfrom the scoped key. -
readStream(
String path) → Stream< List< int> > - Streaming variant of read.
-
toString(
) → String -
A string representation of this object.
inherited
-
totalSize(
String pathPrefix) → Future< int> - Total size in bytes of all files under a path prefix.
-
updateMetadata(
String path, {String? contentType, Map< String, String> metadata = const {}}) → Future<void> - Replace contentType + metadata at the scoped key, bytes untouched.
-
write(
String path, Uint8List bytes, [WriteOptions options = const WriteOptions()]) → Future< void> -
Validate
path, apply the prefix, writebytesat the scoped key. -
writeStream(
String path, Stream< List< byteStream, [WriteOptions options = const WriteOptions()]) → Future<int> >void> - Streaming variant of write — constant memory for any size.
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited