UCD.js Docs

Client

Architecture notes for @ucdjs/client

@ucdjs/client is the typed HTTP client for UCD.js services.

Role

  • Discovers endpoints from the .well-known config.
  • Exposes typed resource wrappers for files, versions, and config.
  • Defines the consumer-facing request and error contract used by higher-level packages.

Mental Model

The client has two construction modes:

  • createUCDClient(baseUrl) performs .well-known discovery first
  • createUCDClientWithConfig(baseUrl, config) skips discovery and builds resources directly

Once constructed, the client exposes three resource namespaces:

  • config
  • files
  • versions

Each resource returns { data, error } style results instead of throwing for normal request failures. The main exception is endpoint discovery, where createUCDClient() throws if the .well-known document cannot be fetched or validated.

Method Flows

createUCDClient(baseUrl)

Resource factory/.well-known/ucd-config.jsondiscoverEndpointsFromConfig()createUCDClient()Resource factory/.well-known/ucd-config.jsondiscoverEndpointsFromConfig()createUCDClient()alt[fetch error][config invalid][config valid]CallercreateUCDClient(baseUrl)discoverEndpointsFromConfig(baseUrl)GET /.well-known/ucd-config.jsonconfig payload or fetch errorthrow fetch errorthrowthrow invalid config errorthrowvalidated endpoint configcreate files/config/versions resourcesUCDClientclient instanceCaller

createUCDClientWithConfig(baseUrl, config)

Resource factorycreateUCDClientWithConfig()Resource factorycreateUCDClientWithConfig()CallercreateUCDClientWithConfig(baseUrl, config)create files/config/versions resourcesUCDClientclient instanceCaller

client.files.get(path)

customFetch.safe()files endpointresolveSafePath()files.get()customFetch.safe()files endpointresolveSafePath()files.get()alt[path traversal or invalid path][path accepted]Callerfiles.get(path)resolveSafePath(endpoints.files, path)PathTraversalError{ data: null, error }resolved endpoint pathrequest(resolved URL)GET /api/v1/files/{wildcard}response{ data, error, response }{ data, error, response }Caller

client.versions.list() and client.versions.getFileTree(version)

versions endpointscustomFetch.safe()versions resourceversions endpointscustomFetch.safe()versions resourcealt[response validates][request or schema fails]Callerlist() or getFileTree(version)request JSON + apply schemaGET /api/v1/versions or /api/v1/versions/{version}/file-treeJSON response{ data, error: null, response }{ data, error: null, response }{ data: null, error }{ data: null, error }Caller

client.versions.getManifest(version)

manifest endpointcustomFetch.safe()versions.getManifest()manifest endpointcustomFetch.safe()versions.getManifest()alt[invalid version format][valid version format]CallergetManifest(version)validate X.Y.Z format{ data: null, error }replace {version} in manifest pathrequest JSON + manifest schemaGET manifest endpointJSON response{ data, error, response }{ data, error, response }Caller

client.config.get()

/.well-known/ucd-config.jsoncustomFetch.safe()config.get()/.well-known/ucd-config.jsoncustomFetch.safe()config.get()Callerconfig.get()request JSON + UCDWellKnownConfigSchemaGET /.well-known/ucd-config.jsonJSON response{ data, error, response }{ data, error, response }Caller

Testing Use

These diagrams also define the most useful client test buckets:

  • discovery success, fetch failure, and invalid .well-known config
  • safe-path validation for files.get()
  • successful resource fetches with schema validation
  • invalid version format for getManifest()
  • normalization of request failures into { data, error }

On this page