| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| library fuchsia.pkg; |
| |
| using fuchsia.io; |
| using zx; |
| |
| /// Error codes for PackageResolver operations. |
| // TODO(https://fxbug.dev/42122591): Use this instead of zx.Status for `GetHash` |
| type ResolveError = strict enum : int32 { |
| /// The resolver encountered an otherwise unspecified error while handling the request. |
| INTERNAL = 1; |
| |
| /// The resolver does not have permission to fetch a package blob. |
| ACCESS_DENIED = 2; |
| |
| /// Some unspecified error during I/O. |
| IO = 3; |
| |
| /// The package blob does not exist. |
| BLOB_NOT_FOUND = 4; |
| |
| /// The package does not exist. |
| PACKAGE_NOT_FOUND = 5; |
| |
| /// The resolver does not know about the repo. |
| REPO_NOT_FOUND = 6; |
| |
| /// There is no space available to store the package or metadata. |
| NO_SPACE = 7; |
| |
| /// The resolver is currently unable to fetch a package blob. |
| UNAVAILABLE_BLOB = 8; |
| |
| /// The resolver is currently unable to fetch a repository's metadata. |
| UNAVAILABLE_REPO_METADATA = 9; |
| |
| /// The `package_url` provided to resolver is invalid. |
| INVALID_URL = 10; |
| |
| /// The `context` provided to resolver is invalid. |
| INVALID_CONTEXT = 11; |
| }; |
| |
| /// This resolves packages from a repository. |
| /// |
| /// This is intended to be implemented by package resolver components, and used by |
| /// repository administration tools. |
| @discoverable |
| closed protocol PackageResolver { |
| /// Populates or updates the cache of a package using an absolute package |
| /// URL. |
| /// |
| /// Ensures that a package, and any transitive subpackages, are on the local |
| /// filesystem. |
| /// |
| /// + request `package_url` the absolute package URL for a package. The |
| /// following link describes the format: |
| /// https://fuchsia.dev/fuchsia-src/concepts/packages/package_url. |
| /// Resource paths are not allowed. |
| /// + request `dir` a request for a directory that will be resolved when the |
| /// package has been successfully cached. |
| /// + returns a `resolved_context`, which can be passed to |
| /// `ResolveWithContext`, with a relative URL, to resolve a subpackage of |
| /// this package. |
| /// * error indicates failure. See `ResolveError` for values and error |
| /// scenarios. |
| // TODO(https://fxbug.dev/42122377) change `package_url` from string to PackageUrl |
| strict Resolve(resource struct { |
| package_url string; |
| dir server_end:fuchsia.io.Directory; |
| }) -> (struct { |
| resolved_context ResolutionContext; |
| }) error ResolveError; |
| |
| /// Populates or updates the cache of a package using either an absolute or |
| /// a relative package URL. If relative, the package will be resolved |
| /// relative to the supplied `context`. |
| /// |
| /// Ensures that a package is on the local filesystem. |
| /// |
| /// + request `package_url` the absolute or relative package URL for a |
| /// package. If absolute, the `context` is ignored, and the behavior is |
| /// identical to calling `Resolve()`. A relative `package_url` is a |
| /// subpackage name. |
| /// + request `context` a `ResolutionContext` associated with a previously |
| /// resolved package, for resolving subpackages relative to that package. |
| /// + request `dir` a request for a directory that will be resolved when the |
| /// package has been successfully cached. |
| /// + returns a `resolved_context`, which can be passed to a subsequent call |
| /// to `ResolveWithContext`, with a relative URL, to resolve a subpackage |
| /// of this package or subpackage. |
| /// * error indicates failure. See `ResolveError` for values and error |
| /// scenarios. |
| // TODO(https://fxbug.dev/42122377) change `package_url` from string to PackageUrl |
| strict ResolveWithContext(resource struct { |
| package_url string; |
| context ResolutionContext; |
| dir server_end:fuchsia.io.Directory; |
| }) -> (struct { |
| resolved_context ResolutionContext; |
| }) error ResolveError; |
| |
| /// Determines the hash of a package. |
| /// |
| /// + request `package_url` the package URL for a package. |
| /// - response `meta_far_blob_id` the hash of the package. |
| /// * error a zx_status value indicating failure. One of the following: |
| /// * `ZX_ERR_INTERNAL` if the resolver encountered an otherwise unspecified error |
| /// while handling the request. |
| /// * `ZX_ERR_NOT_FOUND` if the package does not exist in the repository specified by |
| /// `package_url`. |
| /// * `ZX_ERR_BAD_STATE` if the resolver does not know about the repository specified by |
| /// `package_url`. |
| strict GetHash(struct { |
| package_url PackageUrl; |
| }) -> (struct { |
| meta_far_blob_id BlobId; |
| }) error zx.Status; |
| }; |