Class
The parsed location manifest
Store that answers for a key matching no override and no route.
Exact key → store name, for single assets that escape their prefix.
Exact key → declared placement. Outranks every other layer.
One driver per store name the manifest declares
Returns the public URL for the given content key. For the local driver,
this is the path under /public/ that Next.js serves. For the S3
driver, this is the bucket URL (and optionally signed).
Returns whether a blob for the given key exists in the underlying store. Used by the seed generator to verify content is present, and by future code paths that need to surface "missing media" states.
Reads a bounded UTF-8 text blob for a known text key. Implementations
MUST validate that the key is safe (no absolute prefixes, no .. path
segments) and reject keys that point to binary asset types before
returning any text. Missing or non-text keys reject; the read is not
a general arbitrary-path API.
Whether this key's store is private, and therefore reachable only through a signed URL.
A time-limited URL granting read access to a private store's object.
The content key
A signed URL valid for the store's TTL
Driven adapter: a
BlobStorethat fans out over several stores.Remarks
This is the layer that makes "the asset moved" a configuration change. It decides WHICH store answers for a key and WHAT path that key has inside it; the drivers below it know only how to resolve a path within one store.
It deliberately does not widen the
BlobStoreinterface. In particular RoutingBlobStore.url stays synchronous, so nothing propagates into the lesson, resource and notes adapters, into entity construction, or into the domain. Private stores are reached through CONTENT_SIGNING_ENDPOINT, which is what buys that: signing is asynchronous, a redirect is not.Example