This article is an implementation note, not a compatibility guarantee.
At runtime, all operations go through three explicit stages:
opendalErrorValue.OpendalFs is the stable user-facing handle. Async
completion is represented by OpendalAio, which carries
completion state and result storage.
Background work runs in a Rust Tokio runtime. Callbacks and
completion paths do not call into the R C API directly; this is
intentional, so synchronization and waiting are explicit on the R side
(call_aio(), collect_aio(),
cv_wait(), aio_monitor()).
The package keeps bytes as the storage contract and applies optional transforms in this order:
raw,
text, serial),identity, gzip,
zlib),That means byte-level options remain explicit and inspectable in both sync and async paths.
Layer constructors are opt-in and composable:
runtime_config(threads = ...)layer_concurrent_limit(max = ...)layer_timeout(request_timeout = ..., io_timeout = ...)All are attached at handle construction so behavior is consistent per
OpendalFs.
Public functions are split by surface, with async forms sharing the same shape as sync forms where practical:
fs_read_iter(),
fs_write_iter()collect_aio(),
read_monitor(), aio_monitor()The C header mirrors this boundary as a separate pure-C API for downstream users who need async bytes or completions without R-specific dependencies.