acapy_agent.utils package

Subpackages

Submodules

acapy_agent.utils.classloader module

The classloader provides utilities to dynamically load classes and modules.

class acapy_agent.utils.classloader.ClassLoader[source]

Bases: object

Class used to load classes from modules dynamically.

classmethod load_class(class_name: str, default_module: str | None = None, package: str | None = None)[source]

Resolve a complete class path (ie. typing.Dict) to the class itself.

Parameters:
  • class_name – the class name

  • default_module – the default module to load, if not part of in the class name

  • package – the parent package to search for the module

Returns:

The resolved class

Raises:
classmethod load_module(mod_path: str, package: str | None = None) → ModuleType | None[source]

Load a module by its absolute path.

Parameters:
  • mod_path – the absolute or relative module path

  • package – the parent package to search for the module

Returns:

The resolved module or None if the module cannot be found

Raises:

ModuleLoadError – If there was an error loading the module

classmethod load_subclass_of(base_class: Type, mod_path: str, package: str | None = None)[source]

Resolve an implementation of a base path within a module.

Parameters:
  • base_class – the base class being implemented

  • mod_path – the absolute module path

  • package – the parent package to search for the module

Returns:

The resolved class

Raises:
classmethod scan_subpackages(package: str) → Sequence[str][source]

Return a list of sub-packages defined under a named package.

exception acapy_agent.utils.classloader.ClassNotFoundError(*args, error_code: str | None = None, **kwargs)[source]

Bases: BaseError

Class not found error.

class acapy_agent.utils.classloader.DeferLoad(cls_path: str)[source]

Bases: object

Helper to defer loading of a class definition.

property resolved

Accessor for the resolved class instance.

exception acapy_agent.utils.classloader.ModuleLoadError(*args, error_code: str | None = None, **kwargs)[source]

Bases: BaseError

Module load error.

acapy_agent.utils.dependencies module

Dependency related util methods.

acapy_agent.utils.dependencies.assert_ursa_bbs_signatures_installed()[source]

Assert ursa_bbs_signatures module is installed.

acapy_agent.utils.dependencies.is_ursa_bbs_signatures_module_installed()[source]

Check whether ursa_bbs_signatures module is installed.

Returns:

Whether ursa_bbs_signatures is installed.

Return type:

bool

acapy_agent.utils.endorsement_setup module

acapy_agent.utils.env module

Environment utility methods.

acapy_agent.utils.env.storage_path(*subpaths, create: bool = False) → Path[source]

Get the default aca-py home directory.

acapy_agent.utils.extract_validation_error module

Extract validation error messages from nested exceptions.

acapy_agent.utils.extract_validation_error.extract_validation_error_message(exc: aiohttp.web.HTTPUnprocessableEntity) → str[source]

Extract marshmallow error message from a nested UnprocessableEntity exception.

acapy_agent.utils.general module

Utility functions for the admin server.

acapy_agent.utils.general.const_compare(string1, string2)[source]

Compare two strings in constant time.

acapy_agent.utils.general.strip_did_prefix(did: str) → str | None[source]

Strip the DID prefix from a DID.

acapy_agent.utils.http module

HTTP utility methods.

exception acapy_agent.utils.http.FetchError(*args, error_code: str | None = None, **kwargs)[source]

Bases: BaseError

Error raised when an HTTP fetch fails.

exception acapy_agent.utils.http.PutError(*args, error_code: str | None = None, **kwargs)[source]

Bases: BaseError

Error raised when an HTTP put fails.

async acapy_agent.utils.http.fetch(url: str, *, headers: dict | None = None, retry: bool = True, max_attempts: int = 5, interval: float = 1.0, backoff: float = 0.25, request_timeout: float = 10.0, connector: aiohttp.BaseConnector | None = None, session: aiohttp.ClientSession | None = None, json: bool = False)[source]

Fetch from an HTTP server with automatic retries and timeouts.

Parameters:
  • url – the address to fetch

  • headers – an optional dict of headers to send

  • retry – flag to retry the fetch

  • max_attempts – the maximum number of attempts to make

  • interval – the interval between retries, in seconds

  • backoff – the backoff interval, in seconds

  • request_timeout – the HTTP request timeout, in seconds

  • connector – an optional existing BaseConnector

  • session – a shared ClientSession

  • json – flag to parse the result as JSON

