blob: ffa8f3e8f6e4cc3e51f6bf9d7402b91ad79dc8cb [file] [log] [blame] [view] [edit]
<link rel="stylesheet" href="../style.css" />
[TOC]
# fuchsia.pkg
## **PROTOCOLS**
## BlobIdIterator {#BlobIdIterator}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=236)*
<p>A chunked iterator of blob IDs, allowing transfer of more blob IDs that can
fit in a single FIDL message.</p>
### Next {#BlobIdIterator.Next}
<p>Responds with the next chunk of blob IDs. When the iterator is
exhausted, responds with an empty vector and closes the connection.</p>
<ul>
<li>response <code>blobs</code> the next chunk of blob IDs.</li>
</ul>
#### Request {#BlobIdIterator.Next_Request}
&lt;EMPTY&gt;
#### Response {#BlobIdIterator.Next_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>blobs</code></td>
<td>
<code>vector&lt;<a class='link' href='#BlobId'>BlobId</a>&gt;</code>
</td>
</tr></table>
## BlobInfoIterator {#BlobInfoIterator}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=184)*
<p>A chunked iterator of <a class='link' href='#BlobInfo'>BlobInfo</a>, allowing transfer of more <a class='link' href='#BlobInfo'>BlobInfo</a>s
that can fit in a single FIDL message.</p>
### Next {#BlobInfoIterator.Next}
<p>Responds with the next chunk of <a class='link' href='#BlobInfo'>BlobInfo</a>s. When the iterator is
exhausted, responds with an empty vector and closes the connection.</p>
<ul>
<li>response <code>blobs</code> the next chunk of <a class='link' href='#BlobInfo'>BlobInfo</a>s.</li>
</ul>
#### Request {#BlobInfoIterator.Next_Request}
&lt;EMPTY&gt;
#### Response {#BlobInfoIterator.Next_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>blobs</code></td>
<td>
<code>vector&lt;<a class='link' href='#BlobInfo'>BlobInfo</a>&gt;</code>
</td>
</tr></table>
## FontResolver {#FontResolver}
*Defined in [fuchsia.pkg/font_resolver.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/font_resolver.fidl;l=18)*
<p>This resolves font packages from a registry.</p>
<p>This is intended to be implemented by package resolver components, and used
exclusively by fuchsia.fonts.Provider.</p>
<p>DEPRECATED. This is an interim solution, and will be revisited when Component Framework v2
becomes available and allows non-component packages and easier directory routing.</p>
<p><b>DEPRECATED </b>- For use only in Font Provider. To be replaced after Components v2 launch.</p>
### Resolve {#FontResolver.Resolve}
<p>Populates or updates the cache of a font package, fetching it if it is not present on the
local system.</p>
<ul>
<li>request <code>package_url</code> the package URL of a font package.</li>
<li>request <code>directory_request</code> a request for a directory that will be resolved when the
package has been successfully cached. The directory should contain a single file,
corresponding to the asset filename. The client should retain the directory handle
for as long as needed to prevent the package from being evicted from cache.</li>
</ul>
<ul>
<li>error a zx_status value indicating failure. One of the following:
<ul>
<li><code>ZX_ERR_ACCESS_DENIED</code> if the resolver does not have permission to fetch a
package blob.</li>
<li><code>ZX_ERR_IO</code> if there is some other unspecified error during I/O.</li>
<li><code>ZX_ERR_NOT_FOUND</code> if the font package or a package blob does not exist, or is
not known to be a font package.</li>
<li><code>ZX_ERR_NO_SPACE</code> if there is no space available to store the package.</li>
<li><code>ZX_ERR_UNAVAILABLE</code> if the resolver is currently unable to fetch a package blob.</li>
</ul>
</li>
</ul>
#### Request {#FontResolver.Resolve_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>package_url</code></td>
<td>
<code>string</code>
</td>
</tr><tr>
<td><code>directory_request</code></td>
<td>
<code>request&lt;<a class='link' href='../fuchsia.io/'>fuchsia.io</a>/<a class='link' href='../fuchsia.io/#Directory'>Directory</a>&gt;</code>
</td>
</tr></table>
#### Response {#FontResolver.Resolve_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#FontResolver_Resolve_Result'>FontResolver_Resolve_Result</a></code>
</td>
</tr></table>
## LocalMirror {#LocalMirror}
*Defined in [fuchsia.pkg/local_mirror.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/local_mirror.fidl;l=10)*
<p>A collection of TUF repositories contained in an attached storage device.</p>
### GetBlob {#LocalMirror.GetBlob}
<p>Obtains and returns a blob from an attached storage device.</p>
<ul>
<li>request <code>blob_id</code> the id of the blob to return.</li>
<li>request <code>blob</code> a server end for a blob file to be opened
with <code>OPEN_RIGHT_READABLE | OPEN_FLAG_DESCRIBE</code>. If the blobs
directory exists but the requested file does not, the client end
will receive an OnOpen with <code>Status::NOT_FOUND</code>.</li>
</ul>
<ul>
<li>error a <code>GetBlobError</code> value</li>
</ul>
#### Request {#LocalMirror.GetBlob_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>blob_id</code></td>
<td>
<code><a class='link' href='#BlobId'>BlobId</a></code>
</td>
</tr><tr>
<td><code>blob</code></td>
<td>
<code>request&lt;<a class='link' href='../fuchsia.io/'>fuchsia.io</a>/<a class='link' href='../fuchsia.io/#File'>File</a>&gt;</code>
</td>
</tr></table>
#### Response {#LocalMirror.GetBlob_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#LocalMirror_GetBlob_Result'>LocalMirror_GetBlob_Result</a></code>
</td>
</tr></table>
### GetMetadata {#LocalMirror.GetMetadata}
<p>Obtains and returns a named TUF metadata file from an attached storage
device.</p>
<ul>
<li>request <code>repo_url</code> the URL of the TUF repository for which to return
metadata.</li>
<li>request <code>path</code> the path of the metadata file, relative to the
repository_metadata directory for the specific TUF repository.</li>
<li>request <code>metadata</code> a server end for a TUF metadata file to be opened
with <code>OPEN_RIGHT_READABLE | OPEN_FLAG_DESCRIBE</code>. If the metadata
directory exists but the requested file does not, the client end
will receive an OnOpen with <code>Status::NOT_FOUND</code>.</li>
</ul>
<ul>
<li>error a <code>GetMetadataError</code> value</li>
</ul>
#### Request {#LocalMirror.GetMetadata_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>repo_url</code></td>
<td>
<code><a class='link' href='#RepositoryUrl'>RepositoryUrl</a></code>
</td>
</tr><tr>
<td><code>path</code></td>
<td>
<code>string[4096]</code>
</td>
</tr><tr>
<td><code>metadata</code></td>
<td>
<code>request&lt;<a class='link' href='../fuchsia.io/'>fuchsia.io</a>/<a class='link' href='../fuchsia.io/#File'>File</a>&gt;</code>
</td>
</tr></table>
#### Response {#LocalMirror.GetMetadata_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#LocalMirror_GetMetadata_Result'>LocalMirror_GetMetadata_Result</a></code>
</td>
</tr></table>
## NeededBlobs {#NeededBlobs}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=105)*
<p>Represents the transaction for caching a particular package.</p>
<p>Server expects client to follow the normal operation sequence defined below.
Violating the protocol (e.g. calling wrong methods at the wrong time) will result
in the channel being closed by the package cache with a <code>ZX_ERR_BAD_STATE</code> epitaph
and aborting the package cache operation.
If a fatal error occurs at any step, server will close the channel, and client
should not proceed with the sequence.
Non-fatal errors could be retried, as long as the channel remains open.</p>
<p>Normal operation sequence:</p>
<ol>
<li>Clients should start by requesting to <code>OpenMetaBlob()</code>, and fetch and write
the metadata blob if needed.</li>
<li><code>GetMissingBlobs()</code> should be used to determine which content blobs need
fetched and written.</li>
<li>Each of the missing content blobs needs to be written using <code>OpenBlob()</code>.</li>
</ol>
<p>Once all needed blobs are written by the client, the package cache will
complete the pending <a class='link' href='#PackageCache.Get'>PackageCache.Get</a> request and close this channel
with a <code>ZX_OK</code> epitaph.</p>
### Abort {#NeededBlobs.Abort}
<p>Aborts this caching operation for the package.</p>
<p>Any open blobs and any missing blobs iterator will be closed. Any <code>dir</code>
provided to the associated <a class='link' href='#PackageCache.Get'>PackageCache.Get</a> request will also be
closed. Once this request is acknowledged, this channel will be closed.</p>
<p>Note, dropping this NeededBlobs channel without writing all needed blobs
will also abort the package cache operation. However, this API provides
the ability to wait for the operation to be torn down.</p>
#### Request {#NeededBlobs.Abort_Request}
&lt;EMPTY&gt;
#### Response {#NeededBlobs.Abort_Response}
&lt;EMPTY&gt;
### GetMissingBlobs {#NeededBlobs.GetMissingBlobs}
<p>Returns an iterator of blobs that are not present on the system that
must be written using the <code>OpenBlob</code> request before the package will be
fully cached.</p>
<p>Client should call <code>OpenMetaBlob</code>, and write it if needed, before
calling <code>GetMissingBlobs</code>.</p>
<p>A client should make this request no more than once per <code>NeededBlobs</code>
connection. Once all blobs yielded by this iterator are written, the
package open request will complete.</p>
<ul>
<li>request <code>iterator</code> a request for an iterator of <a class='link' href='#BlobInfo'>BlobInfo</a> of blobs
that the client should try to write.</li>
</ul>
#### Request {#NeededBlobs.GetMissingBlobs_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>iterator</code></td>
<td>
<code>request&lt;<a class='link' href='#BlobInfoIterator'>BlobInfoIterator</a>&gt;</code>
</td>
</tr></table>
### OpenBlob {#NeededBlobs.OpenBlob}
<p>Opens a content blob for writing.</p>
<ul>
<li>request <code>blob_id</code> the blob id describing this blob.</li>
<li>request <code>file</code> resolves to an opened writable file which must be
truncated to the correct size by the caller and then written from
start to finish (seeks are not supported). A corrupt blob is indicated
by a <code>Write()</code> (usually the final write) failing with
<code>ZX_ERR_IO_DATA_INTEGRITY</code>. On error or a response of <code>false</code>, <code>file</code>
will be closed by the server.</li>
</ul>
<ul>
<li>response <code>needed</code> <code>true</code> if the blob is still needed and should be
written by the client. On <code>false</code>, the blob now exists, does not
need to be written by the client, and <code>file</code> will be closed.</li>
</ul>
<ul>
<li>error an OpenBlobError indicating failure. Clients may retry this
request, though the server end may abort this cache operation on
errors it considers to be fatal.</li>
</ul>
#### Request {#NeededBlobs.OpenBlob_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>blob_id</code></td>
<td>
<code><a class='link' href='#BlobId'>BlobId</a></code>
</td>
</tr><tr>
<td><code>file</code></td>
<td>
<code>request&lt;<a class='link' href='../fuchsia.io/'>fuchsia.io</a>/<a class='link' href='../fuchsia.io/#File'>File</a>&gt;</code>
</td>
</tr></table>
#### Response {#NeededBlobs.OpenBlob_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#NeededBlobs_OpenBlob_Result'>NeededBlobs_OpenBlob_Result</a></code>
</td>
</tr></table>
### OpenMetaBlob {#NeededBlobs.OpenMetaBlob}
<p>Opens the package's metadata blob for writing. <code>GetMissingBlobs()</code>
should not be called until writing the meta blob or this request
responds with <code>false</code>.</p>
<p>If the package was already cached, server will close the channel
with a <code>ZX_OK</code> epitaph.</p>
<ul>
<li>request <code>file</code> resolves to an opened writable file which must be
truncated to the correct size by the caller and then written from
start to finish (seeks are not supported). A corrupt blob is indicated
by a <code>Write()</code> (usually the final write) failing with
<code>ZX_ERR_IO_DATA_INTEGRITY</code>. On error or a response of <code>false</code>, <code>file</code>
will be closed by the server.</li>
</ul>
<ul>
<li>response <code>needed</code> <code>true</code> if the blob is still needed and should be
written by the client. On <code>false</code>, the blob now exists, does not
need to be written by the client, and <code>file</code> will be closed.</li>
</ul>
<ul>
<li>error an OpenBlobError indicating failure. Clients may retry this
request, though the server end may abort this cache operation on
errors it considers to be fatal.</li>
</ul>
#### Request {#NeededBlobs.OpenMetaBlob_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>file</code></td>
<td>
<code>request&lt;<a class='link' href='../fuchsia.io/'>fuchsia.io</a>/<a class='link' href='../fuchsia.io/#File'>File</a>&gt;</code>
</td>
</tr></table>
#### Response {#NeededBlobs.OpenMetaBlob_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#NeededBlobs_OpenMetaBlob_Result'>NeededBlobs_OpenMetaBlob_Result</a></code>
</td>
</tr></table>
## PackageCache {#PackageCache}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=14)*
<p>This manages the system package cache.</p>
<p>This is intended to be implemented by the package manager component and used by
package resolver components.</p>
### BasePackageIndex {#PackageCache.BasePackageIndex}
<p>Retrieves a chunk iterator to the base package index.</p>
<ul>
<li>request <code>iterator</code> a request for the <code>PackageIndexIterator</code> that will return sets of
<code>PackageIndexEntry</code> objects until all packages in the base index have been iterated.</li>
</ul>
#### Request {#PackageCache.BasePackageIndex_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>iterator</code></td>
<td>
<code>request&lt;<a class='link' href='#PackageIndexIterator'>PackageIndexIterator</a>&gt;</code>
</td>
</tr></table>
### Get {#PackageCache.Get}
<p>Gets the package directory if it is present on the local system. If it is not, the
<code>missing_blobs</code> iterator will provide all the blobs in the package that are missing from
the system, and the ability to write those blobs to blobfs. If all the missing blobs are
downloaded and written to by the client, the <code>dir</code> directory will be resolved. This method
will return successfully when the package has been fully resolved, or return an error if
the client closes <code>needed_blobs</code> or <code>dir</code> handle before the package has been resolved.</p>
<p>This method does not guarantee the missing blobs have been persisted. In order to guarantee
missing blobs are persisted, clients should call ['Sync'].</p>
<ul>
<li>request <code>meta_far_blob</code> the blob info for the package's meta.far.</li>
<li>request <code>selectors</code> the package selectors (TODO: link to docs).</li>
<li>request <code>needed_blobs</code> an iterator over all the blobs in the package that
are not present on the system.</li>
<li>request <code>dir</code> an optional request for a directory that will be resolved when the package
has been successfully cached.</li>
</ul>
<ul>
<li>error a zx_status value indicating failure. One of the following:
<ul>
<li><code>ZX_ERR_UNAVAILABLE</code> if the client closed <code>needed_blobs</code> handles before
all the missing blobs were downloaded to the system.</li>
</ul>
</li>
</ul>
#### Request {#PackageCache.Get_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>meta_far_blob</code></td>
<td>
<code><a class='link' href='#BlobInfo'>BlobInfo</a></code>
</td>
</tr><tr>
<td><code>selectors</code></td>
<td>
<code>vector&lt;string&gt;</code>
</td>
</tr><tr>
<td><code>needed_blobs</code></td>
<td>
<code>request&lt;<a class='link' href='#NeededBlobs'>NeededBlobs</a>&gt;</code>
</td>
</tr><tr>
<td><code>dir</code></td>
<td>
<code>request&lt;<a class='link' href='../fuchsia.io/'>fuchsia.io</a>/<a class='link' href='../fuchsia.io/#Directory'>Directory</a>&gt;?</code>
</td>
</tr></table>
#### Response {#PackageCache.Get_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#PackageCache_Get_Result'>PackageCache_Get_Result</a></code>
</td>
</tr></table>
### Open {#PackageCache.Open}
<p>Opens the package, or errors out if it is not present on the local system.</p>
<ul>
<li>request <code>meta_far_blob_id</code> the blob id for the package's meta.far.</li>
<li>request <code>selectors</code> the package selectors (TODO: link to docs).</li>
<li>request <code>dir</code> a request for a directory that will be resolved when the package has been
successfully cached.</li>
</ul>
<ul>
<li>error a zx_status value indicating failure. One of the following:
<ul>
<li><code>ZX_ERR_NOT_FOUND</code> if the package does not exist.</li>
</ul>
</li>
</ul>
#### Request {#PackageCache.Open_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>meta_far_blob_id</code></td>
<td>
<code><a class='link' href='#BlobId'>BlobId</a></code>
</td>
</tr><tr>
<td><code>selectors</code></td>
<td>
<code>vector&lt;string&gt;</code>
</td>
</tr><tr>
<td><code>dir</code></td>
<td>
<code>request&lt;<a class='link' href='../fuchsia.io/'>fuchsia.io</a>/<a class='link' href='../fuchsia.io/#Directory'>Directory</a>&gt;</code>
</td>
</tr></table>
#### Response {#PackageCache.Open_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#PackageCache_Open_Result'>PackageCache_Open_Result</a></code>
</td>
</tr></table>
### Sync {#PackageCache.Sync}
<p>Synchronizes updates to the cached packages to the underlying persistent storage.</p>
<ul>
<li>error a zx_status value indicating failure. One of the following:
<ul>
<li><code>ZX_ERR_INTERNAL</code> if the sync fails.</li>
</ul>
</li>
</ul>
#### Request {#PackageCache.Sync_Request}
&lt;EMPTY&gt;
#### Response {#PackageCache.Sync_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#PackageCache_Sync_Result'>PackageCache_Sync_Result</a></code>
</td>
</tr></table>
## PackageIndexIterator {#PackageIndexIterator}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=196)*
<p>A chunk iterator for the package index. This is required because it is possible for the
package index to be too large to send over in a single request (over 64KiB).</p>
### Next {#PackageIndexIterator.Next}
<p>Returns the next chunk of package index entries. When the iterator is exhausted,
this returns an empty vector.</p>
<ul>
<li>response <code>entries</code> the next chunk of entries in the package index.</li>
</ul>
#### Request {#PackageIndexIterator.Next_Request}
&lt;EMPTY&gt;
#### Response {#PackageIndexIterator.Next_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>entries</code></td>
<td>
<code>vector&lt;<a class='link' href='#PackageIndexEntry'>PackageIndexEntry</a>&gt;</code>
</td>
</tr></table>
## PackageResolver {#PackageResolver}
*Defined in [fuchsia.pkg/resolver.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/resolver.fidl;l=48)*
<p>This resolves packages from a repository.</p>
<p>This is intended to be implemented by package resolver components, and used by
repository administration tools.</p>
### GetHash {#PackageResolver.GetHash}
<p>Determines the hash of a package.</p>
<ul>
<li>request <code>package_url</code> the package URL for a package.</li>
</ul>
<ul>
<li>response <code>meta_far_blob_id</code> the hash of the package.</li>
</ul>
<ul>
<li>error a zx_status value indicating failure. One of the following:
<ul>
<li><code>ZX_ERR_INTERNAL</code> if the resolver encountered an otherwise unspecified error
while handling the request.</li>
<li><code>ZX_ERR_NOT_FOUND</code> if the package does not exist in the repository specified by
<code>package_url</code>.</li>
<li><code>ZX_ERR_BAD_STATE</code> if the resolver does not know about the repository specified by
<code>package_url</code>.</li>
</ul>
</li>
</ul>
#### Request {#PackageResolver.GetHash_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>package_url</code></td>
<td>
<code><a class='link' href='#PackageUrl'>PackageUrl</a></code>
</td>
</tr></table>
#### Response {#PackageResolver.GetHash_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#PackageResolver_GetHash_Result'>PackageResolver_GetHash_Result</a></code>
</td>
</tr></table>
### Resolve {#PackageResolver.Resolve}
<p>Populates or updates the cache of a package with the given selectors.</p>
<p>Ensures that a package is on the local filesystem.</p>
<ul>
<li>request <code>package_url</code> the package URL for a package. The following link describes
the format, resource paths are not allowed:
https://fuchsia.dev/fuchsia-src/concepts/packages/package_url.</li>
<li>request <code>selectors</code> the package selectors. This feature is unimplemented and the
parameter will be ignored.</li>
<li>request <code>dir</code> a request for a directory that will be resolved when the package has
been successfully cached.</li>
</ul>
<ul>
<li>error indicates failure. See <code>ResolveError</code> for values and error scenarios.</li>
</ul>
#### Request {#PackageResolver.Resolve_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>package_url</code></td>
<td>
<code>string</code>
</td>
</tr><tr>
<td><code>selectors</code></td>
<td>
<code>vector&lt;string&gt;</code>
</td>
</tr><tr>
<td><code>dir</code></td>
<td>
<code>request&lt;<a class='link' href='../fuchsia.io/'>fuchsia.io</a>/<a class='link' href='../fuchsia.io/#Directory'>Directory</a>&gt;</code>
</td>
</tr></table>
#### Response {#PackageResolver.Resolve_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#PackageResolver_Resolve_Result'>PackageResolver_Resolve_Result</a></code>
</td>
</tr></table>
## PackageResolverAdmin {#PackageResolverAdmin}
*Defined in [fuchsia.pkg/admin.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/admin.fidl;l=8)*
<p>This configures a package resolver.</p>
### SetExperimentState {#PackageResolverAdmin.SetExperimentState}
<p>Sets an experiment toggle to a specific state (on or off).</p>
<p>Experiment states are not persisted and apply only while the resolver
is running.</p>
<ul>
<li>request <code>experiment_id</code> the experiment to enable or disable.</li>
<li>request <code>state</code> the state the experiment should be set to.</li>
</ul>
#### Request {#PackageResolverAdmin.SetExperimentState_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>experiment_id</code></td>
<td>
<code><a class='link' href='#ExperimentToggle'>ExperimentToggle</a></code>
</td>
</tr><tr>
<td><code>state</code></td>
<td>
<code>bool</code>
</td>
</tr></table>
#### Response {#PackageResolverAdmin.SetExperimentState_Response}
&lt;EMPTY&gt;
## RepositoryIterator {#RepositoryIterator}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=163)*
<p>The iterator over all the repositories defined in a <code>PackageResolver</code>.</p>
### Next {#RepositoryIterator.Next}
<p>Advances the iterator and returns the next batch of repositories.</p>
<ul>
<li>response <code>repos</code> a vector of <code>RepositoryConfig</code> repositories.
Will return an empty vector when there are no more repositories.</li>
</ul>
#### Request {#RepositoryIterator.Next_Request}
&lt;EMPTY&gt;
#### Response {#RepositoryIterator.Next_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>repos</code></td>
<td>
<code>vector&lt;<a class='link' href='#RepositoryConfig'>RepositoryConfig</a>&gt;</code>
</td>
</tr></table>
## RepositoryManager {#RepositoryManager}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=13)*
<p>This manages package repositories.</p>
<p>This is intended to be implemented by package resolver components, and used by
repository administration tools.</p>
### Add {#RepositoryManager.Add}
<p>Adds a repository. This will overwrite the repository if it already exists.</p>
<ul>
<li>request <code>repo</code> a repository to add to the resolver.</li>
</ul>
<ul>
<li>error a zx_status value indicating failure. One of the following:
<ul>
<li><code>ZX_ERR_ACCESS_DENIED</code> if editing repositories is permanently disabled.</li>
<li><code>ZX_ERR_ALREADY_EXISTS</code> if the repository already exists.</li>
<li><code>ZX_ERR_INVALID_ARGS</code> if the repository is malformed.</li>
</ul>
</li>
</ul>
#### Request {#RepositoryManager.Add_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>repo</code></td>
<td>
<code><a class='link' href='#RepositoryConfig'>RepositoryConfig</a></code>
</td>
</tr></table>
#### Response {#RepositoryManager.Add_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#RepositoryManager_Add_Result'>RepositoryManager_Add_Result</a></code>
</td>
</tr></table>
### AddMirror {#RepositoryManager.AddMirror}
<p>Adds a mirror to a repository. This will overwrite the mirror if it already exists.</p>
<ul>
<li>request <code>repo_url</code> the URL of the repository to add the mirror to.</li>
<li>request <code>mirror</code> the mirror config used to add the mirror.</li>
</ul>
<ul>
<li>error a zx_status value indicating failure. One of the following:
<ul>
<li><code>ZX_ERR_ALREADY_EXISTS</code> if the mirror for this repository already exists.</li>
<li><code>ZX_ERR_INVALID_ARGS</code> if the <code>repo_url</code> or the <code>mirror</code> is malformed.</li>
<li><code>ZX_ERR_NOT_FOUND</code> if the repository does not exist.</li>
</ul>
</li>
</ul>
#### Request {#RepositoryManager.AddMirror_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>repo_url</code></td>
<td>
<code>string</code>
</td>
</tr><tr>
<td><code>mirror</code></td>
<td>
<code><a class='link' href='#MirrorConfig'>MirrorConfig</a></code>
</td>
</tr></table>
#### Response {#RepositoryManager.AddMirror_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#RepositoryManager_AddMirror_Result'>RepositoryManager_AddMirror_Result</a></code>
</td>
</tr></table>
### List {#RepositoryManager.List}
<p>Returns an iterator over all repositories.</p>
<ul>
<li>request <code>iterator</code> a request for an iterator.</li>
</ul>
#### Request {#RepositoryManager.List_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>iterator</code></td>
<td>
<code>request&lt;<a class='link' href='#RepositoryIterator'>RepositoryIterator</a>&gt;</code>
</td>
</tr></table>
### Remove {#RepositoryManager.Remove}
<p>Removes a repository.</p>
<p>Removing a repository will prevent future packages from being cached from this repository,
but in-flight downloads may not be interrupted.</p>
<ul>
<li>request <code>repo_url</code> the URL of the repository we want to remove.</li>
</ul>
<ul>
<li>error a zx_status value indicating failure. One of the following:
<ul>
<li><code>ZX_ERR_ACCESS_DENIED</code> if editing repositories is permanently disabled or the
<code>repo_url</code> matches a static repository.</li>
<li><code>ZX_ERR_INVALID_ARGS</code> if the <code>repo_url</code> is malformed.</li>
<li><code>ZX_ERR_NOT_FOUND</code> if the repository does not exist.</li>
</ul>
</li>
</ul>
#### Request {#RepositoryManager.Remove_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>repo_url</code></td>
<td>
<code>string</code>
</td>
</tr></table>
#### Response {#RepositoryManager.Remove_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#RepositoryManager_Remove_Result'>RepositoryManager_Remove_Result</a></code>
</td>
</tr></table>
### RemoveMirror {#RepositoryManager.RemoveMirror}
<p>Removes a mirror from a repository.</p>
<p>Removing a mirror will prevent future packages from being cached from that mirror, but
in-flight downloads may not be interrupted.</p>
<ul>
<li>request <code>repo_url</code> the URL of the mirror's repository.</li>
<li>request <code>mirror_url</code> the URL of the mirror we want to remove.</li>
</ul>
<ul>
<li>error a zx_status value indicating failure. One of the following:
<ul>
<li><code>ZX_ERR_INVALID_ARGS</code> if the <code>repo_url</code> or the <code>mirror_url</code> is malformed.</li>
<li><code>ZX_ERR_NOT_FOUND</code> if the repository or mirror does not exist.</li>
</ul>
</li>
</ul>
#### Request {#RepositoryManager.RemoveMirror_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>repo_url</code></td>
<td>
<code>string</code>
</td>
</tr><tr>
<td><code>mirror_url</code></td>
<td>
<code>string</code>
</td>
</tr></table>
#### Response {#RepositoryManager.RemoveMirror_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>result</code></td>
<td>
<code><a class='link' href='#RepositoryManager_RemoveMirror_Result'>RepositoryManager_RemoveMirror_Result</a></code>
</td>
</tr></table>
## RetainedPackages {#RetainedPackages}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=217)*
<p>Manages the set of retained packages.</p>
<p>Retained packages will not be removed from the package cache, even if they
aren't fully present. There is only a single set active at once, and the
provided APIs for configuring the set atomically replace that set. On boot,
the retained package set is always initialized to the empty set.
Documentation on <a href="https://fuchsia.dev/fuchsia-src/concepts/packages/garbage_collection">garbage collection</a> contains
details on various types of package indexes (static, retained, etc) and
describes when a package will be garbage collected or retained.</p>
### Clear {#RetainedPackages.Clear}
<p>Atomically clear the retained package set, releasing any previously
retained packages.</p>
#### Request {#RetainedPackages.Clear_Request}
&lt;EMPTY&gt;
#### Response {#RetainedPackages.Clear_Response}
&lt;EMPTY&gt;
### Replace {#RetainedPackages.Replace}
<p>Atomically replace the retained package set with the <a href="https://fuchsia.dev/fuchsia-src/concepts/packages/package_url#package-hash">package hashes</a>
provided by the given iterator.
Duplicate IDs provided will be merged and processed as a single one.</p>
<ul>
<li>request <code>iterator</code> an iterator of package blob IDs that should be
retained.</li>
</ul>
#### Request {#RetainedPackages.Replace_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>iterator</code></td>
<td>
<code><a class='link' href='#BlobIdIterator'>BlobIdIterator</a></code>
</td>
</tr></table>
#### Response {#RetainedPackages.Replace_Response}
&lt;EMPTY&gt;
## **STRUCTS**
### BlobId {#BlobId data-text="BlobId"}
*Defined in [fuchsia.pkg/common.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/common.fidl;l=8)*
<p>A content-addressed merkle root that describes an artifact that is tracked by the
packaging system.</p>
<table>
<tr><th>Field</th><th>Type</th><th>Description</th><th>Default</th></tr><tr id="BlobId.merkle_root">
<td><code>merkle_root</code></td>
<td>
<code>uint8[32]</code>
</td>
<td>
</td>
<td>No default</td>
</tr>
</table>
### BlobInfo {#BlobInfo data-text="BlobInfo"}
*Defined in [fuchsia.pkg/common.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/common.fidl;l=14)*
<p>A tuple of the content-addressed merkle root for an artifact, along with that
artifact's length in bytes.</p>
<table>
<tr><th>Field</th><th>Type</th><th>Description</th><th>Default</th></tr><tr id="BlobInfo.blob_id">
<td><code>blob_id</code></td>
<td>
<code><a class='link' href='#BlobId'>BlobId</a></code>
</td>
<td>
</td>
<td>No default</td>
</tr><tr id="BlobInfo.length">
<td><code>length</code></td>
<td>
<code>uint64</code>
</td>
<td>
</td>
<td>No default</td>
</tr>
</table>
### FontResolver_Resolve_Response {#FontResolver_Resolve_Response data-text="FontResolver_Resolve_Response"}
*Defined in [fuchsia.pkg/font_resolver.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/font_resolver.fidl;l=38)*
&lt;EMPTY&gt;
### LocalMirror_GetBlob_Response {#LocalMirror_GetBlob_Response data-text="LocalMirror_GetBlob_Response"}
*Defined in [fuchsia.pkg/local_mirror.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/local_mirror.fidl;l=40)*
&lt;EMPTY&gt;
### LocalMirror_GetMetadata_Response {#LocalMirror_GetMetadata_Response data-text="LocalMirror_GetMetadata_Response"}
*Defined in [fuchsia.pkg/local_mirror.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/local_mirror.fidl;l=27)*
&lt;EMPTY&gt;
### NeededBlobs_OpenBlob_Response {#NeededBlobs_OpenBlob_Response data-text="NeededBlobs_OpenBlob_Response"}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=166)*
<table>
<tr><th>Field</th><th>Type</th><th>Description</th><th>Default</th></tr><tr id="NeededBlobs_OpenBlob_Response.needed">
<td><code>needed</code></td>
<td>
<code>bool</code>
</td>
<td>
</td>
<td>No default</td>
</tr>
</table>
### NeededBlobs_OpenMetaBlob_Response {#NeededBlobs_OpenMetaBlob_Response data-text="NeededBlobs_OpenMetaBlob_Response"}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=127)*
<table>
<tr><th>Field</th><th>Type</th><th>Description</th><th>Default</th></tr><tr id="NeededBlobs_OpenMetaBlob_Response.needed">
<td><code>needed</code></td>
<td>
<code>bool</code>
</td>
<td>
</td>
<td>No default</td>
</tr>
</table>
### PackageCache_Get_Response {#PackageCache_Get_Response data-text="PackageCache_Get_Response"}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=39)*
&lt;EMPTY&gt;
### PackageCache_Open_Response {#PackageCache_Open_Response data-text="PackageCache_Open_Response"}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=53)*
&lt;EMPTY&gt;
### PackageCache_Sync_Response {#PackageCache_Sync_Response data-text="PackageCache_Sync_Response"}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=67)*
&lt;EMPTY&gt;
### PackageIndexEntry {#PackageIndexEntry data-text="PackageIndexEntry"}
*Defined in [fuchsia.pkg/common.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/common.fidl;l=32)*
<p>A single entry in the package index.</p>
<table>
<tr><th>Field</th><th>Type</th><th>Description</th><th>Default</th></tr><tr id="PackageIndexEntry.package_url">
<td><code>package_url</code></td>
<td>
<code><a class='link' href='#PackageUrl'>PackageUrl</a></code>
</td>
<td>
</td>
<td>No default</td>
</tr><tr id="PackageIndexEntry.meta_far_blob_id">
<td><code>meta_far_blob_id</code></td>
<td>
<code><a class='link' href='#BlobId'>BlobId</a></code>
</td>
<td>
</td>
<td>No default</td>
</tr>
</table>
### PackageResolver_GetHash_Response {#PackageResolver_GetHash_Response data-text="PackageResolver_GetHash_Response"}
*Defined in [fuchsia.pkg/resolver.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/resolver.fidl;l=81)*
<table>
<tr><th>Field</th><th>Type</th><th>Description</th><th>Default</th></tr><tr id="PackageResolver_GetHash_Response.meta_far_blob_id">
<td><code>meta_far_blob_id</code></td>
<td>
<code><a class='link' href='#BlobId'>BlobId</a></code>
</td>
<td>
</td>
<td>No default</td>
</tr>
</table>
### PackageResolver_Resolve_Response {#PackageResolver_Resolve_Response data-text="PackageResolver_Resolve_Response"}
*Defined in [fuchsia.pkg/resolver.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/resolver.fidl;l=66)*
&lt;EMPTY&gt;
### PackageUrl {#PackageUrl data-text="PackageUrl"}
*Defined in [fuchsia.pkg/common.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/common.fidl;l=21)*
<p>A fuchsia-pkg:// URL indicating a package.
https://fuchsia.dev/fuchsia-src/concepts/packages/package_url#package_identity</p>
<table>
<tr><th>Field</th><th>Type</th><th>Description</th><th>Default</th></tr><tr id="PackageUrl.url">
<td><code>url</code></td>
<td>
<code>string[2048]</code>
</td>
<td>
</td>
<td>No default</td>
</tr>
</table>
### RepositoryManager_AddMirror_Response {#RepositoryManager_AddMirror_Response data-text="RepositoryManager_AddMirror_Response"}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=51)*
&lt;EMPTY&gt;
### RepositoryManager_Add_Response {#RepositoryManager_Add_Response data-text="RepositoryManager_Add_Response"}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=23)*
&lt;EMPTY&gt;
### RepositoryManager_RemoveMirror_Response {#RepositoryManager_RemoveMirror_Response data-text="RepositoryManager_RemoveMirror_Response"}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=66)*
&lt;EMPTY&gt;
### RepositoryManager_Remove_Response {#RepositoryManager_Remove_Response data-text="RepositoryManager_Remove_Response"}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=38)*
&lt;EMPTY&gt;
### RepositoryUrl {#RepositoryUrl data-text="RepositoryUrl"}
*Defined in [fuchsia.pkg/common.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/common.fidl;l=27)*
<p>A fuchsia-pkg:// URL indicating a repository.
https://fuchsia.dev/fuchsia-src/concepts/packages/package_url#repository_identity</p>
<table>
<tr><th>Field</th><th>Type</th><th>Description</th><th>Default</th></tr><tr id="RepositoryUrl.url">
<td><code>url</code></td>
<td>
<code>string[2048]</code>
</td>
<td>
</td>
<td>No default</td>
</tr>
</table>
## **ENUMS**
### ExperimentToggle [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#ExperimentToggle}
Type: <code>uint64</code>
*Defined in [fuchsia.pkg/admin.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/admin.fidl;l=23)*
<p>List of known experiment toggles.</p>
<table>
<tr><th>Name</th><th>Value</th><th>Description</th></tr><tr id="ExperimentToggle.LIGHTBULB">
<td><code>LIGHTBULB</code></td>
<td><code>0</code></td>
<td><p>This does nothing, but is visible in inspect.</p>
</td>
</tr></table>
### GetBlobError [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#GetBlobError}
Type: <code>uint32</code>
*Defined in [fuchsia.pkg/local_mirror.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/local_mirror.fidl;l=51)*
<p>Error type for <a class='link' href='../fuchsia.pkg/'>fuchsia.pkg</a>/<a class='link' href='../fuchsia.pkg/#LocalMirror.GetBlob'>LocalMirror.GetBlob</a>.</p>
<table>
<tr><th>Name</th><th>Value</th><th>Description</th></tr><tr id="GetBlobError.ERROR_OPENING_BLOB">
<td><code>ERROR_OPENING_BLOB</code></td>
<td><code>1</code></td>
<td><p>An error occurred when opening the requested blob. This may (though
does not necessarily) indicate the blobs directory does not exist.</p>
</td>
</tr></table>
### GetMetadataError [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#GetMetadataError}
Type: <code>uint32</code>
*Defined in [fuchsia.pkg/local_mirror.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/local_mirror.fidl;l=44)*
<p>Error type for <a class='link' href='../fuchsia.pkg/'>fuchsia.pkg</a>/<a class='link' href='../fuchsia.pkg/#LocalMirror.GetMetadata'>LocalMirror.GetMetadata</a>.</p>
<table>
<tr><th>Name</th><th>Value</th><th>Description</th></tr><tr id="GetMetadataError.ERROR_OPENING_METADATA">
<td><code>ERROR_OPENING_METADATA</code></td>
<td><code>1</code></td>
<td><p>An error occurred when opening the requested metadata file. This may (though
does not necessarily) indicate the metadata directory does not exist.</p>
</td>
</tr></table>
### OpenBlobError [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#OpenBlobError}
Type: <code>uint32</code>
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=71)*
<p>Error type for <a class='link' href='#NeededBlobs.OpenMetaBlob'>NeededBlobs.OpenMetaBlob</a> and <a class='link' href='#NeededBlobs.OpenBlob'>NeededBlobs.OpenBlob</a>.</p>
<table>
<tr><th>Name</th><th>Value</th><th>Description</th></tr><tr id="OpenBlobError.OUT_OF_SPACE">
<td><code>OUT_OF_SPACE</code></td>
<td><code>1</code></td>
<td><p>There is insufficient storage space available to persist this blob.</p>
</td>
</tr><tr id="OpenBlobError.CONCURRENT_WRITE">
<td><code>CONCURRENT_WRITE</code></td>
<td><code>2</code></td>
<td><p>This blob is already open for write by another cache operation.</p>
</td>
</tr><tr id="OpenBlobError.UNSPECIFIED_IO">
<td><code>UNSPECIFIED_IO</code></td>
<td><code>3</code></td>
<td><p>An unspecified error occured during underlying I/O.</p>
</td>
</tr><tr id="OpenBlobError.INTERNAL">
<td><code>INTERNAL</code></td>
<td><code>4</code></td>
<td><p>An unspecified error occured.</p>
</td>
</tr></table>
### RepositoryStorageType [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#RepositoryStorageType}
Type: <code>uint32</code>
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=134)*
<p>Where the repository storage is written to.</p>
<table>
<tr><th>Name</th><th>Value</th><th>Description</th></tr><tr id="RepositoryStorageType.EPHEMERAL">
<td><code>EPHEMERAL</code></td>
<td><code>1</code></td>
<td><p>Ephemeral, or in-memory storage. This repository metadata will be lost
when the process or device is restarted. The default type.</p>
</td>
</tr><tr id="RepositoryStorageType.PERSISTENT">
<td><code>PERSISTENT</code></td>
<td><code>2</code></td>
<td><p>Persistent, where the repository metadata is written to mutable storage
and is available after a reboot.</p>
</td>
</tr></table>
### ResolveError [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#ResolveError}
Type: <code>int32</code>
*Defined in [fuchsia.pkg/resolver.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/resolver.fidl;l=11)*
<p>Error codes for PackageResolver operations.</p>
<table>
<tr><th>Name</th><th>Value</th><th>Description</th></tr><tr id="ResolveError.INTERNAL">
<td><code>INTERNAL</code></td>
<td><code>1</code></td>
<td><p>The resolver encountered an otherwise unspecified error while handling the request.</p>
</td>
</tr><tr id="ResolveError.ACCESS_DENIED">
<td><code>ACCESS_DENIED</code></td>
<td><code>2</code></td>
<td><p>The resolver does not have permission to fetch a package blob.</p>
</td>
</tr><tr id="ResolveError.IO">
<td><code>IO</code></td>
<td><code>3</code></td>
<td><p>Some unspecified error during I/O.</p>
</td>
</tr><tr id="ResolveError.BLOB_NOT_FOUND">
<td><code>BLOB_NOT_FOUND</code></td>
<td><code>4</code></td>
<td><p>The package blob does not exist.</p>
</td>
</tr><tr id="ResolveError.PACKAGE_NOT_FOUND">
<td><code>PACKAGE_NOT_FOUND</code></td>
<td><code>5</code></td>
<td><p>The package does not exist.</p>
</td>
</tr><tr id="ResolveError.REPO_NOT_FOUND">
<td><code>REPO_NOT_FOUND</code></td>
<td><code>6</code></td>
<td><p>The resolver does not know about the repo.</p>
</td>
</tr><tr id="ResolveError.NO_SPACE">
<td><code>NO_SPACE</code></td>
<td><code>7</code></td>
<td><p>There is no space available to store the package or metadata.</p>
</td>
</tr><tr id="ResolveError.UNAVAILABLE_BLOB">
<td><code>UNAVAILABLE_BLOB</code></td>
<td><code>8</code></td>
<td><p>The resolver is currently unable to fetch a package blob.</p>
</td>
</tr><tr id="ResolveError.UNAVAILABLE_REPO_METADATA">
<td><code>UNAVAILABLE_REPO_METADATA</code></td>
<td><code>9</code></td>
<td><p>The resolver is currently unable to fetch a repository's metadata.</p>
</td>
</tr><tr id="ResolveError.INVALID_URL">
<td><code>INVALID_URL</code></td>
<td><code>10</code></td>
<td><p>The <code>package_url</code> provided to resolver is invalid.</p>
</td>
</tr></table>
## **TABLES**
### MirrorConfig {#MirrorConfig data-text="MirrorConfig"}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=145)*
<p>The configuration necessary to connect to a mirror.</p>
<table>
<tr><th>Ordinal</th><th>Field</th><th>Type</th><th>Description</th></tr>
<tr id="MirrorConfig.mirror_url">
<td>1</td>
<td><code>mirror_url</code></td>
<td>
<code>string</code>
</td>
<td><p>The base URL of the TUF metadata on this mirror. Required.</p>
</td>
</tr><tr id="MirrorConfig.subscribe">
<td>2</td>
<td><code>subscribe</code></td>
<td>
<code>bool</code>
</td>
<td><p>Whether or not to automatically monitor the mirror for updates. Required.</p>
</td>
</tr><tr id="MirrorConfig.">
<td>3</td>
<td><code>RESERVED</code></td>
<td>
<code></code>
</td>
<td>
</td>
</tr><tr id="MirrorConfig.blob_mirror_url">
<td>4</td>
<td><code>blob_mirror_url</code></td>
<td>
<code>string</code>
</td>
<td><p>The URL where blobs from this mirror should be fetched. Optional.
If absent presumed to be <code>mirror_url + &quot;/blobs&quot;</code>.</p>
</td>
</tr></table>
### RepositoryConfig {#RepositoryConfig data-text="RepositoryConfig"}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=77)*
<p>The configuration necessary to connect to a repository and its mirrors.</p>
<table>
<tr><th>Ordinal</th><th>Field</th><th>Type</th><th>Description</th></tr>
<tr id="RepositoryConfig.repo_url">
<td>1</td>
<td><code>repo_url</code></td>
<td>
<code>string</code>
</td>
<td><p>A fuchsia-pkg URL identifying the repository. Required.</p>
<p>Example: fuchsia-pkg://example.com/</p>
</td>
</tr><tr id="RepositoryConfig.root_keys">
<td>2</td>
<td><code>root_keys</code></td>
<td>
<code>vector&lt;<a class='link' href='#RepositoryKeyConfig'>RepositoryKeyConfig</a>&gt;</code>
</td>
<td><p>A vector of public keys that have signed the initial trusted root
metadata. Required.</p>
<p>These keys must match one of the trusted keys known to the system.</p>
</td>
</tr><tr id="RepositoryConfig.mirrors">
<td>3</td>
<td><code>mirrors</code></td>
<td>
<code>vector&lt;<a class='link' href='#MirrorConfig'>MirrorConfig</a>&gt;</code>
</td>
<td><p>The repository mirrors that serve the package contents. Required.</p>
</td>
</tr><tr id="RepositoryConfig.update_package_url">
<td>4</td>
<td><code>update_package_url</code></td>
<td>
<code>string</code>
</td>
<td><p>The package URL of the system update package. Optional.</p>
<p>Only used for the fuchsia-pkg://fuchsia.com/ repo.</p>
</td>
</tr><tr id="RepositoryConfig.root_version">
<td>5</td>
<td><code>root_version</code></td>
<td>
<code>uint32</code>
</td>
<td><p>The initial trusted root metadata version. Optional, if absent presumed
to be 1.</p>
<p>This value describes the initial root metadata version the resolver will
fetch to initialize trust, once it's signatures has been verified by the
<code>root_keys</code>. It will then walk the chain of N+1, N+2, and etc to the
latest version before the resolver fetches any targets.</p>
<p>It is recommended that this <code>root_version</code> number and <code>root_keys </code> are
kept reasonably in sync with the most recent published version of the
root metadata, as that avoids the risk of an old and unused root key
being used to compromise resolvers during the trust initialization.</p>
</td>
</tr><tr id="RepositoryConfig.root_threshold">
<td>6</td>
<td><code>root_threshold</code></td>
<td>
<code>uint32</code>
</td>
<td><p>The number of <code>root_keys</code> that need to have signed the root metadata for it
to be considered trusted. This value must be greater than or equal to 1.
Optional, if absent presumed to be 1.</p>
</td>
</tr><tr id="RepositoryConfig.use_local_mirror">
<td>7</td>
<td><code>use_local_mirror</code></td>
<td>
<code>bool</code>
</td>
<td><p>Whether the package resolver should check attached storage for blobs and
repository metadata. Optional, if absent presumed to be false.</p>
</td>
</tr><tr id="RepositoryConfig.storage_type">
<td>8</td>
<td><code>storage_type</code></td>
<td>
<code><a class='link' href='#RepositoryStorageType'>RepositoryStorageType</a></code>
</td>
<td><p>Controls how repository metadata is persisted across reboots. Optional, if absent presumed
to be EPHEMERAL.</p>
</td>
</tr></table>
## **UNIONS**
### FontResolver_Resolve_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#FontResolver_Resolve_Result data-text="FontResolver_Resolve_Result"}
*Defined in [fuchsia.pkg/font_resolver.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/font_resolver.fidl;l=38)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="FontResolver_Resolve_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#FontResolver_Resolve_Response'>FontResolver_Resolve_Response</a></code>
</td>
<td>
</td>
</tr><tr id="FontResolver_Resolve_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='../zx/'>zx</a>/<a class='link' href='../zx/#status'>status</a></code>
</td>
<td>
</td>
</tr></table>
### LocalMirror_GetBlob_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#LocalMirror_GetBlob_Result data-text="LocalMirror_GetBlob_Result"}
*Defined in [fuchsia.pkg/local_mirror.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/local_mirror.fidl;l=40)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="LocalMirror_GetBlob_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#LocalMirror_GetBlob_Response'>LocalMirror_GetBlob_Response</a></code>
</td>
<td>
</td>
</tr><tr id="LocalMirror_GetBlob_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='#GetBlobError'>GetBlobError</a></code>
</td>
<td>
</td>
</tr></table>
### LocalMirror_GetMetadata_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#LocalMirror_GetMetadata_Result data-text="LocalMirror_GetMetadata_Result"}
*Defined in [fuchsia.pkg/local_mirror.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/local_mirror.fidl;l=27)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="LocalMirror_GetMetadata_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#LocalMirror_GetMetadata_Response'>LocalMirror_GetMetadata_Response</a></code>
</td>
<td>
</td>
</tr><tr id="LocalMirror_GetMetadata_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='#GetMetadataError'>GetMetadataError</a></code>
</td>
<td>
</td>
</tr></table>
### NeededBlobs_OpenBlob_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#NeededBlobs_OpenBlob_Result data-text="NeededBlobs_OpenBlob_Result"}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=166)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="NeededBlobs_OpenBlob_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#NeededBlobs_OpenBlob_Response'>NeededBlobs_OpenBlob_Response</a></code>
</td>
<td>
</td>
</tr><tr id="NeededBlobs_OpenBlob_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='#OpenBlobError'>OpenBlobError</a></code>
</td>
<td>
</td>
</tr></table>
### NeededBlobs_OpenMetaBlob_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#NeededBlobs_OpenMetaBlob_Result data-text="NeededBlobs_OpenMetaBlob_Result"}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=127)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="NeededBlobs_OpenMetaBlob_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#NeededBlobs_OpenMetaBlob_Response'>NeededBlobs_OpenMetaBlob_Response</a></code>
</td>
<td>
</td>
</tr><tr id="NeededBlobs_OpenMetaBlob_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='#OpenBlobError'>OpenBlobError</a></code>
</td>
<td>
</td>
</tr></table>
### PackageCache_Get_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#PackageCache_Get_Result data-text="PackageCache_Get_Result"}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=39)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="PackageCache_Get_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#PackageCache_Get_Response'>PackageCache_Get_Response</a></code>
</td>
<td>
</td>
</tr><tr id="PackageCache_Get_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='../zx/'>zx</a>/<a class='link' href='../zx/#status'>status</a></code>
</td>
<td>
</td>
</tr></table>
### PackageCache_Open_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#PackageCache_Open_Result data-text="PackageCache_Open_Result"}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=53)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="PackageCache_Open_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#PackageCache_Open_Response'>PackageCache_Open_Response</a></code>
</td>
<td>
</td>
</tr><tr id="PackageCache_Open_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='../zx/'>zx</a>/<a class='link' href='../zx/#status'>status</a></code>
</td>
<td>
</td>
</tr></table>
### PackageCache_Sync_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#PackageCache_Sync_Result data-text="PackageCache_Sync_Result"}
*Defined in [fuchsia.pkg/cache.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=67)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="PackageCache_Sync_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#PackageCache_Sync_Response'>PackageCache_Sync_Response</a></code>
</td>
<td>
</td>
</tr><tr id="PackageCache_Sync_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='../zx/'>zx</a>/<a class='link' href='../zx/#status'>status</a></code>
</td>
<td>
</td>
</tr></table>
### PackageResolver_GetHash_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#PackageResolver_GetHash_Result data-text="PackageResolver_GetHash_Result"}
*Defined in [fuchsia.pkg/resolver.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/resolver.fidl;l=81)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="PackageResolver_GetHash_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#PackageResolver_GetHash_Response'>PackageResolver_GetHash_Response</a></code>
</td>
<td>
</td>
</tr><tr id="PackageResolver_GetHash_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='../zx/'>zx</a>/<a class='link' href='../zx/#status'>status</a></code>
</td>
<td>
</td>
</tr></table>
### PackageResolver_Resolve_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#PackageResolver_Resolve_Result data-text="PackageResolver_Resolve_Result"}
*Defined in [fuchsia.pkg/resolver.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/resolver.fidl;l=66)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="PackageResolver_Resolve_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#PackageResolver_Resolve_Response'>PackageResolver_Resolve_Response</a></code>
</td>
<td>
</td>
</tr><tr id="PackageResolver_Resolve_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='#ResolveError'>ResolveError</a></code>
</td>
<td>
</td>
</tr></table>
### RepositoryKeyConfig [flexible](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#RepositoryKeyConfig data-text="RepositoryKeyConfig"}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=128)*
<p>The keys used by the repository to authenticate its packages.</p>
<p>The only supported algorithm at the moment is ed25519.</p>
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="RepositoryKeyConfig.ed25519_key">
<td>1</td>
<td><code>ed25519_key</code></td>
<td>
<code>vector&lt;uint8&gt;</code>
</td>
<td><p>The raw ed25519 public key as binary data.</p>
</td>
</tr></table>
### RepositoryManager_AddMirror_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#RepositoryManager_AddMirror_Result data-text="RepositoryManager_AddMirror_Result"}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=51)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="RepositoryManager_AddMirror_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#RepositoryManager_AddMirror_Response'>RepositoryManager_AddMirror_Response</a></code>
</td>
<td>
</td>
</tr><tr id="RepositoryManager_AddMirror_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='../zx/'>zx</a>/<a class='link' href='../zx/#status'>status</a></code>
</td>
<td>
</td>
</tr></table>
### RepositoryManager_Add_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#RepositoryManager_Add_Result data-text="RepositoryManager_Add_Result"}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=23)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="RepositoryManager_Add_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#RepositoryManager_Add_Response'>RepositoryManager_Add_Response</a></code>
</td>
<td>
</td>
</tr><tr id="RepositoryManager_Add_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='../zx/'>zx</a>/<a class='link' href='../zx/#status'>status</a></code>
</td>
<td>
</td>
</tr></table>
### RepositoryManager_RemoveMirror_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#RepositoryManager_RemoveMirror_Result data-text="RepositoryManager_RemoveMirror_Result"}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=66)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="RepositoryManager_RemoveMirror_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#RepositoryManager_RemoveMirror_Response'>RepositoryManager_RemoveMirror_Response</a></code>
</td>
<td>
</td>
</tr><tr id="RepositoryManager_RemoveMirror_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='../zx/'>zx</a>/<a class='link' href='../zx/#status'>status</a></code>
</td>
<td>
</td>
</tr></table>
### RepositoryManager_Remove_Result [strict](/fuchsia-src/reference/fidl/language/language#strict-vs-flexible){:.fidl-attribute} {#RepositoryManager_Remove_Result data-text="RepositoryManager_Remove_Result"}
*Defined in [fuchsia.pkg/repo.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/repo.fidl;l=38)*
<table>
<tr><th>Ordinal</th><tr><th>Variant</th><th>Type</th><th>Description</th></tr><tr id="RepositoryManager_Remove_Result.response">
<td>1</td>
<td><code>response</code></td>
<td>
<code><a class='link' href='#RepositoryManager_Remove_Response'>RepositoryManager_Remove_Response</a></code>
</td>
<td>
</td>
</tr><tr id="RepositoryManager_Remove_Result.err">
<td>2</td>
<td><code>err</code></td>
<td>
<code><a class='link' href='../zx/'>zx</a>/<a class='link' href='../zx/#status'>status</a></code>
</td>
<td>
</td>
</tr></table>