async acapy_agent.utils.http.fetch_stream(url: str, *, headers: dict | None = None, retry: bool = True, max_attempts: int = 5, interval: float = 1.0, backoff: float = 0.25, request_timeout: float = 10.0, connector: aiohttp.BaseConnector | None = None, session: aiohttp.ClientSession | None = None)[source]

Fetch from an HTTP server with automatic retries and timeouts.

Parameters:
  • url – the address to fetch

  • headers – an optional dict of headers to send

  • retry – flag to retry the fetch

  • max_attempts – the maximum number of attempts to make

  • interval – the interval between retries, in seconds

  • backoff – the backoff interval, in seconds

  • request_timeout – the HTTP request timeout, in seconds

  • connector – an optional existing BaseConnector

  • session – a shared ClientSession

  • json – flag to parse the result as JSON

async acapy_agent.utils.http.put_file(url: str, file_data: dict, extra_data: dict, *, retry: bool = True, max_attempts: int = 5, interval: float = 1.0, backoff: float = 0.25, request_timeout: float = 10.0, connector: aiohttp.BaseConnector | None = None, session: aiohttp.ClientSession | None = None, json: bool = False)[source]

Put to HTTP server with automatic retries and timeouts.

Parameters:
  • url – the address to use

  • file_data – dict with data key and path of file to upload

  • extra_data – further content to include in data to put

  • headers – an optional dict of headers to send

  • retry – flag to retry the fetch

  • max_attempts – the maximum number of attempts to make

  • interval – the interval between retries, in seconds

  • backoff – the backoff interval, in seconds

  • request_timeout – the HTTP request timeout, in seconds

  • connector – an optional existing BaseConnector

  • session – a shared ClientSession

  • json – flag to parse the result as JSON

acapy_agent.utils.jwe module

JSON Web Encryption utilities.

class acapy_agent.utils.jwe.B64Value(*args: Any, **kwargs: Any)[source]

Bases: Str

A marshmallow-compatible wrapper for base64-URL values.

class acapy_agent.utils.jwe.JweEnvelope(*, protected: dict | None = None, protected_b64: bytes | None = None, unprotected: dict | None = None, ciphertext: bytes | None = None, iv: bytes | None = None, tag: bytes | None = None, aad: bytes | None = None, with_protected_recipients: bool = False, with_flatten_recipients: bool = True)[source]

Bases: object

JWE envelope instance.

add_recipient(recip: JweRecipient)[source]

Add a recipient to the JWE envelope.

property combined_aad: bytes

Accessor for the additional authenticated data.

classmethod deserialize(message: Mapping[str, Any]) → JweEnvelope[source]

Deserialize a JWE envelope from a mapping.

classmethod from_json(message: bytes | str) → JweEnvelope[source]

Decode a JWE envelope from a JSON string or bytes value.

get_recipient(kid: str) → JweRecipient[source]

Find a recipient by key ID.

property protected_bytes: bytes

Access the protected data encoded as bytes.

This value is used in the additional authenticated data when encrypting.

property recipient_key_ids: Iterable[JweRecipient]

Accessor for an iterator over the JWE recipient key identifiers.

property recipients: Iterable[JweRecipient]

Accessor for an iterator over the JWE recipients.

The headers for each recipient include protected and unprotected headers from the outer envelope.

property recipients_json: List[Dict[str, Any]]

Encode the current recipients for JSON.

serialize() → dict[source]

Serialize the JWE envelope to a mapping.

set_payload(ciphertext: bytes, iv: bytes, tag: bytes, aad: bytes | None = None)[source]

Set the payload of the JWE envelope.

set_protected(protected: Mapping[str, Any])[source]

Set the protected headers of the JWE envelope.

to_json() → str[source]

Serialize the JWE envelope to a JSON string.

class acapy_agent.utils.jwe.JweRecipient(*, encrypted_key: bytes, header: dict | None = None)[source]

Bases: object

A single message recipient.

classmethod deserialize(entry: Mapping[str, Any]) → JweRecipient[source]

Deserialize a JWE recipient from a mapping.

serialize() → dict[source]

Serialize the JWE recipient to a mapping.

class acapy_agent.utils.jwe.JweRecipientSchema(*args: Any, **kwargs: Any)[source]

Bases: Schema

JWE recipient schema.

class acapy_agent.utils.jwe.JweSchema(*args: Any, **kwargs: Any)[source]

Bases: Schema

JWE envelope schema.

acapy_agent.utils.jwe.b64url(value: bytes | str) → str[source]

Encode a string or bytes value as unpadded base64-URL.

acapy_agent.utils.jwe.from_b64url(value: str) → bytes[source]

Decode an unpadded base64-URL value.

acapy_agent.utils.multi_ledger module

Multiledger related utility methods.

acapy_agent.utils.multi_ledger.get_write_ledger_config_for_profile(settings: BaseSettings) → dict[source]

Return initial/default write ledger config on profile creation.

acapy_agent.utils.outofband module

Utilities for creating out-of-band messages.

acapy_agent.utils.outofband.serialize_outofband(message: AgentMessage, did: DIDInfo, endpoint: str) → str[source]

Serialize the agent message as an out-of-band message.

Returns:

An OOB message in URL format.

acapy_agent.utils.profiles module

acapy_agent.utils.repeat module

Utils for repeating tasks.

class acapy_agent.utils.repeat.RepeatAttempt(seq: RepeatSequence, index: int = 1)[source]

Bases: object

Represents the current iteration in a repeat sequence.

property final: bool

Check if this is the last instance in the sequence.

next() → RepeatAttempt[source]

Get the next attempt instance.

property next_interval: float

Calculate the interval before the next attempt.

timeout(interval: float | None = None)[source]

Create a context manager for timing out an attempt.

class acapy_agent.utils.repeat.RepeatSequence(limit: int = 0, interval: float = 0.0, backoff: float = 0.0)[source]

Bases: object

Represents a repetition sequence.

next_interval(index: int) → float[source]

Calculate the time before the next attempt.

start() → RepeatAttempt[source]

Get the first attempt in the sequence.

acapy_agent.utils.server module

Utility functions for server operations in an AcaPy agent.

async acapy_agent.utils.server.remove_unwanted_headers(request, response) → None[source]

Remove unwanted headers from the response.

acapy_agent.utils.stats module

Classes for tracking performance and timing.

class acapy_agent.utils.stats.Collector(*, enabled: bool = True, log_path: str | None = None)[source]

Bases: object

Collector for a set of statistics.

property enabled: bool

Accessor for the collector’s enabled property.

extract(groups: Sequence[str] = None) → dict[source]

Extract statistics for a specific set of groups.

log(name: str, duration: float, start: float | None = None)[source]

Log an entry in the statistics if the collector is enabled.

mark(*names)[source]

Make a custom decorator function for adding to the set of groups.

reset()[source]

Reset the collector’s statistics.

property results: dict

Accessor for the current set of collected statistics.

timer(*groups)[source]

Create a new timer attached to this collector.

wrap(obj, prop_name: str | Sequence[str], groups: Sequence[str] = None, *, ignore_missing: bool = False)[source]

Wrap a method on a class or class instance.

wrap_coro(fn, groups: Sequence[str])[source]

Wrap a coroutine instance to collect timing statistics on execution.

wrap_fn(fn, groups: Sequence[str])[source]

Wrap a function instance to collect timing statistics on execution.

class acapy_agent.utils.stats.Stats[source]

Bases: object

A collection of statistics.

extract(names: Sequence[str] = None) → dict[source]

Summarize the stats in a dictionary.

log(name: str, duration: float)[source]

Log an entry in the stats.

class acapy_agent.utils.stats.Timer(collector: Collector, groups: Sequence[str])[source]

Bases: object

Timer instance for a running task.

classmethod now()[source]

Fetch a standard timer value.

start() → Timer[source]

Start the timer.

stop()[source]

Stop the timer.

acapy_agent.utils.task_queue module

Classes for managing a set of asyncio tasks.

class acapy_agent.utils.task_queue.CompletedTask(task: Task, exc_info: Tuple, ident: str | None = None, timing: dict | None = None)[source]

Bases: object

Represent the result of a queued task.

class acapy_agent.utils.task_queue.PendingTask(coro: Coroutine, complete_hook: Callable | None = None, ident: str | None = None, task_future: Future = None, queued_time: float | None = None)[source]

Bases: object

Represent a task in the queue.

cancel()[source]

Cancel the pending task.

property cancelled

Accessor for the cancelled property.

property task: Task

Accessor for the task.

class acapy_agent.utils.task_queue.TaskQueue(max_active: int = 0, timed: bool = False, trace_fn: Callable | None = None)[source]

Bases: object

A class for managing a set of asyncio tasks.

add_active(task: Task, task_complete: Callable | None = None, ident: str | None = None, timing: dict | None = None) → Task[source]

Register an active async task with an optional completion callback.

Parameters:
  • task – The asyncio task instance

  • task_complete – An optional callback to run on completion

  • ident – A string identifier for the task

  • timing – An optional dictionary of timing information

add_pending(pending: PendingTask)[source]

Add a task to the pending queue.

Parameters:

pending – The PendingTask to add to the task queue

cancel()[source]

Cancel any pending or active tasks in the queue.

cancel_pending()[source]

Cancel any pending tasks in the queue.

property cancelled: bool

Accessor for the cancelled property of the queue.

async complete(timeout: float | None = None, cleanup: bool = True)[source]

Cancel any pending tasks and wait for, or cancel active tasks.

completed_task(task: Task, task_complete: Callable, ident: str, timing: dict | None = None)[source]

Clean up after a task has completed and run callbacks.

property current_active: int

Accessor for the current number of active tasks in the queue.

property current_pending: int

Accessor for the current number of pending tasks in the queue.

property current_size: int

Accessor for the total number of tasks in the queue.

drain() → Task[source]

Start the process to run queued tasks.

async flush()[source]

Wait for any active or pending tasks to be completed.

property max_active: int

Accessor for the maximum number of active tasks in the queue.

put(coro: Coroutine, task_complete: Callable | None = None, ident: str | None = None) → PendingTask[source]

Add a new task to the queue, delaying execution if busy.

Parameters:
  • coro – The coroutine to run

  • task_complete – A callback to run on completion

  • ident – A string identifier for the task

Returns: a future resolving to the asyncio task instance once queued

property ready: bool

Accessor for the ready property of the queue.

run(coro: Coroutine, task_complete: Callable | None = None, ident: str | None = None, timing: dict | None = None) → Task[source]

Start executing a coroutine as an async task, bypassing the pending queue.

Parameters:
  • coro – The coroutine to run

  • task_complete – An optional callback to run on completion

  • ident – A string identifier for the task

  • timing – An optional dictionary of timing information

Returns: the new asyncio task instance

async wait_for(timeout: float)[source]

Wait for all queued tasks to complete with a timeout.

acapy_agent.utils.task_queue.coro_ident(coro: Coroutine)[source]

Extract an identifier for a coroutine.

async acapy_agent.utils.task_queue.coro_timed(coro: Coroutine, timing: dict)[source]

Capture timing for a coroutine.

acapy_agent.utils.task_queue.task_exc_info(task: Task)[source]

Extract exception info from an asyncio task.

acapy_agent.utils.testing module

acapy_agent.utils.tracing module

Event tracing.

class acapy_agent.utils.tracing.AdminAPIMessageTracingSchema(*args: Any, **kwargs: Any)[source]

Bases: OpenAPISchema

Request/result schema including agent message tracing.

This is to be used as a superclass for aca-py admin input/output messages that need to support tracing.

acapy_agent.utils.tracing.decode_inbound_message(message)[source]

Return bundled message if appropriate.

acapy_agent.utils.tracing.get_timer() → float[source]

Return a timer.

acapy_agent.utils.tracing.trace_event(context, message, handler: str | None = None, outcome: str | None = None, perf_counter: float | None = None, force_trace: bool = False, raise_errors: bool = False) → float[source]

Log a trace event to a configured target.

Parameters:
  • context – The application context, attributes of interest are: context[“trace.enabled”]: True if we are logging events context[“trace.target”]: Trace target (“log”, “message” or an http endpoint) context[“trace.tag”]: Tag to be included in trace output

  • message – the current message, can be an AgentMessage, InboundMessage, OutboundMessage or Exchange record

  • handler (optional) – The handler name for the trace event. If not provided, it defaults to “aca-py.agent”.

  • outcome (optional) – The outcome of the trace event.

  • perf_counter (optional) – The performance counter value for the trace event.

  • force_trace (optional) – If True, forces the trace event to be logged even if tracing is not enabled.

  • raise_errors (optional) – If True, raises an exception if there is an error logging the trace event.

Returns:

The value of the performance counter.

Return type:

float

Raises:

Exception – If there is an error logging the trace event and raise_errors is True.

acapy_agent.utils.tracing.tracing_enabled(context, message) → bool[source]

Determine whether to log trace messages or not.