You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by gi...@apache.org on 2024/03/12 05:21:55 UTC

(opendal) branch gh-pages updated: deploy: e704a899f97faf69acbb46e2bfa174155739ad85

This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/opendal.git


The following commit(s) were added to refs/heads/gh-pages by this push:
     new caa384a5e4 deploy: e704a899f97faf69acbb46e2bfa174155739ad85
caa384a5e4 is described below

commit caa384a5e4b5e881601b37fb1ef8bbdc96beaa9b
Author: Xuanwo <Xu...@users.noreply.github.com>
AuthorDate: Tue Mar 12 05:21:49 2024 +0000

    deploy: e704a899f97faf69acbb46e2bfa174155739ad85
---
 404.html                                           |   2 +-
 assets/js/054cd2fb.6b680376.js                     |   1 -
 assets/js/054cd2fb.ce968650.js                     |   1 +
 assets/js/0605a481.23421cae.js                     |   1 +
 assets/js/0605a481.5df67b79.js                     |   1 -
 assets/js/093f5f04.cd353426.js                     |   1 +
 assets/js/093f5f04.f1beaedb.js                     |   1 -
 assets/js/09d8124e.42a565b9.js                     |   1 +
 assets/js/09d8124e.cf8e4eac.js                     |   1 -
 assets/js/136e1c50.bdbce0d5.js                     |   1 -
 assets/js/136e1c50.eb90e5b4.js                     |   1 +
 assets/js/151cd40f.1ebd6bc0.js                     |   1 -
 assets/js/151cd40f.62596b35.js                     |   1 +
 assets/js/170f36cb.07727330.js                     |   1 +
 assets/js/170f36cb.ed27d97c.js                     |   1 -
 assets/js/1957547a.548f2c99.js                     |   1 +
 assets/js/1957547a.916666b3.js                     |   1 -
 assets/js/1db64337.44028da1.js                     |   1 -
 assets/js/1db64337.7a158466.js                     |   1 +
 assets/js/22d8fa67.74f77be1.js                     |   1 +
 assets/js/22d8fa67.f590829f.js                     |   1 -
 assets/js/29b208a4.c628a6d5.js                     |   1 -
 assets/js/29b208a4.dca4da68.js                     |   1 +
 .../{2cbf1097.4bac5205.js => 2cbf1097.b21fbadb.js} |   2 +-
 assets/js/3632610d.7b6068d8.js                     |   1 +
 assets/js/3632610d.c35a8d13.js                     |   1 -
 assets/js/381c04e3.2d4a8c20.js                     |   1 +
 assets/js/381c04e3.7aba3ee0.js                     |   1 -
 .../{39a95de5.9ee499a8.js => 39a95de5.a98ed421.js} |   2 +-
 assets/js/42347498.a309b688.js                     |   1 -
 assets/js/42347498.c2bed015.js                     |   1 +
 assets/js/434bbc94.7e47b021.js                     |   1 +
 assets/js/434bbc94.8b3c8e63.js                     |   1 -
 assets/js/4e2d8f56.8d143324.js                     |   1 -
 assets/js/4e2d8f56.d47c10f8.js                     |   1 +
 assets/js/500d55cb.b2bf2612.js                     |   1 +
 assets/js/500d55cb.c075c325.js                     |   1 -
 assets/js/57a16c1d.64d9edee.js                     |   1 -
 assets/js/57a16c1d.d3c56402.js                     |   1 +
 assets/js/592d1076.0def77f4.js                     |   1 -
 assets/js/592d1076.e608c333.js                     |   1 +
 assets/js/621b831b.0c44704c.js                     |   1 -
 assets/js/621b831b.67b54108.js                     |   1 +
 assets/js/65bf2b43.07678658.js                     |   1 +
 assets/js/65bf2b43.490aee68.js                     |   1 -
 assets/js/67ecc70e.0888d1c5.js                     |   1 +
 assets/js/67ecc70e.242f8af4.js                     |   1 -
 assets/js/6a41242b.60bae807.js                     |   1 +
 assets/js/6a41242b.80905477.js                     |   1 -
 assets/js/6dc695d1.325fdcd2.js                     |   1 +
 assets/js/6dc695d1.4bda1060.js                     |   1 -
 assets/js/6f4d3fa1.2276ca73.js                     |   1 +
 assets/js/6f4d3fa1.b9e718a6.js                     |   1 -
 assets/js/7263c0b5.71098848.js                     |   1 +
 assets/js/7263c0b5.e9e5d68a.js                     |   1 -
 assets/js/8070e160.2d46276e.js                     |   1 -
 assets/js/8070e160.c0c8e19f.js                     |   1 +
 .../{8cc9519e.dd5c3eec.js => 8cc9519e.46cbb280.js} |   2 +-
 .../{8f4159f2.f8b7d92d.js => 8f4159f2.884e1008.js} |   2 +-
 assets/js/8fb00c63.3700e31f.js                     |   1 -
 assets/js/8fb00c63.a54fe13a.js                     |   1 +
 assets/js/939f74f6.32538d86.js                     |   1 +
 assets/js/939f74f6.5b16e754.js                     |   1 -
 assets/js/a0405932.1f0b5989.js                     |   1 +
 assets/js/a0405932.dd4b4f05.js                     |   1 -
 assets/js/b114cefa.72dd25d4.js                     |   1 +
 assets/js/b114cefa.df5f1c43.js                     |   1 -
 assets/js/b56f9725.ab430d64.js                     |   1 +
 assets/js/b56f9725.bb990128.js                     |   1 -
 assets/js/bb5b2057.312981b0.js                     |   1 -
 assets/js/bb5b2057.a1c13693.js                     |   1 +
 assets/js/c0600a1b.3d9bc277.js                     |   1 -
 assets/js/c0600a1b.4f12403c.js                     |   1 +
 assets/js/c46c6b55.502fab37.js                     |   1 +
 assets/js/c46c6b55.f32af074.js                     |   1 -
 .../{c6ab695b.9f6c3795.js => c6ab695b.a1d73cd2.js} |   2 +-
 .../{cc62039a.33a8b8c5.js => cc62039a.4a83b3ae.js} |   2 +-
 assets/js/d3c0d8d5.26143957.js                     |   1 -
 assets/js/d3c0d8d5.757e9a05.js                     |   1 +
 assets/js/ddccef4c.31798def.js                     |   1 +
 assets/js/ddccef4c.38a36786.js                     |   1 -
 assets/js/e892cec6.17939743.js                     |   1 +
 assets/js/e892cec6.a1623fc8.js                     |   1 -
 assets/js/eec267e4.0f92952e.js                     |   1 -
 assets/js/eec267e4.b024479f.js                     |   1 +
 assets/js/f1ca5a39.4e95b05f.js                     |   1 -
 assets/js/f1ca5a39.cccbe7ff.js                     |   1 +
 assets/js/f9145722.4985669e.js                     |   1 -
 assets/js/f9145722.a9f84803.js                     |   1 +
 assets/js/fde7cc64.c44a3dd5.js                     |   1 -
 assets/js/fde7cc64.ceb2c6f0.js                     |   1 +
 ...e~main.acae46ca.js => runtime~main.b10cd7eb.js} |   2 +-
 blog/apache-opendal-graduated/index.html           |   2 +-
 .../index.html                                     |   2 +-
 blog/archive/index.html                            |   2 +-
 blog/how-opendal-read-data/index.html              |   2 +-
 blog/index.html                                    |   2 +-
 blog/opendal-access-data-freely/index.html         |   2 +-
 blog/opendal-entered-apache-incubator/index.html   |   2 +-
 blog/owo-1/index.html                              |   2 +-
 blog/tags/announcement/index.html                  |   2 +-
 blog/tags/index.html                               |   2 +-
 blog/tags/internal/index.html                      |   2 +-
 blog/tags/owo/index.html                           |   2 +-
 community/category/committers/index.html           |   2 +-
 community/category/events/index.html               |   2 +-
 community/category/pmc-members/index.html          |   2 +-
 community/category/reference/index.html            |   2 +-
 community/committers/onboarding/index.html         |   2 +-
 .../reference/generate_release_note/index.html     |   2 +-
 .../committers/reference/setup_gpg/index.html      |   2 +-
 community/committers/release/index.html            |   2 +-
 .../request_for_adding_secrets/index.html          |   2 +-
 community/committers/verify/index.html             |   2 +-
 community/events/gsoc-proposal-guide/index.html    |   2 +-
 community/index.html                               |   2 +-
 community/maturity/index.html                      |   2 +-
 community/news/index.html                          |   2 +-
 .../pmc_members/nominate-committer/index.html      |   2 +-
 .../pmc_members/nominate-pmc-member/index.html     |   2 +-
 community/pmc_members/onboarding/index.html        |   2 +-
 community/pmc_members/podling-report/index.html    |   2 +-
 community/security/index.html                      |   2 +-
 docs/category/integrations/index.html              |   2 +-
 docs/category/services/index.html                  |   2 +-
 docs/integrations/object_store_opendal/index.html  |   4 +-
 docs/lua/classes/opendal.metadata.html             |   2 +-
 docs/lua/classes/opendal.operator.html             |   2 +-
 docs/lua/index.html                                |   2 +-
 docs/nodejs/classes/BlockingLister.html            |   4 +-
 docs/nodejs/classes/BlockingReader.html            |   4 +-
 docs/nodejs/classes/BlockingWriter.html            |   8 +-
 docs/nodejs/classes/Capability.html                |  80 +--
 docs/nodejs/classes/Entry.html                     |   4 +-
 docs/nodejs/classes/ExternalObject.html            |   4 +-
 docs/nodejs/classes/Layer.html                     |   2 +-
 docs/nodejs/classes/Lister.html                    |   4 +-
 docs/nodejs/classes/Metadata.html                  |  18 +-
 docs/nodejs/classes/Operator.html                  |  66 +-
 docs/nodejs/classes/Reader.html                    |   7 +-
 docs/nodejs/classes/RetryLayer.html                |  14 +-
 docs/nodejs/classes/Writer.html                    |   8 +-
 docs/nodejs/interfaces/ListOptions.html            |   4 +-
 docs/nodejs/interfaces/PresignedRequest.html       |   8 +-
 .../object_store_opendal/index.html                |   2 +-
 .../src/object_store_opendal/lib.rs.html           |   8 +-
 docs/overview/index.html                           |   4 +-
 docs/python/opendal.html                           | 402 ++++++------
 docs/python/search.js                              |   2 +-
 docs/quickstart/index.html                         |   4 +-
 docs/rust/opendal/all.html                         |   2 +-
 docs/rust/opendal/enum.EntryMode.html              |   2 +-
 docs/rust/opendal/enum.ErrorKind.html              |   2 +-
 docs/rust/opendal/enum.Metakey.html                |   4 +-
 docs/rust/opendal/enum.Scheme.html                 |   2 +-
 docs/rust/opendal/layers/struct.BlockingLayer.html |   6 +-
 docs/rust/opendal/layers/struct.ChaosLayer.html    |   6 +-
 docs/rust/opendal/layers/struct.MadsimLayer.html   |   6 +-
 docs/rust/opendal/layers/struct.MadsimServer.html  |   6 +-
 docs/rust/opendal/raw/enum.AsyncBody.html          |   4 +-
 docs/rust/opendal/raw/enum.FourWays.html           |  28 +-
 docs/rust/opendal/raw/enum.ThreeWays.html          |  22 +-
 docs/rust/opendal/raw/enum.TwoWays.html            |  20 +-
 docs/rust/opendal/raw/fn.new_std_io_error.html     |   2 +-
 .../raw/futures_util/type.BoxedStaticFuture.html   |  11 +
 docs/rust/opendal/raw/index.html                   |   4 +-
 docs/rust/opendal/raw/oio/enum.ReadOperation.html  |  16 +-
 docs/rust/opendal/raw/oio/enum.WriteOperation.html |   2 +-
 .../opendal/raw/oio/fn.into_read_from_stream.html  |   2 +-
 .../opendal/raw/oio/fn.into_streamable_read.html   |   2 +-
 docs/rust/opendal/raw/oio/index.html               |   2 +-
 .../opendal/raw/oio/read/api/trait.ReadExt.html    |  11 -
 docs/rust/opendal/raw/oio/sidebar-items.js         |   2 +-
 docs/rust/opendal/raw/oio/struct.BufferReader.html |  26 +-
 docs/rust/opendal/raw/oio/struct.Cursor.html       |  24 +-
 docs/rust/opendal/raw/oio/struct.FileReader.html   |  36 +-
 docs/rust/opendal/raw/oio/struct.FlatLister.html   |   4 +-
 .../opendal/raw/oio/struct.FromStreamReader.html   |  18 +-
 .../rust/opendal/raw/oio/struct.FuturesReader.html |  24 +-
 docs/rust/opendal/raw/oio/struct.LazyReader.html   |  36 +-
 docs/rust/opendal/raw/oio/struct.RangeReader.html  |  36 +-
 docs/rust/opendal/raw/oio/struct.StdReader.html    |   2 +-
 .../opendal/raw/oio/struct.StreamableReader.html   |  20 +-
 docs/rust/opendal/raw/oio/struct.TokioReader.html  |  24 +-
 docs/rust/opendal/raw/oio/trait.BlockingList.html  |   2 +-
 docs/rust/opendal/raw/oio/trait.BlockingRead.html  |  28 +-
 docs/rust/opendal/raw/oio/trait.List.html          |   2 +-
 docs/rust/opendal/raw/oio/trait.Read.html          |  97 +--
 docs/rust/opendal/raw/oio/trait.ReadExt.html       |  20 -
 docs/rust/opendal/raw/oio/trait.Stream.html        |   2 +-
 docs/rust/opendal/raw/oio/trait.Write.html         |   4 +-
 docs/rust/opendal/raw/oio/trait.WriteBuf.html      |   2 +-
 docs/rust/opendal/raw/oio/type.BlockingReader.html |   2 +-
 docs/rust/opendal/raw/oio/type.Reader.html         |   2 +-
 docs/rust/opendal/raw/sidebar-items.js             |   2 +-
 .../rust/opendal/raw/struct.BytesContentRange.html |   4 +-
 docs/rust/opendal/raw/struct.BytesRange.html       |   2 +-
 .../rust/opendal/raw/struct.ConcurrentFutures.html |  24 +-
 .../rust/opendal/raw/struct.IncomingAsyncBody.html |  26 +-
 docs/rust/opendal/raw/tests/enum.ReadAction.html   |   6 +-
 .../rust/opendal/raw/tests/struct.ReadChecker.html |  10 +-
 docs/rust/opendal/raw/trait.Accessor.html          |   2 +-
 docs/rust/opendal/raw/trait.Layer.html             |   2 +-
 docs/rust/opendal/raw/type.BoxedFuture.html        |   4 +-
 docs/rust/opendal/raw/type.BoxedStaticFuture.html  |   4 +
 docs/rust/opendal/struct.BlockingReader.html       |   8 +-
 docs/rust/opendal/struct.Operator.html             |  26 +-
 docs/rust/opendal/struct.Reader.html               |  68 +-
 docs/rust/search-index.js                          |   2 +-
 docs/rust/src/opendal/layers/blocking.rs.html      |  24 +-
 docs/rust/src/opendal/layers/chaos.rs.html         |  36 +-
 .../src/opendal/layers/concurrent_limit.rs.html    |  20 +-
 docs/rust/src/opendal/layers/dtrace.rs.html        |  56 +-
 docs/rust/src/opendal/layers/error_context.rs.html |  26 +-
 docs/rust/src/opendal/layers/logging.rs.html       | 244 +------
 docs/rust/src/opendal/layers/madsim.rs.html        |  30 +-
 docs/rust/src/opendal/layers/metrics.rs.html       |  42 +-
 docs/rust/src/opendal/layers/minitrace.rs.html     |  32 +-
 docs/rust/src/opendal/layers/oteltrace.rs.html     |  20 +-
 docs/rust/src/opendal/layers/prometheus.rs.html    |  58 +-
 .../src/opendal/layers/prometheus_client.rs.html   |  44 +-
 docs/rust/src/opendal/layers/retry.rs.html         | 336 +++-------
 docs/rust/src/opendal/layers/throttle.rs.html      |  20 +-
 docs/rust/src/opendal/layers/timeout.rs.html       |  64 +-
 docs/rust/src/opendal/layers/tracing.rs.html       |  28 +-
 docs/rust/src/opendal/raw/enum_utils.rs.html       |  96 +--
 docs/rust/src/opendal/raw/futures_util.rs.html     |  20 +-
 docs/rust/src/opendal/raw/http_util/body.rs.html   | 168 ++---
 docs/rust/src/opendal/raw/mod.rs.html              |   2 +
 docs/rust/src/opendal/raw/oio/cursor.rs.html       |  38 +-
 .../src/opendal/raw/oio/list/flat_list.rs.html     |   2 +-
 .../src/opendal/raw/oio/list/page_list.rs.html     |   2 +-
 docs/rust/src/opendal/raw/oio/read/api.rs.html     | 464 ++-----------
 .../src/opendal/raw/oio/read/buffer_reader.rs.html | 258 ++++----
 .../src/opendal/raw/oio/read/file_read.rs.html     | 606 +++++------------
 .../src/opendal/raw/oio/read/futures_read.rs.html  |  68 +-
 .../raw/oio/read/into_read_from_stream.rs.html     |  72 +-
 .../raw/oio/read/into_streamable_read.rs.html      |  48 +-
 .../src/opendal/raw/oio/read/lazy_read.rs.html     | 244 +------
 docs/rust/src/opendal/raw/oio/read/mod.rs.html     |   2 -
 .../src/opendal/raw/oio/read/range_read.rs.html    | 722 +++++----------------
 .../src/opendal/raw/oio/read/tokio_read.rs.html    |  76 +--
 docs/rust/src/opendal/raw/oio/stream/api.rs.html   |  12 +-
 .../src/opendal/raw/oio/write/append_write.rs.html |   4 +-
 .../src/opendal/raw/oio/write/block_write.rs.html  |   6 +-
 .../opendal/raw/oio/write/multipart_write.rs.html  |   8 +-
 .../opendal/raw/oio/write/one_shot_write.rs.html   |   2 +-
 .../src/opendal/raw/oio/write/range_write.rs.html  |   8 +-
 docs/rust/src/opendal/raw/std_io_util.rs.html      |  36 +
 docs/rust/src/opendal/raw/tests/read.rs.html       |  88 +--
 docs/rust/src/opendal/services/dbfs/reader.rs.html | 126 +---
 docs/rust/src/opendal/services/ftp/util.rs.html    | 134 ++--
 .../opendal/services/hdfs_native/reader.rs.html    |  32 +-
 docs/rust/src/opendal/types/list.rs.html           |   2 +-
 .../src/opendal/types/operator/operator.rs.html    |   6 +-
 docs/rust/src/opendal/types/reader.rs.html         | 592 +++++++++++++++--
 docs/rust/trait.impl/core/clone/trait.Clone.js     |   2 +-
 docs/rust/trait.impl/core/cmp/trait.Eq.js          |   2 +-
 docs/rust/trait.impl/core/cmp/trait.PartialEq.js   |   2 +-
 docs/rust/trait.impl/core/convert/trait.From.js    |   2 +-
 docs/rust/trait.impl/core/default/trait.Default.js |   2 +-
 docs/rust/trait.impl/core/fmt/trait.Debug.js       |   2 +-
 docs/rust/trait.impl/core/fmt/trait.Display.js     |   2 +-
 docs/rust/trait.impl/core/hash/trait.Hash.js       |   2 +-
 .../core/iter/traits/iterator/trait.Iterator.js    |   2 +-
 docs/rust/trait.impl/core/marker/trait.Copy.js     |   2 +-
 docs/rust/trait.impl/core/marker/trait.Send.js     |   2 +-
 .../trait.impl/core/marker/trait.StructuralEq.js   |   2 +-
 .../core/marker/trait.StructuralPartialEq.js       |   2 +-
 docs/rust/trait.impl/core/marker/trait.Sync.js     |   2 +-
 .../core/panic/unwind_safe/trait.RefUnwindSafe.js  |   2 +-
 .../core/panic/unwind_safe/trait.UnwindSafe.js     |   2 +-
 .../trait.impl/core/str/traits/trait.FromStr.js    |   2 +-
 .../trait.impl/futures_core/stream/trait.Stream.js |   2 +-
 .../futures_io/if_std/trait.AsyncRead.js           |   2 +-
 .../futures_io/if_std/trait.AsyncSeek.js           |   2 +-
 .../opendal/raw/oio/read/api/trait.ReadExt.js      |   3 -
 docs/rust/trait.impl/serde/de/trait.Deserialize.js |   2 +-
 docs/rust/trait.impl/std/io/trait.Read.js          |   2 +-
 docs/rust/trait.impl/std/io/trait.Seek.js          |   2 +-
 docs/rust/type.impl/alloc/boxed/struct.Box.js      |   2 +-
 docs/services/atomicserver/index.html              |   4 +-
 docs/services/azblob/index.html                    |   4 +-
 docs/services/azdls/index.html                     |   4 +-
 docs/services/cacache/index.html                   |   4 +-
 docs/services/cos/index.html                       |   4 +-
 docs/services/d1/index.html                        |   4 +-
 docs/services/dashmap/index.html                   |   4 +-
 docs/services/dropbox/index.html                   |   4 +-
 docs/services/etcd/index.html                      |   4 +-
 docs/services/foundationdb/index.html              |   4 +-
 docs/services/fs/index.html                        |   4 +-
 docs/services/ftp/index.html                       |   4 +-
 docs/services/gcs/index.html                       |   4 +-
 docs/services/gdrive/index.html                    |   4 +-
 docs/services/ghac/index.html                      |   4 +-
 docs/services/gridfs/index.html                    |   4 +-
 docs/services/hdfs/index.html                      |   4 +-
 docs/services/http/index.html                      |   4 +-
 docs/services/huggingface/index.html               |   4 +-
 docs/services/ipfs/index.html                      |   4 +-
 docs/services/ipmfs/index.html                     |   4 +-
 docs/services/libsql/index.html                    |   4 +-
 docs/services/memcached/index.html                 |   4 +-
 docs/services/memory/index.html                    |   4 +-
 docs/services/moka/index.html                      |   4 +-
 docs/services/mongodb/index.html                   |   4 +-
 docs/services/mysql/index.html                     |   4 +-
 docs/services/obs/index.html                       |   4 +-
 docs/services/onedrive/index.html                  |   4 +-
 docs/services/oss/index.html                       |   4 +-
 docs/services/persy/index.html                     |   4 +-
 docs/services/postgresql/index.html                |   4 +-
 docs/services/redb/index.html                      |   4 +-
 docs/services/redis/index.html                     |   4 +-
 docs/services/rocksdb/index.html                   |   4 +-
 docs/services/s3/index.html                        |   4 +-
 docs/services/sftp/index.html                      |   4 +-
 docs/services/sled/index.html                      |   4 +-
 docs/services/sqlite/index.html                    |   4 +-
 docs/services/supabase/index.html                  |   4 +-
 docs/services/swift/index.html                     |   4 +-
 docs/services/tikv/index.html                      |   4 +-
 docs/services/vercel_artifacts/index.html          |   4 +-
 docs/services/webdav/index.html                    |   4 +-
 docs/services/webhdfs/index.html                   |   4 +-
 download/index.html                                |   2 +-
 index.html                                         |   2 +-
 328 files changed, 2473 insertions(+), 4384 deletions(-)

diff --git a/404.html b/404.html
index 144b51e9c7..462e302c28 100644
--- a/404.html
+++ b/404.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Page Not Found | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/404.html"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="tr [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/assets/js/054cd2fb.6b680376.js b/assets/js/054cd2fb.6b680376.js
deleted file mode 100644
index 4dafc62467..0000000000
--- a/assets/js/054cd2fb.6b680376.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1846],{5722:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>b,frontMatter:()=>o,metadata:()=>u,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",h1:"h1",h2:"h2",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx)(n.p,{chi [...]
\ No newline at end of file
diff --git a/assets/js/054cd2fb.ce968650.js b/assets/js/054cd2fb.ce968650.js
new file mode 100644
index 0000000000..07b7be105a
--- /dev/null
+++ b/assets/js/054cd2fb.ce968650.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1846],{5722:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>b,frontMatter:()=>o,metadata:()=>u,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",h1:"h1",h2:"h2",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx)(n.p,{chi [...]
\ No newline at end of file
diff --git a/assets/js/0605a481.23421cae.js b/assets/js/0605a481.23421cae.js
new file mode 100644
index 0000000000..b2fcbe079f
--- /dev/null
+++ b/assets/js/0605a481.23421cae.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2113],{6834:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var n=r(1527),s=r(2175);function a(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,n.jsx [...]
\ No newline at end of file
diff --git a/assets/js/0605a481.5df67b79.js b/assets/js/0605a481.5df67b79.js
deleted file mode 100644
index c4836233e2..0000000000
--- a/assets/js/0605a481.5df67b79.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2113],{6834:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var n=r(1527),s=r(2175);function a(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,n.jsx [...]
\ No newline at end of file
diff --git a/assets/js/093f5f04.cd353426.js b/assets/js/093f5f04.cd353426.js
new file mode 100644
index 0000000000..e445dbb0dd
--- /dev/null
+++ b/assets/js/093f5f04.cd353426.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6915],{493:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>m,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var s=t(1527),a=t(2175);function r(e){const n={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx)(n.p,{chil [...]
\ No newline at end of file
diff --git a/assets/js/093f5f04.f1beaedb.js b/assets/js/093f5f04.f1beaedb.js
deleted file mode 100644
index b071ec10fe..0000000000
--- a/assets/js/093f5f04.f1beaedb.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6915],{493:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>m,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var s=t(1527),a=t(2175);function r(e){const n={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx)(n.p,{chil [...]
\ No newline at end of file
diff --git a/assets/js/09d8124e.42a565b9.js b/assets/js/09d8124e.42a565b9.js
new file mode 100644
index 0000000000..18e0d52cc9
--- /dev/null
+++ b/assets/js/09d8124e.42a565b9.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4543],{7192:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>b,frontMatter:()=>o,metadata:()=>u,toc:()=>p});var s=t(1527),a=t(2175);function r(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx)(n. [...]
\ No newline at end of file
diff --git a/assets/js/09d8124e.cf8e4eac.js b/assets/js/09d8124e.cf8e4eac.js
deleted file mode 100644
index 60016684e4..0000000000
--- a/assets/js/09d8124e.cf8e4eac.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4543],{7192:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>b,frontMatter:()=>o,metadata:()=>u,toc:()=>p});var s=t(1527),a=t(2175);function r(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx)(n. [...]
\ No newline at end of file
diff --git a/assets/js/136e1c50.bdbce0d5.js b/assets/js/136e1c50.bdbce0d5.js
deleted file mode 100644
index af8ddec9d4..0000000000
--- a/assets/js/136e1c50.bdbce0d5.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3057],{1007:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>b,frontMatter:()=>c,metadata:()=>u,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/136e1c50.eb90e5b4.js b/assets/js/136e1c50.eb90e5b4.js
new file mode 100644
index 0000000000..c78372f923
--- /dev/null
+++ b/assets/js/136e1c50.eb90e5b4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3057],{1007:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>b,frontMatter:()=>c,metadata:()=>u,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/151cd40f.1ebd6bc0.js b/assets/js/151cd40f.1ebd6bc0.js
deleted file mode 100644
index 9e25f98f2c..0000000000
--- a/assets/js/151cd40f.1ebd6bc0.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3702],{3919:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>m,frontMatter:()=>c,metadata:()=>u,toc:()=>h});var r=t(1527),s=t(2175);function a(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,r [...]
\ No newline at end of file
diff --git a/assets/js/151cd40f.62596b35.js b/assets/js/151cd40f.62596b35.js
new file mode 100644
index 0000000000..2d416ea728
--- /dev/null
+++ b/assets/js/151cd40f.62596b35.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3702],{3919:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>x,frontMatter:()=>c,metadata:()=>u,toc:()=>h});var r=t(1527),s=t(2175);function a(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,r [...]
\ No newline at end of file
diff --git a/assets/js/170f36cb.07727330.js b/assets/js/170f36cb.07727330.js
new file mode 100644
index 0000000000..a8271dac8f
--- /dev/null
+++ b/assets/js/170f36cb.07727330.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[527],{5766:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>h,frontMatter:()=>c,metadata:()=>d,toc:()=>l});var o=n(1527),s=n(2175);function r(e){const t={a:"a",h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"opendal-object_store-binding",children:"OpenDAL object_store Binding"}),"\n",(0,o.jsxs)(t.p,{children:["This crate int [...]
\ No newline at end of file
diff --git a/assets/js/170f36cb.ed27d97c.js b/assets/js/170f36cb.ed27d97c.js
deleted file mode 100644
index 852eb149c2..0000000000
--- a/assets/js/170f36cb.ed27d97c.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[527],{5766:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>c,metadata:()=>d,toc:()=>l});var o=n(1527),s=n(2175);function r(e){const t={a:"a",h1:"h1",p:"p",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"opendal-object_store-binding",children:"OpenDAL object_store Binding"}),"\n",(0,o.jsxs)(t.p,{children:["This crate int [...]
\ No newline at end of file
diff --git a/assets/js/1957547a.548f2c99.js b/assets/js/1957547a.548f2c99.js
new file mode 100644
index 0000000000..77564927aa
--- /dev/null
+++ b/assets/js/1957547a.548f2c99.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4477],{5034:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),a=n(2175);function r(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/1957547a.916666b3.js b/assets/js/1957547a.916666b3.js
deleted file mode 100644
index 291be5363c..0000000000
--- a/assets/js/1957547a.916666b3.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4477],{5034:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),a=n(2175);function r(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/1db64337.44028da1.js b/assets/js/1db64337.44028da1.js
deleted file mode 100644
index de22fdda2b..0000000000
--- a/assets/js/1db64337.44028da1.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1372],{7500:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var r=n(1527),t=n(2175);const i={sidebar_label:"About",sidebar_position:1},o="Welcome to Apache OpenDAL\u2122",a={id:"overview",title:"Welcome to Apache OpenDAL\u2122",description:"OpenDAL represents Open Data Access Layer. Our vision is to access data freely.",source:"@si [...]
\ No newline at end of file
diff --git a/assets/js/1db64337.7a158466.js b/assets/js/1db64337.7a158466.js
new file mode 100644
index 0000000000..630485521a
--- /dev/null
+++ b/assets/js/1db64337.7a158466.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1372],{7500:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var r=n(1527),t=n(2175);const i={sidebar_label:"About",sidebar_position:1},o="Welcome to Apache OpenDAL\u2122",a={id:"overview",title:"Welcome to Apache OpenDAL\u2122",description:"OpenDAL represents Open Data Access Layer. Our vision is to access data freely.",source:"@si [...]
\ No newline at end of file
diff --git a/assets/js/22d8fa67.74f77be1.js b/assets/js/22d8fa67.74f77be1.js
new file mode 100644
index 0000000000..868092ef4a
--- /dev/null
+++ b/assets/js/22d8fa67.74f77be1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4536],{9109:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>m});var a=n(1527),s=n(2175);function r(e){const t={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,a.jsx)(t.p,{chi [...]
\ No newline at end of file
diff --git a/assets/js/22d8fa67.f590829f.js b/assets/js/22d8fa67.f590829f.js
deleted file mode 100644
index d417b19acc..0000000000
--- a/assets/js/22d8fa67.f590829f.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4536],{9109:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>m});var a=n(1527),s=n(2175);function r(e){const t={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,a.jsx)(t.p,{chi [...]
\ No newline at end of file
diff --git a/assets/js/29b208a4.c628a6d5.js b/assets/js/29b208a4.c628a6d5.js
deleted file mode 100644
index 8fa3884afd..0000000000
--- a/assets/js/29b208a4.c628a6d5.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6152],{4740:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>m,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),a=n(2175);function r(e){const t={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsxs)(t.ul,{c [...]
\ No newline at end of file
diff --git a/assets/js/29b208a4.dca4da68.js b/assets/js/29b208a4.dca4da68.js
new file mode 100644
index 0000000000..12ecfb2a44
--- /dev/null
+++ b/assets/js/29b208a4.dca4da68.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6152],{4740:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>m,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),a=n(2175);function r(e){const t={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsxs)(t.ul,{c [...]
\ No newline at end of file
diff --git a/assets/js/2cbf1097.4bac5205.js b/assets/js/2cbf1097.b21fbadb.js
similarity index 74%
rename from assets/js/2cbf1097.4bac5205.js
rename to assets/js/2cbf1097.b21fbadb.js
index bdc692bb4f..98c865d410 100644
--- a/assets/js/2cbf1097.4bac5205.js
+++ b/assets/js/2cbf1097.b21fbadb.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2804],{9989:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>h,default:()=>j,frontMatter:()=>u,metadata:()=>p,toc:()=>x});var t=s(1527),r=s(2175);function i(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,t.jsx)(n. [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2804],{9989:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>h,default:()=>j,frontMatter:()=>u,metadata:()=>p,toc:()=>x});var t=s(1527),r=s(2175);function i(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,t.jsx)(n. [...]
\ No newline at end of file
diff --git a/assets/js/3632610d.7b6068d8.js b/assets/js/3632610d.7b6068d8.js
new file mode 100644
index 0000000000..36415b5c1d
--- /dev/null
+++ b/assets/js/3632610d.7b6068d8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2963],{5013:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>m,frontMatter:()=>o,metadata:()=>u,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/3632610d.c35a8d13.js b/assets/js/3632610d.c35a8d13.js
deleted file mode 100644
index c40fcce7ac..0000000000
--- a/assets/js/3632610d.c35a8d13.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2963],{5013:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>m,frontMatter:()=>o,metadata:()=>u,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/381c04e3.2d4a8c20.js b/assets/js/381c04e3.2d4a8c20.js
new file mode 100644
index 0000000000..ccf0c53607
--- /dev/null
+++ b/assets/js/381c04e3.2d4a8c20.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1725],{7917:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>m,frontMatter:()=>o,metadata:()=>d,toc:()=>p});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/381c04e3.7aba3ee0.js b/assets/js/381c04e3.7aba3ee0.js
deleted file mode 100644
index c4e8cabc39..0000000000
--- a/assets/js/381c04e3.7aba3ee0.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1725],{7917:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>m,frontMatter:()=>c,metadata:()=>d,toc:()=>p});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/39a95de5.9ee499a8.js b/assets/js/39a95de5.a98ed421.js
similarity index 53%
rename from assets/js/39a95de5.9ee499a8.js
rename to assets/js/39a95de5.a98ed421.js
index 104dc0b975..1502c8c4dc 100644
--- a/assets/js/39a95de5.9ee499a8.js
+++ b/assets/js/39a95de5.a98ed421.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5737],{1851:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>f,contentTitle:()=>h,default:()=>j,frontMatter:()=>u,metadata:()=>p,toc:()=>x});var s=t(1527),i=t(2175);function r(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5737],{1851:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>f,contentTitle:()=>h,default:()=>j,frontMatter:()=>u,metadata:()=>p,toc:()=>x});var s=t(1527),i=t(2175);function r(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/42347498.a309b688.js b/assets/js/42347498.a309b688.js
deleted file mode 100644
index 3c8c24b262..0000000000
--- a/assets/js/42347498.a309b688.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7254],{8202:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var s=n(1527),a=n(2175);function r(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/42347498.c2bed015.js b/assets/js/42347498.c2bed015.js
new file mode 100644
index 0000000000..94f630a90a
--- /dev/null
+++ b/assets/js/42347498.c2bed015.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7254],{8202:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var s=n(1527),a=n(2175);function r(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/434bbc94.7e47b021.js b/assets/js/434bbc94.7e47b021.js
new file mode 100644
index 0000000000..00bb94990f
--- /dev/null
+++ b/assets/js/434bbc94.7e47b021.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1163],{6404:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>d,default:()=>b,frontMatter:()=>o,metadata:()=>u,toc:()=>h});var s=n(1527),a=n(2175);function r(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/434bbc94.8b3c8e63.js b/assets/js/434bbc94.8b3c8e63.js
deleted file mode 100644
index 845163f85a..0000000000
--- a/assets/js/434bbc94.8b3c8e63.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1163],{6404:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>d,default:()=>b,frontMatter:()=>o,metadata:()=>u,toc:()=>h});var s=n(1527),a=n(2175);function r(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/4e2d8f56.8d143324.js b/assets/js/4e2d8f56.8d143324.js
deleted file mode 100644
index b31e047769..0000000000
--- a/assets/js/4e2d8f56.8d143324.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6752],{8723:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),l=n(2175);function a(e){const t={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx)(t.p,{chi [...]
\ No newline at end of file
diff --git a/assets/js/4e2d8f56.d47c10f8.js b/assets/js/4e2d8f56.d47c10f8.js
new file mode 100644
index 0000000000..135157dfe6
--- /dev/null
+++ b/assets/js/4e2d8f56.d47c10f8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6752],{8723:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),l=n(2175);function a(e){const t={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx)(t.p,{chi [...]
\ No newline at end of file
diff --git a/assets/js/500d55cb.b2bf2612.js b/assets/js/500d55cb.b2bf2612.js
new file mode 100644
index 0000000000..93e0a4e2f9
--- /dev/null
+++ b/assets/js/500d55cb.b2bf2612.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7489],{6734:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>m,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),r=n(2175);function a(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/500d55cb.c075c325.js b/assets/js/500d55cb.c075c325.js
deleted file mode 100644
index a9c7508d03..0000000000
--- a/assets/js/500d55cb.c075c325.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7489],{6734:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>m,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),r=n(2175);function a(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/57a16c1d.64d9edee.js b/assets/js/57a16c1d.64d9edee.js
deleted file mode 100644
index 2085306bf4..0000000000
--- a/assets/js/57a16c1d.64d9edee.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7757],{3016:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>m,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var r=n(1527),s=n(2175);function a(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,r.jsx)(t. [...]
\ No newline at end of file
diff --git a/assets/js/57a16c1d.d3c56402.js b/assets/js/57a16c1d.d3c56402.js
new file mode 100644
index 0000000000..60b0abc6ac
--- /dev/null
+++ b/assets/js/57a16c1d.d3c56402.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7757],{3016:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>m,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var r=n(1527),s=n(2175);function a(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,r.jsx)(t. [...]
\ No newline at end of file
diff --git a/assets/js/592d1076.0def77f4.js b/assets/js/592d1076.0def77f4.js
deleted file mode 100644
index e406f971f9..0000000000
--- a/assets/js/592d1076.0def77f4.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[990],{1760:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var s=n(1527),r=n(2175);function a(e){const t={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx)(t.p,{chil [...]
\ No newline at end of file
diff --git a/assets/js/592d1076.e608c333.js b/assets/js/592d1076.e608c333.js
new file mode 100644
index 0000000000..b3c466dd81
--- /dev/null
+++ b/assets/js/592d1076.e608c333.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[990],{1760:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var s=n(1527),r=n(2175);function a(e){const t={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx)(t.p,{chil [...]
\ No newline at end of file
diff --git a/assets/js/621b831b.0c44704c.js b/assets/js/621b831b.0c44704c.js
deleted file mode 100644
index f1f1c91779..0000000000
--- a/assets/js/621b831b.0c44704c.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4551],{6611:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>b,frontMatter:()=>c,metadata:()=>u,toc:()=>p});var s=t(1527),a=t(2175);function r(e){const n={a:"a",code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["As known as ",(0,s.jsx)(n.code,{children [...]
\ No newline at end of file
diff --git a/assets/js/621b831b.67b54108.js b/assets/js/621b831b.67b54108.js
new file mode 100644
index 0000000000..79909dab88
--- /dev/null
+++ b/assets/js/621b831b.67b54108.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4551],{6611:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>b,frontMatter:()=>c,metadata:()=>u,toc:()=>p});var s=t(1527),a=t(2175);function r(e){const n={a:"a",code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["As known as ",(0,s.jsx)(n.code,{children [...]
\ No newline at end of file
diff --git a/assets/js/65bf2b43.07678658.js b/assets/js/65bf2b43.07678658.js
new file mode 100644
index 0000000000..b88b6c3044
--- /dev/null
+++ b/assets/js/65bf2b43.07678658.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2115],{4504:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>m,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),l=n(2175);function a(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/65bf2b43.490aee68.js b/assets/js/65bf2b43.490aee68.js
deleted file mode 100644
index c48ac7a331..0000000000
--- a/assets/js/65bf2b43.490aee68.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2115],{4504:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>m,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),l=n(2175);function a(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/67ecc70e.0888d1c5.js b/assets/js/67ecc70e.0888d1c5.js
new file mode 100644
index 0000000000..5363281016
--- /dev/null
+++ b/assets/js/67ecc70e.0888d1c5.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4434],{1912:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var n=a(1527),s=a(2175);function r(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,n.jsx [...]
\ No newline at end of file
diff --git a/assets/js/67ecc70e.242f8af4.js b/assets/js/67ecc70e.242f8af4.js
deleted file mode 100644
index 2fc2c10399..0000000000
--- a/assets/js/67ecc70e.242f8af4.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4434],{1912:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var a=n(1527),s=n(2175);function r(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,a.jsx [...]
\ No newline at end of file
diff --git a/assets/js/6a41242b.60bae807.js b/assets/js/6a41242b.60bae807.js
new file mode 100644
index 0000000000..4053bee9f2
--- /dev/null
+++ b/assets/js/6a41242b.60bae807.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5571],{6575:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>p});var s=t(1527),a=t(2175);function r(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/6a41242b.80905477.js b/assets/js/6a41242b.80905477.js
deleted file mode 100644
index 0a89c9963c..0000000000
--- a/assets/js/6a41242b.80905477.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5571],{6575:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>p});var s=t(1527),a=t(2175);function r(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/6dc695d1.325fdcd2.js b/assets/js/6dc695d1.325fdcd2.js
new file mode 100644
index 0000000000..13ed65cd2c
--- /dev/null
+++ b/assets/js/6dc695d1.325fdcd2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5982],{3335:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>f,frontMatter:()=>c,metadata:()=>u,toc:()=>h});var a=t(1527),s=t(2175);function i(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,a.jsx [...]
\ No newline at end of file
diff --git a/assets/js/6dc695d1.4bda1060.js b/assets/js/6dc695d1.4bda1060.js
deleted file mode 100644
index 5c3dbc0c9a..0000000000
--- a/assets/js/6dc695d1.4bda1060.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5982],{3335:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>f,frontMatter:()=>c,metadata:()=>u,toc:()=>h});var a=t(1527),s=t(2175);function i(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,a.jsx [...]
\ No newline at end of file
diff --git a/assets/js/6f4d3fa1.2276ca73.js b/assets/js/6f4d3fa1.2276ca73.js
new file mode 100644
index 0000000000..500aca0013
--- /dev/null
+++ b/assets/js/6f4d3fa1.2276ca73.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5885],{5854:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var s=n(1527),r=n(2175);function a(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/6f4d3fa1.b9e718a6.js b/assets/js/6f4d3fa1.b9e718a6.js
deleted file mode 100644
index 5595240133..0000000000
--- a/assets/js/6f4d3fa1.b9e718a6.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5885],{5854:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var s=n(1527),r=n(2175);function a(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/7263c0b5.71098848.js b/assets/js/7263c0b5.71098848.js
new file mode 100644
index 0000000000..f2d3913dd1
--- /dev/null
+++ b/assets/js/7263c0b5.71098848.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4649],{2203:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>p});var a=t(1527),s=t(2175);function r(e){const n={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,a.jsx)(n.p,{chi [...]
\ No newline at end of file
diff --git a/assets/js/7263c0b5.e9e5d68a.js b/assets/js/7263c0b5.e9e5d68a.js
deleted file mode 100644
index 1939eebe40..0000000000
--- a/assets/js/7263c0b5.e9e5d68a.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4649],{2203:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>p});var a=t(1527),s=t(2175);function r(e){const n={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,a.jsx)(n.p,{chi [...]
\ No newline at end of file
diff --git a/assets/js/8070e160.2d46276e.js b/assets/js/8070e160.2d46276e.js
deleted file mode 100644
index 6b726aff65..0000000000
--- a/assets/js/8070e160.2d46276e.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2651],{3866:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>d,toc:()=>r});var t=a(1527),i=a(2175);const l={title:"Quickstart",sidebar_position:3},o=void 0,d={id:"quickstart",title:"Quickstart",description:"Apache OpenDAL\u2122 can be easily integrated into different software with its Rust core and multilingual bindings.",source:"@site/docs/quick [...]
\ No newline at end of file
diff --git a/assets/js/8070e160.c0c8e19f.js b/assets/js/8070e160.c0c8e19f.js
new file mode 100644
index 0000000000..f870241ef9
--- /dev/null
+++ b/assets/js/8070e160.c0c8e19f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2651],{3866:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>d,toc:()=>r});var t=a(1527),i=a(2175);const l={title:"Quickstart",sidebar_position:3},o=void 0,d={id:"quickstart",title:"Quickstart",description:"Apache OpenDAL\u2122 can be easily integrated into different software with its Rust core and multilingual bindings.",source:"@site/docs/quick [...]
\ No newline at end of file
diff --git a/assets/js/8cc9519e.dd5c3eec.js b/assets/js/8cc9519e.46cbb280.js
similarity index 70%
rename from assets/js/8cc9519e.dd5c3eec.js
rename to assets/js/8cc9519e.46cbb280.js
index fafcfc8b8c..53ce69c08c 100644
--- a/assets/js/8cc9519e.dd5c3eec.js
+++ b/assets/js/8cc9519e.46cbb280.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1652],{9755:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>o,contentTitle:()=>r,default:()=>u,frontMatter:()=>l,metadata:()=>d,toc:()=>p});var i=t(1527),n=t(2175);function c(e){const s={h2:"h2",input:"input",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,i.jsx)(s.p,{children:"This service can be use [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1652],{9755:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>o,contentTitle:()=>r,default:()=>u,frontMatter:()=>l,metadata:()=>d,toc:()=>p});var i=t(1527),n=t(2175);function c(e){const s={h2:"h2",input:"input",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,i.jsx)(s.p,{children:"This service can be use [...]
\ No newline at end of file
diff --git a/assets/js/8f4159f2.f8b7d92d.js b/assets/js/8f4159f2.884e1008.js
similarity index 70%
rename from assets/js/8f4159f2.f8b7d92d.js
rename to assets/js/8f4159f2.884e1008.js
index 91c7c20171..40efe74814 100644
--- a/assets/js/8f4159f2.f8b7d92d.js
+++ b/assets/js/8f4159f2.884e1008.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4719],{6282:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>o,contentTitle:()=>d,default:()=>m,frontMatter:()=>l,metadata:()=>r,toc:()=>p});var i=t(1527),n=t(2175);function c(e){const s={h2:"h2",input:"input",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,i.jsx)(s.p,{children:"This service can be use [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4719],{6282:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>o,contentTitle:()=>d,default:()=>m,frontMatter:()=>l,metadata:()=>r,toc:()=>p});var i=t(1527),n=t(2175);function c(e){const s={h2:"h2",input:"input",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,i.jsx)(s.p,{children:"This service can be use [...]
\ No newline at end of file
diff --git a/assets/js/8fb00c63.3700e31f.js b/assets/js/8fb00c63.3700e31f.js
deleted file mode 100644
index db1ff23926..0000000000
--- a/assets/js/8fb00c63.3700e31f.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4600],{8608:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/8fb00c63.a54fe13a.js b/assets/js/8fb00c63.a54fe13a.js
new file mode 100644
index 0000000000..f9ab91b9f9
--- /dev/null
+++ b/assets/js/8fb00c63.a54fe13a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4600],{8608:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/939f74f6.32538d86.js b/assets/js/939f74f6.32538d86.js
new file mode 100644
index 0000000000..6c7542d1fb
--- /dev/null
+++ b/assets/js/939f74f6.32538d86.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4277],{7073:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>b,frontMatter:()=>o,metadata:()=>u,toc:()=>p});var s=t(1527),a=t(2175);function r(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/939f74f6.5b16e754.js b/assets/js/939f74f6.5b16e754.js
deleted file mode 100644
index 8c98f7f1c0..0000000000
--- a/assets/js/939f74f6.5b16e754.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4277],{7073:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>b,frontMatter:()=>o,metadata:()=>u,toc:()=>p});var s=t(1527),a=t(2175);function r(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/a0405932.1f0b5989.js b/assets/js/a0405932.1f0b5989.js
new file mode 100644
index 0000000000..6232e1475e
--- /dev/null
+++ b/assets/js/a0405932.1f0b5989.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[716],{3033:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var s=n(1527),r=n(2175);function a(e){const t={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx)(t.p,{chil [...]
\ No newline at end of file
diff --git a/assets/js/a0405932.dd4b4f05.js b/assets/js/a0405932.dd4b4f05.js
deleted file mode 100644
index 1bef790da8..0000000000
--- a/assets/js/a0405932.dd4b4f05.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[716],{3033:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var s=n(1527),r=n(2175);function a(e){const t={code:"code",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx)(t.p,{chil [...]
\ No newline at end of file
diff --git a/assets/js/b114cefa.72dd25d4.js b/assets/js/b114cefa.72dd25d4.js
new file mode 100644
index 0000000000..f490d6cd8f
--- /dev/null
+++ b/assets/js/b114cefa.72dd25d4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2161],{9571:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var r=t(1527),s=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,r.jsx [...]
\ No newline at end of file
diff --git a/assets/js/b114cefa.df5f1c43.js b/assets/js/b114cefa.df5f1c43.js
deleted file mode 100644
index c25f756544..0000000000
--- a/assets/js/b114cefa.df5f1c43.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2161],{9571:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var r=t(1527),s=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,r.jsx [...]
\ No newline at end of file
diff --git a/assets/js/b56f9725.ab430d64.js b/assets/js/b56f9725.ab430d64.js
new file mode 100644
index 0000000000..85c3b763d1
--- /dev/null
+++ b/assets/js/b56f9725.ab430d64.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[217],{4958:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),a=n(2175);function r(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx) [...]
\ No newline at end of file
diff --git a/assets/js/b56f9725.bb990128.js b/assets/js/b56f9725.bb990128.js
deleted file mode 100644
index 9833e09d68..0000000000
--- a/assets/js/b56f9725.bb990128.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[217],{4958:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),a=n(2175);function r(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx) [...]
\ No newline at end of file
diff --git a/assets/js/bb5b2057.312981b0.js b/assets/js/bb5b2057.312981b0.js
deleted file mode 100644
index 65587bae67..0000000000
--- a/assets/js/bb5b2057.312981b0.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5214],{5279:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),r=n(2175);function a(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/bb5b2057.a1c13693.js b/assets/js/bb5b2057.a1c13693.js
new file mode 100644
index 0000000000..fbe55dcfab
--- /dev/null
+++ b/assets/js/bb5b2057.a1c13693.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5214],{5279:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=n(1527),r=n(2175);function a(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/c0600a1b.3d9bc277.js b/assets/js/c0600a1b.3d9bc277.js
deleted file mode 100644
index 6b3215edab..0000000000
--- a/assets/js/c0600a1b.3d9bc277.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[8874],{5329:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/c0600a1b.4f12403c.js b/assets/js/c0600a1b.4f12403c.js
new file mode 100644
index 0000000000..820dc34c31
--- /dev/null
+++ b/assets/js/c0600a1b.4f12403c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[8874],{5329:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/c46c6b55.502fab37.js b/assets/js/c46c6b55.502fab37.js
new file mode 100644
index 0000000000..a2eb1e4088
--- /dev/null
+++ b/assets/js/c46c6b55.502fab37.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5927],{7709:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>d,default:()=>x,frontMatter:()=>c,metadata:()=>u,toc:()=>h});var s=n(1527),r=n(2175);function a(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/c46c6b55.f32af074.js b/assets/js/c46c6b55.f32af074.js
deleted file mode 100644
index 755c891995..0000000000
--- a/assets/js/c46c6b55.f32af074.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5927],{7709:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>d,default:()=>x,frontMatter:()=>c,metadata:()=>u,toc:()=>h});var s=n(1527),r=n(2175);function a(e){const t={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/c6ab695b.9f6c3795.js b/assets/js/c6ab695b.a1d73cd2.js
similarity index 50%
rename from assets/js/c6ab695b.9f6c3795.js
rename to assets/js/c6ab695b.a1d73cd2.js
index 7ec4e79776..0cc9a04368 100644
--- a/assets/js/c6ab695b.9f6c3795.js
+++ b/assets/js/c6ab695b.a1d73cd2.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7289],{6614:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>c,default:()=>b,frontMatter:()=>d,metadata:()=>u,toc:()=>p});var s=n(1527),i=n(2175);function r(e){const t={a:"a",code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"There two implementations of WebHDFS REST  [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7289],{6614:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>c,default:()=>b,frontMatter:()=>d,metadata:()=>u,toc:()=>p});var s=n(1527),i=n(2175);function r(e){const t={a:"a",code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"There two implementations of WebHDFS REST  [...]
\ No newline at end of file
diff --git a/assets/js/cc62039a.33a8b8c5.js b/assets/js/cc62039a.4a83b3ae.js
similarity index 58%
rename from assets/js/cc62039a.33a8b8c5.js
rename to assets/js/cc62039a.4a83b3ae.js
index 1fc63eb7df..d026ced060 100644
--- a/assets/js/cc62039a.33a8b8c5.js
+++ b/assets/js/cc62039a.4a83b3ae.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1011],{4217:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>u,contentTitle:()=>d,default:()=>m,frontMatter:()=>c,metadata:()=>h,toc:()=>p});var t=s(1527),r=s(2175);function i(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"A distributed file system that provides  [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1011],{4217:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>u,contentTitle:()=>d,default:()=>m,frontMatter:()=>c,metadata:()=>h,toc:()=>p});var t=s(1527),r=s(2175);function i(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"A distributed file system that provides  [...]
\ No newline at end of file
diff --git a/assets/js/d3c0d8d5.26143957.js b/assets/js/d3c0d8d5.26143957.js
deleted file mode 100644
index 1aab57f9b0..0000000000
--- a/assets/js/d3c0d8d5.26143957.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4790],{3529:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>m,frontMatter:()=>o,metadata:()=>u,toc:()=>h});var s=t(1527),a=t(2175);function r(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/d3c0d8d5.757e9a05.js b/assets/js/d3c0d8d5.757e9a05.js
new file mode 100644
index 0000000000..f38cdca8f7
--- /dev/null
+++ b/assets/js/d3c0d8d5.757e9a05.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4790],{3529:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>m,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var s=t(1527),a=t(2175);function r(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/ddccef4c.31798def.js b/assets/js/ddccef4c.31798def.js
new file mode 100644
index 0000000000..4a61f960e4
--- /dev/null
+++ b/assets/js/ddccef4c.31798def.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[9826],{627:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>x,frontMatter:()=>o,metadata:()=>u,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx) [...]
\ No newline at end of file
diff --git a/assets/js/ddccef4c.38a36786.js b/assets/js/ddccef4c.38a36786.js
deleted file mode 100644
index ebc98d62a8..0000000000
--- a/assets/js/ddccef4c.38a36786.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[9826],{627:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>x,frontMatter:()=>o,metadata:()=>u,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx) [...]
\ No newline at end of file
diff --git a/assets/js/e892cec6.17939743.js b/assets/js/e892cec6.17939743.js
new file mode 100644
index 0000000000..72060d6dc6
--- /dev/null
+++ b/assets/js/e892cec6.17939743.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3845],{8627:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/e892cec6.a1623fc8.js b/assets/js/e892cec6.a1623fc8.js
deleted file mode 100644
index 410ffa49e7..0000000000
--- a/assets/js/e892cec6.a1623fc8.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3845],{8627:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>b,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0,s.jsx [...]
\ No newline at end of file
diff --git a/assets/js/eec267e4.0f92952e.js b/assets/js/eec267e4.0f92952e.js
deleted file mode 100644
index a183f00479..0000000000
--- a/assets/js/eec267e4.0f92952e.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2217],{3453:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>d,toc:()=>p});var s=t(1527),a=t(2175);function r(e){const n={a:"a",code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["This service will visit the ",(0,s.jsx)( [...]
\ No newline at end of file
diff --git a/assets/js/eec267e4.b024479f.js b/assets/js/eec267e4.b024479f.js
new file mode 100644
index 0000000000..d7e9dabce8
--- /dev/null
+++ b/assets/js/eec267e4.b024479f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2217],{3453:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>d,toc:()=>p});var s=t(1527),a=t(2175);function r(e){const n={a:"a",code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["This service will visit the ",(0,s.jsx)( [...]
\ No newline at end of file
diff --git a/assets/js/f1ca5a39.4e95b05f.js b/assets/js/f1ca5a39.4e95b05f.js
deleted file mode 100644
index 21e8936aae..0000000000
--- a/assets/js/f1ca5a39.4e95b05f.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4538],{6633:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>m,frontMatter:()=>c,metadata:()=>u,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={a:"a",code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0 [...]
\ No newline at end of file
diff --git a/assets/js/f1ca5a39.cccbe7ff.js b/assets/js/f1ca5a39.cccbe7ff.js
new file mode 100644
index 0000000000..7896fda942
--- /dev/null
+++ b/assets/js/f1ca5a39.cccbe7ff.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4538],{6633:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>m,frontMatter:()=>c,metadata:()=>u,toc:()=>h});var s=t(1527),r=t(2175);function a(e){const n={a:"a",code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"capabilities",children:"Capabilities"}),"\n",(0 [...]
\ No newline at end of file
diff --git a/assets/js/f9145722.4985669e.js b/assets/js/f9145722.4985669e.js
deleted file mode 100644
index 93f5bbe98d..0000000000
--- a/assets/js/f9145722.4985669e.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6529],{9638:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>f,frontMatter:()=>c,metadata:()=>u,toc:()=>p});var r=t(1527),s=t(2175);function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"capabilities",children:"Capabilities"})," [...]
\ No newline at end of file
diff --git a/assets/js/f9145722.a9f84803.js b/assets/js/f9145722.a9f84803.js
new file mode 100644
index 0000000000..8847fafe27
--- /dev/null
+++ b/assets/js/f9145722.a9f84803.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6529],{9638:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>f,frontMatter:()=>c,metadata:()=>u,toc:()=>p});var r=t(1527),s=t(2175);function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"capabilities",children:"Capabilities"})," [...]
\ No newline at end of file
diff --git a/assets/js/fde7cc64.c44a3dd5.js b/assets/js/fde7cc64.c44a3dd5.js
deleted file mode 100644
index 0304d1d368..0000000000
--- a/assets/js/fde7cc64.c44a3dd5.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3454],{1625:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var a=t(1527),s=t(2175);function r(e){const n={a:"a",code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"capabilities",children:"Capabil [...]
\ No newline at end of file
diff --git a/assets/js/fde7cc64.ceb2c6f0.js b/assets/js/fde7cc64.ceb2c6f0.js
new file mode 100644
index 0000000000..9ca936bd02
--- /dev/null
+++ b/assets/js/fde7cc64.ceb2c6f0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3454],{1625:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var a=t(1527),s=t(2175);function r(e){const n={a:"a",code:"code",del:"del",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"capabilities",children:"Capabil [...]
\ No newline at end of file
diff --git a/assets/js/runtime~main.acae46ca.js b/assets/js/runtime~main.b10cd7eb.js
similarity index 81%
rename from assets/js/runtime~main.acae46ca.js
rename to assets/js/runtime~main.b10cd7eb.js
index 423bccdb1c..8014ec0472 100644
--- a/assets/js/runtime~main.acae46ca.js
+++ b/assets/js/runtime~main.b10cd7eb.js
@@ -1 +1 @@
-(()=>{"use strict";var e,c,a,f,b,d={},t={};function r(e){var c=t[e];if(void 0!==c)return c.exports;var a=t[e]={exports:{}};return d[e].call(a.exports,a,a.exports,r),a.exports}r.m=d,e=[],r.O=(c,a,f,b)=>{if(!a){var d=1/0;for(i=0;i<e.length;i++){a=e[i][0],f=e[i][1],b=e[i][2];for(var t=!0,o=0;o<a.length;o++)(!1&b||d>=b)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,b<d&&(d=b));if(t){e.splice(i--,1);var n=f();void 0!==n&&(c=n)}}return c}b=b||0;for(var i=e.length;i>0&&e[i-1] [...]
\ No newline at end of file
+(()=>{"use strict";var e,c,a,f,b,d={},t={};function r(e){var c=t[e];if(void 0!==c)return c.exports;var a=t[e]={exports:{}};return d[e].call(a.exports,a,a.exports,r),a.exports}r.m=d,e=[],r.O=(c,a,f,b)=>{if(!a){var d=1/0;for(i=0;i<e.length;i++){a=e[i][0],f=e[i][1],b=e[i][2];for(var t=!0,o=0;o<a.length;o++)(!1&b||d>=b)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,b<d&&(d=b));if(t){e.splice(i--,1);var n=f();void 0!==n&&(c=n)}}return c}b=b||0;for(var i=e.length;i>0&&e[i-1] [...]
\ No newline at end of file
diff --git a/blog/apache-opendal-graduated/index.html b/blog/apache-opendal-graduated/index.html
index 0a075bd01c..283731dcd7 100644
--- a/blog/apache-opendal-graduated/index.html
+++ b/blog/apache-opendal-graduated/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Apache OpenDAL™ is now Graduated | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/apache-opendal-graduated"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_t [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/blog/apache-opendal-participates-in-gsoc-2024/index.html b/blog/apache-opendal-participates-in-gsoc-2024/index.html
index 68faa86b9f..d86c0bd0bc 100644
--- a/blog/apache-opendal-participates-in-gsoc-2024/index.html
+++ b/blog/apache-opendal-participates-in-gsoc-2024/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Apache OpenDAL™ participates in Google Summer of Code 2024 | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/apache-opendal-participates-in-gsoc-2024"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="e [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/blog/archive/index.html b/blog/archive/index.html
index e30050579d..7741f6ab8a 100644
--- a/blog/archive/index.html
+++ b/blog/archive/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Archive | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/archive"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/blog/how-opendal-read-data/index.html b/blog/how-opendal-read-data/index.html
index e1dab00905..6d9adf8e53 100644
--- a/blog/how-opendal-read-data/index.html
+++ b/blog/how-opendal-read-data/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Apache OpenDAL™ Internal: Data Reading | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/how-opendal-read-data"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusauru [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/blog/index.html b/blog/index.html
index 40b32be8b5..2e3812c8e7 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Blog | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property="o [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/blog/opendal-access-data-freely/index.html b/blog/opendal-access-data-freely/index.html
index 0932e62d50..11a6bbb7a0 100644
--- a/blog/opendal-access-data-freely/index.html
+++ b/blog/opendal-access-data-freely/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Apache OpenDAL™: Access Data Freely | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/opendal-access-data-freely"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusau [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/blog/opendal-entered-apache-incubator/index.html b/blog/opendal-entered-apache-incubator/index.html
index 47661d8727..44757756d2 100644
--- a/blog/opendal-entered-apache-incubator/index.html
+++ b/blog/opendal-entered-apache-incubator/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Way to Go: OpenDAL successfully entered Apache Incubator | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/opendal-entered-apache-incubator"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta d [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/blog/owo-1/index.html b/blog/owo-1/index.html
index a240974e83..ae63d49038 100644
--- a/blog/owo-1/index.html
+++ b/blog/owo-1/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">OwO #1: The v0.40 Release | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/owo-1"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><met [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/blog/tags/announcement/index.html b/blog/tags/announcement/index.html
index c9aaea40ff..8dac1c40f5 100644
--- a/blog/tags/announcement/index.html
+++ b/blog/tags/announcement/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">4 posts tagged with &quot;announcement&quot; | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/tags/announcement"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsear [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/blog/tags/index.html b/blog/tags/index.html
index 5d483d4974..47e10bf121 100644
--- a/blog/tags/index.html
+++ b/blog/tags/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Tags | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/tags"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" proper [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/blog/tags/internal/index.html b/blog/tags/internal/index.html
index 351cca545f..ee79fa7266 100644
--- a/blog/tags/internal/index.html
+++ b/blog/tags/internal/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">One post tagged with &quot;internal&quot; | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/tags/internal"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:lang [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/blog/tags/owo/index.html b/blog/tags/owo/index.html
index 26f546295b..f44c1c9966 100644
--- a/blog/tags/owo/index.html
+++ b/blog/tags/owo/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">One post tagged with &quot;owo&quot; | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/tags/owo"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" cont [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/category/committers/index.html b/community/category/committers/index.html
index 397cb76ed7..c90e1188ef 100644
--- a/community/category/committers/index.html
+++ b/community/category/committers/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Committers | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/category/committers"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en">< [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/category/events/index.html b/community/category/events/index.html
index e8092e3d6b..aec82ba63f 100644
--- a/community/category/events/index.html
+++ b/community/category/events/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Events | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/category/events"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta dat [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/category/pmc-members/index.html b/community/category/pmc-members/index.html
index e5bac411b6..df27502f30 100644
--- a/community/category/pmc-members/index.html
+++ b/community/category/pmc-members/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Committers | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/category/pmc-members"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"> [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/category/reference/index.html b/community/category/reference/index.html
index f7b946d24d..df93b5fdf4 100644
--- a/community/category/reference/index.html
+++ b/community/category/reference/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Reference | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/category/reference"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><me [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/committers/onboarding/index.html b/community/committers/onboarding/index.html
index 7a6d1805f3..a6d1f15d47 100644
--- a/community/committers/onboarding/index.html
+++ b/community/committers/onboarding/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Onboarding | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/committers/onboarding"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/committers/reference/generate_release_note/index.html b/community/committers/reference/generate_release_note/index.html
index e624f62472..e19eb36ecb 100644
--- a/community/committers/reference/generate_release_note/index.html
+++ b/community/committers/reference/generate_release_note/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Generate release note | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/committers/reference/generate_release_note"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name=" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/committers/reference/setup_gpg/index.html b/community/committers/reference/setup_gpg/index.html
index 22727efca3..70f3cf7d83 100644
--- a/community/committers/reference/setup_gpg/index.html
+++ b/community/committers/reference/setup_gpg/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Setup GPG key | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/committers/reference/setup_gpg"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language"  [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/committers/release/index.html b/community/committers/release/index.html
index de29bf58a3..99b6f9d2ef 100644
--- a/community/committers/release/index.html
+++ b/community/committers/release/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Create a release | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/committers/release"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content=" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/committers/request_for_adding_secrets/index.html b/community/committers/request_for_adding_secrets/index.html
index 766a014e34..941795e096 100644
--- a/community/committers/request_for_adding_secrets/index.html
+++ b/community/committers/request_for_adding_secrets/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Request for adding secrets | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/committers/request_for_adding_secrets"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name=" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/committers/verify/index.html b/community/committers/verify/index.html
index 2b10704427..0fdcb3e528 100644
--- a/community/committers/verify/index.html
+++ b/community/committers/verify/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Verify a release candidate | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/committers/verify"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language"  [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/events/gsoc-proposal-guide/index.html b/community/events/gsoc-proposal-guide/index.html
index 3f1e2c6656..51edc28b81 100644
--- a/community/events/gsoc-proposal-guide/index.html
+++ b/community/events/gsoc-proposal-guide/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">GSoC Project Proposal Guidance | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/events/gsoc-proposal-guide"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsear [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/index.html b/community/index.html
index fec7243ecf..87fcae074e 100644
--- a/community/index.html
+++ b/community/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Community | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true"  [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/maturity/index.html b/community/maturity/index.html
index d6bb1aa909..f0175e5e6b 100644
--- a/community/maturity/index.html
+++ b/community/maturity/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Maturity | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/maturity"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh= [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/news/index.html b/community/news/index.html
index c0600e822a..d86baa0f62 100644
--- a/community/news/index.html
+++ b/community/news/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">News | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/news"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" n [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/pmc_members/nominate-committer/index.html b/community/pmc_members/nominate-committer/index.html
index e71647d272..376997f0db 100644
--- a/community/pmc_members/nominate-committer/index.html
+++ b/community/pmc_members/nominate-committer/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Nominate Committer | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/pmc_members/nominate-committer"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:langu [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/pmc_members/nominate-pmc-member/index.html b/community/pmc_members/nominate-pmc-member/index.html
index 8c64fd23dd..9ad350784c 100644
--- a/community/pmc_members/nominate-pmc-member/index.html
+++ b/community/pmc_members/nominate-pmc-member/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Nominate PMC Member | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/pmc_members/nominate-pmc-member"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:lan [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/pmc_members/onboarding/index.html b/community/pmc_members/onboarding/index.html
index cdce8fee62..07982247a9 100644
--- a/community/pmc_members/onboarding/index.html
+++ b/community/pmc_members/onboarding/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Onboarding | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/pmc_members/onboarding"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/pmc_members/podling-report/index.html b/community/pmc_members/podling-report/index.html
index 02932c9d91..62c6163a80 100644
--- a/community/pmc_members/podling-report/index.html
+++ b/community/pmc_members/podling-report/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Podling Status Reports | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/pmc_members/podling-report"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:langu [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/community/security/index.html b/community/security/index.html
index 4260874b96..f91eb79132 100644
--- a/community/security/index.html
+++ b/community/security/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Security | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/security"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh= [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/docs/category/integrations/index.html b/docs/category/integrations/index.html
index a5d034a816..2bd0e17eea 100644
--- a/docs/category/integrations/index.html
+++ b/docs/category/integrations/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Integrations | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/category/integrations"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><m [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/docs/category/services/index.html b/docs/category/services/index.html
index 395f25a189..466e8a8c9a 100644
--- a/docs/category/services/index.html
+++ b/docs/category/services/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Services | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/category/services"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
diff --git a/docs/integrations/object_store_opendal/index.html b/docs/integrations/object_store_opendal/index.html
index cf42280c5e..660ae3194e 100644
--- a/docs/integrations/object_store_opendal/index.html
+++ b/docs/integrations/object_store_opendal/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">object_store_opendal | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/integrations/object_store_opendal"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:langu [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
@@ -13,6 +13,6 @@
 <!-- -->
 <!-- -->
 <h1>OpenDAL object_store Binding</h1>
-<p>This crate intends to build an <a href="https://crates.io/crates/object_store" target="_blank" rel="noopener noreferrer">object_store</a> binding.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/apache/opendal/tree/main/website/docs/integrations/object_store_opendal.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width [...]
+<p>This crate intends to build an <a href="https://crates.io/crates/object_store" target="_blank" rel="noopener noreferrer">object_store</a> binding.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/apache/opendal/tree/main/website/docs/integrations/object_store_opendal.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width [...]
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/lua/classes/opendal.metadata.html b/docs/lua/classes/opendal.metadata.html
index 587183f46b..d785825ce7 100644
--- a/docs/lua/classes/opendal.metadata.html
+++ b/docs/lua/classes/opendal.metadata.html
@@ -138,7 +138,7 @@
 </div> <!-- id="main" -->
 <div id="about">
 <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
-<i style="float:right;">Last updated 2024-03-11 15:27:31 </i>
+<i style="float:right;">Last updated 2024-03-12 05:08:24 </i>
 </div> <!-- id="about" -->
 </div> <!-- id="container" -->
 </body>
diff --git a/docs/lua/classes/opendal.operator.html b/docs/lua/classes/opendal.operator.html
index c1d108771c..9e9e2ce5f5 100644
--- a/docs/lua/classes/opendal.operator.html
+++ b/docs/lua/classes/opendal.operator.html
@@ -321,7 +321,7 @@
 </div> <!-- id="main" -->
 <div id="about">
 <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
-<i style="float:right;">Last updated 2024-03-11 15:27:31 </i>
+<i style="float:right;">Last updated 2024-03-12 05:08:24 </i>
 </div> <!-- id="about" -->
 </div> <!-- id="container" -->
 </body>
diff --git a/docs/lua/index.html b/docs/lua/index.html
index 64236ee669..da61733e5a 100644
--- a/docs/lua/index.html
+++ b/docs/lua/index.html
@@ -57,7 +57,7 @@
 </div> <!-- id="main" -->
 <div id="about">
 <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
-<i style="float:right;">Last updated 2024-03-11 15:27:31 </i>
+<i style="float:right;">Last updated 2024-03-12 05:08:24 </i>
 </div> <!-- id="about" -->
 </div> <!-- id="container" -->
 </body>
diff --git a/docs/nodejs/classes/BlockingLister.html b/docs/nodejs/classes/BlockingLister.html
index 0987eea838..03488c3f3a 100644
--- a/docs/nodejs/classes/BlockingLister.html
+++ b/docs/nodejs/classes/BlockingLister.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>BlockingLister | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script>< [...]
 manner.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L661">generated.d.ts:661</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L663">generated.d.ts:663</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="BlockingLister.html#next" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>next</span></a>
-</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Blo [...]
\ No newline at end of file
+</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Blo [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/BlockingReader.html b/docs/nodejs/classes/BlockingReader.html
index 406fc85cc5..2e32c7c9e7 100644
--- a/docs/nodejs/classes/BlockingReader.html
+++ b/docs/nodejs/classes/BlockingReader.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>BlockingReader | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script>< [...]
 manner.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L552">generated.d.ts:552</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/index.d.ts#L23">index.d.ts:23</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content  [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L552">generated.d.ts:552</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/index.d.ts#L23">index.d.ts:23</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content  [...]
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="BlockingReader.html#createReadStream" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>create<wbr/>Read<wbr/>Stream</span></a>
 <a href="BlockingReader.html#read" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>read</span></a>
 </div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Blo [...]
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">ReadableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Readable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
\ No newline at end of file
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">ReadableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Readable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/BlockingWriter.html b/docs/nodejs/classes/BlockingWriter.html
index 7fe7af1d14..4b27b35c69 100644
--- a/docs/nodejs/classes/BlockingWriter.html
+++ b/docs/nodejs/classes/BlockingWriter.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>BlockingWriter | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script>< [...]
 manner.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L573">generated.d.ts:573</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/index.d.ts#L32">index.d.ts:32</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content  [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L575">generated.d.ts:575</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/index.d.ts#L32">index.d.ts:32</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content  [...]
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="BlockingWriter.html#close" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>close</span></a>
 <a href="BlockingWriter.html#createWriteStream" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>create<wbr/>Write<wbr/>Stream</span></a>
 <a href="BlockingWriter.html#write" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>write</span></a>
@@ -10,11 +10,11 @@ manner.</p>
 <p>Close this writer.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">writer</span><span class="hl-1"> = </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">writerSync</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">);</span><br/><span class="hl-5">writer</span><span class="hl-1 [...]
 </code><button>Copy</button></pre>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L604">generated.d.ts:604</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="createWriteStream" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>create<wbr/>Write<wbr/>Stream</sp [...]
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">WritableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Writable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L606">generated.d.ts:606</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="createWriteStream" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>create<wbr/>Write<wbr/>Stream</sp [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">WritableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Writable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
 <p>&amp;mut self in async napi methods should be marked as unsafe</p>
 </blockquote>
 <p>Write bytes into this writer.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">writer</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">writer</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">);</span> [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul [...]
\ No newline at end of file
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Capability.html b/docs/nodejs/classes/Capability.html
index 54c6b58a16..44275a9ee7 100644
--- a/docs/nodejs/classes/Capability.html
+++ b/docs/nodejs/classes/Capability.html
@@ -7,7 +7,7 @@ by current Operator.</p>
 <li>What&#39;s current Operator max supports batch operations count.</li>
 </ul>
 <p>Add fields of Capabilities with be public and can be accessed directly.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L56">generated.d.ts:56</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L56">generated.d.ts:56</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role [...]
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Accessors</h3><div class="tsd-index-list"><a href="Capability.html#batch" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>batch</span></a>
 <a href="Capability.html#batchDelete" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>batch<wbr/>Delete</span></a>
 <a href="Capability.html#batchMaxOperations" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>batch<wbr/>Max<wbr/>Operations</span></a>
@@ -48,46 +48,46 @@ by current Operator.</p>
 <a href="Capability.html#writeWithContentDisposition" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>write<wbr/>With<wbr/>Content<wbr/>Disposition</span></a>
 <a href="Capability.html#writeWithContentType" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>write<wbr/>With<wbr/>Content<wbr/>Type</span></a>
 </div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Cap [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L144">generated.d.ts:144</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="batchDelete" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>batch<wbr/>Delete</span><a href="#ba [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L146">generated.d.ts:146</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="batchMaxOperations" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>batch<wbr/>Max<wbr/>Operation [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L148">generated.d.ts:148</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="blocking" class="t [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L150">generated.d.ts:150</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="copy" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>copy</span><a href="#copy" aria-label="Perm [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L124">generated.d.ts:124</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="createDir" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>create<wbr/>Dir</span><a href="#create [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L120">generated.d.ts:120</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="delete" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>delete</span><a href="#delete" aria-label [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L122">generated.d.ts:122</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="list" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list</span><a href="#list" aria-label="Perm [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L128">generated.d.ts:128</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="listWithLimit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list<wbr/>With<wbr/>Limit</span><a [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L130">generated.d.ts:130</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="listWithRecursive" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list<wbr/>With<wbr/>Recursive< [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L134">generated.d.ts:134</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="listWithStartAfter" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list<wbr/>With<wbr/>Start<wbr [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L132">generated.d.ts:132</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presign" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign</span><a href="#presign" aria-la [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L136">generated.d.ts:136</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presignRead" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign<wbr/>Read</span><a href="#pr [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L138">generated.d.ts:138</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presignStat" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign<wbr/>Stat</span><a href="#pr [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L140">generated.d.ts:140</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presignWrite" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign<wbr/>Write</span><a href="# [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L142">generated.d.ts:142</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="read" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read</span><a href="#read" aria-label="Perm [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L64">generated.d.ts:64</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readCanNext" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>Can<wbr/>Next</span><a href= [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L68">generated.d.ts:68</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readCanSeek" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>Can<wbr/>Seek</span><a href= [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L66">generated.d.ts:66</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithIfMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>If<wbr/>Match< [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L72">generated.d.ts:72</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithIfNoneMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>If<wbr/>No [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L74">generated.d.ts:74</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithOverrideCacheControl" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>O [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L76">generated.d.ts:76</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithOverrideContentDisposition" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With< [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L78">generated.d.ts:78</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithOverrideContentType" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>Ov [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L80">generated.d.ts:80</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithRange" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>Range</span><a h [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L70">generated.d.ts:70</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="rename" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>rename</span><a href="#rename" aria-label=" [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L126">generated.d.ts:126</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="stat" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>stat</span><a href="#stat" aria-label="Perm [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L58">generated.d.ts:58</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="statWithIfMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>stat<wbr/>With<wbr/>If<wbr/>Match< [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L60">generated.d.ts:60</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="statWithIfNoneMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>stat<wbr/>With<wbr/>If<wbr/>No [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L62">generated.d.ts:62</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="write" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write</span><a href="#write" aria-label="Per [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L82">generated.d.ts:82</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeCanAppend" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Can<wbr/>Append</span><a [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L88">generated.d.ts:88</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeCanEmpty" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Can<wbr/>Empty</span><a h [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L86">generated.d.ts:86</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeCanMulti" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Can<wbr/>Multi</span><a h [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L84">generated.d.ts:84</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeMultiAlignSize" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Multi<wbr/>Align<wb [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L144">generated.d.ts:144</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="batchDelete" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>batch<wbr/>Delete</span><a href="#ba [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L146">generated.d.ts:146</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="batchMaxOperations" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>batch<wbr/>Max<wbr/>Operation [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L148">generated.d.ts:148</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="blocking" class="t [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L150">generated.d.ts:150</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="copy" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>copy</span><a href="#copy" aria-label="Perm [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L124">generated.d.ts:124</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="createDir" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>create<wbr/>Dir</span><a href="#create [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L120">generated.d.ts:120</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="delete" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>delete</span><a href="#delete" aria-label [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L122">generated.d.ts:122</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="list" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list</span><a href="#list" aria-label="Perm [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L128">generated.d.ts:128</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="listWithLimit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list<wbr/>With<wbr/>Limit</span><a [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L130">generated.d.ts:130</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="listWithRecursive" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list<wbr/>With<wbr/>Recursive< [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L134">generated.d.ts:134</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="listWithStartAfter" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list<wbr/>With<wbr/>Start<wbr [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L132">generated.d.ts:132</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presign" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign</span><a href="#presign" aria-la [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L136">generated.d.ts:136</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presignRead" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign<wbr/>Read</span><a href="#pr [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L138">generated.d.ts:138</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presignStat" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign<wbr/>Stat</span><a href="#pr [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L140">generated.d.ts:140</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presignWrite" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign<wbr/>Write</span><a href="# [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L142">generated.d.ts:142</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="read" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read</span><a href="#read" aria-label="Perm [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L64">generated.d.ts:64</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readCanNext" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>Can<wbr/>Next</span><a href= [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L68">generated.d.ts:68</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readCanSeek" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>Can<wbr/>Seek</span><a href= [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L66">generated.d.ts:66</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithIfMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>If<wbr/>Match< [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L72">generated.d.ts:72</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithIfNoneMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>If<wbr/>No [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L74">generated.d.ts:74</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithOverrideCacheControl" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>O [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L76">generated.d.ts:76</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithOverrideContentDisposition" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With< [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L78">generated.d.ts:78</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithOverrideContentType" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>Ov [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L80">generated.d.ts:80</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithRange" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>Range</span><a h [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L70">generated.d.ts:70</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="rename" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>rename</span><a href="#rename" aria-label=" [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L126">generated.d.ts:126</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="stat" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>stat</span><a href="#stat" aria-label="Perm [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L58">generated.d.ts:58</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="statWithIfMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>stat<wbr/>With<wbr/>If<wbr/>Match< [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L60">generated.d.ts:60</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="statWithIfNoneMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>stat<wbr/>With<wbr/>If<wbr/>No [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L62">generated.d.ts:62</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="write" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write</span><a href="#write" aria-label="Per [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L82">generated.d.ts:82</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeCanAppend" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Can<wbr/>Append</span><a [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L88">generated.d.ts:88</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeCanEmpty" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Can<wbr/>Empty</span><a h [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L86">generated.d.ts:86</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeCanMulti" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Can<wbr/>Multi</span><a h [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L84">generated.d.ts:84</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeMultiAlignSize" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Multi<wbr/>Align<wb [...]
 <p>For example, Google GCS requires align size to 256KiB in write_multi.</p>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L112">generated.d.ts:112</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeMultiMaxSize" [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L112">generated.d.ts:112</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeMultiMaxSize" [...]
 <p>For example, AWS S3 supports 5GiB as max in write_multi.</p>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L100">generated.d.ts:100</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeMultiMinSize" [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L100">generated.d.ts:100</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeMultiMinSize" [...]
 <p>For example, AWS S3 requires at least 5MiB in write_multi expect the last one.</p>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L106">generated.d.ts:106</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeTotalMaxSize" [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L106">generated.d.ts:106</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeTotalMaxSize" [...]
 <p>For example, Cloudflare D1 supports 1MB as max in write_total.</p>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L118">generated.d.ts:118</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeWithCacheCont [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L94">generated.d.ts:94</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeWithContentDisposition" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>With<wbr/>C [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L92">generated.d.ts:92</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeWithContentType" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>With<wbr/>Content< [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L90">generated.d.ts:90</a></li></ul></aside></li></ul></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class= [...]
\ No newline at end of file
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L118">generated.d.ts:118</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeWithCacheCont [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L94">generated.d.ts:94</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeWithContentDisposition" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>With<wbr/>C [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L92">generated.d.ts:92</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeWithContentType" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>With<wbr/>Content< [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L90">generated.d.ts:90</a></li></ul></aside></li></ul></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class= [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Entry.html b/docs/nodejs/classes/Entry.html
index daed35ea7b..87e6b56b6f 100644
--- a/docs/nodejs/classes/Entry.html
+++ b/docs/nodejs/classes/Entry.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Entry | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script as [...]
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L521">generated.d.ts:521</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L521">generated.d.ts:521</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Entry.html#path" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>path</span></a>
 </div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Ent [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L523">generated.d.ts:523</a></li></ul></aside></li></ul></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class [...]
\ No newline at end of file
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L523">generated.d.ts:523</a></li></ul></aside></li></ul></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/ExternalObject.html b/docs/nodejs/classes/ExternalObject.html
index aeeb22d94b..83b747240e 100644
--- a/docs/nodejs/classes/ExternalObject.html
+++ b/docs/nodejs/classes/ExternalObject.html
@@ -1,3 +1,3 @@
-<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ExternalObject | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script>< [...]
+<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ExternalObject | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script>< [...]
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Properties</h3><div class="tsd-index-list"><a href="ExternalObject.html#reflection-5" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-1024"></use></svg><span><em>Property</em></span></a>
-</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Ext [...]
\ No newline at end of file
+</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Ext [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Layer.html b/docs/nodejs/classes/Layer.html
index b731022807..6d57fd7781 100644
--- a/docs/nodejs/classes/Layer.html
+++ b/docs/nodejs/classes/Layer.html
@@ -1,3 +1,3 @@
 <!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Layer | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script as [...]
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L665">generated.d.ts:665</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L667">generated.d.ts:667</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
 </div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Lay [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Lister.html b/docs/nodejs/classes/Lister.html
index f4c40c8d13..6411229e11 100644
--- a/docs/nodejs/classes/Lister.html
+++ b/docs/nodejs/classes/Lister.html
@@ -1,10 +1,10 @@
 <!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Lister | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script a [...]
 manner.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L646">generated.d.ts:646</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L648">generated.d.ts:648</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Lister.html#next" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>next</span></a>
 </div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Lis [...]
 <p>&amp;mut self in async napi methods should be marked as unsafe</p>
 </blockquote>
 <p>napi will make sure the function is safe, and we didn&#39;t do unsafe
 thing internally.</p>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><a href="Entry.html" class="tsd-signature-type tsd-kind-class">Entry</a><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e2 [...]
\ No newline at end of file
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><a href="Entry.html" class="tsd-signature-type tsd-kind-class">Entry</a><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e7 [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Metadata.html b/docs/nodejs/classes/Metadata.html
index ab286e8267..38c45bce79 100644
--- a/docs/nodejs/classes/Metadata.html
+++ b/docs/nodejs/classes/Metadata.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Metadata | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script [...]
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L526">generated.d.ts:526</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L526">generated.d.ts:526</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Accessors</h3><div class="tsd-index-list"><a href="Metadata.html#contentDisposition" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>content<wbr/>Disposition</span></a>
 <a href="Metadata.html#contentLength" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>content<wbr/>Length</span></a>
 <a href="Metadata.html#contentMd5" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>content<wbr/>Md5</span></a>
@@ -9,12 +9,12 @@
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Metadata.html#isDirectory" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>is<wbr/>Directory</span></a>
 <a href="Metadata.html#isFile" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>is<wbr/>File</span></a>
 </div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Met [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L532">generated.d.ts:532</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="contentLength" cla [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L534">generated.d.ts:534</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="contentMd5" class= [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L536">generated.d.ts:536</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="contentType" class [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L538">generated.d.ts:538</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="etag" class="tsd-a [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L540">generated.d.ts:540</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="lastModified" clas [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L532">generated.d.ts:532</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="contentLength" cla [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L534">generated.d.ts:534</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="contentMd5" class= [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L536">generated.d.ts:536</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="contentType" class [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L538">generated.d.ts:538</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="etag" class="tsd-a [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L540">generated.d.ts:540</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="lastModified" clas [...]
 <p>We will output this time in RFC3339 format like <code>1996-12-19T16:39:57+08:00</code>.</p>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L546">generated.d.ts:546</a></li></ul></aside></li></ul></section></section><section class="tsd-panel-group tsd-member-group"><h2 [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L528">generated.d.ts:528</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="isFile" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>is<wbr/>File</span><a href="#isFile" aria [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L530">generated.d.ts:530</a></li></ul></aside></li></ul></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary clas [...]
\ No newline at end of file
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L546">generated.d.ts:546</a></li></ul></aside></li></ul></section></section><section class="tsd-panel-group tsd-member-group"><h2 [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L528">generated.d.ts:528</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="isFile" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>is<wbr/>File</span><a href="#isFile" aria [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L530">generated.d.ts:530</a></li></ul></aside></li></ul></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary clas [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Operator.html b/docs/nodejs/classes/Operator.html
index 42ce4e2eb7..6e110868f3 100644
--- a/docs/nodejs/classes/Operator.html
+++ b/docs/nodejs/classes/Operator.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Operator | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script [...]
+<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Operator | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script [...]
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Operator.html#append" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>append</span></a>
 <a href="Operator.html#capability" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>capability</span></a>
 <a href="Operator.html#check" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>check</span></a>
@@ -31,45 +31,45 @@
 <a href="Operator.html#writer" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>writer</span></a>
 <a href="Operator.html#writerSync" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>writer<wbr/>Sync</span></a>
 </div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Ope [...]
-</div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L154">generated.d.ts:154</a></li></ul></aside></li></ul></section></section><section class="tsd-panel-group tsd-member-group"><h2>Methods</h2><section class="tsd-panel tsd-member"><a id="append" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>append</span><a href="#append" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24 [...]
+</div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L154">generated.d.ts:154</a></li></ul></aside></li></ul></section></section><section class="tsd-panel-group tsd-member-group"><h2>Methods</h2><section class="tsd-panel tsd-member"><a id="append" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>append</span><a href="#append" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24 [...]
 <a id="md:notes" class="tsd-anchor"></a><h3><a href="#md:notes">Notes</a></h3><ul>
 <li>It always appends content to the end of the file.</li>
 <li>It will create file if the path not exists.</li>
 </ul>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">append</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">, </span><span class="hl-5">Buffer</span><span class="hl-1">.</span><span class="hl-0">from</span><span class="hl-1">(</span><sp [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="ts [...]
-</div><h4 class="tsd-returns-title">Returns <a href="Capability.html" class="tsd-signature-type tsd-kind-class">Capability</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L156">generated.d.ts:156</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="check" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>check</ [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="ts [...]
+</div><h4 class="tsd-returns-title">Returns <a href="Capability.html" class="tsd-signature-type tsd-kind-class">Capability</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L156">generated.d.ts:156</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="check" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>check</ [...]
 <p>We will send a <code>list</code> request to path and return any errors we met.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">check</span><span class="hl-1">();</span>
 </code><button>Copy</button></pre>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L199">generated.d.ts:199</a></li></ul></aside></li></ul></section><section class [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L199">generated.d.ts:199</a></li></ul></aside></li></ul></section><section class [...]
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">copy</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">, </span><span class="hl-2">&quot;path/to/dest&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-s [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-s [...]
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">copySync</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">, </span><span class="hl-2">&quot;path/to/dest&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd [...]
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">createDir</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/dir/&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typ [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typ [...]
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">createDirSync</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/dir/&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generat [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generat [...]
 <a id="md:notes" class="tsd-anchor"></a><h3><a href="#md:notes">Notes</a></h3><p>Delete not existing error won’t return errors.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">delete</span><span class="hl-1">(</span><span class="hl-2">&quot;test&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typ [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typ [...]
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">deleteSync</span><span class="hl-1">(</span><span class="hl-2">&quot;test&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generat [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generat [...]
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">isExist</span><span class="hl-1">(</span><span class="hl-2">&quot;test&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd- [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd- [...]
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">isExistSync</span><span class="hl-1">(</span><span class="hl-2">&quot;test&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/gene [...]
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">layer</span>: <a href="ExternalObject.html" class="tsd-signature-type tsd-kind-class">ExternalObject</a><span class="tsd-signature-symbol">&lt;</span><a href="Layer.html" class="tsd-signature-type tsd-kind-class">Layer</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="Op [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/gene [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">layer</span>: <a href="ExternalObject.html" class="tsd-signature-type tsd-kind-class">ExternalObject</a><span class="tsd-signature-symbol">&lt;</span><a href="Layer.html" class="tsd-signature-type tsd-kind-class">Layer</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="Op [...]
 <p>This function will return an array of entries.</p>
 <p>An error will be returned if given path doesn&#39;t end with <code>/</code>.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">list</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">list</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/dir/&quot;</span><span class="hl-1">);</span><br/ [...]
@@ -77,7 +77,7 @@
 <a id="md:list-recursively" class="tsd-anchor"></a><h4><a href="#md:list-recursively">List recursively</a></h4><p>With <code>recursive</code> option, you can list recursively.</p>
 <pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">list</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">list</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/dir/&quot;</span><span class="hl-1">, { </span><span class="hl-5">recursive:</span><span class="hl-1"> </span><span class="hl-6">true [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><a href="../interfaces/ListOptions.html" class="tsd-signature-type ts [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><a href="../interfaces/ListOptions.html" class="tsd-signature-type ts [...]
 <p>This function will return a array of entries.</p>
 <p>An error will be returned if given path doesn&#39;t end with <code>/</code>.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">list</span><span class="hl-1"> = </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">listSync</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/dir/&quot;</span><span class="hl-1">);</span><br/><span class="hl-4">for</span><span class="hl-1"> (</s [...]
@@ -85,45 +85,45 @@
 <a id="md:list-recursively" class="tsd-anchor"></a><h4><a href="#md:list-recursively">List recursively</a></h4><p>With <code>recursive</code> option, you can list recursively.</p>
 <pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">list</span><span class="hl-1"> = </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">listSync</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/dir/&quot;</span><span class="hl-1">, { </span><span class="hl-5">recursive:</span><span class="hl-1"> </span><span class="hl-6">true</span><span class="hl-1"> });</span><br/><span class= [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><a href="../interfaces/ListOptions.html" class="tsd-signature-type ts [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><a href="../interfaces/ListOptions.html" class="tsd-signature-type ts [...]
 <p>Unit of expires is seconds.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">req</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">presignRead</span><span class="hl-1">(</span><span class="hl-5">path</span><span class="hl-1">, </span><span class="hl-0" [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../i [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../i [...]
 <p>Unit of expires is seconds.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">req</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">presignStat</span><span class="hl-1">(</span><span class="hl-5">path</span><span class="hl-1">, </span><span class="hl-0" [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../i [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../i [...]
 <p>Unit of expires is seconds.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">req</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">presignWrite</span><span class="hl-1">(</span><span class="hl-5">path</span><span class="hl-1">, </span><span class="hl-0 [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../i [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../i [...]
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">buf</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">read</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type ">Buffer</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd- [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type ">Buffer</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd- [...]
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">buf</span><span class="hl-1"> = </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">readSync</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Buffer</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/gene [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Buffer</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/gene [...]
 <p>It could be used to read large file in a streaming way.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="Reader.html" class="tsd-signature-type tsd-kind-class">Reader</a><span class="tsd-signature-symbol">&gt;</span></h4>< [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="Reader.html" class="tsd-signature-type tsd-kind-class">Reader</a><span class="tsd-signature-symbol">&gt;</span></h4>< [...]
 <p>It could be used to read large file in a streaming way.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="BlockingReader.html" class="tsd-signature-type tsd-kind-class">BlockingReader</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apach [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="BlockingReader.html" class="tsd-signature-type tsd-kind-class">BlockingReader</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apach [...]
 <a id="md:notes" class="tsd-anchor"></a><h3><a href="#md:notes">Notes</a></h3><p>If underlying services support delete in batch, we will use batch delete instead.</p>
 <a id="md:examples" class="tsd-anchor"></a><h3><a href="#md:examples">Examples</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">remove</span><span class="hl-1">([</span><span class="hl-2">&quot;abc&quot;</span><span class="hl-1">, </span><span class="hl-2">&quot;def&quot;</span><span class="hl-1">]);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">paths</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&g [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">paths</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&g [...]
 <a id="md:notes" class="tsd-anchor"></a><h3><a href="#md:notes">Notes</a></h3><p>If underlying services support delete in batch, we will use batch delete instead.</p>
 <a id="md:examples" class="tsd-anchor"></a><h3><a href="#md:examples">Examples</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">removeAll</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/dir/&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typ [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typ [...]
 <p>It&#39;s similar to <code>mv</code> command.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">rename</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">, </span><span class="hl-2">&quot;path/to/dest&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-s [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-s [...]
 <p>It&#39;s similar to <code>mv</code> command.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">renameSync</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">, </span><span class="hl-2">&quot;path/to/dest&quot;</span><span class="hl-1">);</span>
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd [...]
 <a id="md:notes" class="tsd-anchor"></a><h3><a href="#md:notes">Notes</a></h3><p>Use stat if you:</p>
 <ul>
 <li>Want detect the outside changes of path.</li>
@@ -132,17 +132,17 @@
 <p>You may want to use <code>metadata</code> if you are working with entries returned by <code>Lister</code>. It’s highly possible that metadata you want has already been cached.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">meta</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">stat</span><span class="hl-1">(</span><span class="hl-2">&quot;test&quot;</span><span class="hl-1">);</span><br/><span c [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="Metadata.html" class="tsd-signature-type tsd-kind-class">Metadata</a><span class="tsd-signature-symbol">&gt;</span></ [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="Metadata.html" class="tsd-signature-type tsd-kind-class">Metadata</a><span class="tsd-signature-symbol">&gt;</span></ [...]
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">meta</span><span class="hl-1"> = </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">statSync</span><span class="hl-1">(</span><span class="hl-2">&quot;test&quot;</span><span class="hl-1">);</span><br/><span class="hl-4">if</span><span class="hl-1"> (</span><span [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="Metadata.html" class="tsd-signature-type tsd-kind-class">Metadata</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/bl [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="Metadata.html" class="tsd-signature-type tsd-kind-class">Metadata</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/bl [...]
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">write</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">, </span><span class="hl-5">Buffer</span><span class="hl-1">.</span><span class="hl-0">from</span><span class="hl-1">(</span><spa [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="ts [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="ts [...]
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">writeSync</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">, </span><span class="hl-5">Buffer</span><span class="hl-1">.</span><span class="hl-0">from</span><span class="hl-1">(</span><span class="hl-2">&quot;hello world&quot;</span><span cla [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="ts [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="ts [...]
 <p>It could be used to write large file in a streaming way.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="Writer.html" class="tsd-signature-type tsd-kind-class">Writer</a><span class="tsd-signature-symbol">&gt;</span></h4>< [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="Writer.html" class="tsd-signature-type tsd-kind-class">Writer</a><span class="tsd-signature-symbol">&gt;</span></h4>< [...]
 <p>It could be used to write large file in a streaming way.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="BlockingWriter.html" class="tsd-signature-type tsd-kind-class">BlockingWriter</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apach [...]
\ No newline at end of file
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="BlockingWriter.html" class="tsd-signature-type tsd-kind-class">BlockingWriter</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apach [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Reader.html b/docs/nodejs/classes/Reader.html
index 71433894fb..50d92e1734 100644
--- a/docs/nodejs/classes/Reader.html
+++ b/docs/nodejs/classes/Reader.html
@@ -1,11 +1,12 @@
 <!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Reader | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script a [...]
 manner.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L559">generated.d.ts:559</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/index.d.ts#L27">index.d.ts:27</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content  [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L559">generated.d.ts:559</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/index.d.ts#L27">index.d.ts:27</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content  [...]
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Reader.html#createReadStream" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>create<wbr/>Read<wbr/>Stream</span></a>
 <a href="Reader.html#read" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>read</span></a>
 </div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Rea [...]
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">ReadableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Readable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">ReadableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Readable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
 <p>&amp;mut self in async napi methods should be marked as unsafe</p>
 </blockquote>
 <p>Read bytes from this reader into given buffer.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">buf</span>: <span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">bigint</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-t [...]
\ No newline at end of file
+<p>TODO: change api into stream based.</p>
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">buf</span>: <span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">bigint</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-t [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/RetryLayer.html b/docs/nodejs/classes/RetryLayer.html
index bfcc17ff9c..426c8807d6 100644
--- a/docs/nodejs/classes/RetryLayer.html
+++ b/docs/nodejs/classes/RetryLayer.html
@@ -6,27 +6,27 @@ returns true. If operation still failed, this layer will set error to
 <p><code>write</code> and <code>blocking_write</code> don&#39;t support retry so far, visit <a href="https://github.com/apache/opendal/issues/1223">this issue</a> for more details.</p>
 <a id="md:examples" class="tsd-anchor"></a><h1><a href="#md:examples">Examples</a></h1><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">op</span><span class="hl-1"> = </span><span class="hl-6">new</span><span class="hl-1"> </span><span class="hl-0">Operator</span><span class="hl-1">(</span><span class="hl-2">&quot;file&quot;</span><span class="hl-1">, { </span><span class="hl-5">root:</span><span class="hl-1"> </span><spa [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L691">generated.d.ts:691</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L693">generated.d.ts:693</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Accessors</h3><div class="tsd-index-list"><a href="RetryLayer.html#factor" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>factor</span></a>
 <a href="RetryLayer.html#jitter" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>jitter</span></a>
 <a href="RetryLayer.html#maxDelay" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>max<wbr/>Delay</span></a>
 <a href="RetryLayer.html#maxTimes" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>max<wbr/>Times</span></a>
 <a href="RetryLayer.html#minDelay" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>min<wbr/>Delay</span></a>
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="RetryLayer.html#build" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>build</span></a>
-</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Ret [...]
+</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Ret [...]
 <a id="md:panics" class="tsd-anchor"></a><h1><a href="#md:panics">Panics</a></h1><p>This function will panic if input factor smaller than <code>1.0</code>.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated. [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated. [...]
 <p>If jitter is enabled, ExponentialBackoff will add a random jitter in `[0, min_delay)
 to current delay.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">boolean</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">boolean</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated [...]
 <p>Delay will not increasing if current delay is larger than max_delay.</p>
 <a id="md:notes" class="tsd-anchor"></a><h1><a href="#md:notes">Notes</a></h1><ul>
 <li>The unit of max_delay is millisecond.</li>
 </ul>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated. [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated. [...]
 <p>Backoff will return <code>None</code> if max times is reaching.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated. [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated. [...]
 <a id="md:notes" class="tsd-anchor"></a><h1><a href="#md:notes">Notes</a></h1><ul>
 <li>The unit of min_delay is millisecond.</li>
 </ul>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated. [...]
\ No newline at end of file
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated. [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Writer.html b/docs/nodejs/classes/Writer.html
index 901d1dbe61..4d02da6249 100644
--- a/docs/nodejs/classes/Writer.html
+++ b/docs/nodejs/classes/Writer.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Writer | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script a [...]
 manner.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L610">generated.d.ts:610</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/index.d.ts#L37">index.d.ts:37</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content  [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L612">generated.d.ts:612</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/index.d.ts#L37">index.d.ts:37</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content  [...]
 </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Writer.html#close" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>close</span></a>
 <a href="Writer.html#createWriteStream" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>create<wbr/>Write<wbr/>Stream</span></a>
 <a href="Writer.html#write" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>write</span></a>
@@ -10,11 +10,11 @@ manner.</p>
 <p>Close this writer.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">writer</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">writer</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">);</span> [...]
 </code><button>Copy</button></pre>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L640">generated.d.ts:640</a></li></ul></aside></li></ul></section><section class [...]
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">WritableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Writable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L642">generated.d.ts:642</a></li></ul></aside></li></ul></section><section class [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">WritableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Writable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
 <p>&amp;mut self in async napi methods should be marked as unsafe</p>
 </blockquote>
 <p>Write bytes into this writer.</p>
 <a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">writer</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">writer</span><span class="hl-1">(</span><span class="hl-2">&quot;path/to/file&quot;</span><span class="hl-1">);</span> [...]
 </code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type [...]
\ No newline at end of file
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type [...]
\ No newline at end of file
diff --git a/docs/nodejs/interfaces/ListOptions.html b/docs/nodejs/interfaces/ListOptions.html
index f14e72c21d..7268cbe3cf 100644
--- a/docs/nodejs/interfaces/ListOptions.html
+++ b/docs/nodejs/interfaces/ListOptions.html
@@ -1,3 +1,3 @@
-<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ListOptions | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><scr [...]
+<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ListOptions | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><scr [...]
 <a href="ListOptions.html#recursive" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-1024"></use></svg><span>recursive?</span></a>
-</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Properties</h2><section class="tsd-panel tsd-member"><a id="limit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><code class="tsd-tag ts-flagOptional">Optional</code> <span>limit</span><a href="#limit" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">li [...]
\ No newline at end of file
+</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Properties</h2><section class="tsd-panel tsd-member"><a id="limit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><code class="tsd-tag ts-flagOptional">Optional</code> <span>limit</span><a href="#limit" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">li [...]
\ No newline at end of file
diff --git a/docs/nodejs/interfaces/PresignedRequest.html b/docs/nodejs/interfaces/PresignedRequest.html
index 7bfa617fe8..198ac57fa8 100644
--- a/docs/nodejs/interfaces/PresignedRequest.html
+++ b/docs/nodejs/interfaces/PresignedRequest.html
@@ -1,8 +1,8 @@
 <!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>PresignedRequest | Apache OpenDAL™ - v0.45.1+core.0.45.1</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script [...]
-</div><div class="tsd-comment tsd-typography"></div></section><div class="tsd-signature"><span class="tsd-signature-keyword">interface </span><span class="tsd-kind-interface">PresignedRequest </span><span class="tsd-signature-symbol">{ </span><br/><span>    </span><a class="tsd-kind-property" href="PresignedRequest.html#headers">headers</a><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type ">Record</span><span class="tsd-signature-symbol">&lt;</span><span class=" [...]
+</div><div class="tsd-comment tsd-typography"></div></section><div class="tsd-signature"><span class="tsd-signature-keyword">interface </span><span class="tsd-kind-interface">PresignedRequest </span><span class="tsd-signature-symbol">{ </span><br/><span>    </span><a class="tsd-kind-property" href="PresignedRequest.html#headers">headers</a><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type ">Record</span><span class="tsd-signature-symbol">&lt;</span><span class=" [...]
 <a href="PresignedRequest.html#method" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-1024"></use></svg><span>method</span></a>
 <a href="PresignedRequest.html#url" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-1024"></use></svg><span>url</span></a>
 </div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Properties</h2><section class="tsd-panel tsd-member"><a id="headers" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>headers</span><a href="#headers" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">headers</span><span class="tsd-signature-symbol">: [...]
-</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L42">generated.d.ts:42</a></li></ul></aside></section><section class="tsd-panel tsd-member"><a id="method" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>method</span><a href="#method" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a [...]
-</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L38">generated.d.ts:38</a></li></ul></aside></section><section class="tsd-panel tsd-member"><a id="url" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>url</span><a href="#url" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><di [...]
-</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e278b85/bindings/nodejs/generated.d.ts#L40">generated.d.ts:40</a></li></ul></aside></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="# [...]
\ No newline at end of file
+</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L42">generated.d.ts:42</a></li></ul></aside></section><section class="tsd-panel tsd-member"><a id="method" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>method</span><a href="#method" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a [...]
+</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L38">generated.d.ts:38</a></li></ul></aside></section><section class="tsd-panel tsd-member"><a id="url" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>url</span><a href="#url" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><di [...]
+</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/e704a89/bindings/nodejs/generated.d.ts#L40">generated.d.ts:40</a></li></ul></aside></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="# [...]
\ No newline at end of file
diff --git a/docs/object-store-opendal/object_store_opendal/index.html b/docs/object-store-opendal/object_store_opendal/index.html
index d5611f2494..ea15f11256 100644
--- a/docs/object-store-opendal/object_store_opendal/index.html
+++ b/docs/object-store-opendal/object_store_opendal/index.html
@@ -1,3 +1,3 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="API documentation for the Rust `object_store_opendal` crate."><title>object_store_opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" cross [...]
             <li><a id="all-types" href="all.html">All Items</a></li></ul><section><ul class="block"><li><a href="#structs">Structs</a></li></ul></section></div></nav><div class="sidebar-resizer"></div>
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../object_store_opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../help.html" title="help">?</a></di [...]
\ No newline at end of file
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../object_store_opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../help.html" title="help">?</a></di [...]
\ No newline at end of file
diff --git a/docs/object-store-opendal/src/object_store_opendal/lib.rs.html b/docs/object-store-opendal/src/object_store_opendal/lib.rs.html
index f048bfc329..3d5613c0be 100644
--- a/docs/object-store-opendal/src/object_store_opendal/lib.rs.html
+++ b/docs/object-store-opendal/src/object_store_opendal/lib.rs.html
@@ -478,7 +478,6 @@
 <a href="#476" id="476">476</a>
 <a href="#477" id="477">477</a>
 <a href="#478" id="478">478</a>
-<a href="#479" id="479">479</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -828,10 +827,9 @@
 <span class="kw">impl </span>Stream <span class="kw">for </span>OpendalReader {
     <span class="kw">type </span>Item = <span class="prelude-ty">Result</span>&lt;Bytes&gt;;
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">mut </span><span class="self">self</span>: Pin&lt;<span class="kw-2">&amp;mut </span><span class="self">Self</span>&gt;, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="self">Self</span>::Item&gt;&gt; {
-        <span class="kw">use </span>opendal::raw::oio::Read;
-
-        <span class="self">self</span>.inner
+    <span class="kw">fn </span>poll_next(<span class="self">self</span>: Pin&lt;<span class="kw-2">&amp;mut </span><span class="self">Self</span>&gt;, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="self">Self</span>::Item&gt;&gt; {
+        <span class="kw">let </span>inner = Pin::new(<span class="kw-2">&amp;mut </span><span class="self">self</span>.get_mut().inner);
+        inner
             .poll_next(cx)
             .map_err(|err| object_store::Error::Generic {
                 store: <span class="string">"IoError"</span>,
diff --git a/docs/overview/index.html b/docs/overview/index.html
index 9263cb0f35..a2f0b7efda 100644
--- a/docs/overview/index.html
+++ b/docs/overview/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Welcome to Apache OpenDAL™ | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/overview"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en">< [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
@@ -63,6 +63,6 @@
 <p>we DO NOT</p>
 <ul>
 <li>Add <code>Arc</code> for metadata: Users may only need to use metadata once and never clone it. For those who do want this feature, they can add <code>Arc</code> themselves.</li>
-</ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/apache/opendal/tree/main/website/docs/overview.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit__AOS" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29. [...]
+</ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/apache/opendal/tree/main/website/docs/overview.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit__AOS" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29. [...]
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/python/opendal.html b/docs/python/opendal.html
index ca3296fdca..8cec24ec86 100644
--- a/docs/python/opendal.html
+++ b/docs/python/opendal.html
@@ -222,10 +222,10 @@
                                 <a class="variable" href="#Metadata.content_md5">content_md5</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Metadata.content_length">content_length</a>
+                                <a class="variable" href="#Metadata.content_disposition">content_disposition</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Metadata.content_disposition">content_disposition</a>
+                                <a class="variable" href="#Metadata.content_length">content_length</a>
                         </li>
                         <li>
                                 <a class="variable" href="#Metadata.content_type">content_type</a>
@@ -239,15 +239,15 @@
             <li>
                     <a class="class" href="#PresignedRequest">PresignedRequest</a>
                             <ul class="memberlist">
-                        <li>
-                                <a class="variable" href="#PresignedRequest.headers">headers</a>
-                        </li>
                         <li>
                                 <a class="variable" href="#PresignedRequest.method">method</a>
                         </li>
                         <li>
                                 <a class="variable" href="#PresignedRequest.url">url</a>
                         </li>
+                        <li>
+                                <a class="variable" href="#PresignedRequest.headers">headers</a>
+                        </li>
                 </ul>
 
             </li>
@@ -258,115 +258,115 @@
                                 <a class="variable" href="#Capability.write_multi_min_size">write_multi_min_size</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.read_with_override_content_disposition">read_with_override_content_disposition</a>
+                                <a class="variable" href="#Capability.presign_read">presign_read</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.list_with_limit">list_with_limit</a>
+                                <a class="variable" href="#Capability.presign_write">presign_write</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.read_with_override_content_type">read_with_override_content_type</a>
+                                <a class="variable" href="#Capability.stat_with_if_none_match">stat_with_if_none_match</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.read_with_if_match">read_with_if_match</a>
+                                <a class="variable" href="#Capability.list_with_limit">list_with_limit</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.write_multi_align_size">write_multi_align_size</a>
+                                <a class="variable" href="#Capability.read_with_override_content_type">read_with_override_content_type</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.read_with_override_cache_control">read_with_override_cache_control</a>
+                                <a class="variable" href="#Capability.read_can_next">read_can_next</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.write_can_empty">write_can_empty</a>
+                                <a class="variable" href="#Capability.stat">stat</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.write_with_content_disposition">write_with_content_disposition</a>
+                                <a class="variable" href="#Capability.presign_stat">presign_stat</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.write_with_content_type">write_with_content_type</a>
+                                <a class="variable" href="#Capability.read_with_if_match">read_with_if_match</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.read">read</a>
+                                <a class="variable" href="#Capability.read_with_range">read_with_range</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.rename">rename</a>
+                                <a class="variable" href="#Capability.write_total_max_size">write_total_max_size</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.write_can_append">write_can_append</a>
+                                <a class="variable" href="#Capability.write_with_content_disposition">write_with_content_disposition</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.write_can_multi">write_can_multi</a>
+                                <a class="variable" href="#Capability.write_can_empty">write_can_empty</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.stat_with_if_match">stat_with_if_match</a>
+                                <a class="variable" href="#Capability.write">write</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.list">list</a>
+                                <a class="variable" href="#Capability.write_multi_align_size">write_multi_align_size</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.write_with_cache_control">write_with_cache_control</a>
+                                <a class="variable" href="#Capability.delete">delete</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.list_with_start_after">list_with_start_after</a>
+                                <a class="variable" href="#Capability.read_with_override_cache_control">read_with_override_cache_control</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.stat">stat</a>
+                                <a class="variable" href="#Capability.rename">rename</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.presign">presign</a>
+                                <a class="variable" href="#Capability.copy">copy</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.stat_with_if_none_match">stat_with_if_none_match</a>
+                                <a class="variable" href="#Capability.write_with_cache_control">write_with_cache_control</a>
                         </li>
                         <li>
                                 <a class="variable" href="#Capability.read_can_seek">read_can_seek</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.read_can_next">read_can_next</a>
+                                <a class="variable" href="#Capability.read_with_override_content_disposition">read_with_override_content_disposition</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.copy">copy</a>
+                                <a class="variable" href="#Capability.write_can_multi">write_can_multi</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.presign_read">presign_read</a>
+                                <a class="variable" href="#Capability.read">read</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.presign_write">presign_write</a>
+                                <a class="variable" href="#Capability.write_can_append">write_can_append</a>
                         </li>
                         <li>
                                 <a class="variable" href="#Capability.read_with_if_none_match">read_with_if_none_match</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.batch_delete">batch_delete</a>
+                                <a class="variable" href="#Capability.presign">presign</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.delete">delete</a>
+                                <a class="variable" href="#Capability.write_with_content_type">write_with_content_type</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.write">write</a>
+                                <a class="variable" href="#Capability.list">list</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.write_total_max_size">write_total_max_size</a>
+                                <a class="variable" href="#Capability.create_dir">create_dir</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.create_dir">create_dir</a>
+                                <a class="variable" href="#Capability.stat_with_if_match">stat_with_if_match</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.presign_stat">presign_stat</a>
+                                <a class="variable" href="#Capability.list_with_start_after">list_with_start_after</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.list_with_recursive">list_with_recursive</a>
+                                <a class="variable" href="#Capability.batch">batch</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.blocking">blocking</a>
+                                <a class="variable" href="#Capability.batch_delete">batch_delete</a>
                         </li>
                         <li>
                                 <a class="variable" href="#Capability.batch_max_operations">batch_max_operations</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.read_with_range">read_with_range</a>
+                                <a class="variable" href="#Capability.list_with_recursive">list_with_recursive</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Capability.batch">batch</a>
+                                <a class="variable" href="#Capability.blocking">blocking</a>
                         </li>
                         <li>
                                 <a class="variable" href="#Capability.write_multi_max_size">write_multi_max_size</a>
@@ -1313,28 +1313,28 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
 
 
                             </div>
-                            <div id="Metadata.content_length" class="classattr">
+                            <div id="Metadata.content_disposition" class="classattr">
                                 <div class="attr variable">
-            <span class="name">content_length</span><span class="annotation">: int</span>
+            <span class="name">content_disposition</span><span class="annotation">: Optional[str]</span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.content_length"></a>
+    <a class="headerlink" href="#Metadata.content_disposition"></a>
+    
     
-            <div class="docstring"><p>Content length of this entry.</p>
-</div>
-
 
                             </div>
-                            <div id="Metadata.content_disposition" class="classattr">
+                            <div id="Metadata.content_length" class="classattr">
                                 <div class="attr variable">
-            <span class="name">content_disposition</span><span class="annotation">: Optional[str]</span>
+            <span class="name">content_length</span><span class="annotation">: int</span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.content_disposition"></a>
-    
+    <a class="headerlink" href="#Metadata.content_length"></a>
     
+            <div class="docstring"><p>Content length of this entry.</p>
+</div>
+
 
                             </div>
                             <div id="Metadata.content_type" class="classattr">
@@ -1376,41 +1376,41 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
     
     
 
-                            <div id="PresignedRequest.headers" class="classattr">
+                            <div id="PresignedRequest.method" class="classattr">
                                 <div class="attr variable">
-            <span class="name">headers</span><span class="annotation">: dict[str, str]</span>
+            <span class="name">method</span><span class="annotation">: str</span>
 
         
     </div>
-    <a class="headerlink" href="#PresignedRequest.headers"></a>
+    <a class="headerlink" href="#PresignedRequest.method"></a>
     
-            <div class="docstring"><p>Return the HTTP headers of this request.</p>
+            <div class="docstring"><p>Return the HTTP method of this request.</p>
 </div>
 
 
                             </div>
-                            <div id="PresignedRequest.method" class="classattr">
+                            <div id="PresignedRequest.url" class="classattr">
                                 <div class="attr variable">
-            <span class="name">method</span><span class="annotation">: str</span>
+            <span class="name">url</span><span class="annotation">: str</span>
 
         
     </div>
-    <a class="headerlink" href="#PresignedRequest.method"></a>
+    <a class="headerlink" href="#PresignedRequest.url"></a>
     
-            <div class="docstring"><p>Return the HTTP method of this request.</p>
+            <div class="docstring"><p>Return the URL of this request.</p>
 </div>
 
 
                             </div>
-                            <div id="PresignedRequest.url" class="classattr">
+                            <div id="PresignedRequest.headers" class="classattr">
                                 <div class="attr variable">
-            <span class="name">url</span><span class="annotation">: str</span>
+            <span class="name">headers</span><span class="annotation">: dict[str, str]</span>
 
         
     </div>
-    <a class="headerlink" href="#PresignedRequest.url"></a>
+    <a class="headerlink" href="#PresignedRequest.headers"></a>
     
-            <div class="docstring"><p>Return the URL of this request.</p>
+            <div class="docstring"><p>Return the HTTP headers of this request.</p>
 </div>
 
 
@@ -1446,264 +1446,266 @@ by current Operator.</p>
 
 
                             </div>
-                            <div id="Capability.read_with_override_content_disposition" class="classattr">
+                            <div id="Capability.presign_read" class="classattr">
                                 <div class="attr variable">
-            <span class="name">read_with_override_content_disposition</span><span class="annotation">: bool</span>
+            <span class="name">presign_read</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.read_with_override_content_disposition"></a>
+    <a class="headerlink" href="#Capability.presign_read"></a>
     
-            <div class="docstring"><p>if operator supports read with override content disposition.</p>
+            <div class="docstring"><p>If operator supports presign read.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.list_with_limit" class="classattr">
+                            <div id="Capability.presign_write" class="classattr">
                                 <div class="attr variable">
-            <span class="name">list_with_limit</span><span class="annotation">: bool</span>
+            <span class="name">presign_write</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.list_with_limit"></a>
+    <a class="headerlink" href="#Capability.presign_write"></a>
     
-            <div class="docstring"><p>If backend supports list with limit.</p>
+            <div class="docstring"><p>If operator supports presign write.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.read_with_override_content_type" class="classattr">
+                            <div id="Capability.stat_with_if_none_match" class="classattr">
                                 <div class="attr variable">
-            <span class="name">read_with_override_content_type</span><span class="annotation">: bool</span>
+            <span class="name">stat_with_if_none_match</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.read_with_override_content_type"></a>
+    <a class="headerlink" href="#Capability.stat_with_if_none_match"></a>
     
-            <div class="docstring"><p>if operator supports read with override content type.</p>
+            <div class="docstring"><p>If operator supports stat with if none match.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.read_with_if_match" class="classattr">
+                            <div id="Capability.list_with_limit" class="classattr">
                                 <div class="attr variable">
-            <span class="name">read_with_if_match</span><span class="annotation">: bool</span>
+            <span class="name">list_with_limit</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.read_with_if_match"></a>
+    <a class="headerlink" href="#Capability.list_with_limit"></a>
     
-            <div class="docstring"><p>If operator supports read with if match.</p>
+            <div class="docstring"><p>If backend supports list with limit.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.write_multi_align_size" class="classattr">
+                            <div id="Capability.read_with_override_content_type" class="classattr">
                                 <div class="attr variable">
-            <span class="name">write_multi_align_size</span><span class="annotation">: Optional[int]</span>
+            <span class="name">read_with_override_content_type</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.write_multi_align_size"></a>
+    <a class="headerlink" href="#Capability.read_with_override_content_type"></a>
     
-            <div class="docstring"><p>write_multi_align_size is the align size that services required in write_multi.</p>
-
-<p>For example, Google GCS requires align size to 256KiB in write_multi.</p>
+            <div class="docstring"><p>if operator supports read with override content type.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.read_with_override_cache_control" class="classattr">
+                            <div id="Capability.read_can_next" class="classattr">
                                 <div class="attr variable">
-            <span class="name">read_with_override_cache_control</span><span class="annotation">: bool</span>
+            <span class="name">read_can_next</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.read_with_override_cache_control"></a>
+    <a class="headerlink" href="#Capability.read_can_next"></a>
     
-            <div class="docstring"><p>if operator supports read with override cache control.</p>
+            <div class="docstring"><p>If operator supports next on returning reader.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.write_can_empty" class="classattr">
+                            <div id="Capability.stat" class="classattr">
                                 <div class="attr variable">
-            <span class="name">write_can_empty</span><span class="annotation">: bool</span>
+            <span class="name">stat</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.write_can_empty"></a>
+    <a class="headerlink" href="#Capability.stat"></a>
     
-            <div class="docstring"><p>If operator supports write with empty content.</p>
+            <div class="docstring"><p>If operator supports stat.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.write_with_content_disposition" class="classattr">
+                            <div id="Capability.presign_stat" class="classattr">
                                 <div class="attr variable">
-            <span class="name">write_with_content_disposition</span><span class="annotation">: bool</span>
+            <span class="name">presign_stat</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.write_with_content_disposition"></a>
+    <a class="headerlink" href="#Capability.presign_stat"></a>
     
-            <div class="docstring"><p>If operator supports write with content disposition.</p>
+            <div class="docstring"><p>If operator supports presign stat.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.write_with_content_type" class="classattr">
+                            <div id="Capability.read_with_if_match" class="classattr">
                                 <div class="attr variable">
-            <span class="name">write_with_content_type</span><span class="annotation">: bool</span>
+            <span class="name">read_with_if_match</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.write_with_content_type"></a>
+    <a class="headerlink" href="#Capability.read_with_if_match"></a>
     
-            <div class="docstring"><p>If operator supports write with content type.</p>
+            <div class="docstring"><p>If operator supports read with if match.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.read" class="classattr">
+                            <div id="Capability.read_with_range" class="classattr">
                                 <div class="attr variable">
-            <span class="name">read</span><span class="annotation">: bool</span>
+            <span class="name">read_with_range</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.read"></a>
+    <a class="headerlink" href="#Capability.read_with_range"></a>
     
-            <div class="docstring"><p>If operator supports read.</p>
+            <div class="docstring"><p>If operator supports read with range.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.rename" class="classattr">
+                            <div id="Capability.write_total_max_size" class="classattr">
                                 <div class="attr variable">
-            <span class="name">rename</span><span class="annotation">: bool</span>
+            <span class="name">write_total_max_size</span><span class="annotation">: Optional[int]</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.rename"></a>
+    <a class="headerlink" href="#Capability.write_total_max_size"></a>
     
-            <div class="docstring"><p>If operator supports rename.</p>
+            <div class="docstring"><p>write_total_max_size is the max size that services support in write_total.</p>
+
+<p>For example, Cloudflare D1 supports 1MB as max in write_total.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.write_can_append" class="classattr">
+                            <div id="Capability.write_with_content_disposition" class="classattr">
                                 <div class="attr variable">
-            <span class="name">write_can_append</span><span class="annotation">: bool</span>
+            <span class="name">write_with_content_disposition</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.write_can_append"></a>
+    <a class="headerlink" href="#Capability.write_with_content_disposition"></a>
     
-            <div class="docstring"><p>If operator supports write by append.</p>
+            <div class="docstring"><p>If operator supports write with content disposition.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.write_can_multi" class="classattr">
+                            <div id="Capability.write_can_empty" class="classattr">
                                 <div class="attr variable">
-            <span class="name">write_can_multi</span><span class="annotation">: bool</span>
+            <span class="name">write_can_empty</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.write_can_multi"></a>
+    <a class="headerlink" href="#Capability.write_can_empty"></a>
     
-            <div class="docstring"><p>If operator supports write can be called in multi times.</p>
+            <div class="docstring"><p>If operator supports write with empty content.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.stat_with_if_match" class="classattr">
+                            <div id="Capability.write" class="classattr">
                                 <div class="attr variable">
-            <span class="name">stat_with_if_match</span><span class="annotation">: bool</span>
+            <span class="name">write</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.stat_with_if_match"></a>
+    <a class="headerlink" href="#Capability.write"></a>
     
-            <div class="docstring"><p>If operator supports stat with if match.</p>
+            <div class="docstring"><p>If operator supports write.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.list" class="classattr">
+                            <div id="Capability.write_multi_align_size" class="classattr">
                                 <div class="attr variable">
-            <span class="name">list</span><span class="annotation">: bool</span>
+            <span class="name">write_multi_align_size</span><span class="annotation">: Optional[int]</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.list"></a>
+    <a class="headerlink" href="#Capability.write_multi_align_size"></a>
     
-            <div class="docstring"><p>If operator supports list.</p>
+            <div class="docstring"><p>write_multi_align_size is the align size that services required in write_multi.</p>
+
+<p>For example, Google GCS requires align size to 256KiB in write_multi.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.write_with_cache_control" class="classattr">
+                            <div id="Capability.delete" class="classattr">
                                 <div class="attr variable">
-            <span class="name">write_with_cache_control</span><span class="annotation">: bool</span>
+            <span class="name">delete</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.write_with_cache_control"></a>
+    <a class="headerlink" href="#Capability.delete"></a>
     
-            <div class="docstring"><p>If operator supports write with cache control.</p>
+            <div class="docstring"><p>If operator supports delete.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.list_with_start_after" class="classattr">
+                            <div id="Capability.read_with_override_cache_control" class="classattr">
                                 <div class="attr variable">
-            <span class="name">list_with_start_after</span><span class="annotation">: bool</span>
+            <span class="name">read_with_override_cache_control</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.list_with_start_after"></a>
+    <a class="headerlink" href="#Capability.read_with_override_cache_control"></a>
     
-            <div class="docstring"><p>If backend supports list with start after.</p>
+            <div class="docstring"><p>if operator supports read with override cache control.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.stat" class="classattr">
+                            <div id="Capability.rename" class="classattr">
                                 <div class="attr variable">
-            <span class="name">stat</span><span class="annotation">: bool</span>
+            <span class="name">rename</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.stat"></a>
+    <a class="headerlink" href="#Capability.rename"></a>
     
-            <div class="docstring"><p>If operator supports stat.</p>
+            <div class="docstring"><p>If operator supports rename.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.presign" class="classattr">
+                            <div id="Capability.copy" class="classattr">
                                 <div class="attr variable">
-            <span class="name">presign</span><span class="annotation">: bool</span>
+            <span class="name">copy</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.presign"></a>
+    <a class="headerlink" href="#Capability.copy"></a>
     
-            <div class="docstring"><p>If operator supports presign.</p>
+            <div class="docstring"><p>If operator supports copy.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.stat_with_if_none_match" class="classattr">
+                            <div id="Capability.write_with_cache_control" class="classattr">
                                 <div class="attr variable">
-            <span class="name">stat_with_if_none_match</span><span class="annotation">: bool</span>
+            <span class="name">write_with_cache_control</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.stat_with_if_none_match"></a>
+    <a class="headerlink" href="#Capability.write_with_cache_control"></a>
     
-            <div class="docstring"><p>If operator supports stat with if none match.</p>
+            <div class="docstring"><p>If operator supports write with cache control.</p>
 </div>
 
 
@@ -1721,54 +1723,54 @@ by current Operator.</p>
 
 
                             </div>
-                            <div id="Capability.read_can_next" class="classattr">
+                            <div id="Capability.read_with_override_content_disposition" class="classattr">
                                 <div class="attr variable">
-            <span class="name">read_can_next</span><span class="annotation">: bool</span>
+            <span class="name">read_with_override_content_disposition</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.read_can_next"></a>
+    <a class="headerlink" href="#Capability.read_with_override_content_disposition"></a>
     
-            <div class="docstring"><p>If operator supports next on returning reader.</p>
+            <div class="docstring"><p>if operator supports read with override content disposition.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.copy" class="classattr">
+                            <div id="Capability.write_can_multi" class="classattr">
                                 <div class="attr variable">
-            <span class="name">copy</span><span class="annotation">: bool</span>
+            <span class="name">write_can_multi</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.copy"></a>
+    <a class="headerlink" href="#Capability.write_can_multi"></a>
     
-            <div class="docstring"><p>If operator supports copy.</p>
+            <div class="docstring"><p>If operator supports write can be called in multi times.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.presign_read" class="classattr">
+                            <div id="Capability.read" class="classattr">
                                 <div class="attr variable">
-            <span class="name">presign_read</span><span class="annotation">: bool</span>
+            <span class="name">read</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.presign_read"></a>
+    <a class="headerlink" href="#Capability.read"></a>
     
-            <div class="docstring"><p>If operator supports presign read.</p>
+            <div class="docstring"><p>If operator supports read.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.presign_write" class="classattr">
+                            <div id="Capability.write_can_append" class="classattr">
                                 <div class="attr variable">
-            <span class="name">presign_write</span><span class="annotation">: bool</span>
+            <span class="name">write_can_append</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.presign_write"></a>
+    <a class="headerlink" href="#Capability.write_can_append"></a>
     
-            <div class="docstring"><p>If operator supports presign write.</p>
+            <div class="docstring"><p>If operator supports write by append.</p>
 </div>
 
 
@@ -1786,108 +1788,106 @@ by current Operator.</p>
 
 
                             </div>
-                            <div id="Capability.batch_delete" class="classattr">
+                            <div id="Capability.presign" class="classattr">
                                 <div class="attr variable">
-            <span class="name">batch_delete</span><span class="annotation">: bool</span>
+            <span class="name">presign</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.batch_delete"></a>
+    <a class="headerlink" href="#Capability.presign"></a>
     
-            <div class="docstring"><p>If operator supports batch delete.</p>
+            <div class="docstring"><p>If operator supports presign.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.delete" class="classattr">
+                            <div id="Capability.write_with_content_type" class="classattr">
                                 <div class="attr variable">
-            <span class="name">delete</span><span class="annotation">: bool</span>
+            <span class="name">write_with_content_type</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.delete"></a>
+    <a class="headerlink" href="#Capability.write_with_content_type"></a>
     
-            <div class="docstring"><p>If operator supports delete.</p>
+            <div class="docstring"><p>If operator supports write with content type.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.write" class="classattr">
+                            <div id="Capability.list" class="classattr">
                                 <div class="attr variable">
-            <span class="name">write</span><span class="annotation">: bool</span>
+            <span class="name">list</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.write"></a>
+    <a class="headerlink" href="#Capability.list"></a>
     
-            <div class="docstring"><p>If operator supports write.</p>
+            <div class="docstring"><p>If operator supports list.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.write_total_max_size" class="classattr">
+                            <div id="Capability.create_dir" class="classattr">
                                 <div class="attr variable">
-            <span class="name">write_total_max_size</span><span class="annotation">: Optional[int]</span>
+            <span class="name">create_dir</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.write_total_max_size"></a>
+    <a class="headerlink" href="#Capability.create_dir"></a>
     
-            <div class="docstring"><p>write_total_max_size is the max size that services support in write_total.</p>
-
-<p>For example, Cloudflare D1 supports 1MB as max in write_total.</p>
+            <div class="docstring"><p>If operator supports create dir.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.create_dir" class="classattr">
+                            <div id="Capability.stat_with_if_match" class="classattr">
                                 <div class="attr variable">
-            <span class="name">create_dir</span><span class="annotation">: bool</span>
+            <span class="name">stat_with_if_match</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.create_dir"></a>
+    <a class="headerlink" href="#Capability.stat_with_if_match"></a>
     
-            <div class="docstring"><p>If operator supports create dir.</p>
+            <div class="docstring"><p>If operator supports stat with if match.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.presign_stat" class="classattr">
+                            <div id="Capability.list_with_start_after" class="classattr">
                                 <div class="attr variable">
-            <span class="name">presign_stat</span><span class="annotation">: bool</span>
+            <span class="name">list_with_start_after</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.presign_stat"></a>
+    <a class="headerlink" href="#Capability.list_with_start_after"></a>
     
-            <div class="docstring"><p>If operator supports presign stat.</p>
+            <div class="docstring"><p>If backend supports list with start after.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.list_with_recursive" class="classattr">
+                            <div id="Capability.batch" class="classattr">
                                 <div class="attr variable">
-            <span class="name">list_with_recursive</span><span class="annotation">: bool</span>
+            <span class="name">batch</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.list_with_recursive"></a>
+    <a class="headerlink" href="#Capability.batch"></a>
     
-            <div class="docstring"><p>If backend supports list without delimiter.</p>
+            <div class="docstring"><p>If operator supports batch.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.blocking" class="classattr">
+                            <div id="Capability.batch_delete" class="classattr">
                                 <div class="attr variable">
-            <span class="name">blocking</span><span class="annotation">: bool</span>
+            <span class="name">batch_delete</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.blocking"></a>
+    <a class="headerlink" href="#Capability.batch_delete"></a>
     
-            <div class="docstring"><p>If operator supports blocking.</p>
+            <div class="docstring"><p>If operator supports batch delete.</p>
 </div>
 
 
@@ -1905,28 +1905,28 @@ by current Operator.</p>
 
 
                             </div>
-                            <div id="Capability.read_with_range" class="classattr">
+                            <div id="Capability.list_with_recursive" class="classattr">
                                 <div class="attr variable">
-            <span class="name">read_with_range</span><span class="annotation">: bool</span>
+            <span class="name">list_with_recursive</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.read_with_range"></a>
+    <a class="headerlink" href="#Capability.list_with_recursive"></a>
     
-            <div class="docstring"><p>If operator supports read with range.</p>
+            <div class="docstring"><p>If backend supports list without delimiter.</p>
 </div>
 
 
                             </div>
-                            <div id="Capability.batch" class="classattr">
+                            <div id="Capability.blocking" class="classattr">
                                 <div class="attr variable">
-            <span class="name">batch</span><span class="annotation">: bool</span>
+            <span class="name">blocking</span><span class="annotation">: bool</span>
 
         
     </div>
-    <a class="headerlink" href="#Capability.batch"></a>
+    <a class="headerlink" href="#Capability.blocking"></a>
     
-            <div class="docstring"><p>If operator supports batch.</p>
+            <div class="docstring"><p>If operator supports blocking.</p>
 </div>
 
 
diff --git a/docs/python/search.js b/docs/python/search.js
index 8bf642b9c9..f5009338ef 100644
--- a/docs/python/search.js
+++ b/docs/python/search.js
@@ -1,6 +1,6 @@
 window.pdocSearch = (function(){
 /** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.wa [...]
-    /** pdoc search index */const docs = {"version": "0.9.5", "fields": ["qualname", "fullname", "annotation", "default_value", "signature", "bases", "doc"], "ref": "fullname", "documentStore": {"docs": {"opendal": {"fullname": "opendal", "modulename": "opendal", "kind": "module", "doc": "<p>Apache OpenDAL\u2122 Python binding</p>\n\n<h2 id=\"installation\">Installation</h2>\n\n<div class=\"pdoc-code codehilite\">\n<pre><span></span><code>pip<span class=\"w\"> </span>install<span class=\ [...]
+    /** pdoc search index */const docs = {"version": "0.9.5", "fields": ["qualname", "fullname", "annotation", "default_value", "signature", "bases", "doc"], "ref": "fullname", "documentStore": {"docs": {"opendal": {"fullname": "opendal", "modulename": "opendal", "kind": "module", "doc": "<p>Apache OpenDAL\u2122 Python binding</p>\n\n<h2 id=\"installation\">Installation</h2>\n\n<div class=\"pdoc-code codehilite\">\n<pre><span></span><code>pip<span class=\"w\"> </span>install<span class=\ [...]
 
     // mirrored in build-search-index.js (part 1)
     // Also split on html tags. this is a cheap heuristic, but good enough.
diff --git a/docs/quickstart/index.html b/docs/quickstart/index.html
index 37e5a245b9..5f0423c750 100644
--- a/docs/quickstart/index.html
+++ b/docs/quickstart/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Quickstart | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/quickstart"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh=" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.748ad4ff.css">
-<script src="/assets/js/runtime~main.acae46ca.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.b10cd7eb.js" defer="defer"></script>
 <script src="/assets/js/main.82fd696c.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
@@ -53,6 +53,6 @@
 <div class="language-shell codeBlockContainer_MfrX theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent__QvJ"><pre tabindex="0" class="prism-code language-shell codeBlock_xMeh thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_lAHS"><span class="token-line" style="color:#393A34"><span class="token plain">npm install opendal</span><br></span></code></pre><div class="buttonGroup_fpPU"><button t [...]
 <h3 class="anchor anchorWithStickyNavbar_VwHQ" id="demo-3">Demo<a href="#demo-3" class="hash-link" aria-label="Direct link to Demo" title="Direct link to Demo">​</a></h3>
 <p>Try it out:</p>
-<div class="language-javascript codeBlockContainer_MfrX theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent__QvJ"><pre tabindex="0" class="prism-code language-javascript codeBlock_xMeh thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_lAHS"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span>< [...]
+<div class="language-javascript codeBlockContainer_MfrX theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent__QvJ"><pre tabindex="0" class="prism-code language-javascript codeBlock_xMeh thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_lAHS"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span>< [...]
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/rust/opendal/all.html b/docs/rust/opendal/all.html
index a0cb6f6917..1280e4652b 100644
--- a/docs/rust/opendal/all.html
+++ b/docs/rust/opendal/all.html
@@ -1,2 +1,2 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="List of all items in this crate"><title>List of all items in this crate</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.fi [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../help.html" title="help">?</a></div><div id="se [...]
\ No newline at end of file
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../help.html" title="help">?</a></div><div id="se [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/enum.EntryMode.html b/docs/rust/opendal/enum.EntryMode.html
index 23201ffcb4..56a75134ea 100644
--- a/docs/rust/opendal/enum.EntryMode.html
+++ b/docs/rust/opendal/enum.EntryMode.html
@@ -9,7 +9,7 @@
 </div><section id="variant.Unknown" class="variant"><a href="#variant.Unknown" class="anchor">§</a><h3 class="code-header">Unknown</h3></section><div class="docblock"><p>Unknown means we don’t know what we can do on this path.</p>
 </div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-EntryMode" class="impl"><a class="src rightside" href="../src/opendal/types/mode.rs.html#32-52">source</a><a href="#impl-EntryMode" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.EntryMode.html" title="enum opendal::EntryMode">En [...]
 </div></details><details class="toggle method-toggle" open><summary><section id="method.is_dir" class="method"><a class="src rightside" href="../src/opendal/types/mode.rs.html#39-41">source</a><h4 class="code-header">pub fn <a href="#method.is_dir" class="fn">is_dir</a>(self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Check if this mode is DIR.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-EntryMode" class="impl"><a class="src rightside" href="../src/opendal/types/mode.rs.html#22">source</a><a href="#impl-Clone-for-EntryMode" class="anchor">§</a><h3 class="code-header">impl <a class=" [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-EntryMode" class="impl"><a class="src rightside" href="../src/opendal/types/mode.rs.html#22">source</a><a href="#impl-Clone-for-EntryMode" class="anchor">§</a><h3 class="code-header">impl <a class=" [...]
 by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#242">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
 sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Copy-for-EntryMode" class="impl"><a class="src rightside" href="../src/opendal/types/mode.rs.html#22">source</a><a href="#impl-Copy-for-EntryMode" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a> for <a class="enum" href="enum.EntryMode.html" title [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
diff --git a/docs/rust/opendal/enum.ErrorKind.html b/docs/rust/opendal/enum.ErrorKind.html
index 6e9c167df3..20f9bf79a1 100644
--- a/docs/rust/opendal/enum.ErrorKind.html
+++ b/docs/rust/opendal/enum.ErrorKind.html
@@ -52,7 +52,7 @@ So users could to handle this error by themselves.</p>
 </div><section id="variant.InvalidInput" class="variant"><a href="#variant.InvalidInput" class="anchor">§</a><h3 class="code-header">InvalidInput</h3></section><div class="docblock"><p>The input is invalid.</p>
 <p>For example, user try to seek to a negative position</p>
 </div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ErrorKind" class="impl"><a class="src rightside" href="../src/opendal/types/error.rs.html#110-115">source</a><a href="#impl-ErrorKind" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.ErrorKind.html" title="enum opendal::ErrorKind" [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ErrorKind" class="impl"><a class="src rightside" href="../src/opendal/types/error.rs.html#50">source</a><a href="#impl-Clone-for-ErrorKind" class="anchor">§</a><h3 class="code-header">impl <a class= [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ErrorKind" class="impl"><a class="src rightside" href="../src/opendal/types/error.rs.html#50">source</a><a href="#impl-Clone-for-ErrorKind" class="anchor">§</a><h3 class="code-header">impl <a class= [...]
 by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#242">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
 sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Copy-for-ErrorKind" class="impl"><a class="src rightside" href="../src/opendal/types/error.rs.html#50">source</a><a href="#impl-Copy-for-ErrorKind" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a> for <a class="enum" href="enum.ErrorKind.html" titl [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
diff --git a/docs/rust/opendal/enum.Metakey.html b/docs/rust/opendal/enum.Metakey.html
index bbac6762a6..f10c767e75 100644
--- a/docs/rust/opendal/enum.Metakey.html
+++ b/docs/rust/opendal/enum.Metakey.html
@@ -32,9 +32,9 @@ already contains all metadata.</p>
 </div><section id="variant.Etag" class="variant"><a href="#variant.Etag" class="anchor">§</a><h3 class="code-header">Etag</h3></section><div class="docblock"><p>Key for etag.</p>
 </div><section id="variant.LastModified" class="variant"><a href="#variant.LastModified" class="anchor">§</a><h3 class="code-header">LastModified</h3></section><div class="docblock"><p>Key for last modified.</p>
 </div><section id="variant.Version" class="variant"><a href="#variant.Version" class="anchor">§</a><h3 class="code-header">Version</h3></section><div class="docblock"><p>Key for version.</p>
-</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BitAnd%3CR%3E-for-Metakey" class="impl"><a class="src rightside" href="../src/opendal/types/metadata.rs.html#515-555">source</a><a href="#impl-BitAnd%3CR%3E-for-Metakey" class="anchor">§</a><h3 class="code-header">impl&lt;R: <a class= [...]
+</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BitAnd%3CR%3E-for-Metakey" class="impl"><a class="src rightside" href="../src/opendal/types/metadata.rs.html#515-555">source</a><a href="#impl-BitAnd%3CR%3E-for-Metakey" class="anchor">§</a><h3 class="code-header">impl&lt;R: <a class= [...]
 by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#242">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
-sufficient, and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Rem%3CR%3E-for-Metakey" class="impl"><a class="src rightside" href="../src/opendal/types/metadata.rs.html#515-555">source</a><a href="#impl-Rem%3CR%3E-for-Metakey" class="anchor">§</a><h3 class="code-header">impl&lt;R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait [...]
+sufficient, and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Rem%3CR%3E-for-Metakey" class="impl"><a class="src rightside" href="../src/opendal/types/metadata.rs.html#515-555">source</a><a href="#impl-Rem%3CR%3E-for-Metakey" class="anchor">§</a><h3 class="code-header">impl&lt;R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/docs/rust/opendal/enum.Scheme.html b/docs/rust/opendal/enum.Scheme.html
index 242b97ef26..56979caeee 100644
--- a/docs/rust/opendal/enum.Scheme.html
+++ b/docs/rust/opendal/enum.Scheme.html
@@ -147,7 +147,7 @@ This function returns all enabled schemes so users can make decisions based on i
 <span class="kw">if </span>!enabled_schemes.contains(<span class="kw-2">&amp;</span>Scheme::Memory) {
     <span class="macro">panic!</span>(<span class="string">"s3 support is not enabled"</span>)
 }</code></pre></div>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Scheme" class="impl"><a class="src rightside" href="../src/opendal/types/scheme.rs.html#32">source</a><a href="#impl-Clone-for-Scheme" class="anchor">§</a><h3 class="code-header">impl <a class="trai [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Scheme" class="impl"><a class="src rightside" href="../src/opendal/types/scheme.rs.html#32">source</a><a href="#impl-Clone-for-Scheme" class="anchor">§</a><h3 class="code-header">impl <a class="trai [...]
     H: <a class="trait" href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher">Hasher</a>,
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></d [...]
 by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#242">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
diff --git a/docs/rust/opendal/layers/struct.BlockingLayer.html b/docs/rust/opendal/layers/struct.BlockingLayer.html
index 8a2394e7f3..1a8258b5e9 100644
--- a/docs/rust/opendal/layers/struct.BlockingLayer.html
+++ b/docs/rust/opendal/layers/struct.BlockingLayer.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Add blocking API support for non-blocking services."><title>BlockingLayer in opendal::layers - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
 <h2 id="notes"><a href="#notes">Notes</a></h2>
 <ul>
 <li>Please only enable this layer when the underlying service does not support blocking.</li>
@@ -97,8 +97,8 @@ runtime on demand.</p>
 
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/blocking.rs.html#145-153">source</a><a href="#impl-BlockingLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.BlockingLayer.html" titl [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-BlockingLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/blocking.rs.html#140">source</a><a href="#impl-Clone-for-BlockingLayer" class="anchor">§</a><h3 class="code-header [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/blocking.rs.html#144-152">source</a><a href="#impl-BlockingLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.BlockingLayer.html" titl [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-BlockingLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/blocking.rs.html#139">source</a><a href="#impl-Clone-for-BlockingLayer" class="anchor">§</a><h3 class="code-header [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/docs/rust/opendal/layers/struct.ChaosLayer.html b/docs/rust/opendal/layers/struct.ChaosLayer.html
index b2ea1bfb5a..53e20c2aa5 100644
--- a/docs/rust/opendal/layers/struct.ChaosLayer.html
+++ b/docs/rust/opendal/layers/struct.ChaosLayer.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Inject chaos into underlying services for robustness test."><title>ChaosLayer in opendal::layers - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/wo [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
 <h2 id="chaos"><a href="#chaos">Chaos</a></h2>
 <p>Chaos tests is a part of stress test. By generating errors at specified
 error ratio, we can reproduce underlying services error more reliable.</p>
@@ -20,10 +20,10 @@ be added in the future.</p>
     .expect(<span class="string">"must init"</span>)
     .layer(ChaosLayer::new(<span class="number">0.1</span>))
     .finish();</code></pre></div>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ChaosLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/chaos.rs.html#67-80">source</a><a href="#impl-ChaosLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ChaosLayer.html" title="struct open [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ChaosLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/chaos.rs.html#65-78">source</a><a href="#impl-ChaosLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ChaosLayer.html" title="struct open [...]
 <h5 id="panics"><a href="#panics">Panics</a></h5>
 <p>Input error_ratio must in [0.0..=1.0]</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ChaosLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/chaos.rs.html#62">source</a><a href="#impl-Clone-for-ChaosLayer" class="anchor">§</a><h3 class="code-header">impl <a  [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ChaosLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/chaos.rs.html#60">source</a><a href="#impl-Clone-for-ChaosLayer" class="anchor">§</a><h3 class="code-header">impl <a  [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/docs/rust/opendal/layers/struct.MadsimLayer.html b/docs/rust/opendal/layers/struct.MadsimLayer.html
index 44f7fc9129..d1e5131690 100644
--- a/docs/rust/opendal/layers/struct.MadsimLayer.html
+++ b/docs/rust/opendal/layers/struct.MadsimLayer.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Add deterministic simulation for async operations, powered by `madsim`."><title>MadsimLayer in opendal::layers - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
 <h2 id="note"><a href="#note">Note</a></h2>
 <ul>
 <li>blocking operations are not supported, as <a href="https://docs.rs/madsim/latest/madsim/"><code>madsim</code></a> is async only.</li>
@@ -47,8 +47,8 @@
 }</code></pre></div>
 <p>To enable logging output, please set <code>RUSTFLAGS=&quot;--cfg madsim&quot;</code>:</p>
 <div class="example-wrap"><pre class="language-shell"><code>RUSTFLAGS=&quot;--cfg madsim&quot; cargo test
-</code></pre></div></div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-MadsimLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/madsim.rs.html#106-120">source</a><a href="#impl-MadsimLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.MadsimLayer [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-MadsimLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/madsim.rs.html#100">source</a><a href="#impl-Clone-for-MadsimLayer" class="anchor">§</a><h3 class="code-header">impl [...]
+</code></pre></div></div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-MadsimLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/madsim.rs.html#107-121">source</a><a href="#impl-MadsimLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.MadsimLayer [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-MadsimLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/madsim.rs.html#101">source</a><a href="#impl-Clone-for-MadsimLayer" class="anchor">§</a><h3 class="code-header">impl [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/docs/rust/opendal/layers/struct.MadsimServer.html b/docs/rust/opendal/layers/struct.MadsimServer.html
index 879d630e26..d1656d2875 100644
--- a/docs/rust/opendal/layers/struct.MadsimServer.html
+++ b/docs/rust/opendal/layers/struct.MadsimServer.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A simulated server.This an experimental feature, docs are not ready yet."><title>MadsimServer in opendal::layers - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="fon [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-MadsimServer" class="impl"><a class="src rightside" href="../../src/opendal/layers/madsim.rs.html#347-381">source</a><a href="#impl-MadsimServer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.MadsimServer.html" title="st [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-MadsimServer" class="impl"><a class="src rightside" href="../../src/opendal/layers/madsim.rs.html#344">source</a><a href="#impl-Clone-for-MadsimServer" class="anchor">§</a><h3 class="code-header">im [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-MadsimServer" class="impl"><a class="src rightside" href="../../src/opendal/layers/madsim.rs.html#340-374">source</a><a href="#impl-MadsimServer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.MadsimServer.html" title="st [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-MadsimServer" class="impl"><a class="src rightside" href="../../src/opendal/layers/madsim.rs.html#337">source</a><a href="#impl-Clone-for-MadsimServer" class="anchor">§</a><h3 class="code-header">im [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/docs/rust/opendal/raw/enum.AsyncBody.html b/docs/rust/opendal/raw/enum.AsyncBody.html
index d4f56472e2..34338e60a0 100644
--- a/docs/rust/opendal/raw/enum.AsyncBody.html
+++ b/docs/rust/opendal/raw/enum.AsyncBody.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Body used in async HTTP requests."><title>AsyncBody in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../ [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
     Empty,
     Bytes(Bytes),
     ChunkedBytes(<a class="struct" href="oio/struct.ChunkedBytes.html" title="struct opendal::raw::oio::ChunkedBytes">ChunkedBytes</a>),
@@ -10,7 +10,7 @@
 </div><section id="variant.ChunkedBytes" class="variant"><a href="#variant.ChunkedBytes" class="anchor">§</a><h3 class="code-header">ChunkedBytes(<a class="struct" href="oio/struct.ChunkedBytes.html" title="struct opendal::raw::oio::ChunkedBytes">ChunkedBytes</a>)</h3></section><div class="docblock"><p>Body with chunked bytes.</p>
 <p>This is nearly the same with stream, but we can save an extra box.</p>
 </div><section id="variant.Stream" class="variant"><a href="#variant.Stream" class="anchor">§</a><h3 class="code-header">Stream(<a class="type" href="oio/type.Streamer.html" title="type opendal::raw::oio::Streamer">Streamer</a>)</h3></section><div class="docblock"><p>Body with stream.</p>
-</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Default-for-AsyncBody" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/body.rs.html#33">source</a><a href="#impl-Default-for-AsyncBody" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href [...]
+</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Default-for-AsyncBody" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/body.rs.html#31">source</a><a href="#impl-Default-for-AsyncBody" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/docs/rust/opendal/raw/enum.FourWays.html b/docs/rust/opendal/raw/enum.FourWays.html
index 15aa565eb4..fc6e0deab2 100644
--- a/docs/rust/opendal/raw/enum.FourWays.html
+++ b/docs/rust/opendal/raw/enum.FourWays.html
@@ -1,5 +1,5 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="FourWays is used to implement traits that based on four ways."><title>FourWays in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="FourWays is used to implement traits that based on four ways."><title>FourWays in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
     One(ONE),
     Two(TWO),
     Three(THREE),
@@ -10,31 +10,23 @@
 </div><section id="variant.Two" class="variant"><a href="#variant.Two" class="anchor">§</a><h3 class="code-header">Two(TWO)</h3></section><div class="docblock"><p>The second type for the <a href="enum.FourWays.html" title="enum opendal::raw::FourWays"><code>FourWays</code></a>.</p>
 </div><section id="variant.Three" class="variant"><a href="#variant.Three" class="anchor">§</a><h3 class="code-header">Three(THREE)</h3></section><div class="docblock"><p>The third type for the <a href="enum.FourWays.html" title="enum opendal::raw::FourWays"><code>FourWays</code></a>.</p>
 </div><section id="variant.Four" class="variant"><a href="#variant.Four" class="anchor">§</a><h3 class="code-header">Four(FOUR)</h3></section><div class="docblock"><p>The fourth type for the <a href="enum.FourWays.html" title="enum opendal::raw::FourWays"><code>FourWays</code></a>.</p>
-</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingList-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#324-339">source</a><a href="#impl-BlockingList-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class=" [...]
+</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingList-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#300-315">source</a><a href="#impl-BlockingList-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class=" [...]
     ONE: <a class="trait" href="oio/trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,
     TWO: <a class="trait" href="oio/trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,
     THREE: <a class="trait" href="oio/trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,
-    FOUR: <a class="trait" href="oio/trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#331-338">source</a><a href="#method.next" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.BlockingList.html#tymethod.n [...]
+    FOUR: <a class="trait" href="oio/trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#307-314">source</a><a href="#method.next" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.BlockingList.html#tymethod.n [...]
     ONE: <a class="trait" href="oio/trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,
     TWO: <a class="trait" href="oio/trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,
     THREE: <a class="trait" href="oio/trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,
-    FOUR: <a class="trait" href="oio/trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#279-286">source</a><a href="#method.read" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.BlockingRead.html#tymethod.r [...]
+    FOUR: <a class="trait" href="oio/trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#255-262">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.BlockingRead.html#tymeth [...]
     ONE: <a class="trait" href="oio/trait.List.html" title="trait opendal::raw::oio::List">List</a>,
     TWO: <a class="trait" href="oio/trait.List.html" title="trait opendal::raw::oio::List">List</a>,
     THREE: <a class="trait" href="oio/trait.List.html" title="trait opendal::raw::oio::List">List</a>,
-    FOUR: <a class="trait" href="oio/trait.List.html" title="trait opendal::raw::oio::List">List</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_next-1" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#314-321">source</a><a href="#method.poll_next-1" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.List.html#tymethod.poll_next" class="f [...]
+    FOUR: <a class="trait" href="oio/trait.List.html" title="trait opendal::raw::oio::List">List</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_next" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#290-297">source</a><a href="#method.poll_next" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.List.html#tymethod.poll_next" class="fn">p [...]
     ONE: <a class="trait" href="oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,
     TWO: <a class="trait" href="oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,
     THREE: <a class="trait" href="oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,
-    FOUR: <a class="trait" href="oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_read" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#244-251">source</a><a href="#method.poll_read" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.Read.html#tymethod.poll_read" class="fn">p [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="metho [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="oio/trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="t [...]
+    FOUR: <a class="trait" href="oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.seek" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#229-236">source</a><a href="#method.seek" class="anchor">§</a><h4 class="code-header">async fn <a href="oio/trait.Read.html#tymethod.seek" class="fn">seek</a>(& [...]
     FOUR: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
     ONE: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
     THREE: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
@@ -117,11 +109,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.ReadExt.html#method.read" class="fn">read</a>&lt; [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;B&gt;,
     B: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Immutable access to the <code>Borrow&lt;B&gt;</code> of a value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.tap_borrow_mut" class="method trait-impl"><a href="#method.tap_borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;B&gt;,
diff --git a/docs/rust/opendal/raw/enum.ThreeWays.html b/docs/rust/opendal/raw/enum.ThreeWays.html
index 94014ee601..005bb4649c 100644
--- a/docs/rust/opendal/raw/enum.ThreeWays.html
+++ b/docs/rust/opendal/raw/enum.ThreeWays.html
@@ -1,5 +1,5 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="ThreeWays is used to implement traits that based on three ways."><title>ThreeWays in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/w [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="ThreeWays is used to implement traits that based on three ways."><title>ThreeWays in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/w [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
     One(ONE),
     Two(TWO),
     Three(THREE),
@@ -8,19 +8,11 @@
 </div></details><h2 id="variants" class="variants section-header">Variants<a href="#variants" class="anchor">§</a></h2><div class="variants"><section id="variant.One" class="variant"><a href="#variant.One" class="anchor">§</a><h3 class="code-header">One(ONE)</h3></section><div class="docblock"><p>The first type for the <a href="enum.ThreeWays.html" title="enum opendal::raw::ThreeWays"><code>ThreeWays</code></a>.</p>
 </div><section id="variant.Two" class="variant"><a href="#variant.Two" class="anchor">§</a><h3 class="code-header">Two(TWO)</h3></section><div class="docblock"><p>The second type for the <a href="enum.ThreeWays.html" title="enum opendal::raw::ThreeWays"><code>ThreeWays</code></a>.</p>
 </div><section id="variant.Three" class="variant"><a href="#variant.Three" class="anchor">§</a><h3 class="code-header">Three(THREE)</h3></section><div class="docblock"><p>The third type for the <a href="enum.ThreeWays.html" title="enum opendal::raw::ThreeWays"><code>ThreeWays</code></a>.</p>
-</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-ThreeWays%3CONE,+TWO,+THREE%3E" class="impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#167-193">source</a><a href="#impl-BlockingRead-for-ThreeWays%3CONE,+TWO,+THREE%3E" class="anchor">§< [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="metho [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="oio/trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="t [...]
+</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-ThreeWays%3CONE,+TWO,+THREE%3E" class="impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#152-178">source</a><a href="#impl-BlockingRead-for-ThreeWays%3CONE,+TWO,+THREE%3E" class="anchor">§< [...]
     &amp;mut self,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     bs: &amp;dyn <a class="trait" href="oio/trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="oio/trait.Write.html#tymethod.poll_write">Read more</a></div></details>< [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="oio/trait.Write.html#tymethod.poll_write">Read more</a></div></details>< [...]
     ONE: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
     THREE: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
     TWO: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-ThreeWays%3CONE,+TWO,+THREE%3E" class="impl"><a href="#impl-Send-for-ThreeWays%3CONE,+TWO,+THREE%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE, TWO, THREE&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html [...]
@@ -97,11 +89,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.ReadExt.html#method.read" class="fn">read</a>&lt; [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;B&gt;,
     B: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Immutable access to the <code>Borrow&lt;B&gt;</code> of a value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.tap_borrow_mut" class="method trait-impl"><a href="#method.tap_borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;B&gt;,
diff --git a/docs/rust/opendal/raw/enum.TwoWays.html b/docs/rust/opendal/raw/enum.TwoWays.html
index beebd005fe..39ece9b8a8 100644
--- a/docs/rust/opendal/raw/enum.TwoWays.html
+++ b/docs/rust/opendal/raw/enum.TwoWays.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="TwoWays is used to implement traits that based on two ways."><title>TwoWays in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2"  [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="TwoWays is used to implement traits that based on two ways."><title>TwoWays in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2"  [...]
     <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
     One(ONE),
     Two(TWO),
@@ -6,19 +6,11 @@
 <p>Users can wrap two different trait types together.</p>
 </div></details><h2 id="variants" class="variants section-header">Variants<a href="#variants" class="anchor">§</a></h2><div class="variants"><section id="variant.One" class="variant"><a href="#variant.One" class="anchor">§</a><h3 class="code-header">One(ONE)</h3></section><div class="docblock"><p>The first type for the <a href="enum.TwoWays.html" title="enum opendal::raw::TwoWays"><code>TwoWays</code></a>.</p>
 </div><section id="variant.Two" class="variant"><a href="#variant.Two" class="anchor">§</a><h3 class="code-header">Two(TWO)</h3></section><div class="docblock"><p>The second type for the <a href="enum.TwoWays.html" title="enum opendal::raw::TwoWays"><code>TwoWays</code></a>.</p>
-</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-TwoWays%3CONE,+TWO%3E" class="impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#83-104">source</a><a href="#impl-BlockingRead-for-TwoWays%3CONE,+TWO%3E" class="anchor">§</a><h3 class="code- [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="metho [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="oio/trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="t [...]
+</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-TwoWays%3CONE,+TWO%3E" class="impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#76-97">source</a><a href="#impl-BlockingRead-for-TwoWays%3CONE,+TWO%3E" class="anchor">§</a><h3 class="code-h [...]
     &amp;mut self,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     bs: &amp;dyn <a class="trait" href="oio/trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="oio/trait.Write.html#tymethod.poll_write">Read more</a></div></details>< [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="oio/trait.Write.html#tymethod.poll_write">Read more</a></div></details>< [...]
     ONE: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
     TWO: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-TwoWays%3CONE,+TWO%3E" class="impl"><a href="#impl-Send-for-TwoWays%3CONE,+TWO%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE, TWO&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::mark [...]
     ONE: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,
@@ -90,11 +82,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.ReadExt.html#method.read" class="fn">read</a>&lt; [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;B&gt;,
     B: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Immutable access to the <code>Borrow&lt;B&gt;</code> of a value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.tap_borrow_mut" class="method trait-impl"><a href="#method.tap_borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;B&gt;,
diff --git a/docs/rust/opendal/raw/fn.new_std_io_error.html b/docs/rust/opendal/raw/fn.new_std_io_error.html
index 6f633d26cb..243761cf1d 100644
--- a/docs/rust/opendal/raw/fn.new_std_io_error.html
+++ b/docs/rust/opendal/raw/fn.new_std_io_error.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Parse std io error into opendal::Error."><title>new_std_io_error in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
 <h2 id="todo"><a href="#todo">TODO</a></h2>
 <p>Add <code>NotADirectory</code> and <code>IsADirectory</code> once they are stable.</p>
 <p>ref: <a href="https://github.com/rust-lang/rust/issues/86442">https://github.com/rust-lang/rust/issues/86442</a></p>
diff --git a/docs/rust/opendal/raw/futures_util/type.BoxedStaticFuture.html b/docs/rust/opendal/raw/futures_util/type.BoxedStaticFuture.html
new file mode 100644
index 0000000000..ef8dbc974c
--- /dev/null
+++ b/docs/rust/opendal/raw/futures_util/type.BoxedStaticFuture.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" content="0;URL=../../../opendal/raw/type.BoxedStaticFuture.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a href="../../../opendal/raw/type.BoxedStaticFuture.html">../../../opendal/raw/type.BoxedStaticFuture.html</a>...</p>
+    <script>location.replace("../../../opendal/raw/type.BoxedStaticFuture.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/index.html b/docs/rust/opendal/raw/index.html
index 50b311317a..86d56bc6a9 100644
--- a/docs/rust/opendal/raw/index.html
+++ b/docs/rust/opendal/raw/index.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Raw modules provide raw APIs that used by underlying services"><title>opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorig [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
 <h3 id="notes"><a href="#notes">Notes</a></h3>
 <ul>
 <li>Only developers who want to develop new services or layers need to
@@ -11,4 +11,4 @@ them whenever possible.</li>
 </ul>
 </div></details><h2 id="modules" class="section-header"><a href="#modules">Modules</a></h2><ul class="item-table"><li><div class="item-name"><a class="mod" href="adapters/index.html" title="mod opendal::raw::adapters">adapters</a></div><div class="desc docblock-short">Providing adapters and its implementations.</div></li><li><div class="item-name"><a class="mod" href="oio/index.html" title="mod opendal::raw::oio">oio</a></div><div class="desc docblock-short"><code>oio</code> provides Ope [...]
 output.</div></li><li><div class="item-name"><a class="mod" href="tests/index.html" title="mod opendal::raw::tests">tests</a><span class="stab portability" title="Available on crate feature `tests` only"><code>tests</code></span></div><div class="desc docblock-short">Utilities for opendal testing.</div></li></ul><h2 id="structs" class="section-header"><a href="#structs">Structs</a></h2><ul class="item-table"><li><div class="item-name"><a class="struct" href="struct.AccessorInfo.html" tit [...]
-method to inner.</div></li><li><div class="item-name"><a class="trait" href="trait.Part.html" title="trait opendal::raw::Part">Part</a></div><div class="desc docblock-short">Part is a trait for multipart part.</div></li><li><div class="item-name"><a class="trait" href="trait.PathQuery.html" title="trait opendal::raw::PathQuery">PathQuery</a><span class="stab portability" title="Available on crate feature `internal-path-cache` only"><code>internal-path-cache</code></span></div><div class= [...]
\ No newline at end of file
+method to inner.</div></li><li><div class="item-name"><a class="trait" href="trait.Part.html" title="trait opendal::raw::Part">Part</a></div><div class="desc docblock-short">Part is a trait for multipart part.</div></li><li><div class="item-name"><a class="trait" href="trait.PathQuery.html" title="trait opendal::raw::PathQuery">PathQuery</a><span class="stab portability" title="Available on crate feature `internal-path-cache` only"><code>internal-path-cache</code></span></div><div class= [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/enum.ReadOperation.html b/docs/rust/opendal/raw/oio/enum.ReadOperation.html
index 3ebebf693b..54f169174d 100644
--- a/docs/rust/opendal/raw/oio/enum.ReadOperation.html
+++ b/docs/rust/opendal/raw/oio/enum.ReadOperation.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="PageOperation is the name for APIs of lister."><title>ReadOperation in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2"  [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
     Read,
     Seek,
     Next,
@@ -7,18 +7,18 @@
     BlockingSeek,
     BlockingNext,
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>PageOperation is the name for APIs of lister.</p>
-</div></details><h2 id="variants" class="variants section-header">Variants (Non-exhaustive)<a href="#variants" class="anchor">§</a></h2><details class="toggle non-exhaustive"><summary class="hideme"><span>This enum is marked as non-exhaustive</span></summary><div class="docblock">Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.</di [...]
-</div><section id="variant.Seek" class="variant"><a href="#variant.Seek" class="anchor">§</a><h3 class="code-header">Seek</h3></section><div class="docblock"><p>Operation for <a href="trait.Read.html#tymethod.poll_seek" title="method opendal::raw::oio::Read::poll_seek"><code>Read::poll_seek</code></a></p>
-</div><section id="variant.Next" class="variant"><a href="#variant.Next" class="anchor">§</a><h3 class="code-header">Next</h3></section><div class="docblock"><p>Operation for <a href="trait.Read.html#tymethod.poll_next" title="method opendal::raw::oio::Read::poll_next"><code>Read::poll_next</code></a></p>
+</div></details><h2 id="variants" class="variants section-header">Variants (Non-exhaustive)<a href="#variants" class="anchor">§</a></h2><details class="toggle non-exhaustive"><summary class="hideme"><span>This enum is marked as non-exhaustive</span></summary><div class="docblock">Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.</di [...]
+</div><section id="variant.Seek" class="variant"><a href="#variant.Seek" class="anchor">§</a><h3 class="code-header">Seek</h3></section><div class="docblock"><p>Operation for [<code>Read::poll_seek</code>]</p>
+</div><section id="variant.Next" class="variant"><a href="#variant.Next" class="anchor">§</a><h3 class="code-header">Next</h3></section><div class="docblock"><p>Operation for [<code>Read::poll_next</code>]</p>
 </div><section id="variant.BlockingRead" class="variant"><a href="#variant.BlockingRead" class="anchor">§</a><h3 class="code-header">BlockingRead</h3></section><div class="docblock"><p>Operation for <a href="trait.BlockingRead.html#tymethod.read" title="method opendal::raw::oio::BlockingRead::read"><code>BlockingRead::read</code></a></p>
 </div><section id="variant.BlockingSeek" class="variant"><a href="#variant.BlockingSeek" class="anchor">§</a><h3 class="code-header">BlockingSeek</h3></section><div class="docblock"><p>Operation for <a href="trait.BlockingRead.html#tymethod.seek" title="method opendal::raw::oio::BlockingRead::seek"><code>BlockingRead::seek</code></a></p>
 </div><section id="variant.BlockingNext" class="variant"><a href="#variant.BlockingNext" class="anchor">§</a><h3 class="code-header">BlockingNext</h3></section><div class="docblock"><p>Operation for <a href="trait.BlockingRead.html#tymethod.next" title="method opendal::raw::oio::BlockingRead::next"><code>BlockingRead::next</code></a></p>
-</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ReadOperation" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#50-55">source</a><a href="#impl-ReadOperation" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.ReadOperation.html" title="enu [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ReadOperation" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#33">source</a><a href="#impl-Clone-for-ReadOperation" class="anchor">§</a><h3 class="code-hea [...]
+</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ReadOperation" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#48-53">source</a><a href="#impl-ReadOperation" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.ReadOperation.html" title="enu [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ReadOperation" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#31">source</a><a href="#impl-Clone-for-ReadOperation" class="anchor">§</a><h3 class="code-hea [...]
     H: <a class="trait" href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher">Hasher</a>,
-    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></d [...]
+    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></d [...]
 by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#242">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
-sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Copy-for-ReadOperation" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#33">source</a><a href="#impl-Copy-for-ReadOperation" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a> for <a class="enum" href="enum.R [...]
+sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Copy-for-ReadOperation" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#31">source</a><a href="#impl-Copy-for-ReadOperation" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a> for <a class="enum" href="enum.R [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/docs/rust/opendal/raw/oio/enum.WriteOperation.html b/docs/rust/opendal/raw/oio/enum.WriteOperation.html
index 710b20e78c..ca4b2940dd 100644
--- a/docs/rust/opendal/raw/oio/enum.WriteOperation.html
+++ b/docs/rust/opendal/raw/oio/enum.WriteOperation.html
@@ -12,7 +12,7 @@
 </div><section id="variant.BlockingWrite" class="variant"><a href="#variant.BlockingWrite" class="anchor">§</a><h3 class="code-header">BlockingWrite</h3></section><div class="docblock"><p>Operation for <a href="trait.BlockingWrite.html#tymethod.write" title="method opendal::raw::oio::BlockingWrite::write"><code>BlockingWrite::write</code></a></p>
 </div><section id="variant.BlockingClose" class="variant"><a href="#variant.BlockingClose" class="anchor">§</a><h3 class="code-header">BlockingClose</h3></section><div class="docblock"><p>Operation for <a href="trait.BlockingWrite.html#tymethod.close" title="method opendal::raw::oio::BlockingWrite::close"><code>BlockingWrite::close</code></a></p>
 </div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-WriteOperation" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#45-50">source</a><a href="#impl-WriteOperation" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.WriteOperation.html" title= [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-WriteOperation" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#29">source</a><a href="#impl-Clone-for-WriteOperation" class="anchor">§</a><h3 class="code- [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-WriteOperation" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#29">source</a><a href="#impl-Clone-for-WriteOperation" class="anchor">§</a><h3 class="code- [...]
     H: <a class="trait" href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher">Hasher</a>,
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></d [...]
 by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#242">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
diff --git a/docs/rust/opendal/raw/oio/fn.into_read_from_stream.html b/docs/rust/opendal/raw/oio/fn.into_read_from_stream.html
index 8a579519eb..7c0bf7737d 100644
--- a/docs/rust/opendal/raw/oio/fn.into_read_from_stream.html
+++ b/docs/rust/opendal/raw/oio/fn.into_read_from_stream.html
@@ -1,3 +1,3 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Convert given stream `futures::Stream&lt;Item = Result&lt;Bytes&gt;&gt;` into `oio::Reader`."><title>into_read_from_stream in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf. [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
 </div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/fn.into_streamable_read.html b/docs/rust/opendal/raw/oio/fn.into_streamable_read.html
index e255772475..51760c4d05 100644
--- a/docs/rust/opendal/raw/oio/fn.into_streamable_read.html
+++ b/docs/rust/opendal/raw/oio/fn.into_streamable_read.html
@@ -1,3 +1,3 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="into_streamable is used to make `oio::Read` or `oio::BlockingRead` streamable."><title>into_streamable_read in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link re [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
 </div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/index.html b/docs/rust/opendal/raw/oio/index.html
index ab6fa1fb91..f50cab642c 100644
--- a/docs/rust/opendal/raw/oio/index.html
+++ b/docs/rust/opendal/raw/oio/index.html
@@ -17,4 +17,4 @@ care about the details of uploading blocks.</div></li><li><div class="item-name"
 uploads. By implementing MultipartWrite, services don’t need to
 care about the details of uploading parts.</div></li><li><div class="item-name"><a class="trait" href="trait.OneShotWrite.html" title="trait opendal::raw::oio::OneShotWrite">OneShotWrite</a></div><div class="desc docblock-short">OneShotWrite is used to implement [<code>Write</code>] based on one shot operation.
 By implementing OneShotWrite, services don’t need to care about the details.</div></li><li><div class="item-name"><a class="trait" href="trait.PageList.html" title="trait opendal::raw::oio::PageList">PageList</a></div><div class="desc docblock-short">PageList is used to implement [<code>List</code>] based on API supporting pagination. By implementing
-PageList, services don’t need to care about the details of page list.</div></li><li><div class="item-name"><a class="trait" href="trait.RangeWrite.html" title="trait opendal::raw::oio::RangeWrite">RangeWrite</a></div><div class="desc docblock-short">RangeWrite is used to implement [<code>Write</code>] based on range write.</div></li><li><div class="item-name"><a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a></div><div class="desc docblock-short">Read  [...]
\ No newline at end of file
+PageList, services don’t need to care about the details of page list.</div></li><li><div class="item-name"><a class="trait" href="trait.RangeWrite.html" title="trait opendal::raw::oio::RangeWrite">RangeWrite</a></div><div class="desc docblock-short">RangeWrite is used to implement [<code>Write</code>] based on range write.</div></li><li><div class="item-name"><a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a></div><div class="desc docblock-short">Read  [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/read/api/trait.ReadExt.html b/docs/rust/opendal/raw/oio/read/api/trait.ReadExt.html
deleted file mode 100644
index 8a30c9c49a..0000000000
--- a/docs/rust/opendal/raw/oio/read/api/trait.ReadExt.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/trait.ReadExt.html">
-    <title>Redirection</title>
-</head>
-<body>
-    <p>Redirecting to <a href="../../../../../opendal/raw/oio/trait.ReadExt.html">../../../../../opendal/raw/oio/trait.ReadExt.html</a>...</p>
-    <script>location.replace("../../../../../opendal/raw/oio/trait.ReadExt.html" + location.search + location.hash);</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/sidebar-items.js b/docs/rust/opendal/raw/oio/sidebar-items.js
index 684f7667e4..f343314324 100644
--- a/docs/rust/opendal/raw/oio/sidebar-items.js
+++ b/docs/rust/opendal/raw/oio/sidebar-items.js
@@ -1 +1 @@
-window.SIDEBAR_ITEMS = {"enum":["ListOperation","ReadOperation","WriteOperation"],"fn":["into_read_from_stream","into_stream","into_stream_from_reader","into_streamable_read"],"struct":["AdaptiveBuf","AppendWriter","BlockWriter","BufferReader","ChunkedBytes","Cursor","Entry","ExactBufWriter","FileReader","FlatLister","FromStreamReader","FuturesReader","HierarchyLister","LazyReader","MultipartPart","MultipartWriter","OneShotWriter","PageContext","PageLister","PrefixLister","RangeReader"," [...]
\ No newline at end of file
+window.SIDEBAR_ITEMS = {"enum":["ListOperation","ReadOperation","WriteOperation"],"fn":["into_read_from_stream","into_stream","into_stream_from_reader","into_streamable_read"],"struct":["AdaptiveBuf","AppendWriter","BlockWriter","BufferReader","ChunkedBytes","Cursor","Entry","ExactBufWriter","FileReader","FlatLister","FromStreamReader","FuturesReader","HierarchyLister","LazyReader","MultipartPart","MultipartWriter","OneShotWriter","PageContext","PageLister","PrefixLister","RangeReader"," [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/struct.BufferReader.html b/docs/rust/opendal/raw/oio/struct.BufferReader.html
index ba2fd0dbae..cc4e31aaa8 100644
--- a/docs/rust/opendal/raw/oio/struct.BufferReader.html
+++ b/docs/rust/opendal/raw/oio/struct.BufferReader.html
@@ -1,18 +1,10 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="BufferReader allows the underlying reader to fetch data at the buffer’s size and is used to amortize the IO’s overhead."><title>BufferReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="BufferReader allows the underlying reader to fetch data at the buffer’s size and is used to amortize the IO’s overhead."><title>BufferReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
 and is used to amortize the IO’s overhead.</p>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BufferReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/buffer_reader.rs.html#43-97">source</a><a href="#impl-BufferReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="struct" href [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-BufferReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/buffer_reader.rs.html#243-310">source</a><a href="#impl-BlockingRead-for-BufferReader%3CR%3E [...]
-    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/buffer_reader.rs.html#247-273">source</a><a href="#method.read" class="anchor">§</a><h4 class="code-header">fn <a href="trait.BlockingRead.html#tymeth [...]
-    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/buffer_reader.rs.html#140-166">source</a><a href="#method.poll_read" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Read.html#tymethod.poll_read" class="f [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    dst: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="me [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="to [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BufferReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/buffer_reader.rs.html#41-95">source</a><a href="#impl-BufferReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="struct" href [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-BufferReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/buffer_reader.rs.html#232-300">source</a><a href="#impl-BlockingRead-for-BufferReader%3CR%3E [...]
+    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/buffer_reader.rs.html#236-262">source</a><a href="#method.read" class="anchor">§</a><h4 class="code-header">fn <a href="trait.BlockingRead.html#tymeth [...]
+    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.seek-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/buffer_reader.rs.html#139-161">source</a><a href="#method.seek-1" class="anchor">§</a><h4 class="code-header">async fn <a href="trait.Read.html#tymethod.seek" class="fn">se [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-BufferReader%3CR%3E" class="impl"><a href="#impl-Send-for-BufferReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Sen [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</div></h3></section><section id="impl-Sync-for-BufferReader%3CR%3E" class="impl"><a href="#impl-Sync-for-BufferReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.BufferRea [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Unpin-for-BufferReader%3CR%3E" class="impl"><a href="#impl-Unpin-for-BufferReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct.Buff [...]
@@ -79,11 +71,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="trait.ReadExt.html#method.read" class="fn">read</a>&lt;'a&gt [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;B&gt;,
     B: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Immutable access to the <code>Borrow&lt;B&gt;</code> of a value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.tap_borrow_mut" class="method trait-impl"><a href="#method.tap_borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;B&gt;,
diff --git a/docs/rust/opendal/raw/oio/struct.Cursor.html b/docs/rust/opendal/raw/oio/struct.Cursor.html
index 122729bc1b..723d871162 100644
--- a/docs/rust/opendal/raw/oio/struct.Cursor.html
+++ b/docs/rust/opendal/raw/oio/struct.Cursor.html
@@ -1,14 +1,10 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Cursor is the cursor for `Bytes` that implements `oio::Read`"><title>Cursor in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Cursor" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/cursor.rs.html#35-56">source</a><a href="#impl-Cursor" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Cursor.html" title="struct opendal::ra [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.is_empty" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/cursor.rs.html#42-44">source</a><h4 class="code-header">pub fn <a href="#method.is_empty" class="fn">is_empty</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Returns <code>true</code> if the remaining s [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.remaining_slice" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/cursor.rs.html#47-50">source</a><h4 class="code-header">pub fn <a href="#method.remaining_slice" class="fn">remaining_slice</a>(&amp;self) -&gt; &amp;[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>] <a href="#" class="tooltip" data-notable-ty="&amp;[u8]">ⓘ</a></h4></s [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.len" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/cursor.rs.html#53-55">source</a><h4 class="code-header">pub fn <a href="#method.len" class="fn">len</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a></h4></section></summary><div class="docblock"><p>Return the length of remaining slice.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-Cursor" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/cursor.rs.html#116-157">source</a><a href="#impl-BlockingRead-for-Cursor" class="anchor">§</a><h3 class="code- [...]
-    &amp;mut self,
-    _: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="me [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Cursor is the cursor for `Bytes` that implements `oio::Read`"><title>Cursor in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Cursor" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/cursor.rs.html#36-57">source</a><a href="#impl-Cursor" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Cursor.html" title="struct opendal::ra [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.is_empty" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/cursor.rs.html#43-45">source</a><h4 class="code-header">pub fn <a href="#method.is_empty" class="fn">is_empty</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Returns <code>true</code> if the remaining s [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.remaining_slice" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/cursor.rs.html#48-51">source</a><h4 class="code-header">pub fn <a href="#method.remaining_slice" class="fn">remaining_slice</a>(&amp;self) -&gt; &amp;[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>] <a href="#" class="tooltip" data-notable-ty="&amp;[u8]">ⓘ</a></h4></s [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.len" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/cursor.rs.html#54-56">source</a><h4 class="code-header">pub fn <a href="#method.len" class="fn">len</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a></h4></section></summary><div class="docblock"><p>Return the length of remaining slice.</p>
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-Cursor" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/cursor.rs.html#108-149">source</a><a href="#impl-BlockingRead-for-Cursor" class="anchor">§</a><h3 class="code- [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
@@ -70,11 +66,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="trait.ReadExt.html#method.read" class="fn">read</a>&lt;'a&gt [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     T: <a class="trait" href="trait.Stream.html" title="trait opendal::raw::oio::Stream">Stream</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#79-81">source</a><a href="#method.next-1" class="anchor">§</a><h4 class="code-header">fn <a href="trait.StreamExt.html#method.next" class="fn">next</a>( [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     S: <a class="trait" href="trait.Stream.html" title="trait opendal::raw::oio::Stream">Stream</a>,</div></h4></section></summary><div class='docblock'>Chain this stream with another stream.</div></details><details class="toggle method-toggle" open><summary><section id="method.collect" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#96-104">source</a><a href="#method.collect" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/docs/rust/opendal/raw/oio/struct.FileReader.html b/docs/rust/opendal/raw/oio/struct.FileReader.html
index 07edca9709..0875a6242c 100644
--- a/docs/rust/opendal/raw/oio/struct.FileReader.html
+++ b/docs/rust/opendal/raw/oio/struct.FileReader.html
@@ -1,27 +1,25 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="FileReader that implement range read and streamable read on seekable reader."><title>FileReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload"  [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="FileReader that implement range read and streamable read on seekable reader."><title>FileReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload"  [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
 <p><code>oio::Reader</code> requires the underlying reader to handle range correctly and have streamable support.
 But some services like <code>fs</code>, <code>hdfs</code> only have seek support. FileReader implements range and stream
 support based on <code>seek</code>. We will maintain the correct range for give file and implement streamable
 operations based on <a href="struct.AdaptiveBuf.html" title="struct opendal::raw::oio::AdaptiveBuf"><code>oio::AdaptiveBuf</code></a>.</p>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-FileReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/file_read.rs.html#66-89">source</a><a href="#impl-FileReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="struct" hre [...]
-    A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/file_read.rs.html#75-88">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(acc: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/ [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-FileReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/file_read.rs.html#48-71">source</a><a href="#impl-FileReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="struct" hre [...]
+    A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/file_read.rs.html#57-70">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(acc: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/ [...]
 <h5 id="notes"><a href="#notes">Notes</a></h5>
 <p>It’s required that input reader’s cursor is at the input <code>start</code> of the file.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-FileReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/file_read.rs.html#395-541">source</a><a href="#impl-BlockingRead-for-FileReader%3CA,+R%3E"  [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-FileReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/file_read.rs.html#268-388">source</a><a href="#impl-BlockingRead-for-FileReader%3CA,+R%3E"  [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;BlockingReader = R&gt;,
-    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/file_read.rs.html#400-443">source</a><a href="#method.read" class="anchor">§</a><h4 class="code-header">fn <a href="trait.BlockingRead.html#tymethod.r [...]
+    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/file_read.rs.html#273-307">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="trait.BlockingRead.html#tymeth [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;Reader = R&gt;,
-    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/file_read.rs.html#249-292">source</a><a href="#method.poll_read" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Read.html#tymethod.poll_read" class="fn">p [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="me [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="to [...]
-    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h3></section><section id="impl-UnwindSafe-for-FileReader%3CA,+R%3E" class="impl"><a href="#impl-UnwindSafe-for-FileReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; !<a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSaf [...]
+    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.seek" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/file_read.rs.html#216-247">source</a><a href="#method.seek" class="anchor">§</a><h4 class="code-header">async fn <a href="trait.Read.html#tymethod.seek" class="fn">seek</a>(& [...]
+    A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-FileReader%3CA,+R%3E" class="impl"><a href="#impl-Send-for-FileReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</div></h3></section><section id="impl-Sync-for-FileReader%3CA,+R%3E" class="impl"><a href="#impl-Sync-for-FileReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.File [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Unpin-for-FileReader%3CA,+R%3E" class="impl"><a href="#impl-Unpin-for-FileReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h3></section><section id="impl-UnwindSafe-for-FileReader%3CA,+R%3E" class="impl"><a href="#impl-UnwindSafe-for-FileReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe [...]
+    A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,</div></h3></section></div><h2 id="blanket-implementations" class="section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-T" class="impl"><a class="src ri [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
@@ -83,11 +81,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="trait.ReadExt.html#method.read" class="fn">read</a>&lt;'a&gt [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;B&gt;,
     B: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Immutable access to the <code>Borrow&lt;B&gt;</code> of a value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.tap_borrow_mut" class="method trait-impl"><a href="#method.tap_borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;B&gt;,
diff --git a/docs/rust/opendal/raw/oio/struct.FlatLister.html b/docs/rust/opendal/raw/oio/struct.FlatLister.html
index a7387cd89c..3057cdd3b2 100644
--- a/docs/rust/opendal/raw/oio/struct.FlatLister.html
+++ b/docs/rust/opendal/raw/oio/struct.FlatLister.html
@@ -32,9 +32,9 @@ always output directly while listing.</p>
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;BlockingLister = P&gt;,
     P: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#162-200">source</a><a href="#method.next" class="anchor">§</a><h4 class="code-header">fn <a href="trait.BlockingList.html#tymethod.n [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;Lister = L&gt;,
-    L: <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_next" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#105-154">source</a><a href="#method.poll_next" class="anchor">§</a><h4 class="code-header">fn <a href="trait.List.html#tymethod.poll_next" class="fn">p [...]
+    L: <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_next" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#105-154">source</a><a href="#method.poll_next" class="anchor">§</a><h4 class="code-header">fn <a href="trait.List.html#tymethod.poll_next" class="fn">p [...]
 <p>wasm32 is a special target that we only have one event-loop for this FlatLister.</p>
-</div><section id="impl-Sync-for-FlatLister%3CA,+L%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#82">source</a><a href="#impl-Sync-for-FlatLister%3CA,+L%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>, L&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Syn [...]
+</div><section id="impl-Sync-for-FlatLister%3CA,+L%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#82">source</a><a href="#impl-Sync-for-FlatLister%3CA,+L%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>, L&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Syn [...]
 <p>We will only take <code>&amp;mut Self</code> reference for FsLister.</p>
 </div></div><h2 id="synthetic-implementations" class="section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-FlatLister%3CA,+L%3E" class="impl"><a href="#impl-RefUnwindSafe-for-FlatLister%3CA,+L%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, L&gt; !<a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" [...]
     L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h3></section><section id="impl-UnwindSafe-for-FlatLister%3CA,+L%3E" class="impl"><a href="#impl-UnwindSafe-for-FlatLister%3CA,+L%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, L&gt; !<a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSaf [...]
diff --git a/docs/rust/opendal/raw/oio/struct.FromStreamReader.html b/docs/rust/opendal/raw/oio/struct.FromStreamReader.html
index 582d7af6df..c5dabb4aaf 100644
--- a/docs/rust/opendal/raw/oio/struct.FromStreamReader.html
+++ b/docs/rust/opendal/raw/oio/struct.FromStreamReader.html
@@ -1,12 +1,8 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="FromStreamReader will convert a `futures::Stream&lt;Item = Result&lt;Bytes&gt;&gt;` into `oio::Read`"><title>FromStreamReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.t [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
-</div></details><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-FromStreamReader%3CS%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/into_read_from_stream.rs.html#43-87">source</a><a href="#impl-Read-for-FromStreamReader%3CS%3E" class="anchor">§</a><h [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="FromStreamReader will convert a `futures::Stream&lt;Item = Result&lt;Bytes&gt;&gt;` into `oio::Read`"><title>FromStreamReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.t [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+</div></details><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-FromStreamReader%3CS%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/into_read_from_stream.rs.html#41-64">source</a><a href="#impl-Read-for-FromStreamReader%3CS%3E" class="anchor">§</a><h [...]
     S: Stream&lt;Item = <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;T&gt;&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::m [...]
-    T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Bytes&gt;,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/into_read_from_stream.rs.html#48-67">source</a><a href="#method.poll_read" class="anchor">§</a><h4 class="code-he [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="me [...]
+    T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Bytes&gt;,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.seek" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/into_read_from_stream.rs.html#46-51">source</a><a href="#method.seek" class="anchor">§</a><h4 class="code-header">asyn [...]
     S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-FromStreamReader%3CS%3E" class="impl"><a href="#impl-Send-for-FromStreamReader%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::S [...]
     S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</div></h3></section><section id="impl-Sync-for-FromStreamReader%3CS%3E" class="impl"><a href="#impl-Sync-for-FromStreamReader%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.F [...]
     S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Unpin-for-FromStreamReader%3CS%3E" class="impl"><a href="#impl-Unpin-for-FromStreamReader%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="str [...]
@@ -73,11 +69,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read" class="anchor">§</a><h4 class="code-header">fn <a href="trait.ReadExt.html#method.read" class="fn">read</a>&lt;'a&gt;(&a [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;B&gt;,
     B: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Immutable access to the <code>Borrow&lt;B&gt;</code> of a value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.tap_borrow_mut" class="method trait-impl"><a href="#method.tap_borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;B&gt;,
diff --git a/docs/rust/opendal/raw/oio/struct.FuturesReader.html b/docs/rust/opendal/raw/oio/struct.FuturesReader.html
index 90dee6eff8..9f61207d32 100644
--- a/docs/rust/opendal/raw/oio/struct.FuturesReader.html
+++ b/docs/rust/opendal/raw/oio/struct.FuturesReader.html
@@ -1,16 +1,8 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="FuturesReader implements `oio::Read` via `AsyncRead` + `AsyncSeek`."><title>FuturesReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="fo [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-FuturesReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/futures_read.rs.html#35-40">source</a><a href="#impl-FuturesReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R: AsyncRead + AsyncSeek&gt [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-FuturesReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/futures_read.rs.html#42-70">source</a><a href="#impl-Read-for-FuturesReader%3CR%3E" class="anchor"> [...]
-    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section></summary><div class="impl-items"><details class= [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="me [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="to [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="FuturesReader implements `oio::Read` via `AsyncRead` + `AsyncSeek`."><title>FuturesReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="fo [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-FuturesReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/futures_read.rs.html#36-44">source</a><a href="#impl-FuturesReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R: AsyncRead + AsyncSeek&gt [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-FuturesReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/futures_read.rs.html#46-84">source</a><a href="#impl-Read-for-FuturesReader%3CR%3E" class="anchor"> [...]
+    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section></summary><div class="impl-items"><details class= [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-FuturesReader%3CR%3E" class="impl"><a href="#impl-Send-for-FuturesReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">S [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</div></h3></section><section id="impl-Sync-for-FuturesReader%3CR%3E" class="impl"><a href="#impl-Sync-for-FuturesReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.Futures [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Unpin-for-FuturesReader%3CR%3E" class="impl"><a href="#impl-Unpin-for-FuturesReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct.Fu [...]
@@ -77,11 +69,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read" class="anchor">§</a><h4 class="code-header">fn <a href="trait.ReadExt.html#method.read" class="fn">read</a>&lt;'a&gt;(&a [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;B&gt;,
     B: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Immutable access to the <code>Borrow&lt;B&gt;</code> of a value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.tap_borrow_mut" class="method trait-impl"><a href="#method.tap_borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;B&gt;,
diff --git a/docs/rust/opendal/raw/oio/struct.LazyReader.html b/docs/rust/opendal/raw/oio/struct.LazyReader.html
index 2771ecd6ff..20b6d0eb79 100644
--- a/docs/rust/opendal/raw/oio/struct.LazyReader.html
+++ b/docs/rust/opendal/raw/oio/struct.LazyReader.html
@@ -1,22 +1,20 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="LazyReader implements `oio::Read` in a lazy way."><title>LazyReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2"  [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="LazyReader implements `oio::Read` in a lazy way."><title>LazyReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2"  [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
 <p>The real requests are send when users calling read or seek.</p>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-LazyReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#54-68">source</a><a href="#impl-LazyReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="struct" hre [...]
-    A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#59-67">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(acc: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/ [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-LazyReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#150-205">source</a><a href="#impl-BlockingRead-for-LazyReader%3CA,+R%3E"  [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-LazyReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#36-50">source</a><a href="#impl-LazyReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="struct" hre [...]
+    A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#41-49">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(acc: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/ [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-LazyReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#97-118">source</a><a href="#impl-BlockingRead-for-LazyReader%3CA,+R%3E" c [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;BlockingReader = R&gt;,
-    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#155-169">source</a><a href="#method.read" class="anchor">§</a><h4 class="code-header">fn <a href="trait.BlockingRead.html#tymethod.r [...]
+    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#102-104">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="trait.BlockingRead.html#tymeth [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;Reader = R&gt;,
-    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#89-107">source</a><a href="#method.poll_read" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Read.html#tymethod.poll_read" class="fn">po [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="me [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="to [...]
-    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h3></section><section id="impl-UnwindSafe-for-LazyReader%3CA,+R%3E" class="impl"><a href="#impl-UnwindSafe-for-LazyReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; !<a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSaf [...]
+    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.seek" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#72-74">source</a><a href="#method.seek" class="anchor">§</a><h4 class="code-header">async fn <a href="trait.Read.html#tymethod.seek" class="fn">seek</a>(&am [...]
+    A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-LazyReader%3CA,+R%3E" class="impl"><a href="#impl-Send-for-LazyReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</div></h3></section><section id="impl-Sync-for-LazyReader%3CA,+R%3E" class="impl"><a href="#impl-Sync-for-LazyReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.Lazy [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Unpin-for-LazyReader%3CA,+R%3E" class="impl"><a href="#impl-Unpin-for-LazyReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h3></section><section id="impl-UnwindSafe-for-LazyReader%3CA,+R%3E" class="impl"><a href="#impl-UnwindSafe-for-LazyReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe [...]
+    A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,</div></h3></section></div><h2 id="blanket-implementations" class="section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-T" class="impl"><a class="src ri [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
@@ -78,11 +76,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="trait.ReadExt.html#method.read" class="fn">read</a>&lt;'a&gt [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;B&gt;,
     B: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Immutable access to the <code>Borrow&lt;B&gt;</code> of a value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.tap_borrow_mut" class="method trait-impl"><a href="#method.tap_borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;B&gt;,
diff --git a/docs/rust/opendal/raw/oio/struct.RangeReader.html b/docs/rust/opendal/raw/oio/struct.RangeReader.html
index 8a02ec9f53..1b20cd40bb 100644
--- a/docs/rust/opendal/raw/oio/struct.RangeReader.html
+++ b/docs/rust/opendal/raw/oio/struct.RangeReader.html
@@ -1,13 +1,13 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="RangeReader that can do seek on non-seekable reader."><title>RangeReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/wo [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="RangeReader that can do seek on non-seekable reader."><title>RangeReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/wo [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
 <p><code>oio::Reader</code> requires the underlying reader to be seekable, but some services like s3, gcs
 doesn’t support seek natively. RangeReader implement seek by read_with_range. We will start
 a new read request with the correct range when seek is called.</p>
 <p>The <code>seek</code> operation on <code>RangeReader</code> is zero cost and purely in-memory. But calling <code>seek</code>
 while there is a pending read request will cancel the request and start a new one. This could
 add extra cost to the read operation.</p>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-RangeReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#65-191">source</a><a href="#impl-RangeReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="struct" [...]
-    A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#83-100">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(acc: <a class="struct" href="https://doc.rust-lang.org/nightly/allo [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-RangeReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#46-172">source</a><a href="#impl-RangeReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="struct" [...]
+    A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#64-81">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(acc: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc [...]
 <h5 id="input"><a href="#input">Input</a></h5>
 <p>The input is an Accessor will may return a non-seekable reader.</p>
 <h5 id="output"><a href="#output">Output</a></h5>
@@ -15,20 +15,18 @@ add extra cost to the read operation.</p>
 <h5 id="notes"><a href="#notes">Notes</a></h5>
 <p>This operation is not zero cost. If the accessor already returns a
 seekable reader, please don’t use this.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-RangeReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#470-633">source</a><a href="#impl-BlockingRead-for-RangeReader%3CA,+R%3 [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-RangeReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#334-458">source</a><a href="#impl-BlockingRead-for-RangeReader%3CA,+R%3 [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;BlockingReader = R&gt;,
-    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#475-524">source</a><a href="#method.read" class="anchor">§</a><h4 class="code-header">fn <a href="trait.BlockingRead.html#tymethod. [...]
+    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#339-373">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="trait.BlockingRead.html#tymet [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;Reader = R&gt;,
-    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#280-341">source</a><a href="#method.poll_read" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Read.html#tymethod.poll_read" class="fn"> [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="me [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="to [...]
-    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h3></section><section id="impl-UnwindSafe-for-RangeReader%3CA,+R%3E" class="impl"><a href="#impl-UnwindSafe-for-RangeReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; !<a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindS [...]
+    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.seek" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#255-294">source</a><a href="#method.seek" class="anchor">§</a><h4 class="code-header">async fn <a href="trait.Read.html#tymethod.seek" class="fn">seek</a>( [...]
+    A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-RangeReader%3CA,+R%3E" class="impl"><a href="#impl-Send-for-RangeReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Se [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</div></h3></section><section id="impl-Sync-for-RangeReader%3CA,+R%3E" class="impl"><a href="#impl-Sync-for-RangeReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.Ra [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Unpin-for-RangeReader%3CA,+R%3E" class="impl"><a href="#impl-Unpin-for-RangeReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="stru [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h3></section><section id="impl-UnwindSafe-for-RangeReader%3CA,+R%3E" class="impl"><a href="#impl-UnwindSafe-for-RangeReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSa [...]
+    A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,</div></h3></section></div><h2 id="blanket-implementations" class="section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-T" class="impl"><a class="src ri [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
@@ -90,11 +88,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="trait.ReadExt.html#method.read" class="fn">read</a>&lt;'a&gt [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;B&gt;,
     B: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Immutable access to the <code>Borrow&lt;B&gt;</code> of a value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.tap_borrow_mut" class="method trait-impl"><a href="#method.tap_borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;B&gt;,
diff --git a/docs/rust/opendal/raw/oio/struct.StdReader.html b/docs/rust/opendal/raw/oio/struct.StdReader.html
index 170a1f6152..567e132531 100644
--- a/docs/rust/opendal/raw/oio/struct.StdReader.html
+++ b/docs/rust/opendal/raw/oio/struct.StdReader.html
@@ -2,7 +2,7 @@
     <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
 </div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-StdReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/std_read.rs.html#32-37">source</a><a href="#impl-StdReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R: <a class="trait" href="https://doc.r [...]
 </div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-StdReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/std_read.rs.html#39-65">source</a><a href="#impl-BlockingRead-for-StdReader%3CR%3E" class="anch [...]
-    R: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Seek.html" title="trait std::io::Seek">Seek</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sy [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Seek.html" title="trait std::io::Seek">Seek</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sy [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-StdReader%3CR%3E" class="impl"><a href="#impl-Send-for-StdReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>  [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</div></h3></section><section id="impl-Sync-for-StdReader%3CR%3E" class="impl"><a href="#impl-Sync-for-StdReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.StdReader.html" [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Unpin-for-StdReader%3CR%3E" class="impl"><a href="#impl-Unpin-for-StdReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct.StdReader. [...]
diff --git a/docs/rust/opendal/raw/oio/struct.StreamableReader.html b/docs/rust/opendal/raw/oio/struct.StreamableReader.html
index d1a700d111..b3319b2238 100644
--- a/docs/rust/opendal/raw/oio/struct.StreamableReader.html
+++ b/docs/rust/opendal/raw/oio/struct.StreamableReader.html
@@ -1,14 +1,6 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Make given read streamable."><title>StreamableReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin hre [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
-</div></details><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-StreamableReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/into_streamable_read.rs.html#70-93">source</a><a href="#impl-BlockingRead-for-StreamableReader%3CR%3E" class=" [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="me [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="to [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Make given read streamable."><title>StreamableReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin hre [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+</div></details><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-StreamableReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/into_streamable_read.rs.html#65-88">source</a><a href="#impl-BlockingRead-for-StreamableReader%3CR%3E" class=" [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-StreamableReader%3CR%3E" class="impl"><a href="#impl-Send-for-StreamableReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::S [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</div></h3></section><section id="impl-Sync-for-StreamableReader%3CR%3E" class="impl"><a href="#impl-Sync-for-StreamableReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.S [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Unpin-for-StreamableReader%3CR%3E" class="impl"><a href="#impl-Unpin-for-StreamableReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="str [...]
@@ -75,11 +67,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="trait.ReadExt.html#method.read" class="fn">read</a>&lt;'a&gt [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;B&gt;,
     B: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Immutable access to the <code>Borrow&lt;B&gt;</code> of a value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.tap_borrow_mut" class="method trait-impl"><a href="#method.tap_borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;B&gt;,
diff --git a/docs/rust/opendal/raw/oio/struct.TokioReader.html b/docs/rust/opendal/raw/oio/struct.TokioReader.html
index 82a57d1bb6..7ec044dd28 100644
--- a/docs/rust/opendal/raw/oio/struct.TokioReader.html
+++ b/docs/rust/opendal/raw/oio/struct.TokioReader.html
@@ -1,16 +1,8 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="FuturesReader implements `oio::Read` via `AsyncRead` + `AsyncSeek`."><title>TokioReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-TokioReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/tokio_read.rs.html#39-47">source</a><a href="#impl-TokioReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R: AsyncRead + AsyncSeek&gt; <a c [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-TokioReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/tokio_read.rs.html#49-93">source</a><a href="#impl-Read-for-TokioReader%3CR%3E" class="anchor">§</a>< [...]
-    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section></summary><div class="impl-items"><details class= [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="me [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="to [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="FuturesReader implements `oio::Read` via `AsyncRead` + `AsyncSeek`."><title>TokioReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-TokioReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/tokio_read.rs.html#36-44">source</a><a href="#impl-TokioReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R: AsyncRead + AsyncSeek&gt; <a c [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-TokioReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/tokio_read.rs.html#46-84">source</a><a href="#impl-Read-for-TokioReader%3CR%3E" class="anchor">§</a>< [...]
+    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section></summary><div class="impl-items"><details class= [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-TokioReader%3CR%3E" class="impl"><a href="#impl-Send-for-TokioReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send< [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</div></h3></section><section id="impl-Sync-for-TokioReader%3CR%3E" class="impl"><a href="#impl-Sync-for-TokioReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.TokioReader [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Unpin-for-TokioReader%3CR%3E" class="impl"><a href="#impl-Unpin-for-TokioReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct.TokioR [...]
@@ -77,11 +69,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read" class="anchor">§</a><h4 class="code-header">fn <a href="trait.ReadExt.html#method.read" class="fn">read</a>&lt;'a&gt;(&a [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;B&gt;,
     B: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Immutable access to the <code>Borrow&lt;B&gt;</code> of a value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.tap_borrow_mut" class="method trait-impl"><a href="#method.tap_borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;B&gt;,
diff --git a/docs/rust/opendal/raw/oio/trait.BlockingList.html b/docs/rust/opendal/raw/oio/trait.BlockingList.html
index fc9dcf3011..b8c0681b76 100644
--- a/docs/rust/opendal/raw/oio/trait.BlockingList.html
+++ b/docs/rust/opendal/raw/oio/trait.BlockingList.html
@@ -9,7 +9,7 @@ to <code>next</code> will always get the same result.</p>
 </div></details></div><h2 id="foreign-impls" class="section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-BlockingList-for-()" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/api.rs.html#139-143">source</a><a href="#impl-BlockingList-for-()" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.BlockingList.html" title="t [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;BlockingLister = P&gt;,
     P: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section><section id="impl-BlockingList-for-PrefixLister%3CL%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/prefix_list.rs.html#79-91">source</a><a href="#impl-BlockingList-for-PrefixLister%3CL%3E" class="anchor">§</a><h3 class="code-header">impl&lt;L&gt; <a class="trait" href="trait.BlockingList.html" title="trait opendal::r [...]
-    L: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section><section id="impl-BlockingList-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/enum_utils.rs.html#324-339">source</a><a href="#impl-BlockingList-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE, TWO, THREE, FOUR&gt; <a class="trait" href="trai [...]
+    L: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section><section id="impl-BlockingList-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/enum_utils.rs.html#300-315">source</a><a href="#impl-BlockingList-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE, TWO, THREE, FOUR&gt; <a class="trait" href="trai [...]
     ONE: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,
     TWO: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,
     THREE: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,
diff --git a/docs/rust/opendal/raw/oio/trait.BlockingRead.html b/docs/rust/opendal/raw/oio/trait.BlockingRead.html
index c835cbe674..452f89f2a5 100644
--- a/docs/rust/opendal/raw/oio/trait.BlockingRead.html
+++ b/docs/rust/opendal/raw/oio/trait.BlockingRead.html
@@ -1,5 +1,5 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Read is the trait that OpenDAL returns to callers."><title>BlockingRead in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/wof [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Read is the trait that OpenDAL returns to callers."><title>BlockingRead in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/wof [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
     // Required methods
     fn <a href="#tymethod.read" class="fn">read</a>(&amp;mut self, buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]) -&gt; <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;;
 <span class="item-spacer"></span>    fn <a href="#tymethod.seek" class="fn">seek</a>(&amp;mut self, pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>) -&gt; <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;;
@@ -16,24 +16,22 @@
 </ul>
 <p><code>Read</code> is required to be implemented, <code>Seek</code> and <code>Iterator</code>
 is optional. We use <code>Read</code> to make users life easier.</p>
-</div></details><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.read" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#317">source</a><h4 class="code-header">fn <a href="#tymethod.read" class="fn">read</a>(&amp;mut self, buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.seek" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#320">source</a><h4 class="code-header">fn <a href="#tymethod.seek" class="fn">seek</a>(&amp;mut self, pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>) -&gt; <a class="type" href="../../type.Result.html" title="type opend [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.next" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#323">source</a><h4 class="code-header">fn <a href="#tymethod.next" class="fn">next</a>(&amp;mut self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="type" href="../../type.Result.html" title="type open [...]
-</div></details></div><h2 id="provided-methods" class="section-header">Provided Methods<a href="#provided-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="method.read_to_end" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#326-370">source</a><h4 class="code-header">fn <a href="#method.read_to_end" class="fn">read_to_end</a>(&amp;mut self, buf: &amp;mut <a class="struct" href [...]
-</div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Iterator-for-dyn+BlockingRead" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#429-437">source</a><a href="#impl-Iterator-for-dyn+BlockingRead" class="anchor">§</a><h3 class="code-he [...]
-how many bytes were read. <a href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html#tymethod.read">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_vectored" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.36.0">1.36.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/std/io/mod.rs.html#755">source</a></span><a href="#method.read_vectored" class="anc [...]
-implementation. <a href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.is_read_vectored">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_to_end-1" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/std/io/mod.rs.html#819">source</a></span><a href="#method.read_to_end-1" class="ancho [...]
+</div></details><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.read" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#179">source</a><h4 class="code-header">fn <a href="#tymethod.read" class="fn">read</a>(&amp;mut self, buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.seek" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#182">source</a><h4 class="code-header">fn <a href="#tymethod.seek" class="fn">seek</a>(&amp;mut self, pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>) -&gt; <a class="type" href="../../type.Result.html" title="type opend [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.next" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#185">source</a><h4 class="code-header">fn <a href="#tymethod.next" class="fn">next</a>(&amp;mut self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="type" href="../../type.Result.html" title="type open [...]
+</div></details></div><h2 id="provided-methods" class="section-header">Provided Methods<a href="#provided-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="method.read_to_end" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#188-232">source</a><h4 class="code-header">fn <a href="#method.read_to_end" class="fn">read_to_end</a>(&amp;mut self, buf: &amp;mut <a class="struct" href [...]
+</div></details></div><h2 id="foreign-impls" class="section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-BlockingRead-for-()" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#235-257">source</a><a href="#impl-BlockingRead-for-()" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.BlockingRead.html" title="t [...]
 To make BlockingReader work as expected, we must add this impl.</p>
-</div><div class="impl-items"><section id="method.read-2" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#400-402">source</a><a href="#method.read-2" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.read" class="fn">read</a>(&amp;mut self, buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]) -&gt; <a class="type" href="../../type.Result.html" title="type opendal: [...]
+</div><div class="impl-items"><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#262-264">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.read" class="fn">read</a>(&amp;mut self, buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]) -&gt; <a class="type" href="../../type.Result.html" title="type opendal: [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;BlockingReader = R&gt;,
-    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section><section id="impl-BlockingRead-for-LazyReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#150-205">source</a><a href="#impl-BlockingRead-for-LazyReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="trait.BlockingRead.html" title="trait opend [...]
+    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section><section id="impl-BlockingRead-for-LazyReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#97-118">source</a><a href="#impl-BlockingRead-for-LazyReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="trait.BlockingRead.html" title="trait openda [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;BlockingReader = R&gt;,
-    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section><section id="impl-BlockingRead-for-RangeReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#470-633">source</a><a href="#impl-BlockingRead-for-RangeReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="trait.BlockingRead.html" title="trait op [...]
+    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section><section id="impl-BlockingRead-for-RangeReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#334-458">source</a><a href="#impl-BlockingRead-for-RangeReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="trait.BlockingRead.html" title="trait op [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;BlockingReader = R&gt;,
-    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section><section id="impl-BlockingRead-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/enum_utils.rs.html#272-305">source</a><a href="#impl-BlockingRead-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE, TWO, THREE, FOUR&gt; <a class="trait" href="trai [...]
+    R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section><section id="impl-BlockingRead-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/enum_utils.rs.html#248-281">source</a><a href="#impl-BlockingRead-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE, TWO, THREE, FOUR&gt; <a class="trait" href="trai [...]
     ONE: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,
     TWO: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,
     THREE: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,
-    FOUR: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section><section id="impl-BlockingRead-for-TwoWays%3CONE,+TWO%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/enum_utils.rs.html#83-104">source</a><a href="#impl-BlockingRead-for-TwoWays%3CONE,+TWO%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw: [...]
+    FOUR: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section><section id="impl-BlockingRead-for-TwoWays%3CONE,+TWO%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/enum_utils.rs.html#76-97">source</a><a href="#impl-BlockingRead-for-TwoWays%3CONE,+TWO%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw:: [...]
     R: <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,</div></h3></section><section id="impl-BlockingRead-for-StdReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/std_read.rs.html#39-65">source</a><a href="#impl-BlockingRead-for-StdReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio:: [...]
-    R: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Seek.html" title="trait std::io::Seek">Seek</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sy [...]
\ No newline at end of file
+    R: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Seek.html" title="trait std::io::Seek">Seek</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sy [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.List.html b/docs/rust/opendal/raw/oio/trait.List.html
index af3bc56db1..cc3873c952 100644
--- a/docs/rust/opendal/raw/oio/trait.List.html
+++ b/docs/rust/opendal/raw/oio/trait.List.html
@@ -10,7 +10,7 @@ to <code>next</code> will always get the same result.</p>
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;Lister = L&gt;,
     L: <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a>,</div></h3></section><section id="impl-List-for-PageLister%3CL%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/page_list.rs.html#106-139">source</a><a href="#impl-List-for-PageLister%3CL%3E" class="anchor">§</a><h3 class="code-header">impl&lt;L&gt; <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a> for <a class="struct" href=" [...]
     L: <a class="trait" href="trait.PageList.html" title="trait opendal::raw::oio::PageList">PageList</a>,</div></h3></section><section id="impl-List-for-PrefixLister%3CL%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/prefix_list.rs.html#65-77">source</a><a href="#impl-List-for-PrefixLister%3CL%3E" class="anchor">§</a><h3 class="code-header">impl&lt;L&gt; <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a> for <a class [...]
-    L: <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a>,</div></h3></section><section id="impl-List-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/enum_utils.rs.html#307-322">source</a><a href="#impl-List-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE, TWO, THREE, FOUR&gt; <a class="trait" href="trait.List.html" title="trait opendal::raw:: [...]
+    L: <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a>,</div></h3></section><section id="impl-List-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/enum_utils.rs.html#283-298">source</a><a href="#impl-List-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE, TWO, THREE, FOUR&gt; <a class="trait" href="trait.List.html" title="trait opendal::raw:: [...]
     ONE: <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a>,
     TWO: <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a>,
     THREE: <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a>,
diff --git a/docs/rust/opendal/raw/oio/trait.Read.html b/docs/rust/opendal/raw/oio/trait.Read.html
index b628899ba6..76803b21c2 100644
--- a/docs/rust/opendal/raw/oio/trait.Read.html
+++ b/docs/rust/opendal/raw/oio/trait.Read.html
@@ -1,17 +1,14 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Read is the trait that OpenDAL returns to callers."><title>Read in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" cros [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Read is the trait that OpenDAL returns to callers."><title>Read in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" cros [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
     // Required methods
-    fn <a href="#tymethod.poll_read" class="fn">poll_read</a>(
+    fn <a href="#tymethod.read" class="fn">read</a>(
         &amp;mut self,
-        cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-        buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-    ) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;;
-<span class="item-spacer"></span>    fn <a href="#tymethod.poll_seek" class="fn">poll_seek</a>(
+        size: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>
+    ) -&gt; impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;Bytes&gt;&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>;
+<span class="item-spacer"></span>    fn <a href="#tymethod.seek" class="fn">seek</a>(
         &amp;mut self,
-        cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
         pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-    ) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;;
-<span class="item-spacer"></span>    fn <a href="#tymethod.poll_next" class="fn">poll_next</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/nightly/core/option/en [...]
+    ) -&gt; impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>;
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Read is the trait that OpenDAL returns to callers.</p>
 <p>Read is compose of the following trait</p>
 <ul>
@@ -21,71 +18,33 @@
 </ul>
 <p><code>AsyncRead</code> is required to be implemented, <code>AsyncSeek</code> and <code>Stream</code>
 is optional. We use <code>Read</code> to make users life easier.</p>
-</div></details><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.poll_read" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#93">source</a><h4 class="code-header">fn <a href="#tymethod.poll_read" class="fn">poll_read</a>(
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class="docblock"><p>Read bytes asynchronously.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.poll_seek" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#98">source</a><h4 class="code-header">fn <a href="#tymethod.poll_seek" class="fn">poll_seek</a>(
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class="docblock"><p>Seek asynchronously.</p>
+</div></details><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.read" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#101">source</a><h4 class="code-header">fn <a href="#tymethod.read" class="fn">read</a>(&amp;mut self, size: <a class="primitive" href="https://doc.rust-lang.org/nigh [...]
+<p><code>size</code> is used to hint the data that user want to read at most. Implementer
+MUST NOT return more than <code>size</code> bytes. However, implementer can decide
+whether to split or merge the read requests underground.</p>
+<p>Returning <code>bytes</code>’s <code>length == 0</code> means:</p>
+<ul>
+<li>This reader has reached its “end of file” and will likely no longer be able to produce bytes.</li>
+<li>The <code>size</code> specified was <code>0</code>.</li>
+</ul>
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.seek" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#109">source</a><h4 class="code-header">fn <a href="#tymethod.seek" class="fn">seek</a>(&amp;mut self, pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>) -&gt; impl <a class="trait" href="https://doc.rust-lang.org/nightly/c [...]
 <p>Returns <code>Unsupported</code> error if underlying reader doesn’t support seek.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.poll_next" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#107">source</a><h4 class="code-header">fn <a href="#tymethod.poll_next" class="fn">poll_next</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;) -&gt; <a class=" [...]
-<p>Returns <code>Unsupported</code> error if underlying reader doesn’t support stream.</p>
-<p>This API exists for avoiding bytes copying inside async runtime.
-Users can poll bytes from underlying reader and decide when to
-read/consume them.</p>
-</div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncRead-for-dyn+Read" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#152-161">source</a><a href="#impl-AsyncRead-for-dyn+Read" class="anchor">§</a><h3 class="code-header">impl Asy [...]
-    self: <a class="struct" href="https://doc.rust-lang.org/nightly/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut Self</a>&gt;,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/nightly/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to read from the <code>AsyncRead</code> into <code>bu [...]
-    self: <a class="struct" href="https://doc.rust-lang.org/nightly/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut Self</a>&gt;,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    bufs: &amp;mut [<a class="struct" href="https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html" title="struct std::io::IoSliceMut">IoSliceMut</a>&lt;'_&gt;]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>, <a class="struct" href="https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html" title="struct std::io::erro [...]
-IO operations. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncSeek-for-dyn+Read" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#163-172">source</a><a href="#impl-AsyncSeek-for-dyn+Read" class="anchor">§</a><h3 class="code-header">impl AsyncSeek for dyn <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a></h3></section></summary><di [...]
-    self: <a class="struct" href="https://doc.rust-lang.org/nightly/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut Self</a>&gt;,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/nightly/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to seek to an offset, in bytes, in a stream. <a>Read more [...]
-    self: <a class="struct" href="https://doc.rust-lang.org/nightly/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut Self</a>&gt;,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;Self::Item&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to pull out the next value of this stream, registering the
-current task for wakeup if the value is not yet available, and returning
-<code>None</code> if the stream is exhausted. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.size_hint" class="method trait-impl"><a href="#method.size_hint" class="anchor">§</a><h4 class="code-header">fn <a class="fn">size_hint</a>(&amp;self) -&gt; (<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>, <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html"  [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section><section id="method.poll_seek-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#117-1 [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section><section id="method.poll_next-2" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#126-133"> [...]
-work as expected, we must add this impl.</p>
-</div><div class="impl-items"><section id="method.poll_read-2" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#139-141">source</a><a href="#method.poll_read-2" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.poll_read" class="fn">poll_read</a>(
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section><section id="method.poll_seek-2" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#143-1 [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section><section id="method.poll_next-3" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#147-149"> [...]
+</div></details></div><h2 id="object-safety" class="section-header">Object Safety<a href="#object-safety" class="anchor">§</a></h2><div class="object-safety-info">This trait is <b>not</b> <a href="https://doc.rust-lang.org/nightly/reference/items/traits.html#object-safety">object safe</a>.</div><h2 id="foreign-impls" class="section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="im [...]
+<p>Take care about the <code>deref_mut()</code> here. This makes sure that we are calling functions
+upon <code>&amp;mut T</code> instead of <code>&amp;mut Box&lt;T&gt;</code>. The later could result in infinite recursion.</p>
+</div><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#155-157">source</a><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">async fn <a href="#tymethod.read" class="fn">read</a>(&amp;mut self, size: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>) -&gt; <a class="ty [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;Reader = R&gt;,
-    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section><section id="impl-Read-for-LazyReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#84-148">source</a><a href="#impl-Read-for-LazyReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a> for <a class="struct [...]
+    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section><section id="impl-Read-for-LazyReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/lazy_read.rs.html#67-80">source</a><a href="#impl-Read-for-LazyReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a> for <a class="struct" [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;Reader = R&gt;,
-    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section><section id="impl-Read-for-RangeReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#275-468">source</a><a href="#impl-Read-for-RangeReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a> for <a class="st [...]
+    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section><section id="impl-Read-for-RangeReader%3CA,+R%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/range_read.rs.html#250-332">source</a><a href="#impl-Read-for-RangeReader%3CA,+R%3E" class="anchor">§</a><h3 class="code-header">impl&lt;A, R&gt; <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a> for <a class="st [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;Reader = R&gt;,
-    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section><section id="impl-Read-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/enum_utils.rs.html#237-270">source</a><a href="#impl-Read-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE, TWO, THREE, FOUR&gt; <a class="trait" href="trait.Read.html" title="trait opendal::raw:: [...]
+    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section><section id="impl-Read-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/enum_utils.rs.html#222-246">source</a><a href="#impl-Read-for-FourWays%3CONE,+TWO,+THREE,+FOUR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE, TWO, THREE, FOUR&gt; <a class="trait" href="trait.Read.html" title="trait opendal::raw:: [...]
     ONE: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,
     TWO: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,
     THREE: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,
-    FOUR: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section><section id="impl-Read-for-TwoWays%3CONE,+TWO%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/enum_utils.rs.html#60-81">source</a><a href="#impl-Read-for-TwoWays%3CONE,+TWO%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>, TWO: <a class="trait" href= [...]
-    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section><section id="impl-Read-for-FuturesReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/futures_read.rs.html#42-70">source</a><a href="#impl-Read-for-FuturesReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a> for <a class="struct" [...]
-    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Read-for-TokioReader%3CR%3E" cl [...]
-    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Read-for-StreamableReader%3CR%3 [...]
+    FOUR: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section><section id="impl-Read-for-TwoWays%3CONE,+TWO%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/enum_utils.rs.html#60-74">source</a><a href="#impl-Read-for-TwoWays%3CONE,+TWO%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>, TWO: <a class="trait" href= [...]
+    R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section><section id="impl-Read-for-FuturesReader%3CR%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/read/futures_read.rs.html#46-84">source</a><a href="#impl-Read-for-FuturesReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a> for <a class="struct" [...]
+    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Read-for-TokioReader%3CR%3E" cl [...]
+    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</div></h3></section><section id="impl-Read-for-StreamableReader%3CR%3 [...]
     S: Stream&lt;Item = <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;T&gt;&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::m [...]
     T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Bytes&gt;,</div></h3></section></div><script src="../../../trait.impl/opendal/raw/oio/read/api/trait.Read.js" data-ignore-extern-crates="alloc,std" async></script></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.ReadExt.html b/docs/rust/opendal/raw/oio/trait.ReadExt.html
deleted file mode 100644
index cc8b34a14a..0000000000
--- a/docs/rust/opendal/raw/oio/trait.ReadExt.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Extension of `Read` to make it easier for use."><title>ReadExt in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" cross [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
-    // Provided methods
-    fn <a href="#method.read" class="fn">read</a>&lt;'a&gt;(&amp;'a mut self, buf: &amp;'a mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]) -&gt; ReadFuture&lt;'a, Self&gt; { ... }
-<span class="item-spacer"></span>    fn <a href="#method.seek" class="fn">seek</a>(&amp;mut self, pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>) -&gt; SeekFuture&lt;'_, Self&gt; { ... }
-<span class="item-spacer"></span>    fn <a href="#method.next" class="fn">next</a>(&amp;mut self) -&gt; NextFuture&lt;'_, Self&gt; { ... }
-<span class="item-spacer"></span>    fn <a href="#method.read_to_end" class="fn">read_to_end</a>&lt;'a&gt;(
-        &amp;'a mut self,
-        buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-    ) -&gt; ReadToEndFuture&lt;'a, Self&gt; { ... }
-}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Extension of <a href="trait.Read.html" title="trait opendal::raw::oio::Read"><code>Read</code></a> to make it easier for use.</p>
-</div></details><h2 id="provided-methods" class="section-header">Provided Methods<a href="#provided-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="method.read" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><h4 class="code-header">fn <a href="#method.read" class="fn">read</a>&lt;'a&gt;(&amp;'a mut self, buf: &amp;'a mut [<a class="primitive" href="https [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.seek" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#194-196">source</a><h4 class="code-header">fn <a href="#method.seek" class="fn">seek</a>(&amp;mut self, pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>) -&gt; SeekFuture&lt;'_, Self&gt;</h4></section></summary><div class=" [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.next" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#199-201">source</a><h4 class="code-header">fn <a href="#method.next" class="fn">next</a>(&amp;mut self) -&gt; NextFuture&lt;'_, Self&gt;</h4></section></summary><div class="docblock"><p>Build a future for <code>poll_next</code></p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.read_to_end" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#204-206">source</a><h4 class="code-header">fn <a href="#method.read_to_end" class="fn">read_to_end</a>&lt;'a&gt;(
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class="docblock"><p>Build a future for <code>read_to_end</code>.</p>
-</div></details></div><h2 id="object-safety" class="section-header">Object Safety<a href="#object-safety" class="anchor">§</a></h2><div class="object-safety-info">This trait is <b>not</b> <a href="https://doc.rust-lang.org/nightly/reference/items/traits.html#object-safety">object safe</a>.</div><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><section id="impl-ReadExt-for-T" class="impl"><a class="src ri [...]
-</div></div><script src="../../../trait.impl/opendal/raw/oio/read/api/trait.ReadExt.js" async></script></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.Stream.html b/docs/rust/opendal/raw/oio/trait.Stream.html
index 2e07823e5c..06e8875f5b 100644
--- a/docs/rust/opendal/raw/oio/trait.Stream.html
+++ b/docs/rust/opendal/raw/oio/trait.Stream.html
@@ -13,4 +13,4 @@
 current task for wakeup if the value is not yet available, and returning
 <code>None</code> if the stream is exhausted. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.size_hint" class="method trait-impl"><a href="#method.size_hint" class="anchor">§</a><h4 class="code-header">fn <a class="fn">size_hint</a>(&amp;self) -&gt; (<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>, <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html"  [...]
 To make Streamer work as expected, we must add this impl.</p>
-</div><div class="impl-items"><section id="method.poll_next-2" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#52-54">source</a><a href="#method.poll_next-2" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.poll_next" class="fn">poll_next</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>& [...]
\ No newline at end of file
+</div><div class="impl-items"><section id="method.poll_next-2" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#52-54">source</a><a href="#method.poll_next-2" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.poll_next" class="fn">poll_next</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>& [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.Write.html b/docs/rust/opendal/raw/oio/trait.Write.html
index 01d12dc570..4bd371ee74 100644
--- a/docs/rust/opendal/raw/oio/trait.Write.html
+++ b/docs/rust/opendal/raw/oio/trait.Write.html
@@ -33,7 +33,7 @@ repeatedly until all bytes has been written.</p>
     &amp;mut self,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section><section id="method.poll_close-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#124 [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section><section id="method.poll_close-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#124 [...]
     W: <a class="trait" href="trait.AppendWrite.html" title="trait opendal::raw::oio::AppendWrite">AppendWrite</a>,</div></h3></section><section id="impl-Write-for-BlockWriter%3CW%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/block_write.rs.html#182-325">source</a><a href="#impl-Write-for-BlockWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W&gt; <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write">Write</ [...]
     W: <a class="trait" href="trait.BlockWrite.html" title="trait opendal::raw::oio::BlockWrite">BlockWrite</a>,</div></h3></section><section id="impl-Write-for-MultipartWriter%3CW%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/multipart_write.rs.html#218-403">source</a><a href="#impl-Write-for-MultipartWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W&gt; <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write [...]
-    W: <a class="trait" href="trait.MultipartWrite.html" title="trait opendal::raw::oio::MultipartWrite">MultipartWrite</a>,</div></h3></section><section id="impl-Write-for-OneShotWriter%3CW%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#73-132">source</a><a href="#impl-Write-for-OneShotWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W: <a class="trait" href="trait.OneShotWrite.html" title="trait opendal::raw:: [...]
\ No newline at end of file
+    W: <a class="trait" href="trait.MultipartWrite.html" title="trait opendal::raw::oio::MultipartWrite">MultipartWrite</a>,</div></h3></section><section id="impl-Write-for-OneShotWriter%3CW%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#73-132">source</a><a href="#impl-Write-for-OneShotWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W: <a class="trait" href="trait.OneShotWrite.html" title="trait opendal::raw:: [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.WriteBuf.html b/docs/rust/opendal/raw/oio/trait.WriteBuf.html
index 494183cd58..91274ae38b 100644
--- a/docs/rust/opendal/raw/oio/trait.WriteBuf.html
+++ b/docs/rust/opendal/raw/oio/trait.WriteBuf.html
@@ -55,4 +55,4 @@ the given <code>self.bytes(size)</code> could be done without cost. For example,
 buffer is <code>Bytes</code>.</p>
 <h5 id="panics-3"><a href="#panics-3">Panics</a></h5>
 <p>This function will panic if size &gt; self.remaining().</p>
-</div></details></div><h2 id="foreign-impls" class="section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-WriteBuf-for-%26%5Bu8%5D" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/buf/write_buf.rs.html#151-181">source</a><a href="#impl-WriteBuf-for-%26%5Bu8%5D" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.WriteBuf.htm [...]
\ No newline at end of file
+</div></details></div><h2 id="foreign-impls" class="section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-WriteBuf-for-%26%5Bu8%5D" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/buf/write_buf.rs.html#151-181">source</a><a href="#impl-WriteBuf-for-%26%5Bu8%5D" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.WriteBuf.htm [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/type.BlockingReader.html b/docs/rust/opendal/raw/oio/type.BlockingReader.html
index 7497af83f2..1d459b6293 100644
--- a/docs/rust/opendal/raw/oio/type.BlockingReader.html
+++ b/docs/rust/opendal/raw/oio/type.BlockingReader.html
@@ -1,3 +1,3 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="BlockingReader is a boxed dyn `BlockingRead`."><title>BlockingReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
 </div></details><h2 id="aliased-type" class="section-header">Aliased Type<a href="#aliased-type" class="anchor">§</a></h2><pre class="rust item-decl"><code>struct BlockingReader(<span class="comment">/* private fields */</span>);</code></pre><script src="../../../type.impl/alloc/boxed/struct.Box.js" data-self-path="opendal::raw::oio::read::api::BlockingReader" async></script></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/type.Reader.html b/docs/rust/opendal/raw/oio/type.Reader.html
index e82abc25c7..9eebb25a75 100644
--- a/docs/rust/opendal/raw/oio/type.Reader.html
+++ b/docs/rust/opendal/raw/oio/type.Reader.html
@@ -1,3 +1,3 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Reader is a type erased `Read`."><title>Reader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../ [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
 </div></details><h2 id="aliased-type" class="section-header">Aliased Type<a href="#aliased-type" class="anchor">§</a></h2><pre class="rust item-decl"><code>struct Reader(<span class="comment">/* private fields */</span>);</code></pre><script src="../../../type.impl/alloc/boxed/struct.Box.js" data-self-path="opendal::raw::oio::read::api::Reader" async></script></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/sidebar-items.js b/docs/rust/opendal/raw/sidebar-items.js
index 76cc7fa504..369b9c03a7 100644
--- a/docs/rust/opendal/raw/sidebar-items.js
+++ b/docs/rust/opendal/raw/sidebar-items.js
@@ -1 +1 @@
-window.SIDEBAR_ITEMS = {"constant":["VERSION"],"enum":["AsyncBody","BatchOperation","BatchedReply","FourWays","Operation","PresignOperation","ThreeWays","TwoWays"],"fn":["build_abs_path","build_header_value","build_rel_path","build_rooted_abs_path","format_authorization_by_basic","format_authorization_by_bearer","format_content_md5","get_basename","get_parent","new_json_deserialize_error","new_json_serialize_error","new_request_build_error","new_request_credential_error","new_request_sig [...]
\ No newline at end of file
+window.SIDEBAR_ITEMS = {"constant":["VERSION"],"enum":["AsyncBody","BatchOperation","BatchedReply","FourWays","Operation","PresignOperation","ThreeWays","TwoWays"],"fn":["build_abs_path","build_header_value","build_rel_path","build_rooted_abs_path","format_authorization_by_basic","format_authorization_by_bearer","format_content_md5","get_basename","get_parent","new_json_deserialize_error","new_json_serialize_error","new_request_build_error","new_request_credential_error","new_request_sig [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/struct.BytesContentRange.html b/docs/rust/opendal/raw/struct.BytesContentRange.html
index 531510b7e7..9aed04bfb5 100644
--- a/docs/rust/opendal/raw/struct.BytesContentRange.html
+++ b/docs/rust/opendal/raw/struct.BytesContentRange.html
@@ -21,8 +21,8 @@ Please make sure their comes up with <code>with_range</code> or <code>with_size<
 </div></details><details class="toggle method-toggle" open><summary><section id="method.range" class="method"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_content_range.rs.html#92-98">source</a><h4 class="code-header">pub fn <a href="#method.range" class="fn">range</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.o [...]
 </div></details><details class="toggle method-toggle" open><summary><section id="method.range_inclusive" class="method"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_content_range.rs.html#101-107">source</a><h4 class="code-header">pub fn <a href="#method.range_inclusive" class="fn">range_inclusive</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struc [...]
 </div></details><details class="toggle method-toggle" open><summary><section id="method.to_header" class="method"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_content_range.rs.html#110-112">source</a><h4 class="code-header">pub fn <a href="#method.to_header" class="fn">to_header</a>(&amp;self) -&gt; <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a></h4></section></summary><div [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-BytesContentRange" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_content_range.rs.html#51">source</a><a href="#impl-Clone-for-BytesContentRange" class="anchor">§< [...]
-    __D: <a class="trait" href="https://docs.rs/serde/1.0.196/serde/de/trait.Deserializer.html" title="trait serde::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde/1.0.196/serde/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Displ [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-BytesContentRange" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_content_range.rs.html#51">source</a><a href="#impl-Clone-for-BytesContentRange" class="anchor">§< [...]
+    __D: <a class="trait" href="https://docs.rs/serde/1.0.196/serde/de/trait.Deserializer.html" title="trait serde::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde/1.0.196/serde/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Displ [...]
 by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#242">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
 sufficient, and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-BytesContentRange" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_content_range.rs.html#51">source</a><a href="#impl-Serialize-for-BytesContentRange" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde/1.0.196/serde/ser/trait.S [...]
     __S: <a class="trait" href="https://docs.rs/serde/1.0.196/serde/ser/trait.Serializer.html" title="trait serde::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde/1.0.196/serde/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Copy-for-BytesContentRange" class="impl"><a class="src rightside" href="../../src/ope [...]
diff --git a/docs/rust/opendal/raw/struct.BytesRange.html b/docs/rust/opendal/raw/struct.BytesRange.html
index 2d0e7b19c9..de537b882d 100644
--- a/docs/rust/opendal/raw/struct.BytesRange.html
+++ b/docs/rust/opendal/raw/struct.BytesRange.html
@@ -35,7 +35,7 @@ tailing part of content, a.k.a, the last <code>&lt;end&gt;</code> bytes of conte
 </div></details><details class="toggle method-toggle" open><summary><section id="method.to_range" class="method"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_range.rs.html#103-114">source</a><h4 class="code-header">pub fn <a href="#method.to_range" class="fn">to_range</a>(&amp;self) -&gt; impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/range/trait.RangeBounds.html" title="trait core::ops::range::RangeBounds">RangeBounds</a>&lt;<a class="prim [...]
 </div></details><details class="toggle method-toggle" open><summary><section id="method.complete" class="method"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_range.rs.html#117-124">source</a><h4 class="code-header">pub fn <a href="#method.complete" class="fn">complete</a>(&amp;self, total_size: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Complete range wit [...]
 </div></details><details class="toggle method-toggle" open><summary><section id="method.apply_on_bytes" class="method"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_range.rs.html#127-145">source</a><h4 class="code-header">pub fn <a href="#method.apply_on_bytes" class="fn">apply_on_bytes</a>(&amp;self, bs: Bytes) -&gt; Bytes</h4></section></summary><div class="docblock"><p>apply_on_bytes will apply range on bytes.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-BytesRange" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_range.rs.html#52">source</a><a href="#impl-Clone-for-BytesRange" class="anchor">§</a><h3 class="code-hea [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-BytesRange" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_range.rs.html#52">source</a><a href="#impl-Clone-for-BytesRange" class="anchor">§</a><h3 class="code-hea [...]
     T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/range/trait.RangeBounds.html" title="trait core::ops::range::RangeBounds">RangeBounds</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.from" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_r [...]
 by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#242">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
 sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Copy-for-BytesRange" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_range.rs.html#52">source</a><a href="#impl-Copy-for-BytesRange" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a> for <a class="struct" href="stru [...]
diff --git a/docs/rust/opendal/raw/struct.ConcurrentFutures.html b/docs/rust/opendal/raw/struct.ConcurrentFutures.html
index 77bf4b8ad2..4362f3ef9a 100644
--- a/docs/rust/opendal/raw/struct.ConcurrentFutures.html
+++ b/docs/rust/opendal/raw/struct.ConcurrentFutures.html
@@ -1,22 +1,22 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="ConcurrentFutures is a stream that can hold a stream of concurrent futures."><title>ConcurrentFutures in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
 <ul>
 <li>the order of the futures is the same.</li>
 <li>the number of concurrent futures is limited by concurrent.</li>
 <li>optimized for small number of concurrent futures.</li>
 <li>zero cost for non-concurrent futures cases (concurrent == 1).</li>
 </ul>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ConcurrentFutures%3CF%3E" class="impl"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#80-168">source</a><a href="#impl-ConcurrentFutures%3CF%3E" class="anchor">§</a><h3 class="code-header">impl&lt;F&gt; <a class="struct" href=" [...]
-    F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + 'static,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../src/opend [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.clear" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#105-111">source</a><h4 class="code-header">pub fn <a href="#method.clear" class="fn">clear</a>(&amp;mut self)</h4></section></summary><div class="docblock"><p>Drop all tasks.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.len" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#114-120">source</a><h4 class="code-header">pub fn <a href="#method.len" class="fn">len</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a></h4></section></summary><div class="docblock"><p>Return the length of current concurrent futures (both on [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.is_empty" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#123-125">source</a><h4 class="code-header">pub fn <a href="#method.is_empty" class="fn">is_empty</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Return true if there is no futures in the q [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.remaining" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#128-130">source</a><h4 class="code-header">pub fn <a href="#method.remaining" class="fn">remaining</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a></h4></section></summary><div class="docblock"><p>Return the number of remaining space t [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.has_remaining" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#133-135">source</a><h4 class="code-header">pub fn <a href="#method.has_remaining" class="fn">has_remaining</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Return true if there is rema [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.push_back" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#138-151">source</a><h4 class="code-header">pub fn <a href="#method.push_back" class="fn">push_back</a>(&amp;mut self, f: F)</h4></section></summary><div class="docblock"><p>Push new future into the end of queue.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.push_front" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#154-167">source</a><h4 class="code-header">pub fn <a href="#method.push_front" class="fn">push_front</a>(&amp;mut self, f: F)</h4></section></summary><div class="docblock"><p>Push new future into the start of queue, this task will be exactly the next to poll.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Stream-for-ConcurrentFutures%3CF%3E" class="impl"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#170-216">source</a><a href="#impl-Stream-for-ConcurrentFutures%3CF%3E" class="anchor [...]
-    F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + 'static,</div></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Item" class="associatedtype trait-impl"><a href="#associatedtype.Item" c [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ConcurrentFutures%3CF%3E" class="impl"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#88-176">source</a><a href="#impl-ConcurrentFutures%3CF%3E" class="anchor">§</a><h3 class="code-header">impl&lt;F&gt; <a class="struct" href=" [...]
+    F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + 'static,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../src/opend [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.clear" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#113-119">source</a><h4 class="code-header">pub fn <a href="#method.clear" class="fn">clear</a>(&amp;mut self)</h4></section></summary><div class="docblock"><p>Drop all tasks.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.len" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#122-128">source</a><h4 class="code-header">pub fn <a href="#method.len" class="fn">len</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a></h4></section></summary><div class="docblock"><p>Return the length of current concurrent futures (both on [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.is_empty" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#131-133">source</a><h4 class="code-header">pub fn <a href="#method.is_empty" class="fn">is_empty</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Return true if there is no futures in the q [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.remaining" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#136-138">source</a><h4 class="code-header">pub fn <a href="#method.remaining" class="fn">remaining</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a></h4></section></summary><div class="docblock"><p>Return the number of remaining space t [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.has_remaining" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#141-143">source</a><h4 class="code-header">pub fn <a href="#method.has_remaining" class="fn">has_remaining</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Return true if there is rema [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.push_back" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#146-159">source</a><h4 class="code-header">pub fn <a href="#method.push_back" class="fn">push_back</a>(&amp;mut self, f: F)</h4></section></summary><div class="docblock"><p>Push new future into the end of queue.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.push_front" class="method"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#162-175">source</a><h4 class="code-header">pub fn <a href="#method.push_front" class="fn">push_front</a>(&amp;mut self, f: F)</h4></section></summary><div class="docblock"><p>Push new future into the start of queue, this task will be exactly the next to poll.</p>
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Stream-for-ConcurrentFutures%3CF%3E" class="impl"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#178-224">source</a><a href="#impl-Stream-for-ConcurrentFutures%3CF%3E" class="anchor [...]
+    F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + 'static,</div></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Item" class="associatedtype trait-impl"><a href="#associatedtype.Item" c [...]
     self: <a class="struct" href="https://doc.rust-lang.org/nightly/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;
 ) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;Self::Item&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to pull out the next value of this stream, registering the
diff --git a/docs/rust/opendal/raw/struct.IncomingAsyncBody.html b/docs/rust/opendal/raw/struct.IncomingAsyncBody.html
index a3f1e4cd41..6f6bda80e7 100644
--- a/docs/rust/opendal/raw/struct.IncomingAsyncBody.html
+++ b/docs/rust/opendal/raw/struct.IncomingAsyncBody.html
@@ -1,20 +1,12 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="IncomingAsyncBody carries the content returned by remote servers."><title>IncomingAsyncBody in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" ty [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="IncomingAsyncBody carries the content returned by remote servers."><title>IncomingAsyncBody in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" ty [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
 <h2 id="notes"><a href="#notes">Notes</a></h2>
 <p>Client SHOULD NEVER construct this body.</p>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-IncomingAsyncBody" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/body.rs.html#67-160">source</a><a href="#impl-IncomingAsyncBody" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.IncomingAsyncB [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.consume" class="method"><a class="src rightside" href="../../src/opendal/raw/http_util/body.rs.html#90-102">source</a><h4 class="code-header">pub async fn <a href="#method.consume" class="fn">consume</a>(self) -&gt; <a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>&gt;</h4>< [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.bytes" class="method"><a class="src rightside" href="../../src/opendal/raw/http_util/body.rs.html#107-142">source</a><h4 class="code-header">pub async fn <a href="#method.bytes" class="fn">bytes</a>(self) -&gt; <a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;Bytes&gt;</h4></section></summary><div class="docblock"><p>Consume the response to bytes.</p>
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-IncomingAsyncBody" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/body.rs.html#65-164">source</a><a href="#impl-IncomingAsyncBody" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.IncomingAsyncB [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.consume" class="method"><a class="src rightside" href="../../src/opendal/raw/http_util/body.rs.html#88-103">source</a><h4 class="code-header">pub async fn <a href="#method.consume" class="fn">consume</a>(self) -&gt; <a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>&gt;</h4>< [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.bytes" class="method"><a class="src rightside" href="../../src/opendal/raw/http_util/body.rs.html#108-146">source</a><h4 class="code-header">pub async fn <a href="#method.bytes" class="fn">bytes</a>(self) -&gt; <a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;Bytes&gt;</h4></section></summary><div class="docblock"><p>Consume the response to bytes.</p>
 <p>This code is inspired from hyper’s <a href="https://docs.rs/hyper/0.14.23/hyper/body/fn.to_bytes.html"><code>to_bytes</code></a>.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-IncomingAsyncBody" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/body.rs.html#162-237">source</a><a href="#impl-Read-for-IncomingAsyncBody" class="anchor">§</a><h3 class [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="metho [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="oio/trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="t [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-IncomingAsyncBody" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/body.rs.html#166-199">source</a><a href="#impl-Read-for-IncomingAsyncBody" class="anchor">§</a><h3 class [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
@@ -76,11 +68,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.ReadExt.html#method.read" class="fn">read</a>&lt;'a&g [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs.html#34">source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs [...]
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;B&gt;,
     B: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Immutable access to the <code>Borrow&lt;B&gt;</code> of a value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.tap_borrow_mut" class="method trait-impl"><a href="#method.tap_borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;B&gt;,
diff --git a/docs/rust/opendal/raw/tests/enum.ReadAction.html b/docs/rust/opendal/raw/tests/enum.ReadAction.html
index ad2468a806..4b767b873c 100644
--- a/docs/rust/opendal/raw/tests/enum.ReadAction.html
+++ b/docs/rust/opendal/raw/tests/enum.ReadAction.html
@@ -1,8 +1,7 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="ReadAction represents a read action."><title>ReadAction in opendal::raw::tests - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigi [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="ReadAction represents a read action."><title>ReadAction in opendal::raw::tests - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigi [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
     Read(<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>),
     Seek(<a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>),
-    Next,
 }</code></pre><span class="item-info"><div class="stab portability">Available on <strong>crate feature <code>tests</code></strong> only.</div></span><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>ReadAction represents a read action.</p>
 </div></details><h2 id="variants" class="variants section-header">Variants<a href="#variants" class="anchor">§</a></h2><div class="variants"><section id="variant.Read" class="variant"><a href="#variant.Read" class="anchor">§</a><h3 class="code-header">Read(<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>)</h3></section><div class="docblock"><p>Read represents a read action with given input buf size.</p>
 <h4 id="note"><a href="#note">NOTE</a></h4>
@@ -10,7 +9,6 @@
 </div><section id="variant.Seek" class="variant"><a href="#variant.Seek" class="anchor">§</a><h3 class="code-header">Seek(<a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>)</h3></section><div class="docblock"><p>Seek represents a seek action with given seek position.</p>
 <h4 id="note-1"><a href="#note-1">NOTE</a></h4>
 <p>It’s valid that seek outside of the file’s end.</p>
-</div><section id="variant.Next" class="variant"><a href="#variant.Next" class="anchor">§</a><h3 class="code-header">Next</h3></section><div class="docblock"><p>Next represents a next action.</p>
 </div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ReadAction" class="impl"><a class="src rightside" href="../../../src/opendal/raw/tests/read.rs.html#30">source</a><a href="#impl-Clone-for-ReadAction" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="h [...]
 by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#242">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
 sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-ReadAction" class="impl"><a class="src rightside" href="../../../src/opendal/raw/tests/read.rs.html#30">source</a><a href="#impl-Eq-for-ReadAction" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="enum" href="enum.ReadAction.html" title="e [...]
diff --git a/docs/rust/opendal/raw/tests/struct.ReadChecker.html b/docs/rust/opendal/raw/tests/struct.ReadChecker.html
index d741ad069d..84abae9de5 100644
--- a/docs/rust/opendal/raw/tests/struct.ReadChecker.html
+++ b/docs/rust/opendal/raw/tests/struct.ReadChecker.html
@@ -1,12 +1,12 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="ReadChecker is used to check the correctness of the read process."><title>ReadChecker in opendal::raw::tests - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ReadChecker" class="impl"><a class="src rightside" href="../../../src/opendal/raw/tests/read.rs.html#58-240">source</a><a href="#impl-ReadChecker" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ReadChecker.html" title="st [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ReadChecker" class="impl"><a class="src rightside" href="../../../src/opendal/raw/tests/read.rs.html#56-198">source</a><a href="#impl-ReadChecker" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ReadChecker.html" title="st [...]
 <p>It’s by design that we use a random generator to generate the raw data. The content of data
 is not important, we only care about the correctness of the read process.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.data" class="method"><a class="src rightside" href="../../../src/opendal/raw/tests/read.rs.html#80-82">source</a><h4 class="code-header">pub fn <a href="#method.data" class="fn">data</a>(&amp;self) -&gt; Bytes</h4></section></summary><div class="docblock"><p>Return the raw data of this read checker.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.check" class="method"><a class="src rightside" href="../../../src/opendal/raw/tests/read.rs.html#188-210">source</a><h4 class="code-header">pub async fn <a href="#method.check" class="fn">check</a>(&amp;mut self, r: <a class="struct" href="../../struct.Reader.html" title="struct opendal::Reader">Reader</a>, actions: &amp;[<a class="enum" href="enum.ReadAction.html" title="enum opendal::raw::tests::Rea [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.data" class="method"><a class="src rightside" href="../../../src/opendal/raw/tests/read.rs.html#78-80">source</a><h4 class="code-header">pub fn <a href="#method.data" class="fn">data</a>(&amp;self) -&gt; Bytes</h4></section></summary><div class="docblock"><p>Return the raw data of this read checker.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.check" class="method"><a class="src rightside" href="../../../src/opendal/raw/tests/read.rs.html#159-173">source</a><h4 class="code-header">pub async fn <a href="#method.check" class="fn">check</a>(&amp;mut self, r: <a class="struct" href="../../struct.Reader.html" title="struct opendal::Reader">Reader</a>, actions: &amp;[<a class="enum" href="enum.ReadAction.html" title="enum opendal::raw::tests::Rea [...]
 <p>Check will panic if any check failed.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_check" class="method"><a class="src rightside" href="../../../src/opendal/raw/tests/read.rs.html#215-239">source</a><h4 class="code-header">pub fn <a href="#method.blocking_check" class="fn">blocking_check</a>(&amp;mut self, r: <a class="struct" href="../../struct.BlockingReader.html" title="struct opendal::BlockingReader">BlockingReader</a>, actions: &amp;[<a class="enum" href="enum.ReadActi [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_check" class="method"><a class="src rightside" href="../../../src/opendal/raw/tests/read.rs.html#178-197">source</a><h4 class="code-header">pub fn <a href="#method.blocking_check" class="fn">blocking_check</a>(&amp;mut self, r: <a class="struct" href="../../struct.BlockingReader.html" title="struct opendal::BlockingReader">BlockingReader</a>, actions: &amp;[<a class="enum" href="enum.ReadActi [...]
 <p>Check will panic if any check failed.</p>
 </div></details></div></details></div><h2 id="synthetic-implementations" class="section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-ReadChecker" class="impl"><a href="#impl-RefUnwindSafe-for-ReadChecker" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" titl [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
diff --git a/docs/rust/opendal/raw/trait.Accessor.html b/docs/rust/opendal/raw/trait.Accessor.html
index 0e7b2d47a7..48d95e2565 100644
--- a/docs/rust/opendal/raw/trait.Accessor.html
+++ b/docs/rust/opendal/raw/trait.Accessor.html
@@ -455,4 +455,4 @@ written size if operate successful.</p>
     from: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>,
     to: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>,
     args: <a class="struct" href="struct.OpRename.html" title="struct opendal::raw::OpRename">OpRename</a>
-) -&gt; <a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="struct" href="struct.RpRename.html" title="struct opendal::raw::RpRename">RpRename</a>&gt;</h4></section></div></details><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><details class="toggle implementors-toggle"><summary><section id="impl-Accessor-for-L" class="impl"><a class="src rightside" href=".. [...]
\ No newline at end of file
+) -&gt; <a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="struct" href="struct.RpRename.html" title="struct opendal::raw::RpRename">RpRename</a>&gt;</h4></section></div></details><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><details class="toggle implementors-toggle"><summary><section id="impl-Accessor-for-L" class="impl"><a class="src rightside" href=".. [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/trait.Layer.html b/docs/rust/opendal/raw/trait.Layer.html
index fdebf1bf0c..c20d900b66 100644
--- a/docs/rust/opendal/raw/trait.Layer.html
+++ b/docs/rust/opendal/raw/trait.Layer.html
@@ -92,4 +92,4 @@ requires <code>Send</code> and <code>Sync</code>.</p>
 }</code></pre></div>
 </div></details><h2 id="required-associated-types" class="section-header">Required Associated Types<a href="#required-associated-types" class="anchor">§</a></h2><div class="methods"><details class="toggle" open><summary><section id="associatedtype.LayeredAccessor" class="method"><a class="src rightside" href="../../src/opendal/raw/layer.rs.html#124">source</a><h4 class="code-header">type <a href="#associatedtype.LayeredAccessor" class="associatedtype">LayeredAccessor</a>: <a class="trait [...]
 </div></details></div><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.layer" class="method"><a class="src rightside" href="../../src/opendal/raw/layer.rs.html#127">source</a><h4 class="code-header">fn <a href="#tymethod.layer" class="fn">layer</a>(&amp;self, inner: A) -&gt; Self::<a class="associatedtype" href="trait.Layer.ht [...]
-</div></details></div><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><details class="toggle implementors-toggle"><summary><section id="impl-Layer%3CA%3E-for-AsyncBacktraceLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/async_backtrace.rs.html#48-54">source</a><a href="#impl-Layer%3CA%3E-for-AsyncBacktraceLayer" class="anchor">§</a><h3 class="code-header">impl&lt;A: <a class= [...]
\ No newline at end of file
+</div></details></div><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><details class="toggle implementors-toggle"><summary><section id="impl-Layer%3CA%3E-for-AsyncBacktraceLayer" class="impl"><a class="src rightside" href="../../src/opendal/layers/async_backtrace.rs.html#48-54">source</a><a href="#impl-Layer%3CA%3E-for-AsyncBacktraceLayer" class="anchor">§</a><h3 class="code-header">impl&lt;A: <a class= [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/type.BoxedFuture.html b/docs/rust/opendal/raw/type.BoxedFuture.html
index 7c06434ab5..3966c4e649 100644
--- a/docs/rust/opendal/raw/type.BoxedFuture.html
+++ b/docs/rust/opendal/raw/type.BoxedFuture.html
@@ -1,4 +1,4 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="BoxedFuture is the type alias of `futures::future::BoxFuture`."><title>BoxedFuture in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/ [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
 <p>We will switch to [<code>futures::future::LocalBoxFuture</code>] on wasm32 target.</p>
-</div></details><h2 id="aliased-type" class="section-header">Aliased Type<a href="#aliased-type" class="anchor">§</a></h2><pre class="rust item-decl"><code>struct BoxedFuture&lt;T&gt; { <span class="comment">/* private fields */</span> }</code></pre></section></div></main></body></html>
\ No newline at end of file
+</div></details><h2 id="aliased-type" class="section-header">Aliased Type<a href="#aliased-type" class="anchor">§</a></h2><pre class="rust item-decl"><code>struct BoxedFuture&lt;'a, T&gt; { <span class="comment">/* private fields */</span> }</code></pre></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/type.BoxedStaticFuture.html b/docs/rust/opendal/raw/type.BoxedStaticFuture.html
new file mode 100644
index 0000000000..821199602a
--- /dev/null
+++ b/docs/rust/opendal/raw/type.BoxedStaticFuture.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="BoxedStaticFuture is the type alias of `futures::future::BoxFuture`."><title>BoxedStaticFuture in opendal::raw - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div  [...]
+<p>We will switch to [<code>futures::future::LocalBoxFuture</code>] on wasm32 target.</p>
+</div></details><h2 id="aliased-type" class="section-header">Aliased Type<a href="#aliased-type" class="anchor">§</a></h2><pre class="rust item-decl"><code>struct BoxedStaticFuture&lt;T&gt; { <span class="comment">/* private fields */</span> }</code></pre></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/struct.BlockingReader.html b/docs/rust/opendal/struct.BlockingReader.html
index 23a8573804..1e4069b353 100644
--- a/docs/rust/opendal/struct.BlockingReader.html
+++ b/docs/rust/opendal/struct.BlockingReader.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="BlockingReader is designed to read data from given path in an blocking manner."><title>BlockingReader in opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font"  [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../help.html" title="help">?</a></div><div id="se [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../help.html" title="help">?</a></div><div id="se [...]
 manner.</p>
-</div></details><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-BlockingReader" class="impl"><a class="src rightside" href="../src/opendal/types/reader.rs.html#199-214">source</a><a href="#impl-BlockingRead-for-BlockingReader" class="anchor">§</a><h3 class="code-header">impl < [...]
+</div></details><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-BlockingReader" class="impl"><a class="src rightside" href="../src/opendal/types/reader.rs.html#440-455">source</a><a href="#impl-BlockingRead-for-BlockingReader" class="anchor">§</a><h3 class="code-header">impl < [...]
     &amp;mut self
 ) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;[Self::<a class="associatedtype" href="https://doc.rust-lang.org/nightly/core/iter/traits/iterator/trait.Iterator.html#associatedtype.Item" title="type core::iter::traits::iterator::Iterator::Item">Item</a>; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.array.html">N</a>], <a class="struct" href="https://doc.rust-lang.o [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><span class="item-info"><div class="stab unstable"><span class="emoji">🔬</span><span>This is a nightly-only experimental API. (<code>iter_next_chunk</code>)</span></div></span><div class='docblock'>Advances the iterator and returns an array containing the next <code>N</code> values. <a href="https://doc.rust-lang.org/n [...]
@@ -187,14 +187,14 @@ greater than or equal to those of another. <a href="https://doc.rust-lang.org/ni
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(Self::<a class="associatedtype" href="https://doc.rust-lang.org/nightly/core/iter/traits/iterator/trait.Iterator.html#associatedtype.Item" title="type core::iter::traits::iterator::Iterator::Item">Item</a>) -&gt; K,
     K: <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html" title="trait core::cmp::PartialOrd">PartialOrd</a>,</div></h4></section></summary><span class="item-info"><div class="stab unstable"><span class="emoji">🔬</span><span>This is a nightly-only experimental API. (<code>is_sorted</code>)</span></div></span><div class='docblock'>Checks if the elements of this iterator are sorted using the given key extraction
-function. <a href="https://doc.rust-lang.org/nightly/core/iter/traits/iterator/trait.Iterator.html#method.is_sorted_by_key">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-BlockingReader" class="impl"><a class="src rightside" href="../src/opendal/types/reader.rs.html#216-221">source</a><a href="#impl-Read-for-BlockingReader" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc [...]
+function. <a href="https://doc.rust-lang.org/nightly/core/iter/traits/iterator/trait.Iterator.html#method.is_sorted_by_key">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-BlockingReader" class="impl"><a class="src rightside" href="../src/opendal/types/reader.rs.html#457-462">source</a><a href="#impl-Read-for-BlockingReader" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc [...]
 how many bytes were read. <a href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html#tymethod.read">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_vectored" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.36.0">1.36.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/std/io/mod.rs.html#755">source</a></span><a href="#method.read_vectored" class="anc [...]
 implementation. <a href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.is_read_vectored">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_to_end" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/std/io/mod.rs.html#819">source</a></span><a href="#method.read_to_end" class="anchor">§ [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Creates a “by reference” adaptor for this instance of <code>Read</code>. <a href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.by_ref">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.bytes" class="method trait-impl"><span clas [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Transforms this <code>Read</code> instance to an <a href="https://doc.rust-lang.org/nightly/core/iter/traits/iterator/trait.Iterator.html" title="trait core::iter::traits::iterator::Iterator"><code>Iterator</code></a> over its bytes. <a href="https://doc.rust-lang.org/nightly/std/io/trait.Read.htm [...]
     R: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a>,
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Creates an adapter which will chain this stream with another. <a href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.chain">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.take" class="method trait-impl"><span class="rightside" [...]
-    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Creates an adapter which will read at most <code>limit</code> bytes from it. <a href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.take">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Seek-for-BlockingRead [...]
+    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Creates an adapter which will read at most <code>limit</code> bytes from it. <a href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.take">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Seek-for-BlockingRead [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/docs/rust/opendal/struct.Operator.html b/docs/rust/opendal/struct.Operator.html
index 4383bec3d8..c0ed11b77a 100644
--- a/docs/rust/opendal/struct.Operator.html
+++ b/docs/rust/opendal/struct.Operator.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Operator is the entry for all public async APIs."><title>Operator in opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href=" [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../help.html" title="help">?</a></div><div id="se [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../help.html" title="help">?</a></div><div id="se [...]
 <p>Developer should manipulate the data from storage service through Operator only by right.</p>
 <p>We will usually do some general checks and data transformations in this layer,
 like normalizing path from input, checking whether the path refers to one file or one directory,
@@ -24,24 +24,24 @@ Read <a href="docs/concepts/index.html" title="mod opendal::docs::concepts"><cod
 
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Operator" class="impl"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#77-135">source</a><a href="#impl-Operator" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct o [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Operator" class="impl"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#76-134">source</a><a href="#impl-Operator" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct o [...]
 Limit is usually the maximum size of data that operator will handle in one operation.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_limit" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#104-108">source</a><h4 class="code-header">pub fn <a href="#method.with_limit" class="fn">with_limit</a>(&amp;self, limit: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Specify the batch  [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_limit" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#103-107">source</a><h4 class="code-header">pub fn <a href="#method.with_limit" class="fn">with_limit</a>(&amp;self, limit: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Specify the batch  [...]
 <p>Default: 1000</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.info" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#125-127">source</a><h4 class="code-header">pub fn <a href="#method.info" class="fn">info</a>(&amp;self) -&gt; <a class="struct" href="struct.OperatorInfo.html" title="struct opendal::OperatorInfo">OperatorInfo</a></h4></section></summary><div class="docblock"><p>Get information of underlying accessor.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.info" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#124-126">source</a><h4 class="code-header">pub fn <a href="#method.info" class="fn">info</a>(&amp;self) -&gt; <a class="struct" href="struct.OperatorInfo.html" title="struct opendal::OperatorInfo">OperatorInfo</a></h4></section></summary><div class="docblock"><p>Get information of underlying accessor.</p>
 <h5 id="examples-1"><a href="#examples-1">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>opendal::Operator;
 
 <span class="kw">let </span>info = op.info();</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.blocking" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#132-134">source</a><h4 class="code-header">pub fn <a href="#method.blocking" class="fn">blocking</a>(&amp;self) -&gt; <a class="struct" href="struct.BlockingOperator.html" title="struct opendal::BlockingOperator">BlockingOperator</a></h4></section></summary><div class="docblock"><p>Create a new block [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.blocking" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#131-133">source</a><h4 class="code-header">pub fn <a href="#method.blocking" class="fn">blocking</a>(&amp;self) -&gt; <a class="struct" href="struct.BlockingOperator.html" title="struct opendal::BlockingOperator">BlockingOperator</a></h4></section></summary><div class="docblock"><p>Create a new block [...]
 <p>This operation is nearly no cost.</p>
-</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Operator-1" class="impl"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#138-1960">source</a><a href="#impl-Operator-1" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h3></section></summary><div class="docblock"><h4 id="operator-async-api"><a href="#operator- [...]
+</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Operator-1" class="impl"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#137-1960">source</a><a href="#impl-Operator-1" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h3></section></summary><div class="docblock"><h4 id="operator-async-api"><a href="#operator- [...]
 <p>We will send a <code>list</code> request to path and return any errors we met.</p>
 
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>opendal::Operator;
 
 op.check().<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.stat" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#198-200">source</a><h4 class="code-header">pub async fn <a href="#method.stat" class="fn">stat</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;< [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.stat" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#197-199">source</a><h4 class="code-header">pub async fn <a href="#method.stat" class="fn">stat</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;< [...]
 <h5 id="notes"><a href="#notes">Notes</a></h5><h6 id="extra-options"><a href="#extra-options">Extra Options</a></h6>
 <p><a href="struct.Operator.html#method.stat" title="method opendal::Operator::stat"><code>Operator::stat</code></a> is a wrapper of <a href="struct.Operator.html#method.stat_with" title="method opendal::Operator::stat_with"><code>Operator::stat_with</code></a> without any options. To use extra
 options like <code>if_match</code> and <code>if_none_match</code>, please use <a href="struct.Operator.html#method.stat_with" title="method opendal::Operator::stat_with"><code>Operator::stat_with</code></a> instead.</p>
@@ -56,7 +56,7 @@ options like <code>if_match</code> and <code>if_none_match</code>, please use <a
         <span class="macro">println!</span>(<span class="string">"file not exist"</span>)
     }
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.stat_with" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#310-322">source</a><h4 class="code-header">pub fn <a href="#method.stat_with" class="fn">stat_with</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.stat_with" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#309-321">source</a><h4 class="code-header">pub fn <a href="#method.stat_with" class="fn">stat_with</a>(
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>
 ) -&gt; <a class="type" href="operator_futures/type.FutureStat.html" title="type opendal::operator_futures::FutureStat">FutureStat</a>&lt;impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="struct" href="struct.Metadata.html" title="struct opendal::Metadata">Metadata</a>&gt;&gt;&gt;</ [...]
@@ -117,7 +117,7 @@ in certain edge cases. Always use <code>stat(&quot;test/&quot;)</code> when you
 <p>For services that not support <code>create_dir</code>, <code>stat(&quot;test/&quot;)</code> will return <code>NotFound</code> even
 when <code>test/abc</code> exists since the service won’t have the concept of dir. There is nothing
 we can do about this.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.is_exist" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#340-349">source</a><h4 class="code-header">pub async fn <a href="#method.is_exist" class="fn">is_exist</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Res [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.is_exist" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#339-348">source</a><h4 class="code-header">pub async fn <a href="#method.is_exist" class="fn">is_exist</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Res [...]
 <h5 id="example"><a href="#example">Example</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>anyhow::Result;
 <span class="kw">use </span>futures::io;
@@ -129,7 +129,7 @@ we can do about this.</p>
 
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.create_dir" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#376-392">source</a><h4 class="code-header">pub async fn <a href="#method.create_dir" class="fn">create_dir</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Resul [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.create_dir" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#375-391">source</a><h4 class="code-header">pub async fn <a href="#method.create_dir" class="fn">create_dir</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Resul [...]
 <h5 id="notes-2"><a href="#notes-2">Notes</a></h5>
 <p>To indicate that a path is a directory, it is compulsory to include
 a trailing / in the path. Failure to do so may result in
@@ -141,7 +141,7 @@ a trailing / in the path. Failure to do so may result in
 </ul>
 <h5 id="examples-4"><a href="#examples-4">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>op.create_dir(<span class="string">"path/to/dir/"</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.read" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#420-422">source</a><h4 class="code-header">pub async fn <a href="#method.read" class="fn">read</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;< [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.read" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#419-421">source</a><h4 class="code-header">pub async fn <a href="#method.read" class="fn">read</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;< [...]
 <h5 id="notes-3"><a href="#notes-3">Notes</a></h5><h6 id="extra-options-1"><a href="#extra-options-1">Extra Options</a></h6>
 <p><a href="struct.Operator.html#method.read" title="method opendal::Operator::read"><code>Operator::read</code></a> is a wrapper of <a href="struct.Operator.html#method.read_with" title="method opendal::Operator::read_with"><code>Operator::read_with</code></a> without any options. To use
 extra options like <code>range</code> and <code>if_match</code>, please use <a href="struct.Operator.html#method.read_with" title="method opendal::Operator::read_with"><code>Operator::read_with</code></a> instead.</p>
@@ -150,7 +150,7 @@ extra options like <code>range</code> and <code>if_match</code>, please use <a h
 reading data lazily, please use <a href="struct.Operator.html#method.reader" title="method opendal::Operator::reader"><code>Operator::reader</code></a></p>
 <h5 id="examples-5"><a href="#examples-5">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">let </span>bs = op.read(<span class="string">"path/to/file"</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.read_with" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#513-550">source</a><h4 class="code-header">pub fn <a href="#method.read_with" class="fn">read_with</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.read_with" class="method"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#512-550">source</a><h4 class="code-header">pub fn <a href="#method.read_with" class="fn">read_with</a>(
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>
 ) -&gt; <a class="type" href="operator_futures/type.FutureRead.html" title="type opendal::operator_futures::FutureRead">FutureRead</a>&lt;impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc: [...]
@@ -1097,7 +1097,7 @@ inline.</p>
 <span class="kw">let </span>op = op.layer(LoggingLayer::default());
 <span class="comment">// All operations will go through the new_layer
 </span><span class="kw">let _ </span>= op.read(<span class="string">"test_file"</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Operator" class="impl"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#67">source</a><a href="#impl-Clone-for-Operator" class="anchor">§</a><h3 class="code-header">impl [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Operator" class="impl"><a class="src rightside" href="../src/opendal/types/operator/operator.rs.html#66">source</a><a href="#impl-Clone-for-Operator" class="anchor">§</a><h3 class="code-header">impl [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/docs/rust/opendal/struct.Reader.html b/docs/rust/opendal/struct.Reader.html
index fa7cd8c787..862bec8ec6 100644
--- a/docs/rust/opendal/struct.Reader.html
+++ b/docs/rust/opendal/struct.Reader.html
@@ -1,5 +1,5 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Reader is designed to read data from given path in an asynchronous manner."><title>Reader in opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/w [...]
-    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../help.html" title="help">?</a></div><div id="se [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Reader is designed to read data from given path in an asynchronous manner."><title>Reader in opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/w [...]
+    <main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../opendal/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../help.html" title="help">?</a></div><div id="se [...]
 manner.</p>
 <h2 id="usage"><a href="#usage">Usage</a></h2>
 <p>Reader implements the following APIs:</p>
@@ -18,11 +18,27 @@ want to do copy inside IO workers. They can use <code>Stream</code> to get a <co
 and consume it in side CPU workers inside.</p>
 <p>Besides, <code>Stream</code> <strong>COULD</strong> reduce an extra copy if underlying reader is
 stream based (like services s3, azure which based on HTTP).</p>
-</div></details><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncRead-for-Reader" class="impl"><a class="src rightside" href="../src/opendal/types/reader.rs.html#113-125">source</a><a href="#impl-AsyncRead-for-Reader" class="anchor">§</a><h3 class="code-header">impl AsyncRead for <a class= [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Reader" class="impl"><a class="src rightside" href="../src/opendal/types/reader.rs.html#60-214">source</a><a href="#impl-Reader" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Reader.html" title="struct opendal::Reader">R [...]
+    self
+) -&gt; impl AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a></h4></section><span class="item-info"><div class="stab portabili [...]
+<p><code>Reader</code> itself implements [<code>futures::AsyncRead</code>], this function is used to
+make sure that <code>Reader</code> is used as an <code>AsyncRead</code> only.</p>
+<p>The returning type also implements <code>Send</code>, <code>Sync</code> and <code>Unpin</code>, so users can use it
+as <code>Box&lt;dyn futures::AsyncRead&gt;</code> and calling <code>poll_read_unpin</code> on it.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.into_tokio_read" class="method"><a class="src rightside" href="../src/opendal/types/reader.rs.html#107-111">source</a><h4 class="code-header">pub fn <a href="#method.into_tokio_read" class="fn">into_tokio_read</a>(self) -&gt; impl AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" hr [...]
+<p><code>Reader</code> itself implements [<code>tokio::io::AsyncRead</code>], this function is used to
+make sure that <code>Reader</code> is used as an [<code>tokio::io::AsyncRead</code>] only.</p>
+<p>The returning type also implements <code>Send</code>, <code>Sync</code> and <code>Unpin</code>, so users can use it
+as <code>Box&lt;dyn tokio::io::AsyncRead&gt;</code> and calling <code>poll_read_unpin</code> on it.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.seek" class="method"><a class="src rightside" href="../src/opendal/types/reader.rs.html#115-120">source</a><h4 class="code-header">pub async fn <a href="#method.seek" class="fn">seek</a>(&amp;mut self, pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Re [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.read" class="method"><a class="src rightside" href="../src/opendal/types/reader.rs.html#124-129">source</a><h4 class="code-header">pub async fn <a href="#method.read" class="fn">read</a>(&amp;mut self, size: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;Bytes&gt; [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.read_exact" class="method"><a class="src rightside" href="../src/opendal/types/reader.rs.html#132-180">source</a><h4 class="code-header">pub async fn <a href="#method.read_exact" class="fn">read_exact</a>(&amp;mut self, size: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Resul [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.read_to_end" class="method"><a class="src rightside" href="../src/opendal/types/reader.rs.html#183-213">source</a><h4 class="code-header">pub async fn <a href="#method.read_to_end" class="fn">read_to_end</a>(&amp;mut self, buf: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.r [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncRead-for-Reader" class="impl"><a class="src rightside" href="../src/opendal/types/reader.rs.html#293-333">source</a><a href="#impl-AsyncRead-for-Reader" class="anchor">§</a><h3 class="code-header">impl A [...]
     self: <a class="struct" href="https://doc.rust-lang.org/nightly/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     buf: &amp;mut ReadBuf&lt;'_&gt;
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/nightly/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempts to read from the <code>AsyncRead</code> into <code>buf</ [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/nightly/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempts to read from the <code>AsyncRead</code> into <code>buf</ [...]
     self: <a class="struct" href="https://doc.rust-lang.org/nightly/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
@@ -31,22 +47,14 @@ stream based (like services s3, azure which based on HTTP).</p>
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     bufs: &amp;mut [<a class="struct" href="https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html" title="struct std::io::IoSliceMut">IoSliceMut</a>&lt;'_&gt;]
 ) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>, <a class="struct" href="https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html" title="struct std::io::erro [...]
-IO operations. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncSeek-for-Reader" class="impl"><a class="src rightside" href="../src/opendal/types/reader.rs.html#103-111">source</a><a href="#impl-AsyncSeek-for-Reader" class="anchor">§</a><h3 class="code-header">impl AsyncSeek for <a class="struct" href="struct.Reader.html" title="struct opendal::Reader">Reader</a></h3></section></summary><div class="impl-items [...]
+IO operations. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncSeek-for-Reader" class="impl"><a class="src rightside" href="../src/opendal/types/reader.rs.html#262-291">source</a><a href="#impl-AsyncSeek-for-Reader" class="anchor">§</a><h3 class="code-header">impl AsyncSeek for <a class="struct" href="struct.Reader.html" title="struct opendal::Reader">Reader</a></h3></section></summary><div class="impl-items [...]
     self: <a class="struct" href="https://doc.rust-lang.org/nightly/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/nightly/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to seek to an offset, in bytes, in a stream. <a>Read more [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/nightly/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to seek to an offset, in bytes, in a stream. <a>Read more [...]
     self: <a class="struct" href="https://doc.rust-lang.org/nightly/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/nightly/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Waits for a seek operation to complete. <a>Read more</a></div></d [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="method.p [...]
-    &amp;mut self,
-    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
-    pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="raw/oio/trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class=" [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/nightly/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Waits for a seek operation to complete. <a>Read more</a></div></d [...]
     self: <a class="struct" href="https://doc.rust-lang.org/nightly/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;
 ) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;Self::Item&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to pull out the next value of this stream, registering the
@@ -62,7 +70,7 @@ manner, returning a future type. <a>Read more</a></div></details><details class=
     bufs: &amp;'a mut [<a class="struct" href="https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html" title="struct std::io::IoSliceMut">IoSliceMut</a>&lt;'a&gt;]
 ) -&gt; ReadVectored&lt;'a, Self&gt;<div class="where">where
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Creates a future which will read from the <code>AsyncRead</code> into <code>bufs</code> using vectored
-IO operations. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_exact" class="method trait-impl"><a href="#method.read_exact" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_exact</a>&lt;'a&gt;(&amp;'a mut self, buf: &amp;'a mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]) -&gt; ReadExact&lt;'a, Self&gt;<div class="where">where
+IO operations. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_exact-1" class="method trait-impl"><a href="#method.read_exact-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_exact</a>&lt;'a&gt;(&amp;'a mut self, buf: &amp;'a mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]) -&gt; ReadExact&lt;'a, Self&gt;<div class="where">where
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Creates a future which will read exactly enough bytes to fill <code>buf</code>,
 returning an error if end of file (EOF) is hit sooner. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_to_end-1" class="method trait-impl"><a href="#method.read_to_end-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_to_end</a>&lt;'a&gt;(&amp;'a mut self, buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="p [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Creates a future which will read all the bytes from this <code>AsyncRead</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_to_string" class="method trait-impl"><a href="#method.read_to_string" class="anchor">§</a><h4 class="code-he [...]
@@ -81,7 +89,7 @@ from the underlying reader. <a>Read more</a></div></details></div></details><det
 returning how many bytes were read. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_buf" class="method trait-impl"><a href="#method.read_buf" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_buf</a>&lt;B, 'a&gt;(&amp;'a mut self, buf: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut B</a>) -&gt; ReadBuf&lt;'a, Self, B&gt;<div class="where">where
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,
     B: BufMut + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Pulls some bytes from this source into the specified buffer,
-advancing the buffer’s internal cursor. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_exact-1" class="method trait-impl"><a href="#method.read_exact-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_exact</a>&lt;'a&gt;(&amp;'a mut self, buf: &amp;'a mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]) -&gt; ReadExact&lt;'a, Self&gt;<div class="where">where
+advancing the buffer’s internal cursor. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_exact-2" class="method trait-impl"><a href="#method.read_exact-2" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_exact</a>&lt;'a&gt;(&amp;'a mut self, buf: &amp;'a mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]) -&gt; ReadExact&lt;'a, Self&gt;<div class="where">where
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads the exact number of bytes required to fill <code>buf</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_u8" class="method trait-impl"><a href="#method.read_u8" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_ [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads an unsigned 8 bit integer from the underlying reader. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_i8" class="method trait-impl"><a href="#method.read_i8" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_i8</a>( [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads a signed 8 bit integer from the underlying reader. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_u16" class="method trait-impl"><a href="#method.read_u16" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_u16</a>( [...]
@@ -144,7 +152,7 @@ underlying reader. <a>Read more</a></div></details><details class="toggle method
     &amp;'a mut self,
     buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>
 ) -&gt; ReadToStringFuture&lt;'a, Self&gt;<div class="where">where
-    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads the entire contents and appends them to a <a href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String"><code>String</code></a>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_exa [...]
+    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads the entire contents and appends them to a <a href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String"><code>String</code></a>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_exa [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads the exact number of bytes required to fill <code>buf</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.take-6" class="method trait-impl"><a href="#method.take-6" class="anchor">§</a><h4 class="code-header">fn <a class="fn">take</a [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Creates an adapter which will read at most <code>limit</code> bytes from it. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.bytes-1" class="method trait-impl"><a href="#method.bytes-1" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Converts this [<code>AsyncRead</code>] into a [<code>Stream</code>] of bytes. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.chain-6" class="method trait-impl"><a href="#method.chain-6" class="anchor">§</a><h4 class="code-header">fn <a class [...]
@@ -164,7 +172,7 @@ underlying reader. <a>Read more</a></div></details><details class="toggle method
     &amp;'a mut self,
     buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>
 ) -&gt; ReadToStringFuture&lt;'a, Self&gt;<div class="where">where
-    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads the entire contents and appends them to a <a href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String"><code>String</code></a>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_exa [...]
+    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads the entire contents and appends them to a <a href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String"><code>String</code></a>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_exa [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads the exact number of bytes required to fill <code>buf</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.take-9" class="method trait-impl"><a href="#method.take-9" class="anchor">§</a><h4 class="code-header">fn <a class="fn">take</a [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Creates an adapter which will read at most <code>limit</code> bytes from it. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.bytes-2" class="method trait-impl"><a href="#method.bytes-2" class="anchor">§</a><h4 class="code-header">fn <a class= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Converts this [<code>AsyncRead</code>] into a [<code>Stream</code>] of bytes. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.chain-9" class="method trait-impl"><a href="#method.chain-9" class="anchor">§</a><h4 class="code-header">fn <a class [...]
@@ -256,11 +264,7 @@ function.</div></details><details class="toggle method-toggle" open><summary><se
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.DerefMut.html" title="trait core::ops::deref::DerefMut">DerefMut</a>&lt;Target = T&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/deref/trait.Deref.html" title="trait core::ops::deref::Deref">Deref</a>,
     T: 'a + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
     R: 'a,</div></h4></section></summary><div class='docblock'>Mutably borrows <code>self</code>, then passes <code>self.deref_mut()</code> into the pipe
-function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
-    T: <a class="trait" href="raw/oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="src rightside" href="../src/opendal/raw/oio/read/api.rs.html#189-191">source</a><a href="#method.read" class="anchor">§</a><h4 class="code-header">fn <a href="raw/oio/trait.ReadExt.html#method.read" class="fn">read</a>&lt [...]
-    &amp;'a mut self,
-    buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;
-) -&gt; ReadToEndFuture&lt;'a, Self&gt;</h4></section></summary><div class='docblock'>Build a future for <code>read_to_end</code>.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-ReadExt-for-T-1" class="impl"><a href="#impl-ReadExt-for-T-1" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; ReadExt for T<div class="where">where
+function.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-T" class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code-header">c [...]
     T: AsyncRead + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read-3" class="method trait-impl"><a href="#method.read-3" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read</a>&lt;'a&gt;(&amp;'a mut self, buf: &amp;'a mut [<a class="primitive" href="https://doc. [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads some bytes from the byte stream. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_vectored-1" class="method trait-impl"><a href="#method.read_vectored-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_vectored</a> [...]
     &amp;'a mut self,
@@ -274,7 +278,7 @@ function.</div></details></div></details><details class="toggle implementors-tog
     &amp;'a mut self,
     buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>
 ) -&gt; ReadToStringFuture&lt;'a, Self&gt;<div class="where">where
-    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads all bytes from the byte stream and appends them into a string. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_exact-2" class="method trait-impl"><a href="#method.read_exact-2" class="anchor">§</a><h4 class="code-header">fn <a clas [...]
+    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads all bytes from the byte stream and appends them into a string. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_exact-3" class="method trait-impl"><a href="#method.read_exact-3" class="anchor">§</a><h4 class="code-header">fn <a clas [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Reads the exact number of bytes required to fill <code>buf</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.take-5" class="method trait-impl"><a href="#method.take-5" class="anchor">§</a><h4 class="code-header">fn <a class="fn">take</a [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Creates an adaptor which will read at most <code>limit</code> bytes from it. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.by_ref-1" class="method trait-impl"><a href="#method.by_ref-1" class="anchor">§</a><h4 class="code-header">fn <a clas [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Creates a “by reference” adaptor for this instance of <code>Read</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.bytes" class="method trait-impl"><a href="#method.bytes" class="anchor">§</a><h4 class="code-header">fn <a class="fn">byt [...]
@@ -283,8 +287,8 @@ function.</div></details></div></details><details class="toggle implementors-tog
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Creates an adaptor which will chain this stream with another. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.17.0/src/typenum/type_operators.rs. [...]
     T: AsyncSeek + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.seek-3" class="method trait-impl"><a href="#method.seek-3" class="anchor">§</a><h4 class="code-header">fn <a class="fn">seek</a>(&amp;mut self, pos: <a class="enum" href="https://doc.rust-lang.org/nightly/std/io/en [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Seeks to a new position in a byte stream. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-StreamExt-for-S" class="impl"><a href="#impl-StreamExt-for-S" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; StreamExt for S<d [...]
-    S: Stream + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_next-2" class="method trait-impl"><a href="#method.poll_next-2" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_next</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang [...]
-    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>A convenience for calling [<code>Stream::poll_next()</code>] on <code>!</code><a href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin"><code>Unpin</code></a> types.</div></details><details class="toggle method-toggle" open><summary><section id="met [...]
+    S: Stream + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_next-1" class="method trait-impl"><a href="#method.poll_next-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_next</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang [...]
+    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>A convenience for calling [<code>Stream::poll_next()</code>] on <code>!</code><a href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin"><code>Unpin</code></a> types.</div></details><details class="toggle method-toggle" open><summary><section id="met [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Retrieves the next item in the stream. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.try_next-2" class="method trait-impl"><a href="#method.try_next-2" class="anchor">§</a><h4 class="code-header">fn <a class="fn">try_next</a>&lt;T, E&gt;(&a [...]
     Self: Stream&lt;Item = <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;T, E&gt;&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Retrieves the next item in the stream. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section  [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Counts the number of items in the stream. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.map-3" class="method trait-impl"><a href="#method.map-3" class="anchor">§</a><h4 class="code-header">fn <a class="fn">map</a>&lt;T, F&gt;(self, f: F) -& [...]
@@ -365,8 +369,8 @@ function.</div></details></div></details><details class="toggle implementors-tog
     S: Stream&lt;Item = Self::Item&gt;,</div></h4></section></summary><span class="item-info"><div class="stab portability">Available on <strong>crate feature <code>std</code></strong> only.</div></span><div class='docblock'>Merges with <code>other</code> stream, with no preference for either stream when both are ready. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.boxed-1" class="method trait-impl"><a href="#method.boxed-1" class [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a,</div></h4></section></summary><span class="item-info"><div class="stab portability">Available on <strong>crate feature <code>alloc</code></strong> only.</div></span><div class='docblock'>Boxes the stream and changes [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a,</div></h4></section></summary><span class="item-info"><div class="stab portability">Available on <strong>crate feature <code>alloc</code></strong> only.</div></span><div class='docblock'>Boxes the stream and changes its type to <code>dyn Stream + 'a</code>. <a>Read more</a></div></details></div></details><details class="toggle implementors-tog [...]
-    S: Stream + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_next-3" class="method trait-impl"><a href="#method.poll_next-3" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_next</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang [...]
-    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>A convenience for calling [<code>Stream::poll_next()</code>] on <code>!</code><a href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin"><code>Unpin</code></a> types.</div></details><details class="toggle method-toggle" open><summary><section id="met [...]
+    S: Stream + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_next-2" class="method trait-impl"><a href="#method.poll_next-2" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_next</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang [...]
+    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>A convenience for calling [<code>Stream::poll_next()</code>] on <code>!</code><a href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin"><code>Unpin</code></a> types.</div></details><details class="toggle method-toggle" open><summary><section id="met [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Retrieves the next item in the stream. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.try_next-3" class="method trait-impl"><a href="#method.try_next-3" class="anchor">§</a><h4 class="code-header">fn <a class="fn">try_next</a>&lt;T, E&gt;(&a [...]
     Self: Stream&lt;Item = <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;T, E&gt;&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Retrieves the next item in the stream. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section  [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Counts the number of items in the stream. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.map-4" class="method trait-impl"><a href="#method.map-4" class="anchor">§</a><h4 class="code-header">fn <a class="fn">map</a>&lt;T, F&gt;(self, f: F) -& [...]
@@ -447,7 +451,7 @@ function.</div></details></div></details><details class="toggle implementors-tog
     S: Stream&lt;Item = Self::Item&gt;,</div></h4></section></summary><span class="item-info"><div class="stab portability">Available on <strong>crate features <code>std</code> and <code>race</code></strong> only.</div></span><div class='docblock'>Merges with <code>other</code> stream, with no preference for either stream when both are ready. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.boxed-2" class="method trait-impl"><a href= [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a,</div></h4></section></summary><span class="item-info"><div class="stab portability">Available on <strong>crate feature <code>alloc</code></strong> only.</div></span><div class='docblock'>Boxes the stream and changes [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a,</div></h4></section></summary><span class="item-info"><div class="stab portability">Available on <strong>crate feature <code>alloc</code></strong> only.</div></span><div class='docblock'>Boxes the stream and changes its type to <code>dyn Stream + 'a</code>. <a>Read more</a></div></details></div></details><details class="toggle implementors-tog [...]
-    St: Stream + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-2" class="method trait-impl"><a href="#method.next-2" class="anchor">§</a><h4 class="code-header">fn <a class="fn">next</a>(&amp;mut self) -&gt; Next&lt;'_, Self&gt;<div class="where">where
+    St: Stream + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-1" class="method trait-impl"><a href="#method.next-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">next</a>(&amp;mut self) -&gt; Next&lt;'_, Self&gt;<div class="where">where
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Consumes and returns the next value in the stream or <code>None</code> if the
 stream is finished. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.try_next-1" class="method trait-impl"><a href="#method.try_next-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">try_next</a>&lt;T, E&gt;(&amp;mut self) -&gt; TryNext&lt;'_, Self&gt;<div class="where">where
     Self: Stream&lt;Item = <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;T, E&gt;&gt; + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Consumes and returns the next item in the stream. If an error is
@@ -502,7 +506,7 @@ producing a single, final value. <a>Read more</a></div></details><details class=
     duration: <a class="struct" href="https://doc.rust-lang.org/nightly/core/time/struct.Duration.html" title="struct core::time::Duration">Duration</a>
 ) -&gt; ChunksTimeout&lt;Self&gt;<div class="where">where
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><span class="item-info"><div class="stab portability">Available on <strong>crate feature <code>time</code></strong> only.</div></span><div class='docblock'>Batches the items in the given stream using a maximum duration and size for each batch. <a>Read more</a></div></details></div></details><details class="toggle imple [...]
-    T: Stream + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-1" class="method trait-impl"><a href="#method.next-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">next</a>(&amp;mut self) -&gt; Next&lt;'_, Self&gt;<div class="where">where
+    T: Stream + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next" class="method trait-impl"><a href="#method.next" class="anchor">§</a><h4 class="code-header">fn <a class="fn">next</a>(&amp;mut self) -&gt; Next&lt;'_, Self&gt;<div class="where">where
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Creates a future that resolves to the next item in the stream. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.into_future" class="method trait-impl"><a href="#method.into_future" class="anchor">§</a><h4 class="code-header">fn <a class="fn">i [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Converts this stream into a future of <code>(next_item, tail_of_stream)</code>.
 If the stream terminates, then the next item is <a href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html#variant.None" title="variant core::option::Option::None"><code>None</code></a>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.map" class="method trait-impl"><a href="#method.map" class="anchor">§</a><h4 class="code-header">fn <a class="fn">map</a>&lt;T, F&gt;(self, f: F) -&gt; Map&lt;Self, F&gt;<div class="where">where
@@ -628,7 +632,7 @@ of that <code>Either</code>. <a>Read more</a></div></details><details class="tog
 stream types.</div></details><details class="toggle method-toggle" open><summary><section id="method.select_next_some" class="method trait-impl"><a href="#method.select_next_some" class="anchor">§</a><h4 class="code-header">fn <a class="fn">select_next_some</a>(&amp;mut self) -&gt; SelectNextSome&lt;'_, Self&gt;<div class="where">where
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + FusedStream,</div></h4></section></summary><div class='docblock'>Returns a <a href="https://doc.rust-lang.org/nightly/core/future/future/trait.Future.html" title="trait core::future::future::Future"><code>Future</code></a> that resolves when the next item in this stream is
 ready. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-StreamExt-for-T-1" class="impl"><a href="#impl-StreamExt-for-T-1" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; StreamExt for T<div class="where">where
-    T: Stream + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-3" class="method trait-impl"><a href="#method.next-3" class="anchor">§</a><h4 class="code-header">fn <a class="fn">next</a>(&amp;mut self) -&gt; NextFuture&lt;'_, Self&gt;<div class="where">where
+    T: Stream + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-2" class="method trait-impl"><a href="#method.next-2" class="anchor">§</a><h4 class="code-header">fn <a class="fn">next</a>(&amp;mut self) -&gt; NextFuture&lt;'_, Self&gt;<div class="where">where
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h4></section></summary><div class='docblock'>Advances the stream and returns the next value. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.take-4" class="method trait-impl"><a href="#method.take-4" class="anchor">§</a><h4 class="code-header">fn <a class="fn">take</a>(self, n: <a class [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Creates a stream that yields its first <code>n</code> elements. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.take_while-2" class="method trait-impl"><a href="#method.take_while-2" class="anchor">§</a><h4 class="code-header">fn <a class="fn [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
diff --git a/docs/rust/search-index.js b/docs/rust/search-index.js
index 476e14709d..a519aa3224 100644
--- a/docs/rust/search-index.js
+++ b/docs/rust/search-index.js
@@ -1,5 +1,5 @@
 var searchIndex = new Map(JSON.parse('[\
-["opendal",{"doc":"Apache OpenDAL™ is a data access layer that allows users …","t":"RPPPPPPPFFFFKPPFPPPPPPPPPPPPPPPPPPPFGPFGPPPPPPPPPPPPPPPPPPPPPPPPFPPFGPPPPPPPPPPFFFPPPPPPFPPIPPTGPPPPPPPPPPPPPPPPFPNOOONNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNONNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN [...]
+["opendal",{"doc":"Apache OpenDAL™ is a data access layer that allows users …","t":"RPPPPPPPFFFFKPPFPPPPPPPPPPPPPPPPPPPFGPFGPPPPPPPPPPPPPPPPPPPPPPPPFPPFGPPPPPPPPPPFFFPPPPPPFPPIPPTGPPPPPPPPPPPPPPPPFPNOOONNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNONNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN [...]
 ]'));
 if (typeof exports !== 'undefined') exports.searchIndex = searchIndex;
 else if (window.initSearch) window.initSearch(searchIndex);
diff --git a/docs/rust/src/opendal/layers/blocking.rs.html b/docs/rust/src/opendal/layers/blocking.rs.html
index 12828c06de..09addf3ba0 100644
--- a/docs/rust/src/opendal/layers/blocking.rs.html
+++ b/docs/rust/src/opendal/layers/blocking.rs.html
@@ -361,6 +361,13 @@
 <a href="#359" id="359">359</a>
 <a href="#360" id="360">360</a>
 <a href="#361" id="361">361</a>
+<a href="#362" id="362">362</a>
+<a href="#363" id="363">363</a>
+<a href="#364" id="364">364</a>
+<a href="#365" id="365">365</a>
+<a href="#366" id="366">366</a>
+<a href="#367" id="367">367</a>
+<a href="#368" id="368">368</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -380,11 +387,10 @@
 
 </span><span class="kw">use </span>async_trait::async_trait;
 <span class="kw">use </span>bytes;
-<span class="kw">use </span>bytes::Bytes;
+<span class="kw">use </span>bytes::{BufMut, Bytes};
 <span class="kw">use </span>futures::future::poll_fn;
 <span class="kw">use </span>tokio::runtime::Handle;
 
-<span class="kw">use </span><span class="kw">crate</span>::raw::oio::ReadExt;
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
@@ -652,8 +658,11 @@
 }
 
 <span class="kw">impl</span>&lt;I: oio::Read + <span class="lifetime">'static</span>&gt; oio::BlockingRead <span class="kw">for </span>BlockingWrapper&lt;I&gt; {
-    <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="self">self</span>.handle.block_on(<span class="self">self</span>.inner.read(buf))
+    <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw-2">mut </span>buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
+        <span class="kw">let </span>bs = <span class="self">self</span>.handle.block_on(<span class="self">self</span>.inner.read(buf.len()));
+        <span class="kw">let </span>bs = bs<span class="question-mark">?</span>;
+        buf.put_slice(<span class="kw-2">&amp;</span>bs);
+        <span class="prelude-val">Ok</span>(bs.len())
     }
 
     <span class="kw">fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: std::io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
@@ -661,7 +670,12 @@
     }
 
     <span class="kw">fn </span>next(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt; {
-        <span class="self">self</span>.handle.block_on(<span class="self">self</span>.inner.next())
+        <span class="kw">let </span>bs = <span class="self">self</span>.handle.block_on(<span class="self">self</span>.inner.read(<span class="number">4 </span>* <span class="number">1024 </span>* <span class="number">1024</span>));
+        <span class="kw">match </span>bs {
+            <span class="prelude-val">Ok</span>(bs) <span class="kw">if </span>bs.is_empty() =&gt; <span class="prelude-val">None</span>,
+            <span class="prelude-val">Ok</span>(bs) =&gt; <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bs)),
+            <span class="prelude-val">Err</span>(err) =&gt; <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)),
+        }
     }
 }
 
diff --git a/docs/rust/src/opendal/layers/chaos.rs.html b/docs/rust/src/opendal/layers/chaos.rs.html
index 0331de98d1..91583596e2 100644
--- a/docs/rust/src/opendal/layers/chaos.rs.html
+++ b/docs/rust/src/opendal/layers/chaos.rs.html
@@ -218,16 +218,6 @@
 <a href="#216" id="216">216</a>
 <a href="#217" id="217">217</a>
 <a href="#218" id="218">218</a>
-<a href="#219" id="219">219</a>
-<a href="#220" id="220">220</a>
-<a href="#221" id="221">221</a>
-<a href="#222" id="222">222</a>
-<a href="#223" id="223">223</a>
-<a href="#224" id="224">224</a>
-<a href="#225" id="225">225</a>
-<a href="#226" id="226">226</a>
-<a href="#227" id="227">227</a>
-<a href="#228" id="228">228</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -246,8 +236,6 @@
 // under the License.
 
 </span><span class="kw">use </span>std::io;
-<span class="kw">use </span>std::task::Context;
-<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>async_trait::async_trait;
 <span class="kw">use </span>bytes::Bytes;
@@ -406,27 +394,19 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>ChaosReader&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
         <span class="kw">if </span><span class="self">self</span>.i_feel_lucky() {
-            <span class="self">self</span>.inner.poll_read(cx, buf)
-        } <span class="kw">else </span>{
-            Poll::Ready(<span class="prelude-val">Err</span>(<span class="self">Self</span>::unexpected_eof()))
-        }
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="kw">if </span><span class="self">self</span>.i_feel_lucky() {
-            <span class="self">self</span>.inner.poll_seek(cx, pos)
-        } <span class="kw">else </span>{
-            Poll::Ready(<span class="prelude-val">Err</span>(<span class="self">Self</span>::unexpected_eof()))
+            <span class="self">self</span>.inner.read(size).<span class="kw">await
+        </span>} <span class="kw">else </span>{
+            <span class="prelude-val">Err</span>(<span class="self">Self</span>::unexpected_eof())
         }
     }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">if </span><span class="self">self</span>.i_feel_lucky() {
-            <span class="self">self</span>.inner.poll_next(cx)
-        } <span class="kw">else </span>{
-            Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(<span class="self">Self</span>::unexpected_eof())))
+            <span class="self">self</span>.inner.seek(pos).<span class="kw">await
+        </span>} <span class="kw">else </span>{
+            <span class="prelude-val">Err</span>(<span class="self">Self</span>::unexpected_eof())
         }
     }
 }
diff --git a/docs/rust/src/opendal/layers/concurrent_limit.rs.html b/docs/rust/src/opendal/layers/concurrent_limit.rs.html
index be8aff47eb..99ad829f10 100644
--- a/docs/rust/src/opendal/layers/concurrent_limit.rs.html
+++ b/docs/rust/src/opendal/layers/concurrent_limit.rs.html
@@ -317,10 +317,6 @@
 <a href="#315" id="315">315</a>
 <a href="#316" id="316">316</a>
 <a href="#317" id="317">317</a>
-<a href="#318" id="318">318</a>
-<a href="#319" id="319">319</a>
-<a href="#320" id="320">320</a>
-<a href="#321" id="321">321</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -580,17 +576,13 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>ConcurrentLimitWrapper&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="self">self</span>.inner.poll_read(cx, buf)
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="self">self</span>.inner.poll_seek(cx, pos)
-    }
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.seek(pos).<span class="kw">await
+    </span>}
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="self">self</span>.inner.poll_next(cx)
-    }
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="self">self</span>.inner.read(size).<span class="kw">await
+    </span>}
 }
 
 <span class="kw">impl</span>&lt;R: oio::BlockingRead&gt; oio::BlockingRead <span class="kw">for </span>ConcurrentLimitWrapper&lt;R&gt; {
diff --git a/docs/rust/src/opendal/layers/dtrace.rs.html b/docs/rust/src/opendal/layers/dtrace.rs.html
index 21f2c31f82..86472239de 100644
--- a/docs/rust/src/opendal/layers/dtrace.rs.html
+++ b/docs/rust/src/opendal/layers/dtrace.rs.html
@@ -504,24 +504,6 @@
 <a href="#502" id="502">502</a>
 <a href="#503" id="503">503</a>
 <a href="#504" id="504">504</a>
-<a href="#505" id="505">505</a>
-<a href="#506" id="506">506</a>
-<a href="#507" id="507">507</a>
-<a href="#508" id="508">508</a>
-<a href="#509" id="509">509</a>
-<a href="#510" id="510">510</a>
-<a href="#511" id="511">511</a>
-<a href="#512" id="512">512</a>
-<a href="#513" id="513">513</a>
-<a href="#514" id="514">514</a>
-<a href="#515" id="515">515</a>
-<a href="#516" id="516">516</a>
-<a href="#517" id="517">517</a>
-<a href="#518" id="518">518</a>
-<a href="#519" id="519">519</a>
-<a href="#520" id="520">520</a>
-<a href="#521" id="521">521</a>
-<a href="#522" id="522">522</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -868,24 +850,25 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>DtraceLayerWrapper&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
         <span class="kw">let </span>c_path = CString::new(<span class="self">self</span>.path.clone()).unwrap();
         <span class="macro">probe_lazy!</span>(opendal, reader_read_start, c_path.as_ptr());
-        <span class="self">self</span>.inner.poll_read(cx, buf).map(|res| <span class="kw">match </span>res {
-            <span class="prelude-val">Ok</span>(n) =&gt; {
-                <span class="macro">probe_lazy!</span>(opendal, reader_read_ok, c_path.as_ptr(), n);
-                <span class="prelude-val">Ok</span>(n)
+        <span class="kw">match </span><span class="self">self</span>.inner.read(size).<span class="kw">await </span>{
+            <span class="prelude-val">Ok</span>(bs) =&gt; {
+                <span class="macro">probe_lazy!</span>(opendal, reader_read_ok, c_path.as_ptr(), bs.len());
+                <span class="prelude-val">Ok</span>(bs)
             }
             <span class="prelude-val">Err</span>(e) =&gt; {
                 <span class="macro">probe_lazy!</span>(opendal, reader_read_error, c_path.as_ptr());
                 <span class="prelude-val">Err</span>(e)
             }
-        })
+        }
     }
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
+
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">let </span>c_path = CString::new(<span class="self">self</span>.path.clone()).unwrap();
         <span class="macro">probe_lazy!</span>(opendal, reader_seek_start, c_path.as_ptr());
-        <span class="self">self</span>.inner.poll_seek(cx, pos).map(|res| <span class="kw">match </span>res {
+        <span class="kw">match </span><span class="self">self</span>.inner.seek(pos).<span class="kw">await </span>{
             <span class="prelude-val">Ok</span>(n) =&gt; {
                 <span class="macro">probe_lazy!</span>(opendal, reader_seek_ok, c_path.as_ptr(), n);
                 <span class="prelude-val">Ok</span>(n)
@@ -894,26 +877,7 @@
                 <span class="macro">probe_lazy!</span>(opendal, reader_seek_error, c_path.as_ptr());
                 <span class="prelude-val">Err</span>(e)
             }
-        })
-    }
-
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">let </span>c_path = CString::new(<span class="self">self</span>.path.clone()).unwrap();
-        <span class="macro">probe_lazy!</span>(opendal, reader_next_start, c_path.as_ptr());
-        <span class="self">self</span>.inner.poll_next(cx).map(|res| <span class="kw">match </span>res {
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bytes)) =&gt; {
-                <span class="macro">probe_lazy!</span>(opendal, reader_next_ok, c_path.as_ptr(), bytes.len());
-                <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bytes))
-            }
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(e)) =&gt; {
-                <span class="macro">probe_lazy!</span>(opendal, reader_next_error, c_path.as_ptr());
-                <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(e))
-            }
-            <span class="prelude-val">None </span>=&gt; {
-                <span class="macro">probe_lazy!</span>(opendal, reader_next_end, c_path.as_ptr());
-                <span class="prelude-val">None
-            </span>}
-        })
+        }
     }
 }
 
diff --git a/docs/rust/src/opendal/layers/error_context.rs.html b/docs/rust/src/opendal/layers/error_context.rs.html
index bc702dc3c0..f9f6194a6d 100644
--- a/docs/rust/src/opendal/layers/error_context.rs.html
+++ b/docs/rust/src/opendal/layers/error_context.rs.html
@@ -465,15 +465,6 @@
 <a href="#463" id="463">463</a>
 <a href="#464" id="464">464</a>
 <a href="#465" id="465">465</a>
-<a href="#466" id="466">466</a>
-<a href="#467" id="467">467</a>
-<a href="#468" id="468">468</a>
-<a href="#469" id="469">469</a>
-<a href="#470" id="470">470</a>
-<a href="#471" id="471">471</a>
-<a href="#472" id="472">472</a>
-<a href="#473" id="473">473</a>
-<a href="#474" id="474">474</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -825,25 +816,16 @@
 }
 
 <span class="kw">impl</span>&lt;T: oio::Read&gt; oio::Read <span class="kw">for </span>ErrorContextWrapper&lt;T&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="self">self</span>.inner.poll_read(cx, buf).map_err(|err| {
-            err.with_operation(ReadOperation::Read)
-                .with_context(<span class="string">"service"</span>, <span class="self">self</span>.scheme)
-                .with_context(<span class="string">"path"</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path)
-                .with_context(<span class="string">"read_buf"</span>, buf.len().to_string())
-        })
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="self">self</span>.inner.poll_seek(cx, pos).map_err(|err| {
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.seek(pos).<span class="kw">await</span>.map_err(|err| {
             err.with_operation(ReadOperation::Seek)
                 .with_context(<span class="string">"service"</span>, <span class="self">self</span>.scheme)
                 .with_context(<span class="string">"path"</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path)
         })
     }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="self">self</span>.inner.poll_next(cx).map_err(|err| {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="self">self</span>.inner.read(size).<span class="kw">await</span>.map_err(|err| {
             err.with_operation(ReadOperation::Next)
                 .with_context(<span class="string">"service"</span>, <span class="self">self</span>.scheme)
                 .with_context(<span class="string">"path"</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path)
diff --git a/docs/rust/src/opendal/layers/logging.rs.html b/docs/rust/src/opendal/layers/logging.rs.html
index 70c48a15ce..ac56c88955 100644
--- a/docs/rust/src/opendal/layers/logging.rs.html
+++ b/docs/rust/src/opendal/layers/logging.rs.html
@@ -1478,93 +1478,6 @@
 <a href="#1476" id="1476">1476</a>
 <a href="#1477" id="1477">1477</a>
 <a href="#1478" id="1478">1478</a>
-<a href="#1479" id="1479">1479</a>
-<a href="#1480" id="1480">1480</a>
-<a href="#1481" id="1481">1481</a>
-<a href="#1482" id="1482">1482</a>
-<a href="#1483" id="1483">1483</a>
-<a href="#1484" id="1484">1484</a>
-<a href="#1485" id="1485">1485</a>
-<a href="#1486" id="1486">1486</a>
-<a href="#1487" id="1487">1487</a>
-<a href="#1488" id="1488">1488</a>
-<a href="#1489" id="1489">1489</a>
-<a href="#1490" id="1490">1490</a>
-<a href="#1491" id="1491">1491</a>
-<a href="#1492" id="1492">1492</a>
-<a href="#1493" id="1493">1493</a>
-<a href="#1494" id="1494">1494</a>
-<a href="#1495" id="1495">1495</a>
-<a href="#1496" id="1496">1496</a>
-<a href="#1497" id="1497">1497</a>
-<a href="#1498" id="1498">1498</a>
-<a href="#1499" id="1499">1499</a>
-<a href="#1500" id="1500">1500</a>
-<a href="#1501" id="1501">1501</a>
-<a href="#1502" id="1502">1502</a>
-<a href="#1503" id="1503">1503</a>
-<a href="#1504" id="1504">1504</a>
-<a href="#1505" id="1505">1505</a>
-<a href="#1506" id="1506">1506</a>
-<a href="#1507" id="1507">1507</a>
-<a href="#1508" id="1508">1508</a>
-<a href="#1509" id="1509">1509</a>
-<a href="#1510" id="1510">1510</a>
-<a href="#1511" id="1511">1511</a>
-<a href="#1512" id="1512">1512</a>
-<a href="#1513" id="1513">1513</a>
-<a href="#1514" id="1514">1514</a>
-<a href="#1515" id="1515">1515</a>
-<a href="#1516" id="1516">1516</a>
-<a href="#1517" id="1517">1517</a>
-<a href="#1518" id="1518">1518</a>
-<a href="#1519" id="1519">1519</a>
-<a href="#1520" id="1520">1520</a>
-<a href="#1521" id="1521">1521</a>
-<a href="#1522" id="1522">1522</a>
-<a href="#1523" id="1523">1523</a>
-<a href="#1524" id="1524">1524</a>
-<a href="#1525" id="1525">1525</a>
-<a href="#1526" id="1526">1526</a>
-<a href="#1527" id="1527">1527</a>
-<a href="#1528" id="1528">1528</a>
-<a href="#1529" id="1529">1529</a>
-<a href="#1530" id="1530">1530</a>
-<a href="#1531" id="1531">1531</a>
-<a href="#1532" id="1532">1532</a>
-<a href="#1533" id="1533">1533</a>
-<a href="#1534" id="1534">1534</a>
-<a href="#1535" id="1535">1535</a>
-<a href="#1536" id="1536">1536</a>
-<a href="#1537" id="1537">1537</a>
-<a href="#1538" id="1538">1538</a>
-<a href="#1539" id="1539">1539</a>
-<a href="#1540" id="1540">1540</a>
-<a href="#1541" id="1541">1541</a>
-<a href="#1542" id="1542">1542</a>
-<a href="#1543" id="1543">1543</a>
-<a href="#1544" id="1544">1544</a>
-<a href="#1545" id="1545">1545</a>
-<a href="#1546" id="1546">1546</a>
-<a href="#1547" id="1547">1547</a>
-<a href="#1548" id="1548">1548</a>
-<a href="#1549" id="1549">1549</a>
-<a href="#1550" id="1550">1550</a>
-<a href="#1551" id="1551">1551</a>
-<a href="#1552" id="1552">1552</a>
-<a href="#1553" id="1553">1553</a>
-<a href="#1554" id="1554">1554</a>
-<a href="#1555" id="1555">1555</a>
-<a href="#1556" id="1556">1556</a>
-<a href="#1557" id="1557">1557</a>
-<a href="#1558" id="1558">1558</a>
-<a href="#1559" id="1559">1559</a>
-<a href="#1560" id="1560">1560</a>
-<a href="#1561" id="1561">1561</a>
-<a href="#1562" id="1562">1562</a>
-<a href="#1563" id="1563">1563</a>
-<a href="#1564" id="1564">1564</a>
-<a href="#1565" id="1565">1565</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -2558,153 +2471,66 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>LoggingReader&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="kw">let </span>buf_size = buf.len();
-
-        <span class="kw">match </span><span class="self">self</span>.inner.poll_read(cx, buf) {
-            Poll::Ready(res) =&gt; <span class="kw">match </span>res {
-                <span class="prelude-val">Ok</span>(n) =&gt; {
-                    <span class="self">self</span>.read += n <span class="kw">as </span>u64;
-                    <span class="macro">trace!</span>(
-                        target: LOGGING_TARGET,
-                        <span class="string">"service={} operation={} path={} read={} -&gt; buf size: {}B, read {}B "</span>,
-                        <span class="self">self</span>.ctx.scheme,
-                        ReadOperation::Read,
-                        <span class="self">self</span>.path,
-                        <span class="self">self</span>.read,
-                        buf_size,
-                        n
-                    );
-                    Poll::Ready(<span class="prelude-val">Ok</span>(n))
-                }
-                <span class="prelude-val">Err</span>(err) =&gt; {
-                    <span class="kw">if let </span><span class="prelude-val">Some</span>(lvl) = <span class="self">self</span>.ctx.error_level(<span class="kw-2">&amp;</span>err) {
-                        <span class="macro">log!</span>(
-                            target: LOGGING_TARGET,
-                            lvl,
-                            <span class="string">"service={} operation={} path={} read={} -&gt; read failed: {}"</span>,
-                            <span class="self">self</span>.ctx.scheme,
-                            ReadOperation::Read,
-                            <span class="self">self</span>.path,
-                            <span class="self">self</span>.read,
-                            <span class="self">self</span>.ctx.error_print(<span class="kw-2">&amp;</span>err)
-                        )
-                    }
-                    Poll::Ready(<span class="prelude-val">Err</span>(err))
-                }
-            },
-            Poll::Pending =&gt; {
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">match </span><span class="self">self</span>.inner.seek(pos).<span class="kw">await </span>{
+            <span class="prelude-val">Ok</span>(n) =&gt; {
                 <span class="macro">trace!</span>(
                     target: LOGGING_TARGET,
-                    <span class="string">"service={} operation={} path={} read={} -&gt; buf size: {}B, read pending"</span>,
+                    <span class="string">"service={} operation={} path={} read={} -&gt; seek to {pos:?}, current offset {n}"</span>,
                     <span class="self">self</span>.ctx.scheme,
-                    ReadOperation::Read,
+                    ReadOperation::Seek,
                     <span class="self">self</span>.path,
                     <span class="self">self</span>.read,
-                    buf_size
                 );
-                Poll::Pending
+                <span class="prelude-val">Ok</span>(n)
             }
-        }
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="kw">match </span><span class="self">self</span>.inner.poll_seek(cx, pos) {
-            Poll::Ready(res) =&gt; <span class="kw">match </span>res {
-                <span class="prelude-val">Ok</span>(n) =&gt; {
-                    <span class="macro">trace!</span>(
+            <span class="prelude-val">Err</span>(err) =&gt; {
+                <span class="kw">if let </span><span class="prelude-val">Some</span>(lvl) = <span class="self">self</span>.ctx.error_level(<span class="kw-2">&amp;</span>err) {
+                    <span class="macro">log!</span>(
                         target: LOGGING_TARGET,
-                        <span class="string">"service={} operation={} path={} read={} -&gt; seek to {pos:?}, current offset {n}"</span>,
+                        lvl,
+                        <span class="string">"service={} operation={} path={} read={} -&gt; seek to {pos:?} failed: {}"</span>,
                         <span class="self">self</span>.ctx.scheme,
                         ReadOperation::Seek,
                         <span class="self">self</span>.path,
                         <span class="self">self</span>.read,
-                    );
-                    Poll::Ready(<span class="prelude-val">Ok</span>(n))
-                }
-                <span class="prelude-val">Err</span>(err) =&gt; {
-                    <span class="kw">if let </span><span class="prelude-val">Some</span>(lvl) = <span class="self">self</span>.ctx.error_level(<span class="kw-2">&amp;</span>err) {
-                        <span class="macro">log!</span>(
-                            target: LOGGING_TARGET,
-                            lvl,
-                            <span class="string">"service={} operation={} path={} read={} -&gt; seek to {pos:?} failed: {}"</span>,
-                            <span class="self">self</span>.ctx.scheme,
-                            ReadOperation::Seek,
-                            <span class="self">self</span>.path,
-                            <span class="self">self</span>.read,
-                            <span class="self">self</span>.ctx.error_print(<span class="kw-2">&amp;</span>err),
-                        )
-                    }
-                    Poll::Ready(<span class="prelude-val">Err</span>(err))
+                        <span class="self">self</span>.ctx.error_print(<span class="kw-2">&amp;</span>err),
+                    )
                 }
-            },
-            Poll::Pending =&gt; {
+                <span class="prelude-val">Err</span>(err)
+            }
+        }
+    }
+
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="kw">match </span><span class="self">self</span>.inner.read(size).<span class="kw">await </span>{
+            <span class="prelude-val">Ok</span>(bs) =&gt; {
+                <span class="self">self</span>.read += bs.len() <span class="kw">as </span>u64;
                 <span class="macro">trace!</span>(
                     target: LOGGING_TARGET,
-                    <span class="string">"service={} operation={} path={} read={} -&gt; seek to {pos:?} pending"</span>,
+                    <span class="string">"service={} operation={} path={} read={} -&gt; next returns {}B"</span>,
                     <span class="self">self</span>.ctx.scheme,
-                    ReadOperation::Seek,
+                    ReadOperation::Next,
                     <span class="self">self</span>.path,
-                    <span class="self">self</span>.read
+                    <span class="self">self</span>.read,
+                    bs.len()
                 );
-                Poll::Pending
+                <span class="prelude-val">Ok</span>(bs)
             }
-        }
-    }
-
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">match </span><span class="self">self</span>.inner.poll_next(cx) {
-            Poll::Ready(res) =&gt; <span class="kw">match </span>res {
-                <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bs)) =&gt; {
-                    <span class="self">self</span>.read += bs.len() <span class="kw">as </span>u64;
-                    <span class="macro">trace!</span>(
-                        target: LOGGING_TARGET,
-                        <span class="string">"service={} operation={} path={} read={} -&gt; next returns {}B"</span>,
-                        <span class="self">self</span>.ctx.scheme,
-                        ReadOperation::Next,
-                        <span class="self">self</span>.path,
-                        <span class="self">self</span>.read,
-                        bs.len()
-                    );
-                    Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bs)))
-                }
-                <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)) =&gt; {
-                    <span class="kw">if let </span><span class="prelude-val">Some</span>(lvl) = <span class="self">self</span>.ctx.error_level(<span class="kw-2">&amp;</span>err) {
-                        <span class="macro">log!</span>(
-                            target: LOGGING_TARGET,
-                            lvl,
-                            <span class="string">"service={} operation={} path={} read={} -&gt; next failed: {}"</span>,
-                            <span class="self">self</span>.ctx.scheme,
-                            ReadOperation::Next,
-                            <span class="self">self</span>.path,
-                            <span class="self">self</span>.read,
-                            <span class="self">self</span>.ctx.error_print(<span class="kw-2">&amp;</span>err),
-                        )
-                    }
-                    Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)))
-                }
-                <span class="prelude-val">None </span>=&gt; {
-                    <span class="macro">trace!</span>(
+            <span class="prelude-val">Err</span>(err) =&gt; {
+                <span class="kw">if let </span><span class="prelude-val">Some</span>(lvl) = <span class="self">self</span>.ctx.error_level(<span class="kw-2">&amp;</span>err) {
+                    <span class="macro">log!</span>(
                         target: LOGGING_TARGET,
-                        <span class="string">"service={} operation={} path={} read={} -&gt; next returns None"</span>,
+                        lvl,
+                        <span class="string">"service={} operation={} path={} read={} -&gt; next failed: {}"</span>,
                         <span class="self">self</span>.ctx.scheme,
                         ReadOperation::Next,
                         <span class="self">self</span>.path,
                         <span class="self">self</span>.read,
-                    );
-                    Poll::Ready(<span class="prelude-val">None</span>)
+                        <span class="self">self</span>.ctx.error_print(<span class="kw-2">&amp;</span>err),
+                    )
                 }
-            },
-            Poll::Pending =&gt; {
-                <span class="macro">trace!</span>(
-                    target: LOGGING_TARGET,
-                    <span class="string">"service={} operation={} path={} read={} -&gt; next returns pending"</span>,
-                    <span class="self">self</span>.ctx.scheme,
-                    ReadOperation::Next,
-                    <span class="self">self</span>.path,
-                    <span class="self">self</span>.read
-                );
-                Poll::Pending
+                <span class="prelude-val">Err</span>(err)
             }
         }
     }
diff --git a/docs/rust/src/opendal/layers/madsim.rs.html b/docs/rust/src/opendal/layers/madsim.rs.html
index db36c015b4..0caa50b64d 100644
--- a/docs/rust/src/opendal/layers/madsim.rs.html
+++ b/docs/rust/src/opendal/layers/madsim.rs.html
@@ -451,13 +451,6 @@
 <a href="#449" id="449">449</a>
 <a href="#450" id="450">450</a>
 <a href="#451" id="451">451</a>
-<a href="#452" id="452">452</a>
-<a href="#453" id="453">453</a>
-<a href="#454" id="454">454</a>
-<a href="#455" id="455">455</a>
-<a href="#456" id="456">456</a>
-<a href="#457" id="457">457</a>
-<a href="#458" id="458">458</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -482,6 +475,7 @@
 #![allow(dead_code)]
 
 </span><span class="kw">use </span>std::any::Any;
+<span class="kw">use </span>std::cmp::min;
 <span class="kw">use </span>std::collections::HashMap;
 <span class="kw">use </span>std::fmt::Debug;
 <span class="kw">use </span>std::io::Result;
@@ -722,28 +716,20 @@
 }
 
 <span class="kw">impl </span>oio::Read <span class="kw">for </span>MadsimReader {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="kw">crate</span>::Result&lt;usize&gt;&gt; {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="kw">crate</span>::Result&lt;Bytes&gt; {
         <span class="kw">if let </span><span class="prelude-val">Some</span>(<span class="kw-2">ref </span>data) = <span class="self">self</span>.data {
-            <span class="kw">let </span>len = data.len();
-            buf[..len].copy_from_slice(data);
-            Poll::Ready(<span class="prelude-val">Ok</span>(len))
+            <span class="kw">let </span>size = min(size, data.len());
+            <span class="prelude-val">Ok</span>(data.clone().split_to(size))
         } <span class="kw">else </span>{
-            Poll::Ready(<span class="prelude-val">Ok</span>(<span class="number">0</span>))
+            <span class="prelude-val">Ok</span>(Bytes::new())
         }
     }
 
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, <span class="kw">_</span>: SeekFrom) -&gt; Poll&lt;<span class="kw">crate</span>::Result&lt;u64&gt;&gt; {
-        Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
-            ErrorKind::Unsupported,
-            <span class="string">"will be supported in the future"</span>,
-        )))
-    }
-
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="kw">crate</span>::Result&lt;Bytes&gt;&gt;&gt; {
-        Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(Error::new(
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: SeekFrom) -&gt; <span class="kw">crate</span>::Result&lt;u64&gt; {
+        <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">"will be supported in the future"</span>,
-        ))))
+        ))
     }
 }
 
diff --git a/docs/rust/src/opendal/layers/metrics.rs.html b/docs/rust/src/opendal/layers/metrics.rs.html
index ea7339d1b4..602f1b94f4 100644
--- a/docs/rust/src/opendal/layers/metrics.rs.html
+++ b/docs/rust/src/opendal/layers/metrics.rs.html
@@ -884,20 +884,6 @@
 <a href="#882" id="882">882</a>
 <a href="#883" id="883">883</a>
 <a href="#884" id="884">884</a>
-<a href="#885" id="885">885</a>
-<a href="#886" id="886">886</a>
-<a href="#887" id="887">887</a>
-<a href="#888" id="888">888</a>
-<a href="#889" id="889">889</a>
-<a href="#890" id="890">890</a>
-<a href="#891" id="891">891</a>
-<a href="#892" id="892">892</a>
-<a href="#893" id="893">893</a>
-<a href="#894" id="894">894</a>
-<a href="#895" id="895">895</a>
-<a href="#896" id="896">896</a>
-<a href="#897" id="897">897</a>
-<a href="#898" id="898">898</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -1673,41 +1659,27 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>MetricWrapper&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="self">self</span>.inner.poll_read(cx, buf).map(|res| <span class="kw">match </span>res {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="kw">match </span><span class="self">self</span>.inner.read(size).<span class="kw">await </span>{
             <span class="prelude-val">Ok</span>(bytes) =&gt; {
-                <span class="self">self</span>.bytes += bytes <span class="kw">as </span>u64;
+                <span class="self">self</span>.bytes += bytes.len() <span class="kw">as </span>u64;
                 <span class="prelude-val">Ok</span>(bytes)
             }
             <span class="prelude-val">Err</span>(e) =&gt; {
                 <span class="self">self</span>.handle.increment_errors_total(<span class="self">self</span>.op, e.kind());
                 <span class="prelude-val">Err</span>(e)
             }
-        })
+        }
     }
 
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="self">self</span>.inner.poll_seek(cx, pos).map(|res| <span class="kw">match </span>res {
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">match </span><span class="self">self</span>.inner.seek(pos).<span class="kw">await </span>{
             <span class="prelude-val">Ok</span>(n) =&gt; <span class="prelude-val">Ok</span>(n),
             <span class="prelude-val">Err</span>(e) =&gt; {
                 <span class="self">self</span>.handle.increment_errors_total(<span class="self">self</span>.op, e.kind());
                 <span class="prelude-val">Err</span>(e)
             }
-        })
-    }
-
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="self">self</span>.inner.poll_next(cx).map(|res| <span class="kw">match </span>res {
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bytes)) =&gt; {
-                <span class="self">self</span>.bytes += bytes.len() <span class="kw">as </span>u64;
-                <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bytes))
-            }
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(e)) =&gt; {
-                <span class="self">self</span>.handle.increment_errors_total(<span class="self">self</span>.op, e.kind());
-                <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(e))
-            }
-            <span class="prelude-val">None </span>=&gt; <span class="prelude-val">None</span>,
-        })
+        }
     }
 }
 
diff --git a/docs/rust/src/opendal/layers/minitrace.rs.html b/docs/rust/src/opendal/layers/minitrace.rs.html
index 3c8b17238f..403c60695f 100644
--- a/docs/rust/src/opendal/layers/minitrace.rs.html
+++ b/docs/rust/src/opendal/layers/minitrace.rs.html
@@ -379,14 +379,6 @@
 <a href="#377" id="377">377</a>
 <a href="#378" id="378">378</a>
 <a href="#379" id="379">379</a>
-<a href="#380" id="380">380</a>
-<a href="#381" id="381">381</a>
-<a href="#382" id="382">382</a>
-<a href="#383" id="383">383</a>
-<a href="#384" id="384">384</a>
-<a href="#385" id="385">385</a>
-<a href="#386" id="386">386</a>
-<a href="#387" id="387">387</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -686,23 +678,15 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>MinitraceWrapper&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="kw">let </span>_g = <span class="self">self</span>.span.set_local_parent();
-        <span class="kw">let </span>_span = LocalSpan::enter_with_local_parent(ReadOperation::Read.into_static());
-        <span class="self">self</span>.inner.poll_read(cx, buf)
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="kw">let </span>_g = <span class="self">self</span>.span.set_local_parent();
-        <span class="kw">let </span>_span = LocalSpan::enter_with_local_parent(ReadOperation::Seek.into_static());
-        <span class="self">self</span>.inner.poll_seek(cx, pos)
-    }
+    <span class="attr">#[trace(enter_on_poll = <span class="bool-val">true</span>)]
+    </span><span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="self">self</span>.inner.read(size).<span class="kw">await
+    </span>}
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">let </span>_g = <span class="self">self</span>.span.set_local_parent();
-        <span class="kw">let </span>_span = LocalSpan::enter_with_local_parent(ReadOperation::Next.into_static());
-        <span class="self">self</span>.inner.poll_next(cx)
-    }
+    <span class="attr">#[trace(enter_on_poll = <span class="bool-val">true</span>)]
+    </span><span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.seek(pos).<span class="kw">await
+    </span>}
 }
 
 <span class="kw">impl</span>&lt;R: oio::BlockingRead&gt; oio::BlockingRead <span class="kw">for </span>MinitraceWrapper&lt;R&gt; {
diff --git a/docs/rust/src/opendal/layers/oteltrace.rs.html b/docs/rust/src/opendal/layers/oteltrace.rs.html
index db81bef8f5..bbcb5291d7 100644
--- a/docs/rust/src/opendal/layers/oteltrace.rs.html
+++ b/docs/rust/src/opendal/layers/oteltrace.rs.html
@@ -340,10 +340,6 @@
 <a href="#338" id="338">338</a>
 <a href="#339" id="339">339</a>
 <a href="#340" id="340">340</a>
-<a href="#341" id="341">341</a>
-<a href="#342" id="342">342</a>
-<a href="#343" id="343">343</a>
-<a href="#344" id="344">344</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -624,17 +620,13 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>OtelTraceWrapper&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="self">self</span>.inner.poll_read(cx, buf)
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="self">self</span>.inner.poll_seek(cx, pos)
-    }
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="self">self</span>.inner.read(size).<span class="kw">await
+    </span>}
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="self">self</span>.inner.poll_next(cx)
-    }
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.seek(pos).<span class="kw">await
+    </span>}
 }
 
 <span class="kw">impl</span>&lt;R: oio::BlockingRead&gt; oio::BlockingRead <span class="kw">for </span>OtelTraceWrapper&lt;R&gt; {
diff --git a/docs/rust/src/opendal/layers/prometheus.rs.html b/docs/rust/src/opendal/layers/prometheus.rs.html
index 6c5ebe43d1..11146a86c9 100644
--- a/docs/rust/src/opendal/layers/prometheus.rs.html
+++ b/docs/rust/src/opendal/layers/prometheus.rs.html
@@ -865,28 +865,6 @@
 <a href="#863" id="863">863</a>
 <a href="#864" id="864">864</a>
 <a href="#865" id="865">865</a>
-<a href="#866" id="866">866</a>
-<a href="#867" id="867">867</a>
-<a href="#868" id="868">868</a>
-<a href="#869" id="869">869</a>
-<a href="#870" id="870">870</a>
-<a href="#871" id="871">871</a>
-<a href="#872" id="872">872</a>
-<a href="#873" id="873">873</a>
-<a href="#874" id="874">874</a>
-<a href="#875" id="875">875</a>
-<a href="#876" id="876">876</a>
-<a href="#877" id="877">877</a>
-<a href="#878" id="878">878</a>
-<a href="#879" id="879">879</a>
-<a href="#880" id="880">880</a>
-<a href="#881" id="881">881</a>
-<a href="#882" id="882">882</a>
-<a href="#883" id="883">883</a>
-<a href="#884" id="884">884</a>
-<a href="#885" id="885">885</a>
-<a href="#886" id="886">886</a>
-<a href="#887" id="887">887</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -1575,57 +1553,35 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>PrometheusMetricWrapper&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
         <span class="kw">let </span>labels = <span class="self">self</span>.stats.generate_metric_label(
             <span class="self">self</span>.scheme.into_static(),
             Operation::Read.into_static(),
             <span class="kw-2">&amp;</span><span class="self">self</span>.path,
         );
-        <span class="self">self</span>.inner.poll_read(cx, buf).map(|res| <span class="kw">match </span>res {
+        <span class="kw">match </span><span class="self">self</span>.inner.read(size).<span class="kw">await </span>{
             <span class="prelude-val">Ok</span>(bytes) =&gt; {
                 <span class="self">self</span>.stats
                     .bytes_total
                     .with_label_values(<span class="kw-2">&amp;</span>labels)
-                    .observe(bytes <span class="kw">as </span>f64);
+                    .observe(bytes.len() <span class="kw">as </span>f64);
                 <span class="prelude-val">Ok</span>(bytes)
             }
             <span class="prelude-val">Err</span>(e) =&gt; {
                 <span class="self">self</span>.stats.increment_errors_total(<span class="self">self</span>.op, e.kind());
                 <span class="prelude-val">Err</span>(e)
             }
-        })
+        }
     }
 
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="self">self</span>.inner.poll_seek(cx, pos).map(|res| <span class="kw">match </span>res {
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">match </span><span class="self">self</span>.inner.seek(pos).<span class="kw">await </span>{
             <span class="prelude-val">Ok</span>(n) =&gt; <span class="prelude-val">Ok</span>(n),
             <span class="prelude-val">Err</span>(e) =&gt; {
                 <span class="self">self</span>.stats.increment_errors_total(<span class="self">self</span>.op, e.kind());
                 <span class="prelude-val">Err</span>(e)
             }
-        })
-    }
-
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">let </span>labels = <span class="self">self</span>.stats.generate_metric_label(
-            <span class="self">self</span>.scheme.into_static(),
-            Operation::Read.into_static(),
-            <span class="kw-2">&amp;</span><span class="self">self</span>.path,
-        );
-        <span class="self">self</span>.inner.poll_next(cx).map(|res| <span class="kw">match </span>res {
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bytes)) =&gt; {
-                <span class="self">self</span>.stats
-                    .bytes_total
-                    .with_label_values(<span class="kw-2">&amp;</span>labels)
-                    .observe(bytes.len() <span class="kw">as </span>f64);
-                <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bytes))
-            }
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(e)) =&gt; {
-                <span class="self">self</span>.stats.increment_errors_total(<span class="self">self</span>.op, e.kind());
-                <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(e))
-            }
-            <span class="prelude-val">None </span>=&gt; <span class="prelude-val">None</span>,
-        })
+        }
     }
 }
 
diff --git a/docs/rust/src/opendal/layers/prometheus_client.rs.html b/docs/rust/src/opendal/layers/prometheus_client.rs.html
index ed24df9738..cb04868d0c 100644
--- a/docs/rust/src/opendal/layers/prometheus_client.rs.html
+++ b/docs/rust/src/opendal/layers/prometheus_client.rs.html
@@ -669,21 +669,6 @@
 <a href="#667" id="667">667</a>
 <a href="#668" id="668">668</a>
 <a href="#669" id="669">669</a>
-<a href="#670" id="670">670</a>
-<a href="#671" id="671">671</a>
-<a href="#672" id="672">672</a>
-<a href="#673" id="673">673</a>
-<a href="#674" id="674">674</a>
-<a href="#675" id="675">675</a>
-<a href="#676" id="676">676</a>
-<a href="#677" id="677">677</a>
-<a href="#678" id="678">678</a>
-<a href="#679" id="679">679</a>
-<a href="#680" id="680">680</a>
-<a href="#681" id="681">681</a>
-<a href="#682" id="682">682</a>
-<a href="#683" id="683">683</a>
-<a href="#684" id="684">684</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -1225,10 +1210,10 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>PrometheusMetricWrapper&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="self">self</span>.inner.poll_read(cx, buf).map(|res| <span class="kw">match </span>res {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="kw">match </span><span class="self">self</span>.inner.read(size).<span class="kw">await </span>{
             <span class="prelude-val">Ok</span>(bytes) =&gt; {
-                <span class="self">self</span>.bytes_total += bytes;
+                <span class="self">self</span>.bytes_total += bytes.len();
                 <span class="prelude-val">Ok</span>(bytes)
             }
             <span class="prelude-val">Err</span>(e) =&gt; {
@@ -1236,33 +1221,18 @@
                     .increment_errors_total(<span class="self">self</span>.scheme, <span class="self">self</span>.op, e.kind());
                 <span class="prelude-val">Err</span>(e)
             }
-        })
+        }
     }
 
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="self">self</span>.inner.poll_seek(cx, pos).map(|res| <span class="kw">match </span>res {
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">match </span><span class="self">self</span>.inner.seek(pos).<span class="kw">await </span>{
             <span class="prelude-val">Ok</span>(n) =&gt; <span class="prelude-val">Ok</span>(n),
             <span class="prelude-val">Err</span>(e) =&gt; {
                 <span class="self">self</span>.metrics
                     .increment_errors_total(<span class="self">self</span>.scheme, <span class="self">self</span>.op, e.kind());
                 <span class="prelude-val">Err</span>(e)
             }
-        })
-    }
-
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="self">self</span>.inner.poll_next(cx).map(|res| <span class="kw">match </span>res {
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bytes)) =&gt; {
-                <span class="self">self</span>.bytes_total += bytes.len();
-                <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bytes))
-            }
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(e)) =&gt; {
-                <span class="self">self</span>.metrics
-                    .increment_errors_total(<span class="self">self</span>.scheme, <span class="self">self</span>.op, e.kind());
-                <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(e))
-            }
-            <span class="prelude-val">None </span>=&gt; <span class="prelude-val">None</span>,
-        })
+        }
     }
 }
 
diff --git a/docs/rust/src/opendal/layers/retry.rs.html b/docs/rust/src/opendal/layers/retry.rs.html
index 6a496abfe0..71b488aa84 100644
--- a/docs/rust/src/opendal/layers/retry.rs.html
+++ b/docs/rust/src/opendal/layers/retry.rs.html
@@ -1338,96 +1338,6 @@
 <a href="#1336" id="1336">1336</a>
 <a href="#1337" id="1337">1337</a>
 <a href="#1338" id="1338">1338</a>
-<a href="#1339" id="1339">1339</a>
-<a href="#1340" id="1340">1340</a>
-<a href="#1341" id="1341">1341</a>
-<a href="#1342" id="1342">1342</a>
-<a href="#1343" id="1343">1343</a>
-<a href="#1344" id="1344">1344</a>
-<a href="#1345" id="1345">1345</a>
-<a href="#1346" id="1346">1346</a>
-<a href="#1347" id="1347">1347</a>
-<a href="#1348" id="1348">1348</a>
-<a href="#1349" id="1349">1349</a>
-<a href="#1350" id="1350">1350</a>
-<a href="#1351" id="1351">1351</a>
-<a href="#1352" id="1352">1352</a>
-<a href="#1353" id="1353">1353</a>
-<a href="#1354" id="1354">1354</a>
-<a href="#1355" id="1355">1355</a>
-<a href="#1356" id="1356">1356</a>
-<a href="#1357" id="1357">1357</a>
-<a href="#1358" id="1358">1358</a>
-<a href="#1359" id="1359">1359</a>
-<a href="#1360" id="1360">1360</a>
-<a href="#1361" id="1361">1361</a>
-<a href="#1362" id="1362">1362</a>
-<a href="#1363" id="1363">1363</a>
-<a href="#1364" id="1364">1364</a>
-<a href="#1365" id="1365">1365</a>
-<a href="#1366" id="1366">1366</a>
-<a href="#1367" id="1367">1367</a>
-<a href="#1368" id="1368">1368</a>
-<a href="#1369" id="1369">1369</a>
-<a href="#1370" id="1370">1370</a>
-<a href="#1371" id="1371">1371</a>
-<a href="#1372" id="1372">1372</a>
-<a href="#1373" id="1373">1373</a>
-<a href="#1374" id="1374">1374</a>
-<a href="#1375" id="1375">1375</a>
-<a href="#1376" id="1376">1376</a>
-<a href="#1377" id="1377">1377</a>
-<a href="#1378" id="1378">1378</a>
-<a href="#1379" id="1379">1379</a>
-<a href="#1380" id="1380">1380</a>
-<a href="#1381" id="1381">1381</a>
-<a href="#1382" id="1382">1382</a>
-<a href="#1383" id="1383">1383</a>
-<a href="#1384" id="1384">1384</a>
-<a href="#1385" id="1385">1385</a>
-<a href="#1386" id="1386">1386</a>
-<a href="#1387" id="1387">1387</a>
-<a href="#1388" id="1388">1388</a>
-<a href="#1389" id="1389">1389</a>
-<a href="#1390" id="1390">1390</a>
-<a href="#1391" id="1391">1391</a>
-<a href="#1392" id="1392">1392</a>
-<a href="#1393" id="1393">1393</a>
-<a href="#1394" id="1394">1394</a>
-<a href="#1395" id="1395">1395</a>
-<a href="#1396" id="1396">1396</a>
-<a href="#1397" id="1397">1397</a>
-<a href="#1398" id="1398">1398</a>
-<a href="#1399" id="1399">1399</a>
-<a href="#1400" id="1400">1400</a>
-<a href="#1401" id="1401">1401</a>
-<a href="#1402" id="1402">1402</a>
-<a href="#1403" id="1403">1403</a>
-<a href="#1404" id="1404">1404</a>
-<a href="#1405" id="1405">1405</a>
-<a href="#1406" id="1406">1406</a>
-<a href="#1407" id="1407">1407</a>
-<a href="#1408" id="1408">1408</a>
-<a href="#1409" id="1409">1409</a>
-<a href="#1410" id="1410">1410</a>
-<a href="#1411" id="1411">1411</a>
-<a href="#1412" id="1412">1412</a>
-<a href="#1413" id="1413">1413</a>
-<a href="#1414" id="1414">1414</a>
-<a href="#1415" id="1415">1415</a>
-<a href="#1416" id="1416">1416</a>
-<a href="#1417" id="1417">1417</a>
-<a href="#1418" id="1418">1418</a>
-<a href="#1419" id="1419">1419</a>
-<a href="#1420" id="1420">1420</a>
-<a href="#1421" id="1421">1421</a>
-<a href="#1422" id="1422">1422</a>
-<a href="#1423" id="1423">1423</a>
-<a href="#1424" id="1424">1424</a>
-<a href="#1425" id="1425">1425</a>
-<a href="#1426" id="1426">1426</a>
-<a href="#1427" id="1427">1427</a>
-<a href="#1428" id="1428">1428</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -2077,7 +1987,7 @@
 }
 
 <span class="kw">pub struct </span>RetryWrapper&lt;R, I&gt; {
-    inner: R,
+    inner: <span class="prelude-ty">Option</span>&lt;R&gt;,
     notify: Arc&lt;I&gt;,
 
     path: String,
@@ -2089,7 +1999,7 @@
 <span class="kw">impl</span>&lt;R, I&gt; RetryWrapper&lt;R, I&gt; {
     <span class="kw">fn </span>new(inner: R, notify: Arc&lt;I&gt;, path: <span class="kw-2">&amp;</span>str, backoff: ExponentialBuilder) -&gt; <span class="self">Self </span>{
         <span class="self">Self </span>{
-            inner,
+            inner: <span class="prelude-val">Some</span>(inner),
             notify,
 
             path: path.to_string(),
@@ -2101,152 +2011,74 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read, I: RetryInterceptor&gt; oio::Read <span class="kw">for </span>RetryWrapper&lt;R, I&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="kw">if let </span><span class="prelude-val">Some</span>(sleep) = <span class="self">self</span>.sleep.as_mut() {
-            <span class="macro">ready!</span>(sleep.poll_unpin(cx));
-            <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
-        }
-
-        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_read(cx, buf)) {
-            <span class="prelude-val">Ok</span>(v) =&gt; {
-                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
-                Poll::Ready(<span class="prelude-val">Ok</span>(v))
-            }
-            <span class="prelude-val">Err</span>(err) <span class="kw">if </span>!err.is_temporary() =&gt; {
-                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
-                Poll::Ready(<span class="prelude-val">Err</span>(err))
-            }
-            <span class="prelude-val">Err</span>(err) =&gt; {
-                <span class="kw">let </span>backoff = <span class="kw">match </span><span class="self">self</span>.current_backoff.as_mut() {
-                    <span class="prelude-val">Some</span>(backoff) =&gt; backoff,
-                    <span class="prelude-val">None </span>=&gt; {
-                        <span class="self">self</span>.current_backoff = <span class="prelude-val">Some</span>(<span class="self">self</span>.builder.build());
-                        <span class="self">self</span>.current_backoff.as_mut().unwrap()
-                    }
-                };
-
-                <span class="kw">match </span>backoff.next() {
-                    <span class="prelude-val">None </span>=&gt; {
-                        <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
-                        Poll::Ready(<span class="prelude-val">Err</span>(err))
-                    }
-                    <span class="prelude-val">Some</span>(dur) =&gt; {
-                        <span class="self">self</span>.notify.intercept(
-                            <span class="kw-2">&amp;</span>err,
-                            dur,
-                            <span class="kw-2">&amp;</span>[
-                                (<span class="string">"operation"</span>, ReadOperation::Read.into_static()),
-                                (<span class="string">"path"</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
-                            ],
-                        );
-                        <span class="self">self</span>.sleep = <span class="prelude-val">Some</span>(Box::pin(tokio::time::sleep(dur)));
-                        <span class="self">self</span>.poll_read(cx, buf)
-                    }
-                }
-            }
-        }
-    }
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">use </span>backon::RetryableWithContext;
 
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="kw">if let </span><span class="prelude-val">Some</span>(sleep) = <span class="self">self</span>.sleep.as_mut() {
-            <span class="macro">ready!</span>(sleep.poll_unpin(cx));
-            <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
-        }
+        <span class="kw">let </span>inner = <span class="self">self</span>.inner.take().expect(<span class="string">"inner must be valid"</span>);
 
-        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_seek(cx, pos)) {
-            <span class="prelude-val">Ok</span>(v) =&gt; {
-                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
-                Poll::Ready(<span class="prelude-val">Ok</span>(v))
-            }
-            <span class="prelude-val">Err</span>(err) <span class="kw">if </span>!err.is_temporary() =&gt; {
-                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
-                Poll::Ready(<span class="prelude-val">Err</span>(err))
-            }
-            <span class="prelude-val">Err</span>(err) =&gt; {
-                <span class="kw">let </span>backoff = <span class="kw">match </span><span class="self">self</span>.current_backoff.as_mut() {
-                    <span class="prelude-val">Some</span>(backoff) =&gt; backoff,
-                    <span class="prelude-val">None </span>=&gt; {
-                        <span class="self">self</span>.current_backoff = <span class="prelude-val">Some</span>(<span class="self">self</span>.builder.build());
-                        <span class="self">self</span>.current_backoff.as_mut().unwrap()
-                    }
-                };
+        <span class="kw">let </span>(inner, res) = {
+            |<span class="kw-2">mut </span>r: R| <span class="kw">async move </span>{
+                <span class="kw">let </span>res = r.seek(pos).<span class="kw">await</span>;
 
-                <span class="kw">match </span>backoff.next() {
-                    <span class="prelude-val">None </span>=&gt; {
-                        <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
-                        Poll::Ready(<span class="prelude-val">Err</span>(err))
-                    }
-                    <span class="prelude-val">Some</span>(dur) =&gt; {
-                        <span class="self">self</span>.notify.intercept(
-                            <span class="kw-2">&amp;</span>err,
-                            dur,
-                            <span class="kw-2">&amp;</span>[
-                                (<span class="string">"operation"</span>, ReadOperation::Seek.into_static()),
-                                (<span class="string">"path"</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
-                            ],
-                        );
-                        <span class="self">self</span>.sleep = <span class="prelude-val">Some</span>(Box::pin(tokio::time::sleep(dur)));
-                        <span class="self">self</span>.poll_seek(cx, pos)
-                    }
-                }
+                (r, res)
             }
         }
+        .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
+        .context(inner)
+        .when(|e| e.is_temporary())
+        .notify(|err, dur| {
+            <span class="self">self</span>.notify.intercept(
+                err,
+                dur,
+                <span class="kw-2">&amp;</span>[
+                    (<span class="string">"operation"</span>, ReadOperation::Seek.into_static()),
+                    (<span class="string">"path"</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                ],
+            )
+        })
+        .map(|(r, res)| (r, res.map_err(|err| err.set_persistent())))
+        .<span class="kw">await</span>;
+
+        <span class="self">self</span>.inner = <span class="prelude-val">Some</span>(inner);
+        res
     }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">if let </span><span class="prelude-val">Some</span>(sleep) = <span class="self">self</span>.sleep.as_mut() {
-            <span class="macro">ready!</span>(sleep.poll_unpin(cx));
-            <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
-        }
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="kw">use </span>backon::RetryableWithContext;
 
-        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_next(cx)) {
-            <span class="prelude-val">None </span>=&gt; {
-                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
-                Poll::Ready(<span class="prelude-val">None</span>)
-            }
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(v)) =&gt; {
-                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
-                Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(v)))
-            }
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)) <span class="kw">if </span>!err.is_temporary() =&gt; {
-                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
-                Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)))
-            }
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)) =&gt; {
-                <span class="kw">let </span>backoff = <span class="kw">match </span><span class="self">self</span>.current_backoff.as_mut() {
-                    <span class="prelude-val">Some</span>(backoff) =&gt; backoff,
-                    <span class="prelude-val">None </span>=&gt; {
-                        <span class="self">self</span>.current_backoff = <span class="prelude-val">Some</span>(<span class="self">self</span>.builder.build());
-                        <span class="self">self</span>.current_backoff.as_mut().unwrap()
-                    }
-                };
+        <span class="kw">let </span>inner = <span class="self">self</span>.inner.take().expect(<span class="string">"inner must be valid"</span>);
 
-                <span class="kw">match </span>backoff.next() {
-                    <span class="prelude-val">None </span>=&gt; {
-                        <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
-                        Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)))
-                    }
-                    <span class="prelude-val">Some</span>(dur) =&gt; {
-                        <span class="self">self</span>.notify.intercept(
-                            <span class="kw-2">&amp;</span>err,
-                            dur,
-                            <span class="kw-2">&amp;</span>[
-                                (<span class="string">"operation"</span>, ReadOperation::Next.into_static()),
-                                (<span class="string">"path"</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
-                            ],
-                        );
-                        <span class="self">self</span>.sleep = <span class="prelude-val">Some</span>(Box::pin(tokio::time::sleep(dur)));
-                        <span class="self">self</span>.poll_next(cx)
-                    }
-                }
+        <span class="kw">let </span>(inner, res) = {
+            |<span class="kw-2">mut </span>r: R| <span class="kw">async move </span>{
+                <span class="kw">let </span>res = r.read(size).<span class="kw">await</span>;
+
+                (r, res)
             }
         }
+        .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
+        .when(|e| e.is_temporary())
+        .context(inner)
+        .notify(|err, dur| {
+            <span class="self">self</span>.notify.intercept(
+                err,
+                dur,
+                <span class="kw-2">&amp;</span>[
+                    (<span class="string">"operation"</span>, ReadOperation::Next.into_static()),
+                    (<span class="string">"path"</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                ],
+            )
+        })
+        .map(|(r, res)| (r, res.map_err(|err| err.set_persistent())))
+        .<span class="kw">await</span>;
+
+        <span class="self">self</span>.inner = <span class="prelude-val">Some</span>(inner);
+        res
     }
 }
 
 <span class="kw">impl</span>&lt;R: oio::BlockingRead, I: RetryInterceptor&gt; oio::BlockingRead <span class="kw">for </span>RetryWrapper&lt;R, I&gt; {
     <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        { || <span class="self">self</span>.inner.read(buf) }
+        { || <span class="self">self</span>.inner.as_mut().unwrap().read(buf) }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
@@ -2264,7 +2096,7 @@
     }
 
     <span class="kw">fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        { || <span class="self">self</span>.inner.seek(pos) }
+        { || <span class="self">self</span>.inner.as_mut().unwrap().seek(pos) }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
@@ -2282,7 +2114,7 @@
     }
 
     <span class="kw">fn </span>next(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt; {
-        { || <span class="self">self</span>.inner.next().transpose() }
+        { || <span class="self">self</span>.inner.as_mut().unwrap().next().transpose() }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
@@ -2308,7 +2140,7 @@
             <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
         }
 
-        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_write(cx, bs)) {
+        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.as_mut().unwrap().poll_write(cx, bs)) {
             <span class="prelude-val">Ok</span>(v) =&gt; {
                 <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
                 Poll::Ready(<span class="prelude-val">Ok</span>(v))
@@ -2354,7 +2186,7 @@
             <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
         }
 
-        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_abort(cx)) {
+        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.as_mut().unwrap().poll_abort(cx)) {
             <span class="prelude-val">Ok</span>(v) =&gt; {
                 <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
                 Poll::Ready(<span class="prelude-val">Ok</span>(v))
@@ -2400,7 +2232,7 @@
             <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
         }
 
-        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_close(cx)) {
+        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.as_mut().unwrap().poll_close(cx)) {
             <span class="prelude-val">Ok</span>(v) =&gt; {
                 <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
                 Poll::Ready(<span class="prelude-val">Ok</span>(v))
@@ -2443,7 +2275,7 @@
 
 <span class="kw">impl</span>&lt;R: oio::BlockingWrite, I: RetryInterceptor&gt; oio::BlockingWrite <span class="kw">for </span>RetryWrapper&lt;R, I&gt; {
     <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        { || <span class="self">self</span>.inner.write(bs) }
+        { || <span class="self">self</span>.inner.as_mut().unwrap().write(bs) }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
@@ -2461,7 +2293,7 @@
     }
 
     <span class="kw">fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        { || <span class="self">self</span>.inner.close() }
+        { || <span class="self">self</span>.inner.as_mut().unwrap().close() }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
@@ -2488,7 +2320,7 @@
             <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
         }
 
-        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_next(cx)) {
+        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.as_mut().unwrap().poll_next(cx)) {
             <span class="prelude-val">Ok</span>(v) =&gt; {
                 <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
                 Poll::Ready(<span class="prelude-val">Ok</span>(v))
@@ -2531,7 +2363,7 @@
 
 <span class="kw">impl</span>&lt;P: oio::BlockingList, I: RetryInterceptor&gt; oio::BlockingList <span class="kw">for </span>RetryWrapper&lt;P, I&gt; {
     <span class="kw">fn </span>next(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="prelude-ty">Option</span>&lt;oio::Entry&gt;&gt; {
-        { || <span class="self">self</span>.inner.next() }
+        { || <span class="self">self</span>.inner.as_mut().unwrap().next() }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
@@ -2560,7 +2392,6 @@
 
     <span class="kw">use </span>async_trait::async_trait;
     <span class="kw">use </span>bytes::Bytes;
-    <span class="kw">use </span>futures::AsyncReadExt;
     <span class="kw">use </span>futures::TryStreamExt;
 
     <span class="kw">use super</span>::<span class="kw-2">*</span>;
@@ -2693,50 +2524,39 @@
     }
 
     <span class="kw">impl </span>oio::Read <span class="kw">for </span>MockReader {
-        <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+            <span class="self">self</span>.pos = <span class="kw">match </span>pos {
+                io::SeekFrom::Current(n) =&gt; (<span class="self">self</span>.pos <span class="kw">as </span>i64 + n) <span class="kw">as </span>u64,
+                io::SeekFrom::Start(n) =&gt; n,
+                io::SeekFrom::End(n) =&gt; (<span class="number">13 </span>+ n) <span class="kw">as </span>u64,
+            };
+
+            <span class="prelude-val">Ok</span>(<span class="self">self</span>.pos)
+        }
+
+        <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
             <span class="kw">let </span><span class="kw-2">mut </span>attempt = <span class="self">self</span>.attempt.lock().unwrap();
             <span class="kw-2">*</span>attempt += <span class="number">1</span>;
 
-            Poll::Ready(<span class="kw">match </span><span class="kw-2">*</span>attempt {
+            <span class="kw">match </span><span class="kw-2">*</span>attempt {
                 <span class="number">1 </span>=&gt; <span class="prelude-val">Err</span>(
                     Error::new(ErrorKind::Unexpected, <span class="string">"retryable_error from reader"</span>)
                         .set_temporary(),
                 ),
                 <span class="number">2 </span>=&gt; {
-                    buf[..<span class="number">7</span>].copy_from_slice(<span class="string">"Hello, "</span>.as_bytes());
                     <span class="self">self</span>.pos += <span class="number">7</span>;
-                    <span class="prelude-val">Ok</span>(<span class="number">7</span>)
+                    <span class="prelude-val">Ok</span>(Bytes::copy_from_slice(<span class="string">"Hello, "</span>.as_bytes()))
                 }
                 <span class="number">3 </span>=&gt; <span class="prelude-val">Err</span>(
                     Error::new(ErrorKind::Unexpected, <span class="string">"retryable_error from reader"</span>)
                         .set_temporary(),
                 ),
                 <span class="number">4 </span>=&gt; {
-                    buf[..<span class="number">6</span>].copy_from_slice(<span class="string">"World!"</span>.as_bytes());
                     <span class="self">self</span>.pos += <span class="number">6</span>;
-                    <span class="prelude-val">Ok</span>(<span class="number">6</span>)
+                    <span class="prelude-val">Ok</span>(Bytes::copy_from_slice(<span class="string">"World!"</span>.as_bytes()))
                 }
-                <span class="number">5 </span>=&gt; <span class="prelude-val">Ok</span>(<span class="number">0</span>),
+                <span class="number">5 </span>=&gt; <span class="prelude-val">Ok</span>(Bytes::new()),
                 <span class="kw">_ </span>=&gt; <span class="macro">unreachable!</span>(),
-            })
-        }
-
-        <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-            <span class="self">self</span>.pos = <span class="kw">match </span>pos {
-                io::SeekFrom::Current(n) =&gt; (<span class="self">self</span>.pos <span class="kw">as </span>i64 + n) <span class="kw">as </span>u64,
-                io::SeekFrom::Start(n) =&gt; n,
-                io::SeekFrom::End(n) =&gt; (<span class="number">13 </span>+ n) <span class="kw">as </span>u64,
-            };
-
-            Poll::Ready(<span class="prelude-val">Ok</span>(<span class="self">self</span>.pos))
-        }
-
-        <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-            <span class="kw">let </span><span class="kw-2">mut </span>bs = <span class="macro">vec!</span>[<span class="number">0</span>; <span class="number">1</span>];
-            <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.poll_read(cx, <span class="kw-2">&amp;mut </span>bs)) {
-                <span class="prelude-val">Ok</span>(<span class="number">0</span>) =&gt; Poll::Ready(<span class="prelude-val">None</span>),
-                <span class="prelude-val">Ok</span>(v) =&gt; Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(Bytes::from(bs[..v].to_vec())))),
-                <span class="prelude-val">Err</span>(err) =&gt; Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err))),
             }
         }
     }
diff --git a/docs/rust/src/opendal/layers/throttle.rs.html b/docs/rust/src/opendal/layers/throttle.rs.html
index 142e8e3ddf..703e8af18f 100644
--- a/docs/rust/src/opendal/layers/throttle.rs.html
+++ b/docs/rust/src/opendal/layers/throttle.rs.html
@@ -274,10 +274,6 @@
 <a href="#272" id="272">272</a>
 <a href="#273" id="273">273</a>
 <a href="#274" id="274">274</a>
-<a href="#275" id="275">275</a>
-<a href="#276" id="276">276</a>
-<a href="#277" id="277">277</a>
-<a href="#278" id="278">278</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -465,18 +461,14 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>ThrottleWrapper&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
         <span class="comment">// TODO: How can we handle buffer reads with a limiter?
-        </span><span class="self">self</span>.inner.poll_read(cx, buf)
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="self">self</span>.inner.poll_seek(cx, pos)
-    }
+        </span><span class="self">self</span>.inner.read(size).<span class="kw">await
+    </span>}
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="self">self</span>.inner.poll_next(cx)
-    }
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.seek(pos).<span class="kw">await
+    </span>}
 }
 
 <span class="kw">impl</span>&lt;R: oio::BlockingRead&gt; oio::BlockingRead <span class="kw">for </span>ThrottleWrapper&lt;R&gt; {
diff --git a/docs/rust/src/opendal/layers/timeout.rs.html b/docs/rust/src/opendal/layers/timeout.rs.html
index aa3cb4a84e..5da3816cbe 100644
--- a/docs/rust/src/opendal/layers/timeout.rs.html
+++ b/docs/rust/src/opendal/layers/timeout.rs.html
@@ -526,10 +526,6 @@
 <a href="#524" id="524">524</a>
 <a href="#525" id="525">525</a>
 <a href="#526" id="526">526</a>
-<a href="#527" id="527">527</a>
-<a href="#528" id="528">528</a>
-<a href="#529" id="529">529</a>
-<a href="#530" id="530">530</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -818,6 +814,20 @@
         }
     }
 
+    <span class="attr">#[inline]
+    </span><span class="kw">async fn </span>io_timeout&lt;F: Future&lt;Output = <span class="prelude-ty">Result</span>&lt;T&gt;&gt;, T&gt;(
+        timeout: Duration,
+        op: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>str,
+        fut: F,
+    ) -&gt; <span class="prelude-ty">Result</span>&lt;T&gt; {
+        tokio::time::timeout(timeout, fut).<span class="kw">await</span>.map_err(|<span class="kw">_</span>| {
+            Error::new(ErrorKind::Unexpected, <span class="string">"io operation timeout reached"</span>)
+                .with_operation(op)
+                .with_context(<span class="string">"timeout"</span>, timeout.as_secs_f64().to_string())
+                .set_temporary()
+        })<span class="question-mark">?
+    </span>}
+
     <span class="attr">#[inline]
     </span><span class="kw">fn </span>poll_timeout(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, op: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>str) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
         <span class="kw">let </span>sleep = <span class="self">self
@@ -840,29 +850,15 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>TimeoutWrapper&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="self">self</span>.poll_timeout(cx, ReadOperation::Read.into_static())<span class="question-mark">?</span>;
-
-        <span class="kw">let </span>v = <span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_read(cx, buf));
-        <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
-        Poll::Ready(v)
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="self">self</span>.poll_timeout(cx, ReadOperation::Seek.into_static())<span class="question-mark">?</span>;
-
-        <span class="kw">let </span>v = <span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_seek(cx, pos));
-        <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
-        Poll::Ready(v)
-    }
-
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="self">self</span>.poll_timeout(cx, ReadOperation::Next.into_static())<span class="question-mark">?</span>;
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">let </span>fut = <span class="self">self</span>.inner.seek(pos);
+        <span class="self">Self</span>::io_timeout(<span class="self">self</span>.timeout, ReadOperation::Seek.into_static(), fut).<span class="kw">await
+    </span>}
 
-        <span class="kw">let </span>v = <span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_next(cx));
-        <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
-        Poll::Ready(v)
-    }
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="kw">let </span>fut = <span class="self">self</span>.inner.read(size);
+        <span class="self">Self</span>::io_timeout(<span class="self">self</span>.timeout, ReadOperation::Next.into_static(), fut).<span class="kw">await
+    </span>}
 }
 
 <span class="kw">impl</span>&lt;R: oio::Write&gt; oio::Write <span class="kw">for </span>TimeoutWrapper&lt;R&gt; {
@@ -903,6 +899,7 @@
 
 <span class="attr">#[cfg(test)]
 </span><span class="kw">mod </span>tests {
+    <span class="kw">use </span>std::future::{pending, Future};
     <span class="kw">use </span>std::io::SeekFrom;
     <span class="kw">use </span>std::sync::Arc;
     <span class="kw">use </span>std::task::Context;
@@ -917,7 +914,6 @@
 
     <span class="kw">use </span><span class="kw">crate</span>::layers::TimeoutLayer;
     <span class="kw">use </span><span class="kw">crate</span>::layers::TypeEraseLayer;
-    <span class="kw">use </span><span class="kw">crate</span>::raw::oio::ReadExt;
     <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
     <span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
@@ -966,16 +962,12 @@
     </span><span class="kw">struct </span>MockReader;
 
     <span class="kw">impl </span>oio::Read <span class="kw">for </span>MockReader {
-        <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-            Poll::Pending
+        <span class="kw">fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: SeekFrom) -&gt; <span class="kw">impl </span>Future&lt;Output = <span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
+            pending()
         }
 
-        <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, <span class="kw">_</span>: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-            Poll::Pending
-        }
-
-        <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-            Poll::Pending
+        <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: usize) -&gt; <span class="kw">impl </span>Future&lt;Output = <span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt; {
+            pending()
         }
     }
 
@@ -1015,7 +1007,7 @@
 
         <span class="kw">let </span><span class="kw-2">mut </span>reader = op.reader(<span class="string">"test"</span>).<span class="kw">await</span>.unwrap();
 
-        <span class="kw">let </span>res = reader.read(<span class="kw-2">&amp;mut </span>[<span class="number">0</span>; <span class="number">4</span>]).<span class="kw">await</span>;
+        <span class="kw">let </span>res = reader.read(<span class="number">4</span>).<span class="kw">await</span>;
         <span class="macro">assert!</span>(res.is_err());
         <span class="kw">let </span>err = res.unwrap_err();
         <span class="macro">assert_eq!</span>(err.kind(), ErrorKind::Unexpected);
diff --git a/docs/rust/src/opendal/layers/tracing.rs.html b/docs/rust/src/opendal/layers/tracing.rs.html
index f265e9656d..beb13b62f9 100644
--- a/docs/rust/src/opendal/layers/tracing.rs.html
+++ b/docs/rust/src/opendal/layers/tracing.rs.html
@@ -370,14 +370,6 @@
 <a href="#368" id="368">368</a>
 <a href="#369" id="369">369</a>
 <a href="#370" id="370">370</a>
-<a href="#371" id="371">371</a>
-<a href="#372" id="372">372</a>
-<a href="#373" id="373">373</a>
-<a href="#374" id="374">374</a>
-<a href="#375" id="375">375</a>
-<a href="#376" id="376">376</a>
-<a href="#377" id="377">377</a>
-<a href="#378" id="378">378</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -652,25 +644,17 @@
         parent = <span class="kw-2">&amp;</span><span class="self">self</span>.span,
         level = <span class="string">"trace"</span>,
         skip_all)]
-    </span><span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="self">self</span>.inner.poll_read(cx, buf)
-    }
-
-    <span class="attr">#[tracing::instrument(
-        parent = <span class="kw-2">&amp;</span><span class="self">self</span>.span,
-        level = <span class="string">"trace"</span>,
-        skip_all)]
-    </span><span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="self">self</span>.inner.poll_seek(cx, pos)
-    }
+    </span><span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="self">self</span>.inner.read(size).<span class="kw">await
+    </span>}
 
     <span class="attr">#[tracing::instrument(
         parent = <span class="kw-2">&amp;</span><span class="self">self</span>.span,
         level = <span class="string">"trace"</span>,
         skip_all)]
-    </span><span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="self">self</span>.inner.poll_next(cx)
-    }
+    </span><span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.seek(pos).<span class="kw">await
+    </span>}
 }
 
 <span class="kw">impl</span>&lt;R: oio::BlockingRead&gt; oio::BlockingRead <span class="kw">for </span>TracingWrapper&lt;R&gt; {
diff --git a/docs/rust/src/opendal/raw/enum_utils.rs.html b/docs/rust/src/opendal/raw/enum_utils.rs.html
index b7c40f96d4..18879956ed 100644
--- a/docs/rust/src/opendal/raw/enum_utils.rs.html
+++ b/docs/rust/src/opendal/raw/enum_utils.rs.html
@@ -315,30 +315,6 @@
 <a href="#313" id="313">313</a>
 <a href="#314" id="314">314</a>
 <a href="#315" id="315">315</a>
-<a href="#316" id="316">316</a>
-<a href="#317" id="317">317</a>
-<a href="#318" id="318">318</a>
-<a href="#319" id="319">319</a>
-<a href="#320" id="320">320</a>
-<a href="#321" id="321">321</a>
-<a href="#322" id="322">322</a>
-<a href="#323" id="323">323</a>
-<a href="#324" id="324">324</a>
-<a href="#325" id="325">325</a>
-<a href="#326" id="326">326</a>
-<a href="#327" id="327">327</a>
-<a href="#328" id="328">328</a>
-<a href="#329" id="329">329</a>
-<a href="#330" id="330">330</a>
-<a href="#331" id="331">331</a>
-<a href="#332" id="332">332</a>
-<a href="#333" id="333">333</a>
-<a href="#334" id="334">334</a>
-<a href="#335" id="335">335</a>
-<a href="#336" id="336">336</a>
-<a href="#337" id="337">337</a>
-<a href="#338" id="338">338</a>
-<a href="#339" id="339">339</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -399,24 +375,17 @@
 }
 
 <span class="kw">impl</span>&lt;ONE: oio::Read, TWO: oio::Read&gt; oio::Read <span class="kw">for </span>TwoWays&lt;ONE, TWO&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(v) =&gt; v.poll_read(cx, buf),
-            <span class="self">Self</span>::Two(v) =&gt; v.poll_read(cx, buf),
+            <span class="self">Self</span>::One(v) =&gt; v.seek(pos).<span class="kw">await</span>,
+            <span class="self">Self</span>::Two(v) =&gt; v.seek(pos).<span class="kw">await</span>,
         }
     }
 
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
         <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(v) =&gt; v.poll_seek(cx, pos),
-            <span class="self">Self</span>::Two(v) =&gt; v.poll_seek(cx, pos),
-        }
-    }
-
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(v) =&gt; v.poll_next(cx),
-            <span class="self">Self</span>::Two(v) =&gt; v.poll_next(cx),
+            <span class="self">Self</span>::One(v) =&gt; v.read(size).<span class="kw">await</span>,
+            <span class="self">Self</span>::Two(v) =&gt; v.read(size).<span class="kw">await</span>,
         }
     }
 }
@@ -480,27 +449,19 @@
 }
 
 <span class="kw">impl</span>&lt;ONE: oio::Read, TWO: oio::Read, THREE: oio::Read&gt; oio::Read <span class="kw">for </span>ThreeWays&lt;ONE, TWO, THREE&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(v) =&gt; v.poll_read(cx, buf),
-            <span class="self">Self</span>::Two(v) =&gt; v.poll_read(cx, buf),
-            <span class="self">Self</span>::Three(v) =&gt; v.poll_read(cx, buf),
+            <span class="self">Self</span>::One(v) =&gt; v.seek(pos).<span class="kw">await</span>,
+            <span class="self">Self</span>::Two(v) =&gt; v.seek(pos).<span class="kw">await</span>,
+            <span class="self">Self</span>::Three(v) =&gt; v.seek(pos).<span class="kw">await</span>,
         }
     }
 
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
         <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(v) =&gt; v.poll_seek(cx, pos),
-            <span class="self">Self</span>::Two(v) =&gt; v.poll_seek(cx, pos),
-            <span class="self">Self</span>::Three(v) =&gt; v.poll_seek(cx, pos),
-        }
-    }
-
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(v) =&gt; v.poll_next(cx),
-            <span class="self">Self</span>::Two(v) =&gt; v.poll_next(cx),
-            <span class="self">Self</span>::Three(v) =&gt; v.poll_next(cx),
+            <span class="self">Self</span>::One(v) =&gt; v.read(size).<span class="kw">await</span>,
+            <span class="self">Self</span>::Two(v) =&gt; v.read(size).<span class="kw">await</span>,
+            <span class="self">Self</span>::Three(v) =&gt; v.read(size).<span class="kw">await</span>,
         }
     }
 }
@@ -582,30 +543,21 @@
     THREE: oio::Read,
     FOUR: oio::Read,
 {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(v) =&gt; v.poll_read(cx, buf),
-            <span class="self">Self</span>::Two(v) =&gt; v.poll_read(cx, buf),
-            <span class="self">Self</span>::Three(v) =&gt; v.poll_read(cx, buf),
-            <span class="self">Self</span>::Four(v) =&gt; v.poll_read(cx, buf),
-        }
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(v) =&gt; v.poll_seek(cx, pos),
-            <span class="self">Self</span>::Two(v) =&gt; v.poll_seek(cx, pos),
-            <span class="self">Self</span>::Three(v) =&gt; v.poll_seek(cx, pos),
-            <span class="self">Self</span>::Four(v) =&gt; v.poll_seek(cx, pos),
+            <span class="self">Self</span>::One(v) =&gt; v.seek(pos).<span class="kw">await</span>,
+            <span class="self">Self</span>::Two(v) =&gt; v.seek(pos).<span class="kw">await</span>,
+            <span class="self">Self</span>::Three(v) =&gt; v.seek(pos).<span class="kw">await</span>,
+            <span class="self">Self</span>::Four(v) =&gt; v.seek(pos).<span class="kw">await</span>,
         }
     }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
         <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(v) =&gt; v.poll_next(cx),
-            <span class="self">Self</span>::Two(v) =&gt; v.poll_next(cx),
-            <span class="self">Self</span>::Three(v) =&gt; v.poll_next(cx),
-            <span class="self">Self</span>::Four(v) =&gt; v.poll_next(cx),
+            <span class="self">Self</span>::One(v) =&gt; v.read(size).<span class="kw">await</span>,
+            <span class="self">Self</span>::Two(v) =&gt; v.read(size).<span class="kw">await</span>,
+            <span class="self">Self</span>::Three(v) =&gt; v.read(size).<span class="kw">await</span>,
+            <span class="self">Self</span>::Four(v) =&gt; v.read(size).<span class="kw">await</span>,
         }
     }
 }
diff --git a/docs/rust/src/opendal/raw/futures_util.rs.html b/docs/rust/src/opendal/raw/futures_util.rs.html
index e9d9e2951f..1e620dfd59 100644
--- a/docs/rust/src/opendal/raw/futures_util.rs.html
+++ b/docs/rust/src/opendal/raw/futures_util.rs.html
@@ -281,6 +281,14 @@
 <a href="#279" id="279">279</a>
 <a href="#280" id="280">280</a>
 <a href="#281" id="281">281</a>
+<a href="#282" id="282">282</a>
+<a href="#283" id="283">283</a>
+<a href="#284" id="284">284</a>
+<a href="#285" id="285">285</a>
+<a href="#286" id="286">286</a>
+<a href="#287" id="287">287</a>
+<a href="#288" id="288">288</a>
+<a href="#289" id="289">289</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -312,9 +320,17 @@
 ///
 /// We will switch to [`futures::future::LocalBoxFuture`] on wasm32 target.
 </span><span class="attr">#[cfg(not(target_arch = <span class="string">"wasm32"</span>))]
-</span><span class="kw">pub type </span>BoxedFuture&lt;T&gt; = futures::future::BoxFuture&lt;<span class="lifetime">'static</span>, T&gt;;
+</span><span class="kw">pub type </span>BoxedFuture&lt;<span class="lifetime">'a</span>, T&gt; = futures::future::BoxFuture&lt;<span class="lifetime">'a</span>, T&gt;;
 <span class="attr">#[cfg(target_arch = <span class="string">"wasm32"</span>)]
-</span><span class="kw">pub type </span>BoxedFuture&lt;T&gt; = futures::future::LocalBoxFuture&lt;<span class="lifetime">'static</span>, T&gt;;
+</span><span class="kw">pub type </span>BoxedFuture&lt;<span class="lifetime">'a</span>, T&gt; = futures::future::LocalBoxFuture&lt;<span class="lifetime">'a</span>, T&gt;;
+
+<span class="doccomment">/// BoxedStaticFuture is the type alias of [`futures::future::BoxFuture`].
+///
+/// We will switch to [`futures::future::LocalBoxFuture`] on wasm32 target.
+</span><span class="attr">#[cfg(not(target_arch = <span class="string">"wasm32"</span>))]
+</span><span class="kw">pub type </span>BoxedStaticFuture&lt;T&gt; = futures::future::BoxFuture&lt;<span class="lifetime">'static</span>, T&gt;;
+<span class="attr">#[cfg(target_arch = <span class="string">"wasm32"</span>)]
+</span><span class="kw">pub type </span>BoxedStaticFuture&lt;T&gt; = futures::future::LocalBoxFuture&lt;<span class="lifetime">'static</span>, T&gt;;
 
 <span class="doccomment">/// CONCURRENT_LARGE_THRESHOLD is the threshold to determine whether to use
 /// [`FuturesOrdered`] or not.
diff --git a/docs/rust/src/opendal/raw/http_util/body.rs.html b/docs/rust/src/opendal/raw/http_util/body.rs.html
index 677bdd6fdf..ccbebf5501 100644
--- a/docs/rust/src/opendal/raw/http_util/body.rs.html
+++ b/docs/rust/src/opendal/raw/http_util/body.rs.html
@@ -199,44 +199,6 @@
 <a href="#197" id="197">197</a>
 <a href="#198" id="198">198</a>
 <a href="#199" id="199">199</a>
-<a href="#200" id="200">200</a>
-<a href="#201" id="201">201</a>
-<a href="#202" id="202">202</a>
-<a href="#203" id="203">203</a>
-<a href="#204" id="204">204</a>
-<a href="#205" id="205">205</a>
-<a href="#206" id="206">206</a>
-<a href="#207" id="207">207</a>
-<a href="#208" id="208">208</a>
-<a href="#209" id="209">209</a>
-<a href="#210" id="210">210</a>
-<a href="#211" id="211">211</a>
-<a href="#212" id="212">212</a>
-<a href="#213" id="213">213</a>
-<a href="#214" id="214">214</a>
-<a href="#215" id="215">215</a>
-<a href="#216" id="216">216</a>
-<a href="#217" id="217">217</a>
-<a href="#218" id="218">218</a>
-<a href="#219" id="219">219</a>
-<a href="#220" id="220">220</a>
-<a href="#221" id="221">221</a>
-<a href="#222" id="222">222</a>
-<a href="#223" id="223">223</a>
-<a href="#224" id="224">224</a>
-<a href="#225" id="225">225</a>
-<a href="#226" id="226">226</a>
-<a href="#227" id="227">227</a>
-<a href="#228" id="228">228</a>
-<a href="#229" id="229">229</a>
-<a href="#230" id="230">230</a>
-<a href="#231" id="231">231</a>
-<a href="#232" id="232">232</a>
-<a href="#233" id="233">233</a>
-<a href="#234" id="234">234</a>
-<a href="#235" id="235">235</a>
-<a href="#236" id="236">236</a>
-<a href="#237" id="237">237</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -257,13 +219,11 @@
 </span><span class="kw">use </span>std::cmp::min;
 <span class="kw">use </span>std::cmp::Ordering;
 <span class="kw">use </span>std::io;
-<span class="kw">use </span>std::task::ready;
-<span class="kw">use </span>std::task::Context;
-<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>bytes::Buf;
 <span class="kw">use </span>bytes::BufMut;
 <span class="kw">use </span>bytes::Bytes;
+<span class="kw">use </span>futures::StreamExt;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
@@ -300,7 +260,7 @@
     </span>inner: oio::Streamer,
     size: <span class="prelude-ty">Option</span>&lt;u64&gt;,
     consumed: u64,
-    chunk: <span class="prelude-ty">Option</span>&lt;Bytes&gt;,
+    chunk: Bytes,
 }
 
 <span class="kw">impl </span>IncomingAsyncBody {
@@ -310,7 +270,7 @@
             inner: s,
             size,
             consumed: <span class="number">0</span>,
-            chunk: <span class="prelude-val">None</span>,
+            chunk: Bytes::new(),
         }
     }
 
@@ -321,20 +281,23 @@
             inner: Box::new(()),
             size: <span class="prelude-val">Some</span>(<span class="number">0</span>),
             consumed: <span class="number">0</span>,
-            chunk: <span class="prelude-val">None</span>,
+            chunk: Bytes::new(),
         }
     }
 
     <span class="doccomment">/// Consume the entire body.
     </span><span class="kw">pub async fn </span>consume(<span class="kw-2">mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">use </span>oio::ReadExt;
+        <span class="kw">use </span>oio::Read;
 
-        <span class="kw">while let </span><span class="prelude-val">Some</span>(bs) = <span class="self">self</span>.next().<span class="kw">await </span>{
-            bs.map_err(|err| {
+        <span class="kw">loop </span>{
+            <span class="kw">let </span>buf = <span class="self">self</span>.read(<span class="number">4 </span>* <span class="number">1024 </span>* <span class="number">1024</span>).<span class="kw">await</span>.map_err(|err| {
                 Error::new(ErrorKind::Unexpected, <span class="string">"fetch bytes from stream"</span>)
                     .with_operation(<span class="string">"http_util::IncomingAsyncBody::consume"</span>)
                     .set_source(err)
             })<span class="question-mark">?</span>;
+            <span class="kw">if </span>buf.is_empty() {
+                <span class="kw">break</span>;
+            }
         }
 
         <span class="prelude-val">Ok</span>(())
@@ -344,20 +307,18 @@
     ///
     /// This code is inspired from hyper's [`to_bytes`](https://docs.rs/hyper/0.14.23/hyper/body/fn.to_bytes.html).
     </span><span class="kw">pub async fn </span>bytes(<span class="kw-2">mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
-        <span class="kw">use </span>oio::ReadExt;
+        <span class="kw">use </span>oio::Read;
 
         <span class="comment">// If there's only 1 chunk, we can just return Buf::to_bytes()
-        </span><span class="kw">let </span>first = <span class="kw">if let </span><span class="prelude-val">Some</span>(buf) = <span class="self">self</span>.next().<span class="kw">await </span>{
-            buf<span class="question-mark">?
-        </span>} <span class="kw">else </span>{
-            <span class="kw">return </span><span class="prelude-val">Ok</span>(Bytes::new());
-        };
+        </span><span class="kw">let </span>first = <span class="self">self</span>.read(<span class="number">4 </span>* <span class="number">1024 </span>* <span class="number">1024</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="kw">if </span>first.is_empty() {
+            <span class="kw">return </span><span class="prelude-val">Ok</span>(first);
+        }
 
-        <span class="kw">let </span>second = <span class="kw">if let </span><span class="prelude-val">Some</span>(buf) = <span class="self">self</span>.next().<span class="kw">await </span>{
-            buf<span class="question-mark">?
-        </span>} <span class="kw">else </span>{
+        <span class="kw">let </span>second = <span class="self">self</span>.read(<span class="number">4 </span>* <span class="number">1024 </span>* <span class="number">1024</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="kw">if </span>second.is_empty() {
             <span class="kw">return </span><span class="prelude-val">Ok</span>(first);
-        };
+        }
 
         <span class="comment">// With more than 1 buf, we gotta flatten into a Vec first.
         </span><span class="kw">let </span>cap = <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
@@ -373,8 +334,13 @@
         vec.put(first);
         vec.put(second);
 
-        <span class="kw">while let </span><span class="prelude-val">Some</span>(buf) = <span class="self">self</span>.next().<span class="kw">await </span>{
-            vec.put(buf<span class="question-mark">?</span>);
+        <span class="comment">// TODO: we can tune the io size here.
+        </span><span class="kw">loop </span>{
+            <span class="kw">let </span>buf = <span class="self">self</span>.read(<span class="number">4 </span>* <span class="number">1024 </span>* <span class="number">1024</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="kw">if </span>buf.is_empty() {
+                <span class="kw">break</span>;
+            }
+            vec.put(buf);
         }
 
         <span class="prelude-val">Ok</span>(vec.into())
@@ -399,79 +365,37 @@
 }
 
 <span class="kw">impl </span>oio::Read <span class="kw">for </span>IncomingAsyncBody {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, <span class="kw-2">mut </span>buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="kw">if </span>buf.is_empty() || <span class="self">self</span>.size == <span class="prelude-val">Some</span>(<span class="number">0</span>) {
-            <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(<span class="number">0</span>));
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="kw">if </span><span class="self">self</span>.size == <span class="prelude-val">Some</span>(<span class="number">0</span>) {
+            <span class="kw">return </span><span class="prelude-val">Ok</span>(Bytes::new());
         }
 
-        <span class="comment">// Avoid extra poll of next if we already have chunks.
-        </span><span class="kw">let </span><span class="kw-2">mut </span>bs = <span class="kw">if let </span><span class="prelude-val">Some</span>(chunk) = <span class="self">self</span>.chunk.take() {
-            chunk
-        } <span class="kw">else </span>{
-            <span class="kw">loop </span>{
-                <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_next(cx)) {
-                    <span class="comment">// It's possible for underlying stream to return empty bytes, we should continue
-                    // to fetch next one.
-                    </span><span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bs)) <span class="kw">if </span>bs.is_empty() =&gt; <span class="kw">continue</span>,
-                    <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bs)) =&gt; {
-                        <span class="self">self</span>.consumed += bs.len() <span class="kw">as </span>u64;
-                        <span class="kw">break </span>bs;
-                    }
-                    <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)) =&gt; <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(err)),
-                    <span class="prelude-val">None </span>=&gt; {
-                        <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
-                            <span class="self">Self</span>::check(size, <span class="self">self</span>.consumed)<span class="question-mark">?</span>;
-                        }
-                        <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(<span class="number">0</span>));
-                    }
-                }
-            }
-        };
+        <span class="kw">if </span><span class="self">self</span>.chunk.is_empty() {
+            <span class="self">self</span>.chunk = <span class="kw">match </span><span class="self">self</span>.inner.next().<span class="kw">await</span>.transpose()<span class="question-mark">? </span>{
+                <span class="prelude-val">Some</span>(bs) =&gt; bs,
+                <span class="prelude-val">None </span>=&gt; {
+                    <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
+                        <span class="self">Self</span>::check(size, <span class="self">self</span>.consumed)<span class="question-mark">?
+                    </span>}
 
-        <span class="kw">let </span>amt = min(bs.len(), buf.len());
-        buf.put_slice(<span class="kw-2">&amp;</span>bs[..amt]);
-        bs.advance(amt);
-        <span class="kw">if </span>!bs.is_empty() {
-            <span class="self">self</span>.chunk = <span class="prelude-val">Some</span>(bs);
+                    <span class="kw">return </span><span class="prelude-val">Ok</span>(Bytes::new());
+                }
+            };
         }
 
-        Poll::Ready(<span class="prelude-val">Ok</span>(amt))
+        <span class="kw">let </span>size = min(size, <span class="self">self</span>.chunk.len());
+        <span class="self">self</span>.consumed += size <span class="kw">as </span>u64;
+        <span class="kw">let </span>bs = <span class="self">self</span>.chunk.split_to(size);
+        <span class="prelude-val">Ok</span>(bs)
     }
 
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="kw">let </span>(<span class="kw">_</span>, <span class="kw">_</span>) = (cx, pos);
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">let _ </span>= pos;
 
-        Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+        <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">"output reader doesn't support seeking"</span>,
-        )))
-    }
-
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">if </span><span class="self">self</span>.size == <span class="prelude-val">Some</span>(<span class="number">0</span>) {
-            <span class="kw">return </span>Poll::Ready(<span class="prelude-val">None</span>);
-        }
-
-        <span class="kw">if let </span><span class="prelude-val">Some</span>(bs) = <span class="self">self</span>.chunk.take() {
-            <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bs)));
-        }
-
-        <span class="kw">let </span>res = <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_next(cx)) {
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bs)) =&gt; {
-                <span class="self">self</span>.consumed += bs.len() <span class="kw">as </span>u64;
-                <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bs))
-            }
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)) =&gt; <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)),
-            <span class="prelude-val">None </span>=&gt; {
-                <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
-                    <span class="self">Self</span>::check(size, <span class="self">self</span>.consumed)<span class="question-mark">?</span>;
-                }
-
-                <span class="prelude-val">None
-            </span>}
-        };
-
-        Poll::Ready(res)
+        ))
     }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/raw/mod.rs.html b/docs/rust/src/opendal/raw/mod.rs.html
index d32a44680b..d64551ce5f 100644
--- a/docs/rust/src/opendal/raw/mod.rs.html
+++ b/docs/rust/src/opendal/raw/mod.rs.html
@@ -83,6 +83,7 @@
 <a href="#81" id="81">81</a>
 <a href="#82" id="82">82</a>
 <a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -156,6 +157,7 @@
 
 <span class="kw">mod </span>futures_util;
 <span class="kw">pub use </span>futures_util::BoxedFuture;
+<span class="kw">pub use </span>futures_util::BoxedStaticFuture;
 <span class="kw">pub use </span>futures_util::ConcurrentFutures;
 
 <span class="kw">mod </span>enum_utils;
diff --git a/docs/rust/src/opendal/raw/oio/cursor.rs.html b/docs/rust/src/opendal/raw/oio/cursor.rs.html
index 56808723ff..3256c7ec85 100644
--- a/docs/rust/src/opendal/raw/oio/cursor.rs.html
+++ b/docs/rust/src/opendal/raw/oio/cursor.rs.html
@@ -161,14 +161,6 @@
 <a href="#159" id="159">159</a>
 <a href="#160" id="160">160</a>
 <a href="#161" id="161">161</a>
-<a href="#162" id="162">162</a>
-<a href="#163" id="163">163</a>
-<a href="#164" id="164">164</a>
-<a href="#165" id="165">165</a>
-<a href="#166" id="166">166</a>
-<a href="#167" id="167">167</a>
-<a href="#168" id="168">168</a>
-<a href="#169" id="169">169</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -186,7 +178,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span>std::io::Read;
+</span><span class="kw">use </span>std::cmp::min;
+<span class="kw">use </span>std::io::Read;
 <span class="kw">use </span>std::io::SeekFrom;
 <span class="kw">use </span>std::task::Context;
 <span class="kw">use </span>std::task::Poll;
@@ -242,17 +235,7 @@
 }
 
 <span class="kw">impl </span>oio::Read <span class="kw">for </span>Cursor {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="kw">let </span>n = Read::read(<span class="kw-2">&amp;mut </span><span class="self">self</span>.remaining_slice(), buf).map_err(|err| {
-            Error::new(ErrorKind::Unexpected, <span class="string">"read data from Cursor"</span>)
-                .with_context(<span class="string">"source"</span>, <span class="string">"Cursor"</span>)
-                .set_source(err)
-        })<span class="question-mark">?</span>;
-        <span class="self">self</span>.pos += n <span class="kw">as </span>u64;
-        Poll::Ready(<span class="prelude-val">Ok</span>(n))
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">let </span>(base, amt) = <span class="kw">match </span>pos {
             SeekFrom::Start(n) =&gt; (<span class="number">0</span>, n <span class="kw">as </span>i64),
             SeekFrom::End(n) =&gt; (<span class="self">self</span>.inner.len() <span class="kw">as </span>i64, n),
@@ -262,24 +245,25 @@
         <span class="kw">let </span>n = <span class="kw">match </span>base.checked_add(amt) {
             <span class="prelude-val">Some</span>(n) <span class="kw">if </span>n &gt;= <span class="number">0 </span>=&gt; n <span class="kw">as </span>u64,
             <span class="kw">_ </span>=&gt; {
-                <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
                     ErrorKind::InvalidInput,
                     <span class="string">"invalid seek to a negative or overflowing position"</span>,
-                )))
+                ))
             }
         };
         <span class="self">self</span>.pos = n;
-        Poll::Ready(<span class="prelude-val">Ok</span>(n))
+        <span class="prelude-val">Ok</span>(n)
     }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
         <span class="kw">if </span><span class="self">self</span>.is_empty() {
-            Poll::Ready(<span class="prelude-val">None</span>)
+            <span class="prelude-val">Ok</span>(Bytes::new())
         } <span class="kw">else </span>{
             <span class="comment">// The clone here is required as we don't want to change it.
-            </span><span class="kw">let </span>bs = <span class="self">self</span>.inner.clone().split_off(<span class="self">self</span>.pos <span class="kw">as </span>usize);
+            </span><span class="kw">let </span><span class="kw-2">mut </span>bs = <span class="self">self</span>.inner.clone().split_off(<span class="self">self</span>.pos <span class="kw">as </span>usize);
+            <span class="kw">let </span>bs = bs.split_to(min(bs.len(), size));
             <span class="self">self</span>.pos += bs.len() <span class="kw">as </span>u64;
-            Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bs)))
+            <span class="prelude-val">Ok</span>(bs)
         }
     }
 }
diff --git a/docs/rust/src/opendal/raw/oio/list/flat_list.rs.html b/docs/rust/src/opendal/raw/oio/list/flat_list.rs.html
index fccc682e1f..8cd536ca4b 100644
--- a/docs/rust/src/opendal/raw/oio/list/flat_list.rs.html
+++ b/docs/rust/src/opendal/raw/oio/list/flat_list.rs.html
@@ -324,7 +324,7 @@
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
 <span class="doccomment">/// ListFuture is the future returned while calling async list.
-</span><span class="kw">type </span>ListFuture&lt;A, L&gt; = BoxedFuture&lt;(A, oio::Entry, <span class="prelude-ty">Result</span>&lt;(RpList, L)&gt;)&gt;;
+</span><span class="kw">type </span>ListFuture&lt;A, L&gt; = BoxedStaticFuture&lt;(A, oio::Entry, <span class="prelude-ty">Result</span>&lt;(RpList, L)&gt;)&gt;;
 
 <span class="doccomment">/// FlatLister will walk dir in bottom up way:
 ///
diff --git a/docs/rust/src/opendal/raw/oio/list/page_list.rs.html b/docs/rust/src/opendal/raw/oio/list/page_list.rs.html
index ab7c49426c..4eb4522187 100644
--- a/docs/rust/src/opendal/raw/oio/list/page_list.rs.html
+++ b/docs/rust/src/opendal/raw/oio/list/page_list.rs.html
@@ -213,7 +213,7 @@
 
 <span class="kw">enum </span>State&lt;L&gt; {
     Idle(<span class="prelude-ty">Option</span>&lt;(L, PageContext)&gt;),
-    Fetch(BoxedFuture&lt;((L, PageContext), <span class="prelude-ty">Result</span>&lt;()&gt;)&gt;),
+    Fetch(BoxedStaticFuture&lt;((L, PageContext), <span class="prelude-ty">Result</span>&lt;()&gt;)&gt;),
 }
 
 <span class="doccomment">/// # Safety
diff --git a/docs/rust/src/opendal/raw/oio/read/api.rs.html b/docs/rust/src/opendal/raw/oio/read/api.rs.html
index 90f6a55d37..0db2e257cb 100644
--- a/docs/rust/src/opendal/raw/oio/read/api.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/api.rs.html
@@ -273,187 +273,6 @@
 <a href="#271" id="271">271</a>
 <a href="#272" id="272">272</a>
 <a href="#273" id="273">273</a>
-<a href="#274" id="274">274</a>
-<a href="#275" id="275">275</a>
-<a href="#276" id="276">276</a>
-<a href="#277" id="277">277</a>
-<a href="#278" id="278">278</a>
-<a href="#279" id="279">279</a>
-<a href="#280" id="280">280</a>
-<a href="#281" id="281">281</a>
-<a href="#282" id="282">282</a>
-<a href="#283" id="283">283</a>
-<a href="#284" id="284">284</a>
-<a href="#285" id="285">285</a>
-<a href="#286" id="286">286</a>
-<a href="#287" id="287">287</a>
-<a href="#288" id="288">288</a>
-<a href="#289" id="289">289</a>
-<a href="#290" id="290">290</a>
-<a href="#291" id="291">291</a>
-<a href="#292" id="292">292</a>
-<a href="#293" id="293">293</a>
-<a href="#294" id="294">294</a>
-<a href="#295" id="295">295</a>
-<a href="#296" id="296">296</a>
-<a href="#297" id="297">297</a>
-<a href="#298" id="298">298</a>
-<a href="#299" id="299">299</a>
-<a href="#300" id="300">300</a>
-<a href="#301" id="301">301</a>
-<a href="#302" id="302">302</a>
-<a href="#303" id="303">303</a>
-<a href="#304" id="304">304</a>
-<a href="#305" id="305">305</a>
-<a href="#306" id="306">306</a>
-<a href="#307" id="307">307</a>
-<a href="#308" id="308">308</a>
-<a href="#309" id="309">309</a>
-<a href="#310" id="310">310</a>
-<a href="#311" id="311">311</a>
-<a href="#312" id="312">312</a>
-<a href="#313" id="313">313</a>
-<a href="#314" id="314">314</a>
-<a href="#315" id="315">315</a>
-<a href="#316" id="316">316</a>
-<a href="#317" id="317">317</a>
-<a href="#318" id="318">318</a>
-<a href="#319" id="319">319</a>
-<a href="#320" id="320">320</a>
-<a href="#321" id="321">321</a>
-<a href="#322" id="322">322</a>
-<a href="#323" id="323">323</a>
-<a href="#324" id="324">324</a>
-<a href="#325" id="325">325</a>
-<a href="#326" id="326">326</a>
-<a href="#327" id="327">327</a>
-<a href="#328" id="328">328</a>
-<a href="#329" id="329">329</a>
-<a href="#330" id="330">330</a>
-<a href="#331" id="331">331</a>
-<a href="#332" id="332">332</a>
-<a href="#333" id="333">333</a>
-<a href="#334" id="334">334</a>
-<a href="#335" id="335">335</a>
-<a href="#336" id="336">336</a>
-<a href="#337" id="337">337</a>
-<a href="#338" id="338">338</a>
-<a href="#339" id="339">339</a>
-<a href="#340" id="340">340</a>
-<a href="#341" id="341">341</a>
-<a href="#342" id="342">342</a>
-<a href="#343" id="343">343</a>
-<a href="#344" id="344">344</a>
-<a href="#345" id="345">345</a>
-<a href="#346" id="346">346</a>
-<a href="#347" id="347">347</a>
-<a href="#348" id="348">348</a>
-<a href="#349" id="349">349</a>
-<a href="#350" id="350">350</a>
-<a href="#351" id="351">351</a>
-<a href="#352" id="352">352</a>
-<a href="#353" id="353">353</a>
-<a href="#354" id="354">354</a>
-<a href="#355" id="355">355</a>
-<a href="#356" id="356">356</a>
-<a href="#357" id="357">357</a>
-<a href="#358" id="358">358</a>
-<a href="#359" id="359">359</a>
-<a href="#360" id="360">360</a>
-<a href="#361" id="361">361</a>
-<a href="#362" id="362">362</a>
-<a href="#363" id="363">363</a>
-<a href="#364" id="364">364</a>
-<a href="#365" id="365">365</a>
-<a href="#366" id="366">366</a>
-<a href="#367" id="367">367</a>
-<a href="#368" id="368">368</a>
-<a href="#369" id="369">369</a>
-<a href="#370" id="370">370</a>
-<a href="#371" id="371">371</a>
-<a href="#372" id="372">372</a>
-<a href="#373" id="373">373</a>
-<a href="#374" id="374">374</a>
-<a href="#375" id="375">375</a>
-<a href="#376" id="376">376</a>
-<a href="#377" id="377">377</a>
-<a href="#378" id="378">378</a>
-<a href="#379" id="379">379</a>
-<a href="#380" id="380">380</a>
-<a href="#381" id="381">381</a>
-<a href="#382" id="382">382</a>
-<a href="#383" id="383">383</a>
-<a href="#384" id="384">384</a>
-<a href="#385" id="385">385</a>
-<a href="#386" id="386">386</a>
-<a href="#387" id="387">387</a>
-<a href="#388" id="388">388</a>
-<a href="#389" id="389">389</a>
-<a href="#390" id="390">390</a>
-<a href="#391" id="391">391</a>
-<a href="#392" id="392">392</a>
-<a href="#393" id="393">393</a>
-<a href="#394" id="394">394</a>
-<a href="#395" id="395">395</a>
-<a href="#396" id="396">396</a>
-<a href="#397" id="397">397</a>
-<a href="#398" id="398">398</a>
-<a href="#399" id="399">399</a>
-<a href="#400" id="400">400</a>
-<a href="#401" id="401">401</a>
-<a href="#402" id="402">402</a>
-<a href="#403" id="403">403</a>
-<a href="#404" id="404">404</a>
-<a href="#405" id="405">405</a>
-<a href="#406" id="406">406</a>
-<a href="#407" id="407">407</a>
-<a href="#408" id="408">408</a>
-<a href="#409" id="409">409</a>
-<a href="#410" id="410">410</a>
-<a href="#411" id="411">411</a>
-<a href="#412" id="412">412</a>
-<a href="#413" id="413">413</a>
-<a href="#414" id="414">414</a>
-<a href="#415" id="415">415</a>
-<a href="#416" id="416">416</a>
-<a href="#417" id="417">417</a>
-<a href="#418" id="418">418</a>
-<a href="#419" id="419">419</a>
-<a href="#420" id="420">420</a>
-<a href="#421" id="421">421</a>
-<a href="#422" id="422">422</a>
-<a href="#423" id="423">423</a>
-<a href="#424" id="424">424</a>
-<a href="#425" id="425">425</a>
-<a href="#426" id="426">426</a>
-<a href="#427" id="427">427</a>
-<a href="#428" id="428">428</a>
-<a href="#429" id="429">429</a>
-<a href="#430" id="430">430</a>
-<a href="#431" id="431">431</a>
-<a href="#432" id="432">432</a>
-<a href="#433" id="433">433</a>
-<a href="#434" id="434">434</a>
-<a href="#435" id="435">435</a>
-<a href="#436" id="436">436</a>
-<a href="#437" id="437">437</a>
-<a href="#438" id="438">438</a>
-<a href="#439" id="439">439</a>
-<a href="#440" id="440">440</a>
-<a href="#441" id="441">441</a>
-<a href="#442" id="442">442</a>
-<a href="#443" id="443">443</a>
-<a href="#444" id="444">444</a>
-<a href="#445" id="445">445</a>
-<a href="#446" id="446">446</a>
-<a href="#447" id="447">447</a>
-<a href="#448" id="448">448</a>
-<a href="#449" id="449">449</a>
-<a href="#450" id="450">450</a>
-<a href="#451" id="451">451</a>
-<a href="#452" id="452">452</a>
-<a href="#453" id="453">453</a>
-<a href="#454" id="454">454</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -474,15 +293,13 @@
 </span><span class="kw">use </span>std::fmt::Display;
 <span class="kw">use </span>std::fmt::Formatter;
 <span class="kw">use </span>std::io;
-<span class="kw">use </span>std::pin::Pin;
-<span class="kw">use </span>std::task::ready;
-<span class="kw">use </span>std::task::Context;
-<span class="kw">use </span>std::task::Poll;
+<span class="kw">use </span>std::ops::DerefMut;
 
 <span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>futures::Future;
 <span class="kw">use </span>tokio::io::ReadBuf;
 
+<span class="kw">use </span><span class="kw">crate</span>::raw::BoxedFuture;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
 <span class="doccomment">/// PageOperation is the name for APIs of lister.
@@ -532,7 +349,7 @@
 }
 
 <span class="doccomment">/// Reader is a type erased [`Read`].
-</span><span class="kw">pub type </span>Reader = Box&lt;<span class="kw">dyn </span>Read&gt;;
+</span><span class="kw">pub type </span>Reader = Box&lt;<span class="kw">dyn </span>ReadDyn&gt;;
 
 <span class="doccomment">/// Read is the trait that OpenDAL returns to callers.
 ///
@@ -545,214 +362,78 @@
 /// `AsyncRead` is required to be implemented, `AsyncSeek` and `Stream`
 /// is optional. We use `Read` to make users life easier.
 </span><span class="kw">pub trait </span>Read: Unpin + Send + Sync {
-    <span class="doccomment">/// Read bytes asynchronously.
-    </span><span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt;;
+    <span class="doccomment">/// Fetch more bytes from underlying reader.
+    ///
+    /// `size` is used to hint the data that user want to read at most. Implementer
+    /// MUST NOT return more than `size` bytes. However, implementer can decide
+    /// whether to split or merge the read requests underground.
+    ///
+    /// Returning `bytes`'s `length == 0` means:
+    ///
+    /// - This reader has reached its “end of file” and will likely no longer be able to produce bytes.
+    /// - The `size` specified was `0`.
+    </span><span class="attr">#[cfg(not(target_arch = <span class="string">"wasm32"</span>))]
+    </span><span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="kw">impl </span>Future&lt;Output = <span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt; + Send;
+    <span class="attr">#[cfg(target_arch = <span class="string">"wasm32"</span>)]
+    </span><span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="kw">impl </span>Future&lt;Output = <span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;;
 
     <span class="doccomment">/// Seek asynchronously.
     ///
     /// Returns `Unsupported` error if underlying reader doesn't support seek.
-    </span><span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt;;
-
-    <span class="doccomment">/// Stream [`Bytes`] from underlying reader.
-    ///
-    /// Returns `Unsupported` error if underlying reader doesn't support stream.
-    ///
-    /// This API exists for avoiding bytes copying inside async runtime.
-    /// Users can poll bytes from underlying reader and decide when to
-    /// read/consume them.
-    </span><span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt;;
+    </span><span class="attr">#[cfg(not(target_arch = <span class="string">"wasm32"</span>))]
+    </span><span class="kw">fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="kw">impl </span>Future&lt;Output = <span class="prelude-ty">Result</span>&lt;u64&gt;&gt; + Send;
+    <span class="attr">#[cfg(target_arch = <span class="string">"wasm32"</span>)]
+    </span><span class="kw">fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="kw">impl </span>Future&lt;Output = <span class="prelude-ty">Result</span>&lt;u64&gt;&gt;;
 }
 
 <span class="kw">impl </span>Read <span class="kw">for </span>() {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="kw">let </span>(<span class="kw">_</span>, <span class="kw">_</span>) = (cx, buf);
-
-        <span class="macro">unimplemented!</span>(<span class="string">"poll_read is required to be implemented for oio::Read"</span>)
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="kw">let </span>(<span class="kw">_</span>, <span class="kw">_</span>) = (cx, pos);
-
-        Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
-            ErrorKind::Unsupported,
-            <span class="string">"output reader doesn't support seeking"</span>,
-        )))
-    }
-
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">let _ </span>= cx;
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="kw">let _ </span>= size;
 
-        Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(Error::new(
+        <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">"output reader doesn't support streaming"</span>,
-        ))))
-    }
-}
-
-<span class="doccomment">/// `Box&lt;dyn Read&gt;` won't implement `Read` automatically. To make Reader
-/// work as expected, we must add this impl.
-</span><span class="kw">impl</span>&lt;T: Read + <span class="question-mark">?</span>Sized&gt; Read <span class="kw">for </span>Box&lt;T&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        (<span class="kw-2">**</span><span class="self">self</span>).poll_read(cx, buf)
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        (<span class="kw-2">**</span><span class="self">self</span>).poll_seek(cx, pos)
+        ))
     }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        (<span class="kw-2">**</span><span class="self">self</span>).poll_next(cx)
-    }
-}
-
-<span class="kw">impl </span>futures::AsyncRead <span class="kw">for dyn </span>Read {
-    <span class="kw">fn </span>poll_read(
-        <span class="kw-2">mut </span><span class="self">self</span>: Pin&lt;<span class="kw-2">&amp;mut </span><span class="self">Self</span>&gt;,
-        cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;,
-        buf: <span class="kw-2">&amp;mut </span>[u8],
-    ) -&gt; Poll&lt;io::Result&lt;usize&gt;&gt; {
-        <span class="kw">let </span>this: <span class="kw-2">&amp;mut </span><span class="kw">dyn </span>Read = <span class="kw-2">&amp;mut *</span><span class="self">self</span>;
-        this.poll_read(cx, buf).map_err(format_io_error)
-    }
-}
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">let _ </span>= pos;
 
-<span class="kw">impl </span>futures::AsyncSeek <span class="kw">for dyn </span>Read {
-    <span class="kw">fn </span>poll_seek(
-        <span class="kw-2">mut </span><span class="self">self</span>: Pin&lt;<span class="kw-2">&amp;mut </span><span class="self">Self</span>&gt;,
-        cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;,
-        pos: io::SeekFrom,
-    ) -&gt; Poll&lt;io::Result&lt;u64&gt;&gt; {
-        <span class="kw">let </span>this: <span class="kw-2">&amp;mut </span><span class="kw">dyn </span>Read = <span class="kw-2">&amp;mut *</span><span class="self">self</span>;
-        this.poll_seek(cx, pos).map_err(format_io_error)
+        <span class="prelude-val">Err</span>(Error::new(
+            ErrorKind::Unsupported,
+            <span class="string">"output reader doesn't support seeking"</span>,
+        ))
     }
 }
 
-<span class="kw">impl </span>futures::Stream <span class="kw">for dyn </span>Read {
-    <span class="kw">type </span>Item = <span class="prelude-ty">Result</span>&lt;Bytes&gt;;
+<span class="kw">pub trait </span>ReadDyn: Unpin + Send + Sync {
+    <span class="kw">fn </span>read_dyn(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; BoxedFuture&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;;
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">mut </span><span class="self">self</span>: Pin&lt;<span class="kw-2">&amp;mut </span><span class="self">Self</span>&gt;, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="self">Self</span>::Item&gt;&gt; {
-        <span class="kw">let </span>this: <span class="kw-2">&amp;mut </span><span class="kw">dyn </span>Read = <span class="kw-2">&amp;mut *</span><span class="self">self</span>;
-        this.poll_next(cx)
-    }
+    <span class="kw">fn </span>seek_dyn(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; BoxedFuture&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt;;
 }
 
-<span class="doccomment">/// Impl ReadExt for all T: Read
-</span><span class="kw">impl</span>&lt;T: Read&gt; ReadExt <span class="kw">for </span>T {}
-
-<span class="doccomment">/// Extension of [`Read`] to make it easier for use.
-</span><span class="kw">pub trait </span>ReadExt: Read {
-    <span class="doccomment">/// Build a future for `poll_read`.
-    </span><span class="kw">fn </span>read&lt;<span class="lifetime">'a</span>&gt;(<span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>[u8]) -&gt; ReadFuture&lt;<span class="lifetime">'a</span>, <span class="self">Self</span>&gt; {
-        ReadFuture { reader: <span class="self">self</span>, buf }
-    }
-
-    <span class="doccomment">/// Build a future for `poll_seek`.
-    </span><span class="kw">fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; SeekFuture&lt;<span class="lifetime">'_</span>, <span class="self">Self</span>&gt; {
-        SeekFuture { reader: <span class="self">self</span>, pos }
+<span class="kw">impl</span>&lt;T: Read + <span class="question-mark">?</span>Sized&gt; ReadDyn <span class="kw">for </span>T {
+    <span class="kw">fn </span>read_dyn(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; BoxedFuture&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt; {
+        Box::pin(<span class="self">self</span>.read(size))
     }
 
-    <span class="doccomment">/// Build a future for `poll_next`
-    </span><span class="kw">fn </span>next(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; NextFuture&lt;<span class="lifetime">'_</span>, <span class="self">Self</span>&gt; {
-        NextFuture { reader: <span class="self">self </span>}
+    <span class="kw">fn </span>seek_dyn(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; BoxedFuture&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
+        Box::pin(<span class="self">self</span>.seek(pos))
     }
-
-    <span class="doccomment">/// Build a future for `read_to_end`.
-    </span><span class="kw">fn </span>read_to_end&lt;<span class="lifetime">'a</span>&gt;(<span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>Vec&lt;u8&gt;) -&gt; ReadToEndFuture&lt;<span class="lifetime">'a</span>, <span class="self">Self</span>&gt; {
-        ReadToEndFuture { reader: <span class="self">self</span>, buf }
-    }
-}
-
-<span class="kw">pub struct </span>ReadFuture&lt;<span class="lifetime">'a</span>, R: Read + Unpin + <span class="question-mark">?</span>Sized&gt; {
-    reader: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>R,
-    buf: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>[u8],
 }
 
-<span class="kw">impl</span>&lt;R&gt; Future <span class="kw">for </span>ReadFuture&lt;<span class="lifetime">'_</span>, R&gt;
-<span class="kw">where
-    </span>R: Read + Unpin + <span class="question-mark">?</span>Sized,
-{
-    <span class="kw">type </span>Output = <span class="prelude-ty">Result</span>&lt;usize&gt;;
-
-    <span class="kw">fn </span>poll(<span class="self">self</span>: Pin&lt;<span class="kw-2">&amp;mut </span><span class="self">Self</span>&gt;, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="kw">let </span>this = <span class="self">self</span>.get_mut();
-        this.reader.poll_read(cx, this.buf)
-    }
-}
-
-<span class="kw">pub struct </span>SeekFuture&lt;<span class="lifetime">'a</span>, R: Read + Unpin + <span class="question-mark">?</span>Sized&gt; {
-    reader: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>R,
-    pos: io::SeekFrom,
-}
-
-<span class="kw">impl</span>&lt;R&gt; Future <span class="kw">for </span>SeekFuture&lt;<span class="lifetime">'_</span>, R&gt;
-<span class="kw">where
-    </span>R: Read + Unpin + <span class="question-mark">?</span>Sized,
-{
-    <span class="kw">type </span>Output = <span class="prelude-ty">Result</span>&lt;u64&gt;;
-
-    <span class="kw">fn </span>poll(<span class="self">self</span>: Pin&lt;<span class="kw-2">&amp;mut </span><span class="self">Self</span>&gt;, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="kw">let </span>this = <span class="self">self</span>.get_mut();
-        this.reader.poll_seek(cx, this.pos)
-    }
-}
-
-<span class="kw">pub struct </span>NextFuture&lt;<span class="lifetime">'a</span>, R: Read + Unpin + <span class="question-mark">?</span>Sized&gt; {
-    reader: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>R,
-}
-
-<span class="kw">impl</span>&lt;R&gt; Future <span class="kw">for </span>NextFuture&lt;<span class="lifetime">'_</span>, R&gt;
-<span class="kw">where
-    </span>R: Read + Unpin + <span class="question-mark">?</span>Sized,
-{
-    <span class="kw">type </span>Output = <span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;;
-
-    <span class="kw">fn </span>poll(<span class="kw-2">mut </span><span class="self">self</span>: Pin&lt;<span class="kw-2">&amp;mut </span><span class="self">Self</span>&gt;, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="self">self</span>.reader.poll_next(cx)
-    }
-}
-
-<span class="kw">pub struct </span>ReadToEndFuture&lt;<span class="lifetime">'a</span>, R: Read + Unpin + <span class="question-mark">?</span>Sized&gt; {
-    reader: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>R,
-    buf: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>Vec&lt;u8&gt;,
-}
-
-<span class="kw">impl</span>&lt;R&gt; Future <span class="kw">for </span>ReadToEndFuture&lt;<span class="lifetime">'_</span>, R&gt;
-<span class="kw">where
-    </span>R: Read + Unpin + <span class="question-mark">?</span>Sized,
-{
-    <span class="kw">type </span>Output = <span class="prelude-ty">Result</span>&lt;usize&gt;;
-
-    <span class="kw">fn </span>poll(<span class="self">self</span>: Pin&lt;<span class="kw-2">&amp;mut </span><span class="self">Self</span>&gt;, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="kw">let </span>this = <span class="self">self</span>.get_mut();
-        <span class="kw">let </span>start_len = this.buf.len();
-
-        <span class="kw">loop </span>{
-            <span class="kw">if </span>this.buf.len() == this.buf.capacity() {
-                this.buf.reserve(<span class="number">32</span>); <span class="comment">// buf is full, need more space
-            </span>}
-
-            <span class="kw">let </span>spare = this.buf.spare_capacity_mut();
-            <span class="kw">let </span><span class="kw-2">mut </span>read_buf: ReadBuf = ReadBuf::uninit(spare);
-
-            <span class="comment">// SAFETY: These bytes were initialized but not filled in the previous loop
-            </span><span class="kw">unsafe </span>{
-                read_buf.assume_init(read_buf.capacity());
-            }
-
-            <span class="kw">match </span><span class="macro">ready!</span>(this.reader.poll_read(cx, read_buf.initialize_unfilled())) {
-                <span class="prelude-val">Ok</span>(<span class="number">0</span>) =&gt; {
-                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(this.buf.len() - start_len));
-                }
-                <span class="prelude-val">Ok</span>(n) =&gt; {
-                    <span class="comment">// SAFETY: Read API makes sure that returning `n` is correct.
-                    </span><span class="kw">unsafe </span>{
-                        this.buf.set_len(this.buf.len() + n);
-                    }
-                }
-                <span class="prelude-val">Err</span>(e) =&gt; <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(e)),
-            }
-        }
-    }
+<span class="doccomment">/// # NOTE
+///
+/// Take care about the `deref_mut()` here. This makes sure that we are calling functions
+/// upon `&amp;mut T` instead of `&amp;mut Box&lt;T&gt;`. The later could result in infinite recursion.
+</span><span class="kw">impl</span>&lt;T: ReadDyn + <span class="question-mark">?</span>Sized&gt; Read <span class="kw">for </span>Box&lt;T&gt; {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="self">self</span>.deref_mut().read_dyn(size).<span class="kw">await
+    </span>}
+
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.deref_mut().seek_dyn(pos).<span class="kw">await
+    </span>}
 }
 
 <span class="doccomment">/// BlockingReader is a boxed dyn `BlockingRead`.
@@ -865,47 +546,4 @@
         (<span class="kw-2">**</span><span class="self">self</span>).next()
     }
 }
-
-<span class="kw">impl </span>io::Read <span class="kw">for dyn </span>BlockingRead {
-    <span class="attr">#[inline]
-    </span><span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; io::Result&lt;usize&gt; {
-        <span class="kw">let </span>this: <span class="kw-2">&amp;mut </span><span class="kw">dyn </span>BlockingRead = <span class="kw-2">&amp;mut *</span><span class="self">self</span>;
-        this.read(buf).map_err(format_io_error)
-    }
-}
-
-<span class="kw">impl </span>io::Seek <span class="kw">for dyn </span>BlockingRead {
-    <span class="attr">#[inline]
-    </span><span class="kw">fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: io::SeekFrom) -&gt; io::Result&lt;u64&gt; {
-        <span class="kw">let </span>this: <span class="kw-2">&amp;mut </span><span class="kw">dyn </span>BlockingRead = <span class="kw-2">&amp;mut *</span><span class="self">self</span>;
-        this.seek(pos).map_err(format_io_error)
-    }
-}
-
-<span class="kw">impl </span>Iterator <span class="kw">for dyn </span>BlockingRead {
-    <span class="kw">type </span>Item = <span class="prelude-ty">Result</span>&lt;Bytes&gt;;
-
-    <span class="attr">#[inline]
-    </span><span class="kw">fn </span>next(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="self">Self</span>::Item&gt; {
-        <span class="kw">let </span>this: <span class="kw-2">&amp;mut </span><span class="kw">dyn </span>BlockingRead = <span class="kw-2">&amp;mut *</span><span class="self">self</span>;
-        this.next()
-    }
-}
-
-<span class="doccomment">/// helper functions to format `Error` into `io::Error`.
-///
-/// This function is added privately by design and only valid in current
-/// context (i.e. `oio` crate). We don't want to expose this function to
-/// users.
-</span><span class="attr">#[inline]
-</span><span class="kw">fn </span>format_io_error(err: Error) -&gt; io::Error {
-    <span class="kw">let </span>kind = <span class="kw">match </span>err.kind() {
-        ErrorKind::NotFound =&gt; io::ErrorKind::NotFound,
-        ErrorKind::PermissionDenied =&gt; io::ErrorKind::PermissionDenied,
-        ErrorKind::InvalidInput =&gt; io::ErrorKind::InvalidInput,
-        <span class="kw">_ </span>=&gt; io::ErrorKind::Interrupted,
-    };
-
-    io::Error::new(kind, err)
-}
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/raw/oio/read/buffer_reader.rs.html b/docs/rust/src/opendal/raw/oio/read/buffer_reader.rs.html
index 68963aa554..9bef19542a 100644
--- a/docs/rust/src/opendal/raw/oio/read/buffer_reader.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/buffer_reader.rs.html
@@ -831,21 +831,6 @@
 <a href="#829" id="829">829</a>
 <a href="#830" id="830">830</a>
 <a href="#831" id="831">831</a>
-<a href="#832" id="832">832</a>
-<a href="#833" id="833">833</a>
-<a href="#834" id="834">834</a>
-<a href="#835" id="835">835</a>
-<a href="#836" id="836">836</a>
-<a href="#837" id="837">837</a>
-<a href="#838" id="838">838</a>
-<a href="#839" id="839">839</a>
-<a href="#840" id="840">840</a>
-<a href="#841" id="841">841</a>
-<a href="#842" id="842">842</a>
-<a href="#843" id="843">843</a>
-<a href="#844" id="844">844</a>
-<a href="#845" id="845">845</a>
-<a href="#846" id="846">846</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -865,9 +850,6 @@
 
 </span><span class="kw">use </span>std::cmp::min;
 <span class="kw">use </span>std::io::SeekFrom;
-<span class="kw">use </span>std::task::ready;
-<span class="kw">use </span>std::task::Context;
-<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>bytes::BufMut;
 <span class="kw">use </span>bytes::Bytes;
@@ -883,7 +865,8 @@
     r: R,
     cur: u64,
 
-    buf: Vec&lt;u8&gt;,
+    <span class="doccomment">/// TODO: maybe we can use chunked bytes here?
+    </span>buf: Vec&lt;u8&gt;,
     filled: usize,
     pos: usize,
 }
@@ -948,7 +931,7 @@
 <span class="kw">where
     </span>R: oio::Read,
 {
-    <span class="kw">fn </span>poll_fill_buf(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;<span class="kw-2">&amp;</span>[u8]&gt;&gt; {
+    <span class="kw">async fn </span>fill_buf(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="kw-2">&amp;</span>[u8]&gt; {
         <span class="comment">// If we've reached the end of our internal buffer then we need to fetch
         // some more data from the underlying reader.
         // Branch using `&gt;=` instead of the more correct `==`
@@ -962,22 +945,23 @@
             <span class="kw">let </span><span class="kw-2">mut </span>buf = ReadBuf::uninit(dst);
             <span class="kw">unsafe </span>{ buf.assume_init(cap) };
 
-            <span class="kw">let </span>n = <span class="macro">ready!</span>(<span class="self">self</span>.r.poll_read(cx, buf.initialized_mut()))<span class="question-mark">?</span>;
-            <span class="kw">unsafe </span>{ <span class="self">self</span>.buf.set_len(n) }
+            <span class="kw">let </span>bs = <span class="self">self</span>.r.read(cap).<span class="kw">await</span><span class="question-mark">?</span>;
+            buf.put_slice(<span class="kw-2">&amp;</span>bs);
+            <span class="kw">unsafe </span>{ <span class="self">self</span>.buf.set_len(bs.len()) }
 
             <span class="self">self</span>.pos = <span class="number">0</span>;
-            <span class="self">self</span>.filled = n;
+            <span class="self">self</span>.filled = bs.len();
         }
 
-        Poll::Ready(<span class="prelude-val">Ok</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.buf[<span class="self">self</span>.pos..<span class="self">self</span>.filled]))
+        <span class="prelude-val">Ok</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.buf[<span class="self">self</span>.pos..<span class="self">self</span>.filled])
     }
 
-    <span class="kw">fn </span>poll_inner_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="kw">let </span>cur = <span class="macro">ready!</span>(<span class="self">self</span>.r.poll_seek(cx, pos))<span class="question-mark">?</span>;
+    <span class="kw">async fn </span>inner_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">let </span>cur = <span class="self">self</span>.r.seek(pos).<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="self">self</span>.discard_buffer();
         <span class="self">self</span>.cur = cur;
 
-        Poll::Ready(<span class="prelude-val">Ok</span>(cur))
+        <span class="prelude-val">Ok</span>(cur)
     }
 }
 
@@ -985,69 +969,59 @@
 <span class="kw">where
     </span>R: oio::Read,
 {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, <span class="kw-2">mut </span>dst: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="comment">// Sanity check for normal cases.
-        </span><span class="kw">if </span>dst.is_empty() {
-            <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(<span class="number">0</span>));
-        }
-
-        <span class="comment">// If we don't have any buffered data and we're doing a massive read
-        // (larger than our internal buffer), bypass our internal buffer
-        // entirely.
-        </span><span class="kw">if </span><span class="self">self</span>.pos == <span class="self">self</span>.filled &amp;&amp; dst.len() &gt;= <span class="self">self</span>.capacity() {
-            <span class="kw">let </span>res = <span class="macro">ready!</span>(<span class="self">self</span>.r.poll_read(cx, dst));
-            <span class="self">self</span>.discard_buffer();
-            <span class="kw">return match </span>res {
-                <span class="prelude-val">Ok</span>(nread) =&gt; {
-                    <span class="self">self</span>.cur += nread <span class="kw">as </span>u64;
-                    Poll::Ready(<span class="prelude-val">Ok</span>(nread))
-                }
-                <span class="prelude-val">Err</span>(err) =&gt; Poll::Ready(<span class="prelude-val">Err</span>(err)),
-            };
-        }
-
-        <span class="kw">let </span>rem = <span class="macro">ready!</span>(<span class="self">self</span>.poll_fill_buf(cx))<span class="question-mark">?</span>;
-        <span class="kw">let </span>amt = min(rem.len(), dst.len());
-        dst.put(<span class="kw-2">&amp;</span>rem[..amt]);
-        <span class="self">self</span>.consume(amt);
-        Poll::Ready(<span class="prelude-val">Ok</span>(amt))
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">match </span>pos {
             SeekFrom::Start(new_pos) =&gt; {
                 <span class="comment">// TODO(weny): Check the overflowing.
                 </span><span class="kw">let </span><span class="prelude-val">Some</span>(offset) = (new_pos <span class="kw">as </span>i64).checked_sub(<span class="self">self</span>.cur <span class="kw">as </span>i64) <span class="kw">else </span>{
-                    <span class="kw">return </span><span class="self">self</span>.poll_inner_seek(cx, pos);
+                    <span class="kw">return </span><span class="self">self</span>.inner_seek(pos).<span class="kw">await</span>;
                 };
 
                 <span class="kw">match </span><span class="self">self</span>.seek_relative(offset) {
-                    <span class="prelude-val">Some</span>(cur) =&gt; Poll::Ready(<span class="prelude-val">Ok</span>(cur)),
-                    <span class="prelude-val">None </span>=&gt; <span class="self">self</span>.poll_inner_seek(cx, pos),
+                    <span class="prelude-val">Some</span>(cur) =&gt; <span class="prelude-val">Ok</span>(cur),
+                    <span class="prelude-val">None </span>=&gt; <span class="self">self</span>.inner_seek(pos).<span class="kw">await</span>,
                 }
             }
             SeekFrom::Current(offset) =&gt; <span class="kw">match </span><span class="self">self</span>.seek_relative(offset) {
-                <span class="prelude-val">Some</span>(cur) =&gt; Poll::Ready(<span class="prelude-val">Ok</span>(cur)),
-                <span class="prelude-val">None </span>=&gt; <span class="self">self
-                    </span>.poll_inner_seek(cx, SeekFrom::Current(offset - <span class="self">self</span>.unconsumed_buffer_len())),
+                <span class="prelude-val">Some</span>(cur) =&gt; <span class="prelude-val">Ok</span>(cur),
+                <span class="prelude-val">None </span>=&gt; {
+                    <span class="self">self</span>.inner_seek(SeekFrom::Current(offset - <span class="self">self</span>.unconsumed_buffer_len()))
+                        .<span class="kw">await
+                </span>}
             },
-            SeekFrom::End(<span class="kw">_</span>) =&gt; <span class="self">self</span>.poll_inner_seek(cx, pos),
+            SeekFrom::End(<span class="kw">_</span>) =&gt; <span class="self">self</span>.inner_seek(pos).<span class="kw">await</span>,
         }
     }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.poll_fill_buf(cx)) {
-            <span class="prelude-val">Ok</span>(bytes) =&gt; {
-                <span class="kw">if </span>bytes.is_empty() {
-                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">None</span>);
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="kw">if </span>size == <span class="number">0 </span>{
+            <span class="kw">return </span><span class="prelude-val">Ok</span>(Bytes::new());
+        }
+
+        <span class="comment">// If we don't have any buffered data and we're doing a massive read
+        // (larger than our internal buffer), bypass our internal buffer
+        // entirely.
+        </span><span class="kw">if </span><span class="self">self</span>.pos == <span class="self">self</span>.filled &amp;&amp; size &gt;= <span class="self">self</span>.capacity() {
+            <span class="kw">let </span>res = <span class="self">self</span>.r.read(size).<span class="kw">await</span>;
+            <span class="self">self</span>.discard_buffer();
+            <span class="kw">return match </span>res {
+                <span class="prelude-val">Ok</span>(bs) =&gt; {
+                    <span class="self">self</span>.cur += bs.len() <span class="kw">as </span>u64;
+                    <span class="prelude-val">Ok</span>(bs)
                 }
+                <span class="prelude-val">Err</span>(err) =&gt; <span class="prelude-val">Err</span>(err),
+            };
+        }
 
-                <span class="kw">let </span>bytes = Bytes::copy_from_slice(bytes);
-                <span class="self">self</span>.consume(bytes.len());
-                Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bytes)))
-            }
-            <span class="prelude-val">Err</span>(err) =&gt; Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err))),
+        <span class="kw">let </span>bytes = <span class="self">self</span>.fill_buf().<span class="kw">await</span><span class="question-mark">?</span>;
+
+        <span class="kw">if </span>bytes.is_empty() {
+            <span class="kw">return </span><span class="prelude-val">Ok</span>(Bytes::new());
         }
+        <span class="kw">let </span>size = min(bytes.len(), size);
+        <span class="kw">let </span>bytes = Bytes::copy_from_slice(<span class="kw-2">&amp;</span>bytes[..size]);
+        <span class="self">self</span>.consume(bytes.len());
+        <span class="prelude-val">Ok</span>(bytes)
     }
 }
 
@@ -1055,7 +1029,7 @@
 <span class="kw">where
     </span>R: BlockingRead,
 {
-    <span class="kw">fn </span>fill_buf(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="kw-2">&amp;</span>[u8]&gt; {
+    <span class="kw">fn </span>blocking_fill_buf(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="kw-2">&amp;</span>[u8]&gt; {
         <span class="comment">// If we've reached the end of our internal buffer then we need to fetch
         // some more data from the underlying reader.
         // Branch using `&gt;=` instead of the more correct `==`
@@ -1079,7 +1053,7 @@
         <span class="prelude-val">Ok</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.buf[<span class="self">self</span>.pos..<span class="self">self</span>.filled])
     }
 
-    <span class="kw">fn </span>inner_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">fn </span>blocking_inner_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">let </span>cur = <span class="self">self</span>.r.seek(pos)<span class="question-mark">?</span>;
         <span class="self">self</span>.discard_buffer();
         <span class="self">self</span>.cur = cur;
@@ -1113,7 +1087,7 @@
             };
         }
 
-        <span class="kw">let </span>rem = <span class="self">self</span>.fill_buf()<span class="question-mark">?</span>;
+        <span class="kw">let </span>rem = <span class="self">self</span>.blocking_fill_buf()<span class="question-mark">?</span>;
         <span class="kw">let </span>amt = min(rem.len(), dst.len());
         dst.put(<span class="kw-2">&amp;</span>rem[..amt]);
         <span class="self">self</span>.consume(amt);
@@ -1125,24 +1099,25 @@
             SeekFrom::Start(new_pos) =&gt; {
                 <span class="comment">// TODO(weny): Check the overflowing.
                 </span><span class="kw">let </span><span class="prelude-val">Some</span>(offset) = (new_pos <span class="kw">as </span>i64).checked_sub(<span class="self">self</span>.cur <span class="kw">as </span>i64) <span class="kw">else </span>{
-                    <span class="kw">return </span><span class="self">self</span>.inner_seek(pos);
+                    <span class="kw">return </span><span class="self">self</span>.blocking_inner_seek(pos);
                 };
 
                 <span class="kw">match </span><span class="self">self</span>.seek_relative(offset) {
                     <span class="prelude-val">Some</span>(cur) =&gt; <span class="prelude-val">Ok</span>(cur),
-                    <span class="prelude-val">None </span>=&gt; <span class="self">self</span>.inner_seek(pos),
+                    <span class="prelude-val">None </span>=&gt; <span class="self">self</span>.blocking_inner_seek(pos),
                 }
             }
             SeekFrom::Current(offset) =&gt; <span class="kw">match </span><span class="self">self</span>.seek_relative(offset) {
                 <span class="prelude-val">Some</span>(cur) =&gt; <span class="prelude-val">Ok</span>(cur),
-                <span class="prelude-val">None </span>=&gt; <span class="self">self</span>.inner_seek(SeekFrom::Current(offset - <span class="self">self</span>.unconsumed_buffer_len())),
+                <span class="prelude-val">None </span>=&gt; <span class="self">self
+                    </span>.blocking_inner_seek(SeekFrom::Current(offset - <span class="self">self</span>.unconsumed_buffer_len())),
             },
-            SeekFrom::End(<span class="kw">_</span>) =&gt; <span class="self">self</span>.inner_seek(pos),
+            SeekFrom::End(<span class="kw">_</span>) =&gt; <span class="self">self</span>.blocking_inner_seek(pos),
         }
     }
 
     <span class="kw">fn </span>next(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt; {
-        <span class="kw">match </span><span class="self">self</span>.fill_buf() {
+        <span class="kw">match </span><span class="self">self</span>.blocking_fill_buf() {
             <span class="prelude-val">Ok</span>(bytes) =&gt; {
                 <span class="kw">if </span>bytes.is_empty() {
                     <span class="kw">return </span><span class="prelude-val">None</span>;
@@ -1164,8 +1139,6 @@
 
     <span class="kw">use </span>async_trait::async_trait;
     <span class="kw">use </span>bytes::Bytes;
-    <span class="kw">use </span>futures::AsyncReadExt;
-    <span class="kw">use </span>futures::AsyncSeekExt;
     <span class="kw">use </span>rand::prelude::<span class="kw-2">*</span>;
     <span class="kw">use </span>sha2::Digest;
     <span class="kw">use </span>sha2::Sha256;
@@ -1242,22 +1215,18 @@
     }
 
     <span class="kw">impl </span>oio::Read <span class="kw">for </span>MockReader {
-        <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-            <span class="self">self</span>.inner.poll_read(cx, buf)
-        }
-
-        <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-            <span class="kw">let </span>(<span class="kw">_</span>, <span class="kw">_</span>) = (cx, pos);
+        <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+            <span class="kw">let _ </span>= pos;
 
-            Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+            <span class="prelude-val">Err</span>(Error::new(
                 ErrorKind::Unsupported,
                 <span class="string">"output reader doesn't support seeking"</span>,
-            )))
+            ))
         }
 
-        <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-            <span class="self">self</span>.inner.poll_next(cx)
-        }
+        <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+            oio::Read::read(<span class="kw-2">&amp;mut </span><span class="self">self</span>.inner, size).<span class="kw">await
+        </span>}
     }
 
     <span class="kw">impl </span>BlockingRead <span class="kw">for </span>MockReader {
@@ -1285,22 +1254,20 @@
         <span class="kw">let </span>r = Box::new(RangeReader::new(acc, <span class="string">"x"</span>, OpRead::default())) <span class="kw">as </span>oio::Reader;
 
         <span class="kw">let </span>buf_cap = <span class="number">10</span>;
-        <span class="kw">let </span><span class="kw-2">mut </span>r = Box::new(BufferReader::new(r, buf_cap)) <span class="kw">as </span>oio::Reader;
-        <span class="kw">let </span><span class="kw-2">mut </span>dst = [<span class="number">0u8</span>; <span class="number">5</span>];
+        <span class="kw">let </span>r = Box::new(BufferReader::new(r, buf_cap)) <span class="kw">as </span>oio::Reader;
+        <span class="kw">let </span><span class="kw-2">mut </span>r = Reader::new(r);
 
-        <span class="kw">let </span>nread = r.read(<span class="kw-2">&amp;mut </span>dst).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="macro">assert_eq!</span>(nread, dst.len());
-        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>dst, <span class="string">b"Hello"</span>);
+        <span class="kw">let </span>bs = r.read(<span class="number">5</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="macro">assert_eq!</span>(bs.len(), <span class="number">5</span>);
+        <span class="macro">assert_eq!</span>(bs.as_ref(), <span class="string">b"Hello"</span>);
 
-        <span class="kw">let </span><span class="kw-2">mut </span>dst = [<span class="number">0u8</span>; <span class="number">5</span>];
-        <span class="kw">let </span>nread = r.read(<span class="kw-2">&amp;mut </span>dst).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="macro">assert_eq!</span>(nread, dst.len());
-        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>dst, <span class="string">b", Wor"</span>);
+        <span class="kw">let </span>bs = r.read(<span class="number">5</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="macro">assert_eq!</span>(bs.len(), <span class="number">5</span>);
+        <span class="macro">assert_eq!</span>(bs.as_ref(), <span class="string">b", Wor"</span>);
 
-        <span class="kw">let </span><span class="kw-2">mut </span>dst = [<span class="number">0u8</span>; <span class="number">3</span>];
-        <span class="kw">let </span>nread = r.read(<span class="kw-2">&amp;mut </span>dst).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="macro">assert_eq!</span>(nread, dst.len());
-        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>dst, <span class="string">b"ld!"</span>);
+        <span class="kw">let </span>bs = r.read(<span class="number">3</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="macro">assert_eq!</span>(bs.len(), <span class="number">3</span>);
+        <span class="macro">assert_eq!</span>(bs.as_ref(), <span class="string">b"ld!"</span>);
 
         <span class="prelude-val">Ok</span>(())
     }
@@ -1312,36 +1279,33 @@
         <span class="kw">let </span>r = Box::new(RangeReader::new(acc, <span class="string">"x"</span>, OpRead::default())) <span class="kw">as </span>oio::Reader;
 
         <span class="kw">let </span>buf_cap = <span class="number">10</span>;
-        <span class="kw">let </span><span class="kw-2">mut </span>r = Box::new(BufferReader::new(r, buf_cap)) <span class="kw">as </span>oio::Reader;
+        <span class="kw">let </span>r = Box::new(BufferReader::new(r, buf_cap)) <span class="kw">as </span>oio::Reader;
+        <span class="kw">let </span><span class="kw-2">mut </span>r = Reader::new(r);
 
         <span class="comment">// The underlying reader buffers the b"Hello, Wor".
-        </span><span class="kw">let </span><span class="kw-2">mut </span>dst = [<span class="number">0u8</span>; <span class="number">5</span>];
-        <span class="kw">let </span>nread = r.read(<span class="kw-2">&amp;mut </span>dst).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="macro">assert_eq!</span>(nread, dst.len());
-        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>dst, <span class="string">b"Hello"</span>);
+        </span><span class="kw">let </span>buf = r.read(<span class="number">5</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="macro">assert_eq!</span>(buf.len(), <span class="number">5</span>);
+        <span class="macro">assert_eq!</span>(buf.as_ref(), <span class="string">b"Hello"</span>);
 
         <span class="kw">let </span>pos = r.seek(SeekFrom::Start(<span class="number">7</span>)).<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="macro">assert_eq!</span>(pos, <span class="number">7</span>);
-        <span class="kw">let </span><span class="kw-2">mut </span>dst = [<span class="number">0u8</span>; <span class="number">5</span>];
-        <span class="kw">let </span>nread = r.read(<span class="kw-2">&amp;mut </span>dst).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>dst[..nread], <span class="kw-2">&amp;</span>bs[<span class="number">7</span>..<span class="number">10</span>]);
-        <span class="macro">assert_eq!</span>(nread, <span class="number">3</span>);
+        <span class="kw">let </span>buf = r.read(<span class="number">5</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>buf, <span class="kw-2">&amp;</span>bs[<span class="number">7</span>..<span class="number">10</span>]);
+        <span class="macro">assert_eq!</span>(buf.len(), <span class="number">3</span>);
 
         <span class="comment">// Should perform a relative seek.
         </span><span class="kw">let </span>pos = r.seek(SeekFrom::Start(<span class="number">0</span>)).<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="macro">assert_eq!</span>(pos, <span class="number">0</span>);
-        <span class="kw">let </span><span class="kw-2">mut </span>dst = [<span class="number">0u8</span>; <span class="number">9</span>];
-        <span class="kw">let </span>nread = r.read(<span class="kw-2">&amp;mut </span>dst).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>dst[..nread], <span class="kw-2">&amp;</span>bs[<span class="number">0</span>..<span class="number">9</span>]);
-        <span class="macro">assert_eq!</span>(nread, <span class="number">9</span>);
+        <span class="kw">let </span>buf = r.read(<span class="number">9</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>buf, <span class="kw-2">&amp;</span>bs[<span class="number">0</span>..<span class="number">9</span>]);
+        <span class="macro">assert_eq!</span>(buf.len(), <span class="number">9</span>);
 
         <span class="comment">// Should perform a non-relative seek.
         </span><span class="kw">let </span>pos = r.seek(SeekFrom::Start(<span class="number">11</span>)).<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="macro">assert_eq!</span>(pos, <span class="number">11</span>);
-        <span class="kw">let </span><span class="kw-2">mut </span>dst = [<span class="number">0u8</span>; <span class="number">9</span>];
-        <span class="kw">let </span>nread = r.read(<span class="kw-2">&amp;mut </span>dst).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>dst[..nread], <span class="kw-2">&amp;</span>bs[<span class="number">11</span>..<span class="number">13</span>]);
-        <span class="macro">assert_eq!</span>(nread, <span class="number">2</span>);
+        <span class="kw">let </span>buf = r.read(<span class="number">9</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>buf, <span class="kw-2">&amp;</span>bs[<span class="number">11</span>..<span class="number">13</span>]);
+        <span class="macro">assert_eq!</span>(buf.len(), <span class="number">2</span>);
 
         <span class="prelude-val">Ok</span>(())
     }
@@ -1357,7 +1321,8 @@
             OpRead::default().with_range(BytesRange::from(..)),
         )) <span class="kw">as </span>oio::Reader;
 
-        <span class="kw">let </span><span class="kw-2">mut </span>r = Box::new(BufferReader::new(r, <span class="number">4096 </span>* <span class="number">1024</span>)) <span class="kw">as </span>oio::Reader;
+        <span class="kw">let </span>r = Box::new(BufferReader::new(r, <span class="number">4096 </span>* <span class="number">1024</span>)) <span class="kw">as </span>oio::Reader;
+        <span class="kw">let </span><span class="kw-2">mut </span>r = Reader::new(r);
 
         <span class="kw">let </span><span class="kw-2">mut </span>buf = Vec::new();
         r.read_to_end(<span class="kw-2">&amp;mut </span>buf).<span class="kw">await</span><span class="question-mark">?</span>;
@@ -1394,13 +1359,13 @@
             <span class="string">"x"</span>,
             OpRead::default().with_range(BytesRange::from(..)),
         )) <span class="kw">as </span>oio::Reader;
-        <span class="kw">let </span><span class="kw-2">mut </span>r = Box::new(BufferReader::new(r, <span class="number">10</span>)) <span class="kw">as </span>oio::Reader;
+        <span class="kw">let </span>r = Box::new(BufferReader::new(r, <span class="number">10</span>)) <span class="kw">as </span>oio::Reader;
+        <span class="kw">let </span><span class="kw-2">mut </span>r = Reader::new(r);
 
         <span class="kw">let </span><span class="kw-2">mut </span>cur = <span class="number">0</span>;
         <span class="kw">for _ in </span><span class="number">0</span>..<span class="number">3 </span>{
-            <span class="kw">let </span><span class="kw-2">mut </span>dst = [<span class="number">0u8</span>; <span class="number">5</span>];
-            <span class="kw">let </span>nread = r.read(<span class="kw-2">&amp;mut </span>dst).<span class="kw">await</span><span class="question-mark">?</span>;
-            <span class="macro">assert_eq!</span>(nread, <span class="number">5</span>);
+            <span class="kw">let </span>bs = r.read(<span class="number">5</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="macro">assert_eq!</span>(bs.len(), <span class="number">5</span>);
             cur += <span class="number">5</span>;
         }
 
@@ -1421,13 +1386,13 @@
             <span class="string">"x"</span>,
             OpRead::default().with_range(BytesRange::from(..)),
         )) <span class="kw">as </span>oio::Reader;
-        <span class="kw">let </span><span class="kw-2">mut </span>r = Box::new(BufferReader::new(r, <span class="number">5</span>)) <span class="kw">as </span>oio::Reader;
+        <span class="kw">let </span>r = Box::new(BufferReader::new(r, <span class="number">5</span>)) <span class="kw">as </span>oio::Reader;
+        <span class="kw">let </span><span class="kw-2">mut </span>r = Reader::new(r);
 
         <span class="kw">let </span><span class="kw-2">mut </span>cur = <span class="number">0</span>;
         <span class="kw">for _ in </span><span class="number">0</span>..<span class="number">3 </span>{
-            <span class="kw">let </span><span class="kw-2">mut </span>dst = [<span class="number">0u8</span>; <span class="number">6</span>];
-            <span class="kw">let </span>nread = r.read(<span class="kw-2">&amp;mut </span>dst).<span class="kw">await</span><span class="question-mark">?</span>;
-            <span class="macro">assert_eq!</span>(nread, <span class="number">6</span>);
+            <span class="kw">let </span>bs = r.read(<span class="number">6</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="macro">assert_eq!</span>(bs.len(), <span class="number">6</span>);
             cur += <span class="number">6</span>;
         }
 
@@ -1447,7 +1412,8 @@
             <span class="string">"x"</span>,
             OpRead::default().with_range(BytesRange::from(<span class="number">4096</span>..<span class="number">4096 </span>+ <span class="number">4096</span>)),
         )) <span class="kw">as </span>oio::Reader;
-        <span class="kw">let </span><span class="kw-2">mut </span>r = Box::new(BufferReader::new(r, <span class="number">4096 </span>* <span class="number">1024</span>)) <span class="kw">as </span>oio::Reader;
+        <span class="kw">let </span>r = Box::new(BufferReader::new(r, <span class="number">4096 </span>* <span class="number">1024</span>)) <span class="kw">as </span>oio::Reader;
+        <span class="kw">let </span><span class="kw-2">mut </span>r = Reader::new(r);
 
         <span class="kw">let </span><span class="kw-2">mut </span>buf = Vec::new();
         r.read_to_end(<span class="kw-2">&amp;mut </span>buf).<span class="kw">await</span><span class="question-mark">?</span>;
@@ -1473,8 +1439,7 @@
         <span class="kw">let </span>n = r.seek(SeekFrom::Start(<span class="number">1024</span>)).<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="macro">assert_eq!</span>(<span class="number">1024</span>, n, <span class="string">"seek to 1024"</span>);
 
-        <span class="kw">let </span><span class="kw-2">mut </span>buf = <span class="macro">vec!</span>[<span class="number">0</span>; <span class="number">1024</span>];
-        r.read_exact(<span class="kw-2">&amp;mut </span>buf).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="kw">let </span>buf = r.read_exact(<span class="number">1024</span>).<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="macro">assert_eq!</span>(
             <span class="macro">format!</span>(<span class="string">"{:x}"</span>, Sha256::digest(<span class="kw-2">&amp;</span>bs[<span class="number">4096 </span>+ <span class="number">1024</span>..<span class="number">4096 </span>+ <span class="number">2048</span>])),
             <span class="macro">format!</span>(<span class="string">"{:x}"</span>, Sha256::digest(<span class="kw-2">&amp;</span>buf)),
@@ -1484,8 +1449,7 @@
         <span class="kw">let </span>n = r.seek(SeekFrom::Current(<span class="number">1024</span>)).<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="macro">assert_eq!</span>(<span class="number">3072</span>, n, <span class="string">"seek to 3072"</span>);
 
-        <span class="kw">let </span><span class="kw-2">mut </span>buf = <span class="macro">vec!</span>[<span class="number">0</span>; <span class="number">1024</span>];
-        r.read_exact(<span class="kw-2">&amp;mut </span>buf).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="kw">let </span>buf = r.read_exact(<span class="number">1024</span>).<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="macro">assert_eq!</span>(
             <span class="macro">format!</span>(<span class="string">"{:x}"</span>, Sha256::digest(<span class="kw-2">&amp;</span>bs[<span class="number">4096 </span>+ <span class="number">3072</span>..<span class="number">4096 </span>+ <span class="number">3072 </span>+ <span class="number">1024</span>])),
             <span class="macro">format!</span>(<span class="string">"{:x}"</span>, Sha256::digest(<span class="kw-2">&amp;</span>buf)),
@@ -1500,7 +1464,8 @@
         <span class="kw">let </span>bs = Bytes::copy_from_slice(<span class="kw-2">&amp;</span><span class="string">b"Hello, World!"</span>[..]);
         <span class="kw">let </span>r = Box::new(oio::Cursor::from(bs.clone())) <span class="kw">as </span>oio::BlockingReader;
         <span class="kw">let </span>buf_cap = <span class="number">10</span>;
-        <span class="kw">let </span><span class="kw-2">mut </span>r = Box::new(BufferReader::new(r, buf_cap)) <span class="kw">as </span>oio::BlockingReader;
+        <span class="kw">let </span>r = Box::new(BufferReader::new(r, buf_cap)) <span class="kw">as </span>oio::BlockingReader;
+        <span class="kw">let </span><span class="kw-2">mut </span>r = BlockingReader::new(r);
 
         <span class="kw">let </span><span class="kw-2">mut </span>dst = [<span class="number">0u8</span>; <span class="number">5</span>];
         <span class="kw">let </span>nread = r.read(<span class="kw-2">&amp;mut </span>dst)<span class="question-mark">?</span>;
@@ -1525,7 +1490,8 @@
         <span class="kw">let </span>bs = Bytes::copy_from_slice(<span class="kw-2">&amp;</span><span class="string">b"Hello, World!"</span>[..]);
         <span class="kw">let </span>r = Box::new(oio::Cursor::from(bs.clone())) <span class="kw">as </span>oio::BlockingReader;
         <span class="kw">let </span>buf_cap = <span class="number">10</span>;
-        <span class="kw">let </span><span class="kw-2">mut </span>r = Box::new(BufferReader::new(r, buf_cap)) <span class="kw">as </span>oio::BlockingReader;
+        <span class="kw">let </span>r = Box::new(BufferReader::new(r, buf_cap)) <span class="kw">as </span>oio::BlockingReader;
+        <span class="kw">let </span><span class="kw-2">mut </span>r = BlockingReader::new(r);
 
         <span class="comment">// The underlying reader buffers the b"Hello, Wor".
         </span><span class="kw">let </span><span class="kw-2">mut </span>dst = [<span class="number">0u8</span>; <span class="number">5</span>];
@@ -1563,7 +1529,8 @@
     </span><span class="kw">async fn </span>test_blocking_read_all() -&gt; anyhow::Result&lt;()&gt; {
         <span class="kw">let </span>(bs, <span class="kw">_</span>) = gen_bytes();
         <span class="kw">let </span>r = Box::new(oio::Cursor::from(bs.clone())) <span class="kw">as </span>oio::BlockingReader;
-        <span class="kw">let </span><span class="kw-2">mut </span>r = Box::new(BufferReader::new(r, <span class="number">4096 </span>* <span class="number">1024</span>)) <span class="kw">as </span>oio::BlockingReader;
+        <span class="kw">let </span>r = Box::new(BufferReader::new(r, <span class="number">4096 </span>* <span class="number">1024</span>)) <span class="kw">as </span>oio::BlockingReader;
+        <span class="kw">let </span><span class="kw-2">mut </span>r = BlockingReader::new(r);
 
         <span class="kw">let </span><span class="kw-2">mut </span>buf = Vec::new();
         r.read_to_end(<span class="kw-2">&amp;mut </span>buf)<span class="question-mark">?</span>;
@@ -1595,7 +1562,8 @@
             <span class="kw-2">&amp;</span><span class="string">b"Hello, World! I'm going to tests a seek relative related bug!"</span>[..],
         );
         <span class="kw">let </span>r = Box::new(oio::Cursor::from(bs.clone())) <span class="kw">as </span>oio::BlockingReader;
-        <span class="kw">let </span><span class="kw-2">mut </span>r = Box::new(BufferReader::new(r, <span class="number">10</span>)) <span class="kw">as </span>oio::BlockingReader;
+        <span class="kw">let </span>r = Box::new(BufferReader::new(r, <span class="number">10</span>)) <span class="kw">as </span>oio::BlockingReader;
+        <span class="kw">let </span><span class="kw-2">mut </span>r = BlockingReader::new(r);
 
         <span class="kw">let </span><span class="kw-2">mut </span>cur = <span class="number">0</span>;
         <span class="kw">for _ in </span><span class="number">0</span>..<span class="number">3 </span>{
@@ -1617,7 +1585,8 @@
             <span class="kw-2">&amp;</span><span class="string">b"Hello, World! I'm going to tests a seek relative related bug!"</span>[..],
         );
         <span class="kw">let </span>r = Box::new(oio::Cursor::from(bs.clone())) <span class="kw">as </span>oio::BlockingReader;
-        <span class="kw">let </span><span class="kw-2">mut </span>r = Box::new(BufferReader::new(r, <span class="number">5</span>)) <span class="kw">as </span>oio::BlockingReader;
+        <span class="kw">let </span>r = Box::new(BufferReader::new(r, <span class="number">5</span>)) <span class="kw">as </span>oio::BlockingReader;
+        <span class="kw">let </span><span class="kw-2">mut </span>r = BlockingReader::new(r);
 
         <span class="kw">let </span><span class="kw-2">mut </span>cur = <span class="number">0</span>;
         <span class="kw">for _ in </span><span class="number">0</span>..<span class="number">3 </span>{
@@ -1644,7 +1613,8 @@
             <span class="string">"x"</span>,
             OpRead::default().with_range(BytesRange::from(<span class="number">4096</span>..<span class="number">4096 </span>+ <span class="number">4096</span>)),
         )) <span class="kw">as </span>oio::BlockingReader;
-        <span class="kw">let </span><span class="kw-2">mut </span>r = Box::new(BufferReader::new(r, <span class="number">4096 </span>* <span class="number">1024</span>)) <span class="kw">as </span>oio::BlockingReader;
+        <span class="kw">let </span>r = Box::new(BufferReader::new(r, <span class="number">4096 </span>* <span class="number">1024</span>)) <span class="kw">as </span>oio::BlockingReader;
+        <span class="kw">let </span><span class="kw-2">mut </span>r = BlockingReader::new(r);
 
         <span class="kw">let </span><span class="kw-2">mut </span>buf = Vec::new();
         BlockingRead::read_to_end(<span class="kw-2">&amp;mut </span>r, <span class="kw-2">&amp;mut </span>buf)<span class="question-mark">?</span>;
diff --git a/docs/rust/src/opendal/raw/oio/read/file_read.rs.html b/docs/rust/src/opendal/raw/oio/read/file_read.rs.html
index 727f8b36bc..205c41b641 100644
--- a/docs/rust/src/opendal/raw/oio/read/file_read.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/file_read.rs.html
@@ -388,159 +388,6 @@
 <a href="#386" id="386">386</a>
 <a href="#387" id="387">387</a>
 <a href="#388" id="388">388</a>
-<a href="#389" id="389">389</a>
-<a href="#390" id="390">390</a>
-<a href="#391" id="391">391</a>
-<a href="#392" id="392">392</a>
-<a href="#393" id="393">393</a>
-<a href="#394" id="394">394</a>
-<a href="#395" id="395">395</a>
-<a href="#396" id="396">396</a>
-<a href="#397" id="397">397</a>
-<a href="#398" id="398">398</a>
-<a href="#399" id="399">399</a>
-<a href="#400" id="400">400</a>
-<a href="#401" id="401">401</a>
-<a href="#402" id="402">402</a>
-<a href="#403" id="403">403</a>
-<a href="#404" id="404">404</a>
-<a href="#405" id="405">405</a>
-<a href="#406" id="406">406</a>
-<a href="#407" id="407">407</a>
-<a href="#408" id="408">408</a>
-<a href="#409" id="409">409</a>
-<a href="#410" id="410">410</a>
-<a href="#411" id="411">411</a>
-<a href="#412" id="412">412</a>
-<a href="#413" id="413">413</a>
-<a href="#414" id="414">414</a>
-<a href="#415" id="415">415</a>
-<a href="#416" id="416">416</a>
-<a href="#417" id="417">417</a>
-<a href="#418" id="418">418</a>
-<a href="#419" id="419">419</a>
-<a href="#420" id="420">420</a>
-<a href="#421" id="421">421</a>
-<a href="#422" id="422">422</a>
-<a href="#423" id="423">423</a>
-<a href="#424" id="424">424</a>
-<a href="#425" id="425">425</a>
-<a href="#426" id="426">426</a>
-<a href="#427" id="427">427</a>
-<a href="#428" id="428">428</a>
-<a href="#429" id="429">429</a>
-<a href="#430" id="430">430</a>
-<a href="#431" id="431">431</a>
-<a href="#432" id="432">432</a>
-<a href="#433" id="433">433</a>
-<a href="#434" id="434">434</a>
-<a href="#435" id="435">435</a>
-<a href="#436" id="436">436</a>
-<a href="#437" id="437">437</a>
-<a href="#438" id="438">438</a>
-<a href="#439" id="439">439</a>
-<a href="#440" id="440">440</a>
-<a href="#441" id="441">441</a>
-<a href="#442" id="442">442</a>
-<a href="#443" id="443">443</a>
-<a href="#444" id="444">444</a>
-<a href="#445" id="445">445</a>
-<a href="#446" id="446">446</a>
-<a href="#447" id="447">447</a>
-<a href="#448" id="448">448</a>
-<a href="#449" id="449">449</a>
-<a href="#450" id="450">450</a>
-<a href="#451" id="451">451</a>
-<a href="#452" id="452">452</a>
-<a href="#453" id="453">453</a>
-<a href="#454" id="454">454</a>
-<a href="#455" id="455">455</a>
-<a href="#456" id="456">456</a>
-<a href="#457" id="457">457</a>
-<a href="#458" id="458">458</a>
-<a href="#459" id="459">459</a>
-<a href="#460" id="460">460</a>
-<a href="#461" id="461">461</a>
-<a href="#462" id="462">462</a>
-<a href="#463" id="463">463</a>
-<a href="#464" id="464">464</a>
-<a href="#465" id="465">465</a>
-<a href="#466" id="466">466</a>
-<a href="#467" id="467">467</a>
-<a href="#468" id="468">468</a>
-<a href="#469" id="469">469</a>
-<a href="#470" id="470">470</a>
-<a href="#471" id="471">471</a>
-<a href="#472" id="472">472</a>
-<a href="#473" id="473">473</a>
-<a href="#474" id="474">474</a>
-<a href="#475" id="475">475</a>
-<a href="#476" id="476">476</a>
-<a href="#477" id="477">477</a>
-<a href="#478" id="478">478</a>
-<a href="#479" id="479">479</a>
-<a href="#480" id="480">480</a>
-<a href="#481" id="481">481</a>
-<a href="#482" id="482">482</a>
-<a href="#483" id="483">483</a>
-<a href="#484" id="484">484</a>
-<a href="#485" id="485">485</a>
-<a href="#486" id="486">486</a>
-<a href="#487" id="487">487</a>
-<a href="#488" id="488">488</a>
-<a href="#489" id="489">489</a>
-<a href="#490" id="490">490</a>
-<a href="#491" id="491">491</a>
-<a href="#492" id="492">492</a>
-<a href="#493" id="493">493</a>
-<a href="#494" id="494">494</a>
-<a href="#495" id="495">495</a>
-<a href="#496" id="496">496</a>
-<a href="#497" id="497">497</a>
-<a href="#498" id="498">498</a>
-<a href="#499" id="499">499</a>
-<a href="#500" id="500">500</a>
-<a href="#501" id="501">501</a>
-<a href="#502" id="502">502</a>
-<a href="#503" id="503">503</a>
-<a href="#504" id="504">504</a>
-<a href="#505" id="505">505</a>
-<a href="#506" id="506">506</a>
-<a href="#507" id="507">507</a>
-<a href="#508" id="508">508</a>
-<a href="#509" id="509">509</a>
-<a href="#510" id="510">510</a>
-<a href="#511" id="511">511</a>
-<a href="#512" id="512">512</a>
-<a href="#513" id="513">513</a>
-<a href="#514" id="514">514</a>
-<a href="#515" id="515">515</a>
-<a href="#516" id="516">516</a>
-<a href="#517" id="517">517</a>
-<a href="#518" id="518">518</a>
-<a href="#519" id="519">519</a>
-<a href="#520" id="520">520</a>
-<a href="#521" id="521">521</a>
-<a href="#522" id="522">522</a>
-<a href="#523" id="523">523</a>
-<a href="#524" id="524">524</a>
-<a href="#525" id="525">525</a>
-<a href="#526" id="526">526</a>
-<a href="#527" id="527">527</a>
-<a href="#528" id="528">528</a>
-<a href="#529" id="529">529</a>
-<a href="#530" id="530">530</a>
-<a href="#531" id="531">531</a>
-<a href="#532" id="532">532</a>
-<a href="#533" id="533">533</a>
-<a href="#534" id="534">534</a>
-<a href="#535" id="535">535</a>
-<a href="#536" id="536">536</a>
-<a href="#537" id="537">537</a>
-<a href="#538" id="538">538</a>
-<a href="#539" id="539">539</a>
-<a href="#540" id="540">540</a>
-<a href="#541" id="541">541</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -560,14 +407,9 @@
 
 </span><span class="kw">use </span>std::cmp;
 <span class="kw">use </span>std::io::SeekFrom;
-<span class="kw">use </span>std::pin::Pin;
 <span class="kw">use </span>std::sync::Arc;
-<span class="kw">use </span>std::task::ready;
-<span class="kw">use </span>std::task::Context;
-<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>bytes::Bytes;
-<span class="kw">use </span>futures::Future;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
@@ -587,25 +429,12 @@
     size: <span class="prelude-ty">Option</span>&lt;u64&gt;,
     cur: u64,
 
+    reader: <span class="prelude-ty">Option</span>&lt;R&gt;,
     buf: oio::AdaptiveBuf,
-    state: State&lt;R&gt;,
     <span class="doccomment">/// Do we need to reset our cursor?
     </span>seek_dirty: bool,
 }
 
-<span class="kw">enum </span>State&lt;R&gt; {
-    Idle,
-    Send(BoxedFuture&lt;<span class="prelude-ty">Result</span>&lt;(RpRead, R)&gt;&gt;),
-    Read(R),
-}
-
-<span class="doccomment">/// # Safety
-///
-/// wasm32 is a special target that we only have one event-loop for this state.
-</span><span class="kw">unsafe impl</span>&lt;R&gt; Send <span class="kw">for </span>State&lt;R&gt; {}
-<span class="doccomment">/// Safety: State will only be accessed under &amp;mut.
-</span><span class="kw">unsafe impl</span>&lt;R&gt; Sync <span class="kw">for </span>State&lt;R&gt; {}
-
 <span class="kw">impl</span>&lt;A, R&gt; FileReader&lt;A, R&gt;
 <span class="kw">where
     </span>A: Accessor,
@@ -625,7 +454,7 @@
             size: <span class="prelude-val">None</span>,
             cur: <span class="number">0</span>,
             buf: oio::AdaptiveBuf::default(),
-            state: State::&lt;R&gt;::Idle,
+            reader: <span class="prelude-val">None</span>,
             seek_dirty: <span class="bool-val">false</span>,
         }
     }
@@ -636,81 +465,66 @@
     </span>A: Accessor&lt;Reader = R&gt;,
     R: oio::Read,
 {
-    <span class="kw">fn </span>read_future(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; BoxedFuture&lt;<span class="prelude-ty">Result</span>&lt;(RpRead, R)&gt;&gt; {
-        <span class="kw">let </span>acc = <span class="self">self</span>.acc.clone();
-        <span class="kw">let </span>path = <span class="self">self</span>.path.clone();
-
-        <span class="comment">// FileReader doesn't support range, we will always use full range to open a file.
-        </span><span class="kw">let </span>op = <span class="self">self</span>.op.clone().with_range(BytesRange::from(..));
-
-        Box::pin(<span class="kw">async move </span>{ acc.read(<span class="kw-2">&amp;</span>path, op).<span class="kw">await </span>})
-    }
-
     <span class="doccomment">/// calculate_offset will make sure that the offset has been set.
-    </span><span class="kw">fn </span>poll_offset(
-        cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;,
-        r: <span class="kw-2">&amp;mut </span>R,
-        range: BytesRange,
-    ) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;(<span class="prelude-ty">Option</span>&lt;u64&gt;, <span class="prelude-ty">Option</span>&lt;u64&gt;)&gt;&gt; {
+    </span><span class="kw">async fn </span>offset(r: <span class="kw-2">&amp;mut </span>R, range: BytesRange) -&gt; <span class="prelude-ty">Result</span>&lt;(<span class="prelude-ty">Option</span>&lt;u64&gt;, <span class="prelude-ty">Option</span>&lt;u64&gt;)&gt; {
         <span class="kw">let </span>(offset, size) = <span class="kw">match </span>(range.offset(), range.size()) {
             (<span class="prelude-val">None</span>, <span class="prelude-val">None</span>) =&gt; (<span class="number">0</span>, <span class="prelude-val">None</span>),
             (<span class="prelude-val">None</span>, <span class="prelude-val">Some</span>(size)) =&gt; {
-                <span class="kw">let </span>start = <span class="macro">ready!</span>(r.poll_seek(cx, SeekFrom::End(-(size <span class="kw">as </span>i64))))<span class="question-mark">?</span>;
+                <span class="kw">let </span>start = r.seek(SeekFrom::End(-(size <span class="kw">as </span>i64))).<span class="kw">await</span><span class="question-mark">?</span>;
                 (start, <span class="prelude-val">Some</span>(size))
             }
             (<span class="prelude-val">Some</span>(offset), <span class="prelude-val">None</span>) =&gt; {
-                <span class="kw">let </span>start = <span class="macro">ready!</span>(r.poll_seek(cx, SeekFrom::Start(offset)))<span class="question-mark">?</span>;
+                <span class="kw">let </span>start = r.seek(SeekFrom::Start(offset)).<span class="kw">await</span><span class="question-mark">?</span>;
                 (start, <span class="prelude-val">None</span>)
             }
             (<span class="prelude-val">Some</span>(offset), <span class="prelude-val">Some</span>(size)) =&gt; {
-                <span class="kw">let </span>start = <span class="macro">ready!</span>(r.poll_seek(cx, SeekFrom::Start(offset)))<span class="question-mark">?</span>;
+                <span class="kw">let </span>start = r.seek(SeekFrom::Start(offset)).<span class="kw">await</span><span class="question-mark">?</span>;
                 (start, <span class="prelude-val">Some</span>(size))
             }
         };
 
-        Poll::Ready(<span class="prelude-val">Ok</span>((<span class="prelude-val">Some</span>(offset), size)))
+        <span class="prelude-val">Ok</span>((<span class="prelude-val">Some</span>(offset), size))
     }
 
-    <span class="kw">fn </span>poll_seek_inner(
-        cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;,
+    <span class="kw">async fn </span>seek_inner(
         r: <span class="kw-2">&amp;mut </span>R,
         offset: <span class="prelude-ty">Option</span>&lt;u64&gt;,
         size: <span class="prelude-ty">Option</span>&lt;u64&gt;,
         cur: u64,
         pos: SeekFrom,
-    ) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
+    ) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">let </span>offset = offset.expect(<span class="string">"offset should be set for calculate_position"</span>);
 
         <span class="kw">match </span>pos {
             SeekFrom::Start(n) =&gt; {
                 <span class="comment">// It's valid for user to seek outsides end of the file.
-                </span>r.poll_seek(cx, SeekFrom::Start(offset + n))
-            }
+                </span>r.seek(SeekFrom::Start(offset + n)).<span class="kw">await
+            </span>}
             SeekFrom::End(n) =&gt; {
                 <span class="kw">let </span>size =
                     size.expect(<span class="string">"size should be set for calculate_position when seek with end"</span>);
                 <span class="kw">if </span>size <span class="kw">as </span>i64 + n &lt; <span class="number">0 </span>{
-                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                    <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
                         ErrorKind::InvalidInput,
                         <span class="string">"seek to a negative position is invalid"</span>,
                     )
-                    .with_context(<span class="string">"position"</span>, <span class="macro">format!</span>(<span class="string">"{pos:?}"</span>))));
+                    .with_context(<span class="string">"position"</span>, <span class="macro">format!</span>(<span class="string">"{pos:?}"</span>)));
                 }
                 <span class="comment">// size is known, we can convert SeekFrom::End into SeekFrom::Start.
                 </span><span class="kw">let </span>pos = SeekFrom::Start(offset + (size <span class="kw">as </span>i64 + n) <span class="kw">as </span>u64);
-                r.poll_seek(cx, pos)
-            }
+                r.seek(pos).<span class="kw">await
+            </span>}
             SeekFrom::Current(n) =&gt; {
                 <span class="kw">if </span>cur <span class="kw">as </span>i64 + n &lt; <span class="number">0 </span>{
-                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                    <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
                         ErrorKind::InvalidInput,
                         <span class="string">"seek to a negative position is invalid"</span>,
                     )
-                    .with_context(<span class="string">"position"</span>, <span class="macro">format!</span>(<span class="string">"{pos:?}"</span>))));
+                    .with_context(<span class="string">"position"</span>, <span class="macro">format!</span>(<span class="string">"{pos:?}"</span>)));
                 }
                 <span class="kw">let </span>pos = SeekFrom::Start(offset + (cur <span class="kw">as </span>i64 + n) <span class="kw">as </span>u64);
-                r.poll_seek(cx, pos)
-            }
+                r.seek(pos).<span class="kw">await
+            </span>}
         }
     }
 }
@@ -741,7 +555,7 @@
         <span class="prelude-val">Ok</span>((<span class="prelude-val">Some</span>(offset), size))
     }
 
-    <span class="kw">fn </span>seek_inner(
+    <span class="kw">fn </span>blocking_seek_inner(
         r: <span class="kw-2">&amp;mut </span>R,
         offset: <span class="prelude-ty">Option</span>&lt;u64&gt;,
         size: <span class="prelude-ty">Option</span>&lt;u64&gt;,
@@ -789,150 +603,56 @@
     </span>A: Accessor&lt;Reader = R&gt;,
     R: oio::Read,
 {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="self">self</span>.state = State::Send(<span class="self">self</span>.read_future());
-                <span class="self">self</span>.poll_read(cx, buf)
-            }
-            State::Send(fut) =&gt; {
-                <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="macro">ready!</span>(Pin::new(fut).poll(cx)).map_err(|err| {
-                    <span class="comment">// If send future returns an error, we should reset
-                    // state to Idle so that we can retry it.
-                    </span><span class="self">self</span>.state = State::Idle;
-                    err
-                })<span class="question-mark">?</span>;
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.poll_read(cx, buf)
-            }
-            State::Read(r) =&gt; {
-                <span class="comment">// We should know where to start read the data.
-                </span><span class="kw">if </span><span class="self">self</span>.offset.is_none() {
-                    (<span class="self">self</span>.offset, <span class="self">self</span>.size) = <span class="macro">ready!</span>(<span class="self">Self</span>::poll_offset(cx, r, <span class="self">self</span>.op.range()))<span class="question-mark">?</span>;
-                }
-
-                <span class="kw">let </span>size = <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
-                    <span class="comment">// Sanity check.
-                    </span><span class="kw">if </span><span class="self">self</span>.cur &gt;= size {
-                        <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(<span class="number">0</span>));
-                    }
-                    cmp::min(buf.len(), (size - <span class="self">self</span>.cur) <span class="kw">as </span>usize)
-                } <span class="kw">else </span>{
-                    buf.len()
-                };
-
-                <span class="kw">match </span><span class="macro">ready!</span>(r.poll_read(cx, <span class="kw-2">&amp;mut </span>buf[..size])) {
-                    <span class="prelude-val">Ok</span>(<span class="number">0</span>) =&gt; Poll::Ready(<span class="prelude-val">Ok</span>(<span class="number">0</span>)),
-                    <span class="prelude-val">Ok</span>(n) =&gt; {
-                        <span class="self">self</span>.cur += n <span class="kw">as </span>u64;
-                        Poll::Ready(<span class="prelude-val">Ok</span>(n))
-                    }
-                    <span class="comment">// We don't need to reset state here since it's ok to poll the same reader.
-                    </span><span class="prelude-val">Err</span>(err) =&gt; Poll::Ready(<span class="prelude-val">Err</span>(err)),
-                }
-            }
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">if </span><span class="self">self</span>.reader.is_none() {
+            <span class="comment">// FileReader doesn't support range, we will always use full range to open a file.
+            </span><span class="kw">let </span>op = <span class="self">self</span>.op.clone().with_range(BytesRange::from(..));
+            <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="self">self</span>.acc.read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, op).<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="self">self</span>.reader = <span class="prelude-val">Some</span>(r);
         }
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="self">self</span>.state = State::Send(<span class="self">self</span>.read_future());
-                <span class="self">self</span>.poll_seek(cx, pos)
-            }
-            State::Send(fut) =&gt; {
-                <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="macro">ready!</span>(Pin::new(fut).poll(cx)).map_err(|err| {
-                    <span class="comment">// If send future returns an error, we should reset
-                    // state to Idle so that we can retry it.
-                    </span><span class="self">self</span>.state = State::Idle;
-                    err
-                })<span class="question-mark">?</span>;
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.poll_seek(cx, pos)
-            }
-            State::Read(r) =&gt; {
-                <span class="comment">// We should know where to start read the data.
-                </span><span class="kw">if </span><span class="self">self</span>.offset.is_none() {
-                    (<span class="self">self</span>.offset, <span class="self">self</span>.size) = <span class="macro">ready!</span>(<span class="self">Self</span>::poll_offset(cx, r, <span class="self">self</span>.op.range()))<span class="question-mark">?</span>;
-                }
 
-                <span class="comment">// Fetch size when seek end.
-                </span><span class="kw">let </span>current_offset = <span class="self">self</span>.offset.unwrap() + <span class="self">self</span>.cur;
-                <span class="kw">if </span><span class="macro">matches!</span>(pos, SeekFrom::End(<span class="kw">_</span>)) &amp;&amp; <span class="self">self</span>.size.is_none() {
-                    <span class="kw">let </span>size = <span class="macro">ready!</span>(r.poll_seek(cx, SeekFrom::End(<span class="number">0</span>)))<span class="question-mark">?</span>;
-                    <span class="self">self</span>.size = <span class="prelude-val">Some</span>(size - <span class="self">self</span>.offset.unwrap());
-                    <span class="self">self</span>.seek_dirty = <span class="bool-val">true</span>;
-                }
-                <span class="kw">if </span><span class="self">self</span>.seek_dirty {
-                    <span class="comment">// Reset cursor.
-                    </span><span class="macro">ready!</span>(r.poll_seek(cx, SeekFrom::Start(current_offset)))<span class="question-mark">?</span>;
-                    <span class="self">self</span>.seek_dirty = <span class="bool-val">false</span>;
-                }
+        <span class="kw">let </span>r = <span class="self">self</span>.reader.as_mut().expect(<span class="string">"reader must be valid"</span>);
 
-                <span class="kw">let </span>pos = <span class="macro">ready!</span>(<span class="self">Self</span>::poll_seek_inner(
-                    cx,
-                    r,
-                    <span class="self">self</span>.offset,
-                    <span class="self">self</span>.size,
-                    <span class="self">self</span>.cur,
-                    pos
-                ))<span class="question-mark">?</span>;
-                <span class="self">self</span>.cur = pos - <span class="self">self</span>.offset.unwrap();
-                Poll::Ready(<span class="prelude-val">Ok</span>(<span class="self">self</span>.cur))
-            }
+        <span class="comment">// We should know where to start read the data.
+        </span><span class="kw">if </span><span class="self">self</span>.offset.is_none() {
+            (<span class="self">self</span>.offset, <span class="self">self</span>.size) = <span class="self">Self</span>::offset(r, <span class="self">self</span>.op.range()).<span class="kw">await</span><span class="question-mark">?</span>;
         }
-    }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="self">self</span>.state = State::Send(<span class="self">self</span>.read_future());
-                <span class="self">self</span>.poll_next(cx)
-            }
-            State::Send(fut) =&gt; {
-                <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="macro">ready!</span>(Pin::new(fut).poll(cx)).map_err(|err| {
-                    <span class="comment">// If send future returns an error, we should reset
-                    // state to Idle so that we can retry it.
-                    </span><span class="self">self</span>.state = State::Idle;
-                    err
-                })<span class="question-mark">?</span>;
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.poll_next(cx)
-            }
-            State::Read(r) =&gt; {
-                <span class="comment">// We should know where to start read the data.
-                </span><span class="kw">if </span><span class="self">self</span>.offset.is_none() {
-                    (<span class="self">self</span>.offset, <span class="self">self</span>.size) = <span class="macro">ready!</span>(<span class="self">Self</span>::poll_offset(cx, r, <span class="self">self</span>.op.range()))<span class="question-mark">?</span>;
-                }
+        <span class="comment">// Fetch size when seek end.
+        </span><span class="kw">let </span>current_offset = <span class="self">self</span>.offset.unwrap() + <span class="self">self</span>.cur;
+        <span class="kw">if </span><span class="macro">matches!</span>(pos, SeekFrom::End(<span class="kw">_</span>)) &amp;&amp; <span class="self">self</span>.size.is_none() {
+            <span class="kw">let </span>size = r.seek(SeekFrom::End(<span class="number">0</span>)).<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="self">self</span>.size = <span class="prelude-val">Some</span>(size - <span class="self">self</span>.offset.unwrap());
+            <span class="self">self</span>.seek_dirty = <span class="bool-val">true</span>;
+        }
+        <span class="kw">if </span><span class="self">self</span>.seek_dirty {
+            <span class="comment">// Reset cursor.
+            </span>r.seek(SeekFrom::Start(current_offset)).<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="self">self</span>.seek_dirty = <span class="bool-val">false</span>;
+        }
 
-                <span class="self">self</span>.buf.reserve();
+        <span class="kw">let </span>pos = <span class="self">Self</span>::seek_inner(r, <span class="self">self</span>.offset, <span class="self">self</span>.size, <span class="self">self</span>.cur, pos).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="self">self</span>.cur = pos - <span class="self">self</span>.offset.unwrap();
+        <span class="prelude-val">Ok</span>(<span class="self">self</span>.cur)
+    }
 
-                <span class="kw">let </span><span class="kw-2">mut </span>buf = <span class="self">self</span>.buf.initialized_mut();
-                <span class="kw">let </span>buf = buf.initialized_mut();
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="kw">if </span><span class="self">self</span>.reader.is_none() {
+            <span class="comment">// FileReader doesn't support range, we will always use full range to open a file.
+            </span><span class="kw">let </span>op = <span class="self">self</span>.op.clone().with_range(BytesRange::from(..));
+            <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="self">self</span>.acc.read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, op).<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="self">self</span>.reader = <span class="prelude-val">Some</span>(r);
+        }
 
-                <span class="kw">let </span>size = <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
-                    <span class="comment">// Sanity check.
-                    </span><span class="kw">if </span><span class="self">self</span>.cur &gt;= size {
-                        <span class="kw">return </span>Poll::Ready(<span class="prelude-val">None</span>);
-                    }
-                    cmp::min(buf.len(), (size - <span class="self">self</span>.cur) <span class="kw">as </span>usize)
-                } <span class="kw">else </span>{
-                    buf.len()
-                };
+        <span class="kw">let </span>r = <span class="self">self</span>.reader.as_mut().expect(<span class="string">"reader must be valid"</span>);
 
-                <span class="kw">match </span><span class="macro">ready!</span>(r.poll_read(cx, <span class="kw-2">&amp;mut </span>buf[..size])) {
-                    <span class="prelude-val">Ok</span>(<span class="number">0</span>) =&gt; Poll::Ready(<span class="prelude-val">None</span>),
-                    <span class="prelude-val">Ok</span>(n) =&gt; {
-                        <span class="self">self</span>.cur += n <span class="kw">as </span>u64;
-                        <span class="self">self</span>.buf.record(n);
-                        Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(<span class="self">self</span>.buf.split(n))))
-                    }
-                    <span class="comment">// We don't need to reset state here since it's ok to poll the same reader.
-                    </span><span class="prelude-val">Err</span>(err) =&gt; Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err))),
-                }
-            }
+        <span class="comment">// We should know where to start read the data.
+        </span><span class="kw">if </span><span class="self">self</span>.offset.is_none() {
+            (<span class="self">self</span>.offset, <span class="self">self</span>.size) = <span class="self">Self</span>::offset(r, <span class="self">self</span>.op.range()).<span class="kw">await</span><span class="question-mark">?</span>;
         }
-    }
+
+        r.read(size).<span class="kw">await
+    </span>}
 }
 
 <span class="kw">impl</span>&lt;A, R&gt; oio::BlockingRead <span class="kw">for </span>FileReader&lt;A, R&gt;
@@ -941,144 +661,118 @@
     R: oio::BlockingRead,
 {
     <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="comment">// FileReader doesn't support range, we will always use full range to open a file.
-                </span><span class="kw">let </span>op = <span class="self">self</span>.op.clone().with_range(BytesRange::from(..));
+        <span class="kw">if </span><span class="self">self</span>.reader.is_none() {
+            <span class="comment">// FileReader doesn't support range, we will always use full range to open a file.
+            </span><span class="kw">let </span>op = <span class="self">self</span>.op.clone().with_range(BytesRange::from(..));
+            <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="self">self</span>.acc.blocking_read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, op)<span class="question-mark">?</span>;
+            <span class="self">self</span>.reader = <span class="prelude-val">Some</span>(r);
+        }
 
-                <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="self">self</span>.acc.blocking_read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, op)<span class="question-mark">?</span>;
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.read(buf)
-            }
+        <span class="kw">let </span>r = <span class="self">self</span>.reader.as_mut().expect(<span class="string">"reader must be valid"</span>);
 
-            State::Read(r) =&gt; {
-                <span class="comment">// We should know where to start read the data.
-                </span><span class="kw">if </span><span class="self">self</span>.offset.is_none() {
-                    (<span class="self">self</span>.offset, <span class="self">self</span>.size) = <span class="self">Self</span>::calculate_offset(r, <span class="self">self</span>.op.range())<span class="question-mark">?</span>;
-                }
-
-                <span class="kw">let </span>size = <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
-                    <span class="comment">// Sanity check.
-                    </span><span class="kw">if </span><span class="self">self</span>.cur &gt;= size {
-                        <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="number">0</span>);
-                    }
-                    cmp::min(buf.len(), (size - <span class="self">self</span>.cur) <span class="kw">as </span>usize)
-                } <span class="kw">else </span>{
-                    buf.len()
-                };
+        <span class="comment">// We should know where to start read the data.
+        </span><span class="kw">if </span><span class="self">self</span>.offset.is_none() {
+            (<span class="self">self</span>.offset, <span class="self">self</span>.size) = <span class="self">Self</span>::calculate_offset(r, <span class="self">self</span>.op.range())<span class="question-mark">?</span>;
+        }
 
-                <span class="kw">match </span>r.read(<span class="kw-2">&amp;mut </span>buf[..size]) {
-                    <span class="prelude-val">Ok</span>(<span class="number">0</span>) =&gt; <span class="prelude-val">Ok</span>(<span class="number">0</span>),
-                    <span class="prelude-val">Ok</span>(n) =&gt; {
-                        <span class="self">self</span>.cur += n <span class="kw">as </span>u64;
-                        <span class="prelude-val">Ok</span>(n)
-                    }
-                    <span class="comment">// We don't need to reset state here since it's ok to poll the same reader.
-                    </span><span class="prelude-val">Err</span>(err) =&gt; <span class="prelude-val">Err</span>(err),
-                }
+        <span class="kw">let </span>size = <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
+            <span class="comment">// Sanity check.
+            </span><span class="kw">if </span><span class="self">self</span>.cur &gt;= size {
+                <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="number">0</span>);
             }
-            State::Send(<span class="kw">_</span>) =&gt; {
-                <span class="macro">unreachable!</span>(
-                    <span class="string">"It's invalid to go into State::Send for BlockingRead, please report this bug"
-                </span>)
+            cmp::min(buf.len(), (size - <span class="self">self</span>.cur) <span class="kw">as </span>usize)
+        } <span class="kw">else </span>{
+            buf.len()
+        };
+
+        <span class="kw">match </span>r.read(<span class="kw-2">&amp;mut </span>buf[..size]) {
+            <span class="prelude-val">Ok</span>(<span class="number">0</span>) =&gt; <span class="prelude-val">Ok</span>(<span class="number">0</span>),
+            <span class="prelude-val">Ok</span>(n) =&gt; {
+                <span class="self">self</span>.cur += n <span class="kw">as </span>u64;
+                <span class="prelude-val">Ok</span>(n)
             }
+            <span class="comment">// We don't need to reset state here since it's ok to poll the same reader.
+            </span><span class="prelude-val">Err</span>(err) =&gt; <span class="prelude-val">Err</span>(err),
         }
     }
 
     <span class="kw">fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="comment">// FileReader doesn't support range, we will always use full range to open a file.
-                </span><span class="kw">let </span>op = <span class="self">self</span>.op.clone().with_range(BytesRange::from(..));
+        <span class="kw">if </span><span class="self">self</span>.reader.is_none() {
+            <span class="comment">// FileReader doesn't support range, we will always use full range to open a file.
+            </span><span class="kw">let </span>op = <span class="self">self</span>.op.clone().with_range(BytesRange::from(..));
+            <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="self">self</span>.acc.blocking_read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, op)<span class="question-mark">?</span>;
+            <span class="self">self</span>.reader = <span class="prelude-val">Some</span>(r);
+        }
 
-                <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="self">self</span>.acc.blocking_read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, op)<span class="question-mark">?</span>;
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.seek(pos)
-            }
-            State::Read(r) =&gt; {
-                <span class="comment">// We should know where to start read the data.
-                </span><span class="kw">if </span><span class="self">self</span>.offset.is_none() {
-                    (<span class="self">self</span>.offset, <span class="self">self</span>.size) = <span class="self">Self</span>::calculate_offset(r, <span class="self">self</span>.op.range())<span class="question-mark">?</span>;
-                }
-                <span class="comment">// Fetch size when seek end.
-                </span><span class="kw">let </span>current_offset = <span class="self">self</span>.offset.unwrap() + <span class="self">self</span>.cur;
-                <span class="kw">if </span><span class="macro">matches!</span>(pos, SeekFrom::End(<span class="kw">_</span>)) &amp;&amp; <span class="self">self</span>.size.is_none() {
-                    <span class="kw">let </span>size = r.seek(SeekFrom::End(<span class="number">0</span>))<span class="question-mark">?</span>;
-                    <span class="self">self</span>.size = <span class="prelude-val">Some</span>(size - <span class="self">self</span>.offset.unwrap());
-                    <span class="self">self</span>.seek_dirty = <span class="bool-val">true</span>;
-                }
-                <span class="kw">if </span><span class="self">self</span>.seek_dirty {
-                    <span class="comment">// Reset cursor.
-                    </span>r.seek(SeekFrom::Start(current_offset))<span class="question-mark">?</span>;
-                    <span class="self">self</span>.seek_dirty = <span class="bool-val">false</span>;
-                }
+        <span class="kw">let </span>r = <span class="self">self</span>.reader.as_mut().expect(<span class="string">"reader must be valid"</span>);
 
-                <span class="kw">let </span>pos = <span class="self">Self</span>::seek_inner(r, <span class="self">self</span>.offset, <span class="self">self</span>.size, <span class="self">self</span>.cur, pos)<span class="question-mark">?</span>;
-                <span class="self">self</span>.cur = pos - <span class="self">self</span>.offset.unwrap();
-                <span class="prelude-val">Ok</span>(<span class="self">self</span>.cur)
-            }
-            State::Send(<span class="kw">_</span>) =&gt; {
-                <span class="macro">unreachable!</span>(
-                    <span class="string">"It's invalid to go into State::Send for BlockingRead, please report this bug"
-                </span>)
-            }
+        <span class="comment">// We should know where to start read the data.
+        </span><span class="kw">if </span><span class="self">self</span>.offset.is_none() {
+            (<span class="self">self</span>.offset, <span class="self">self</span>.size) = <span class="self">Self</span>::calculate_offset(r, <span class="self">self</span>.op.range())<span class="question-mark">?</span>;
+        }
+        <span class="comment">// Fetch size when seek end.
+        </span><span class="kw">let </span>current_offset = <span class="self">self</span>.offset.unwrap() + <span class="self">self</span>.cur;
+        <span class="kw">if </span><span class="macro">matches!</span>(pos, SeekFrom::End(<span class="kw">_</span>)) &amp;&amp; <span class="self">self</span>.size.is_none() {
+            <span class="kw">let </span>size = r.seek(SeekFrom::End(<span class="number">0</span>))<span class="question-mark">?</span>;
+            <span class="self">self</span>.size = <span class="prelude-val">Some</span>(size - <span class="self">self</span>.offset.unwrap());
+            <span class="self">self</span>.seek_dirty = <span class="bool-val">true</span>;
         }
+        <span class="kw">if </span><span class="self">self</span>.seek_dirty {
+            <span class="comment">// Reset cursor.
+            </span>r.seek(SeekFrom::Start(current_offset))<span class="question-mark">?</span>;
+            <span class="self">self</span>.seek_dirty = <span class="bool-val">false</span>;
+        }
+
+        <span class="kw">let </span>pos = <span class="self">Self</span>::blocking_seek_inner(r, <span class="self">self</span>.offset, <span class="self">self</span>.size, <span class="self">self</span>.cur, pos)<span class="question-mark">?</span>;
+        <span class="self">self</span>.cur = pos - <span class="self">self</span>.offset.unwrap();
+        <span class="prelude-val">Ok</span>(<span class="self">self</span>.cur)
     }
 
     <span class="kw">fn </span>next(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="comment">// FileReader doesn't support range, we will always use full range to open a file.
-                </span><span class="kw">let </span>op = <span class="self">self</span>.op.clone().with_range(BytesRange::from(..));
+        <span class="kw">if </span><span class="self">self</span>.reader.is_none() {
+            <span class="comment">// FileReader doesn't support range, we will always use full range to open a file.
+            </span><span class="kw">let </span>op = <span class="self">self</span>.op.clone().with_range(BytesRange::from(..));
+            <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="kw">match </span><span class="self">self</span>.acc.blocking_read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, op) {
+                <span class="prelude-val">Ok</span>(v) =&gt; v,
+                <span class="prelude-val">Err</span>(err) =&gt; <span class="kw">return </span><span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)),
+            };
+            <span class="self">self</span>.reader = <span class="prelude-val">Some</span>(r);
+        }
 
-                <span class="kw">let </span>r = <span class="kw">match </span><span class="self">self</span>.acc.blocking_read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, op) {
-                    <span class="prelude-val">Ok</span>((<span class="kw">_</span>, r)) =&gt; r,
-                    <span class="prelude-val">Err</span>(err) =&gt; <span class="kw">return </span><span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)),
-                };
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.next()
-            }
+        <span class="kw">let </span>r = <span class="self">self</span>.reader.as_mut().expect(<span class="string">"reader must be valid"</span>);
 
-            State::Read(r) =&gt; {
-                <span class="comment">// We should know where to start read the data.
-                </span><span class="kw">if </span><span class="self">self</span>.offset.is_none() {
-                    (<span class="self">self</span>.offset, <span class="self">self</span>.size) = <span class="kw">match </span><span class="self">Self</span>::calculate_offset(r, <span class="self">self</span>.op.range()) {
-                        <span class="prelude-val">Ok</span>(v) =&gt; v,
-                        <span class="prelude-val">Err</span>(err) =&gt; <span class="kw">return </span><span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)),
-                    }
-                }
-
-                <span class="self">self</span>.buf.reserve();
+        <span class="comment">// We should know where to start read the data.
+        </span><span class="kw">if </span><span class="self">self</span>.offset.is_none() {
+            (<span class="self">self</span>.offset, <span class="self">self</span>.size) = <span class="kw">match </span><span class="self">Self</span>::calculate_offset(r, <span class="self">self</span>.op.range()) {
+                <span class="prelude-val">Ok</span>(v) =&gt; v,
+                <span class="prelude-val">Err</span>(err) =&gt; <span class="kw">return </span><span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)),
+            }
+        }
 
-                <span class="kw">let </span><span class="kw-2">mut </span>buf = <span class="self">self</span>.buf.initialized_mut();
-                <span class="kw">let </span>buf = buf.initialized_mut();
+        <span class="self">self</span>.buf.reserve();
 
-                <span class="kw">let </span>size = <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
-                    <span class="comment">// Sanity check.
-                    </span><span class="kw">if </span><span class="self">self</span>.cur &gt;= size {
-                        <span class="kw">return </span><span class="prelude-val">None</span>;
-                    }
-                    cmp::min(buf.len(), (size - <span class="self">self</span>.cur) <span class="kw">as </span>usize)
-                } <span class="kw">else </span>{
-                    buf.len()
-                };
+        <span class="kw">let </span><span class="kw-2">mut </span>buf = <span class="self">self</span>.buf.initialized_mut();
+        <span class="kw">let </span>buf = buf.initialized_mut();
 
-                <span class="kw">match </span>r.read(<span class="kw-2">&amp;mut </span>buf[..size]) {
-                    <span class="prelude-val">Ok</span>(<span class="number">0</span>) =&gt; <span class="prelude-val">None</span>,
-                    <span class="prelude-val">Ok</span>(n) =&gt; {
-                        <span class="self">self</span>.cur += n <span class="kw">as </span>u64;
-                        <span class="self">self</span>.buf.record(n);
-                        <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(<span class="self">self</span>.buf.split(n)))
-                    }
-                    <span class="comment">// We don't need to reset state here since it's ok to poll the same reader.
-                    </span><span class="prelude-val">Err</span>(err) =&gt; <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)),
-                }
+        <span class="kw">let </span>size = <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
+            <span class="comment">// Sanity check.
+            </span><span class="kw">if </span><span class="self">self</span>.cur &gt;= size {
+                <span class="kw">return </span><span class="prelude-val">None</span>;
             }
-            State::Send(<span class="kw">_</span>) =&gt; {
-                <span class="macro">unreachable!</span>(
-                    <span class="string">"It's invalid to go into State::Send for BlockingRead, please report this bug"
-                </span>)
+            cmp::min(buf.len(), (size - <span class="self">self</span>.cur) <span class="kw">as </span>usize)
+        } <span class="kw">else </span>{
+            buf.len()
+        };
+
+        <span class="kw">match </span>r.read(<span class="kw-2">&amp;mut </span>buf[..size]) {
+            <span class="prelude-val">Ok</span>(<span class="number">0</span>) =&gt; <span class="prelude-val">None</span>,
+            <span class="prelude-val">Ok</span>(n) =&gt; {
+                <span class="self">self</span>.cur += n <span class="kw">as </span>u64;
+                <span class="self">self</span>.buf.record(n);
+                <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(<span class="self">self</span>.buf.split(n)))
             }
+            <span class="comment">// We don't need to reset state here since it's ok to poll the same reader.
+            </span><span class="prelude-val">Err</span>(err) =&gt; <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)),
         }
     }
 }
diff --git a/docs/rust/src/opendal/raw/oio/read/futures_read.rs.html b/docs/rust/src/opendal/raw/oio/read/futures_read.rs.html
index 7e88934e2d..32e070a81f 100644
--- a/docs/rust/src/opendal/raw/oio/read/futures_read.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/futures_read.rs.html
@@ -70,6 +70,20 @@
 <a href="#68" id="68">68</a>
 <a href="#69" id="69">69</a>
 <a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -88,13 +102,13 @@
 // under the License.
 
 </span><span class="kw">use </span>std::io::SeekFrom;
-<span class="kw">use </span>std::pin::Pin;
-<span class="kw">use </span>std::task::Context;
-<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>futures::AsyncRead;
+<span class="kw">use </span>futures::AsyncReadExt;
 <span class="kw">use </span>futures::AsyncSeek;
+<span class="kw">use </span>futures::AsyncSeekExt;
+<span class="kw">use </span>tokio::io::ReadBuf;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
@@ -102,12 +116,16 @@
 <span class="doccomment">/// FuturesReader implements [`oio::Read`] via [`AsyncRead`] + [`AsyncSeek`].
 </span><span class="kw">pub struct </span>FuturesReader&lt;R: AsyncRead + AsyncSeek&gt; {
     inner: R,
+    buf: Vec&lt;u8&gt;,
 }
 
 <span class="kw">impl</span>&lt;R: AsyncRead + AsyncSeek&gt; FuturesReader&lt;R&gt; {
     <span class="doccomment">/// Create a new futures reader.
     </span><span class="kw">pub fn </span>new(inner: R) -&gt; <span class="self">Self </span>{
-        <span class="self">Self </span>{ inner }
+        <span class="self">Self </span>{
+            inner,
+            buf: Vec::with_capacity(<span class="number">64 </span>* <span class="number">1024</span>),
+        }
     }
 }
 
@@ -115,29 +133,39 @@
 <span class="kw">where
     </span>R: AsyncRead + AsyncSeek + Unpin + Send + Sync,
 {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        Pin::new(<span class="kw-2">&amp;mut </span><span class="self">self</span>.inner).poll_read(cx, buf).map_err(|err| {
-            new_std_io_error(err)
-                .with_operation(oio::ReadOperation::Read)
-                .with_context(<span class="string">"source"</span>, <span class="string">"FuturesReader"</span>)
-        })
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        Pin::new(<span class="kw-2">&amp;mut </span><span class="self">self</span>.inner).poll_seek(cx, pos).map_err(|err| {
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.seek(pos).<span class="kw">await</span>.map_err(|err| {
             new_std_io_error(err)
                 .with_operation(oio::ReadOperation::Seek)
                 .with_context(<span class="string">"source"</span>, <span class="string">"FuturesReader"</span>)
         })
     }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">let _ </span>= cx;
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="comment">// Make sure buf has enough space.
+        </span><span class="kw">if </span><span class="self">self</span>.buf.capacity() &lt; size {
+            <span class="self">self</span>.buf.reserve(size);
+        }
+        <span class="kw">let </span>buf = <span class="self">self</span>.buf.spare_capacity_mut();
+        <span class="kw">let </span><span class="kw-2">mut </span>read_buf: ReadBuf = ReadBuf::uninit(buf);
+
+        <span class="comment">// SAFETY: Read at most `size` bytes into `read_buf`.
+        </span><span class="kw">unsafe </span>{
+            read_buf.assume_init(size);
+        }
+
+        <span class="kw">let </span>n = <span class="self">self
+            </span>.inner
+            .read(read_buf.initialized_mut())
+            .<span class="kw">await
+            </span>.map_err(|err| {
+                new_std_io_error(err)
+                    .with_operation(oio::ReadOperation::Read)
+                    .with_context(<span class="string">"source"</span>, <span class="string">"FuturesReader"</span>)
+            })<span class="question-mark">?</span>;
+        read_buf.set_filled(n);
 
-        Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(Error::new(
-            ErrorKind::Unsupported,
-            <span class="string">"FuturesReader doesn't support poll_next"</span>,
-        ))))
+        <span class="prelude-val">Ok</span>(Bytes::copy_from_slice(read_buf.filled()))
     }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/raw/oio/read/into_read_from_stream.rs.html b/docs/rust/src/opendal/raw/oio/read/into_read_from_stream.rs.html
index 36bc9aba4d..5c298a4681 100644
--- a/docs/rust/src/opendal/raw/oio/read/into_read_from_stream.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/into_read_from_stream.rs.html
@@ -64,29 +64,6 @@
 <a href="#62" id="62">62</a>
 <a href="#63" id="63">63</a>
 <a href="#64" id="64">64</a>
-<a href="#65" id="65">65</a>
-<a href="#66" id="66">66</a>
-<a href="#67" id="67">67</a>
-<a href="#68" id="68">68</a>
-<a href="#69" id="69">69</a>
-<a href="#70" id="70">70</a>
-<a href="#71" id="71">71</a>
-<a href="#72" id="72">72</a>
-<a href="#73" id="73">73</a>
-<a href="#74" id="74">74</a>
-<a href="#75" id="75">75</a>
-<a href="#76" id="76">76</a>
-<a href="#77" id="77">77</a>
-<a href="#78" id="78">78</a>
-<a href="#79" id="79">79</a>
-<a href="#80" id="80">80</a>
-<a href="#81" id="81">81</a>
-<a href="#82" id="82">82</a>
-<a href="#83" id="83">83</a>
-<a href="#84" id="84">84</a>
-<a href="#85" id="85">85</a>
-<a href="#86" id="86">86</a>
-<a href="#87" id="87">87</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -104,11 +81,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span>std::io::SeekFrom;
-<span class="kw">use </span>std::task::Context;
-<span class="kw">use </span>std::task::Poll;
+</span><span class="kw">use </span>std::cmp::min;
+<span class="kw">use </span>std::io::SeekFrom;
 
-<span class="kw">use </span>bytes::Buf;
 <span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>futures::StreamExt;
 
@@ -134,44 +109,23 @@
     </span>S: futures::Stream&lt;Item = <span class="prelude-ty">Result</span>&lt;T&gt;&gt; + Send + Sync + Unpin + <span class="lifetime">'static</span>,
     T: Into&lt;Bytes&gt;,
 {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="kw">if </span>!<span class="self">self</span>.buf.is_empty() {
-            <span class="kw">let </span>len = std::cmp::min(buf.len(), <span class="self">self</span>.buf.len());
-            buf[..len].copy_from_slice(<span class="kw-2">&amp;</span><span class="self">self</span>.buf[..len]);
-            <span class="self">self</span>.buf.advance(len);
-            <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(len));
-        }
-
-        <span class="kw">match </span><span class="macro">futures::ready!</span>(<span class="self">self</span>.inner.poll_next_unpin(cx)) {
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bytes)) =&gt; {
-                <span class="kw">let </span>bytes = bytes.into();
-                <span class="kw">let </span>len = std::cmp::min(buf.len(), bytes.len());
-                buf[..len].copy_from_slice(<span class="kw-2">&amp;</span>bytes[..len]);
-                <span class="self">self</span>.buf = bytes.slice(len..);
-                Poll::Ready(<span class="prelude-val">Ok</span>(len))
-            }
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)) =&gt; Poll::Ready(<span class="prelude-val">Err</span>(err)),
-            <span class="prelude-val">None </span>=&gt; Poll::Ready(<span class="prelude-val">Ok</span>(<span class="number">0</span>)),
-        }
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, <span class="kw">_</span>: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">"FromStreamReader can't support operation"</span>,
-        )))
+        ))
     }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">if </span>!<span class="self">self</span>.buf.is_empty() {
-            <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(std::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.buf))));
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="kw">if </span><span class="self">self</span>.buf.is_empty() {
+            <span class="self">self</span>.buf = <span class="kw">match </span><span class="self">self</span>.inner.next().<span class="kw">await</span>.transpose()<span class="question-mark">? </span>{
+                <span class="prelude-val">Some</span>(v) =&gt; v.into(),
+                <span class="prelude-val">None </span>=&gt; <span class="kw">return </span><span class="prelude-val">Ok</span>(Bytes::new()),
+            };
         }
 
-        <span class="kw">match </span><span class="macro">futures::ready!</span>(<span class="self">self</span>.inner.poll_next_unpin(cx)) {
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bytes)) =&gt; Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(bytes.into()))),
-            <span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)) =&gt; Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err))),
-            <span class="prelude-val">None </span>=&gt; Poll::Ready(<span class="prelude-val">None</span>),
-        }
+        <span class="kw">let </span>bs = <span class="self">self</span>.buf.split_to(min(size, <span class="self">self</span>.buf.len()));
+        <span class="prelude-val">Ok</span>(bs)
     }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/raw/oio/read/into_streamable_read.rs.html b/docs/rust/src/opendal/raw/oio/read/into_streamable_read.rs.html
index e9d85f9d99..f6fed2ae97 100644
--- a/docs/rust/src/opendal/raw/oio/read/into_streamable_read.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/into_streamable_read.rs.html
@@ -145,9 +145,6 @@
 <a href="#143" id="143">143</a>
 <a href="#144" id="144">144</a>
 <a href="#145" id="145">145</a>
-<a href="#146" id="146">146</a>
-<a href="#147" id="147">147</a>
-<a href="#148" id="148">148</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -165,10 +162,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span>std::io::SeekFrom;
-<span class="kw">use </span>std::task::ready;
-<span class="kw">use </span>std::task::Context;
-<span class="kw">use </span>std::task::Poll;
+</span><span class="kw">use </span>std::cmp::min;
+<span class="kw">use </span>std::io::SeekFrom;
 
 <span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>tokio::io::ReadBuf;
@@ -193,27 +188,24 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>StreamableReader&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="self">self</span>.r.poll_read(cx, buf)
-    }
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.r.seek(pos).<span class="kw">await
+    </span>}
 
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="self">self</span>.r.poll_seek(cx, pos)
-    }
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="kw">let </span>size = min(<span class="self">self</span>.buf.capacity(), size);
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
         <span class="kw">let </span>dst = <span class="self">self</span>.buf.spare_capacity_mut();
         <span class="kw">let </span><span class="kw-2">mut </span>buf = ReadBuf::uninit(dst);
-        <span class="kw">unsafe </span>{ buf.assume_init(<span class="self">self</span>.cap) };
 
-        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.r.poll_read(cx, buf.initialized_mut())) {
-            <span class="prelude-val">Err</span>(err) =&gt; Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err))),
-            <span class="prelude-val">Ok</span>(<span class="number">0</span>) =&gt; Poll::Ready(<span class="prelude-val">None</span>),
-            <span class="prelude-val">Ok</span>(n) =&gt; {
-                buf.set_filled(n);
-                Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Ok</span>(Bytes::from(buf.filled().to_vec()))))
-            }
-        }
+        <span class="comment">// SAFETY: Read at most `size` bytes into `read_buf`.
+        </span><span class="kw">unsafe </span>{ buf.assume_init(size) };
+
+        <span class="kw">let </span>bs = <span class="self">self</span>.r.read(size).<span class="kw">await</span><span class="question-mark">?</span>;
+        buf.put_slice(<span class="kw-2">&amp;</span>bs);
+        buf.set_filled(bs.len());
+
+        <span class="prelude-val">Ok</span>(Bytes::from(buf.filled().to_vec()))
     }
 }
 
@@ -244,6 +236,7 @@
 
 <span class="attr">#[cfg(test)]
 </span><span class="kw">mod </span>tests {
+    <span class="kw">use </span><span class="kw">crate</span>::raw::oio::Read;
     <span class="kw">use </span>bytes::BufMut;
     <span class="kw">use </span>bytes::BytesMut;
     <span class="kw">use </span>rand::prelude::<span class="kw-2">*</span>;
@@ -252,8 +245,6 @@
 
     <span class="attr">#[tokio::test]
     </span><span class="kw">async fn </span>test_into_stream() {
-        <span class="kw">use </span>oio::ReadExt;
-
         <span class="kw">let </span><span class="kw-2">mut </span>rng = ThreadRng::default();
         <span class="comment">// Generate size between 1B..16MB.
         </span><span class="kw">let </span>size = rng.gen_range(<span class="number">1</span>..<span class="number">16 </span>* <span class="number">1024 </span>* <span class="number">1024</span>);
@@ -266,8 +257,11 @@
         <span class="kw">let </span><span class="kw-2">mut </span>s = into_streamable_read(Box::new(r) <span class="kw">as </span>oio::Reader, cap);
 
         <span class="kw">let </span><span class="kw-2">mut </span>bs = BytesMut::new();
-        <span class="kw">while let </span><span class="prelude-val">Some</span>(b) = s.next().<span class="kw">await </span>{
-            <span class="kw">let </span>b = b.expect(<span class="string">"read must success"</span>);
+        <span class="kw">loop </span>{
+            <span class="kw">let </span>b = s.read(<span class="number">4 </span>* <span class="number">1024 </span>* <span class="number">1024</span>).<span class="kw">await</span>.expect(<span class="string">"read must success"</span>);
+            <span class="kw">if </span>b.is_empty() {
+                <span class="kw">break</span>;
+            }
             bs.put_slice(<span class="kw-2">&amp;</span>b);
         }
         <span class="macro">assert_eq!</span>(bs.freeze().to_vec(), content)
diff --git a/docs/rust/src/opendal/raw/oio/read/lazy_read.rs.html b/docs/rust/src/opendal/raw/oio/read/lazy_read.rs.html
index a9b083fa16..09e965fd69 100644
--- a/docs/rust/src/opendal/raw/oio/read/lazy_read.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/lazy_read.rs.html
@@ -118,93 +118,6 @@
 <a href="#116" id="116">116</a>
 <a href="#117" id="117">117</a>
 <a href="#118" id="118">118</a>
-<a href="#119" id="119">119</a>
-<a href="#120" id="120">120</a>
-<a href="#121" id="121">121</a>
-<a href="#122" id="122">122</a>
-<a href="#123" id="123">123</a>
-<a href="#124" id="124">124</a>
-<a href="#125" id="125">125</a>
-<a href="#126" id="126">126</a>
-<a href="#127" id="127">127</a>
-<a href="#128" id="128">128</a>
-<a href="#129" id="129">129</a>
-<a href="#130" id="130">130</a>
-<a href="#131" id="131">131</a>
-<a href="#132" id="132">132</a>
-<a href="#133" id="133">133</a>
-<a href="#134" id="134">134</a>
-<a href="#135" id="135">135</a>
-<a href="#136" id="136">136</a>
-<a href="#137" id="137">137</a>
-<a href="#138" id="138">138</a>
-<a href="#139" id="139">139</a>
-<a href="#140" id="140">140</a>
-<a href="#141" id="141">141</a>
-<a href="#142" id="142">142</a>
-<a href="#143" id="143">143</a>
-<a href="#144" id="144">144</a>
-<a href="#145" id="145">145</a>
-<a href="#146" id="146">146</a>
-<a href="#147" id="147">147</a>
-<a href="#148" id="148">148</a>
-<a href="#149" id="149">149</a>
-<a href="#150" id="150">150</a>
-<a href="#151" id="151">151</a>
-<a href="#152" id="152">152</a>
-<a href="#153" id="153">153</a>
-<a href="#154" id="154">154</a>
-<a href="#155" id="155">155</a>
-<a href="#156" id="156">156</a>
-<a href="#157" id="157">157</a>
-<a href="#158" id="158">158</a>
-<a href="#159" id="159">159</a>
-<a href="#160" id="160">160</a>
-<a href="#161" id="161">161</a>
-<a href="#162" id="162">162</a>
-<a href="#163" id="163">163</a>
-<a href="#164" id="164">164</a>
-<a href="#165" id="165">165</a>
-<a href="#166" id="166">166</a>
-<a href="#167" id="167">167</a>
-<a href="#168" id="168">168</a>
-<a href="#169" id="169">169</a>
-<a href="#170" id="170">170</a>
-<a href="#171" id="171">171</a>
-<a href="#172" id="172">172</a>
-<a href="#173" id="173">173</a>
-<a href="#174" id="174">174</a>
-<a href="#175" id="175">175</a>
-<a href="#176" id="176">176</a>
-<a href="#177" id="177">177</a>
-<a href="#178" id="178">178</a>
-<a href="#179" id="179">179</a>
-<a href="#180" id="180">180</a>
-<a href="#181" id="181">181</a>
-<a href="#182" id="182">182</a>
-<a href="#183" id="183">183</a>
-<a href="#184" id="184">184</a>
-<a href="#185" id="185">185</a>
-<a href="#186" id="186">186</a>
-<a href="#187" id="187">187</a>
-<a href="#188" id="188">188</a>
-<a href="#189" id="189">189</a>
-<a href="#190" id="190">190</a>
-<a href="#191" id="191">191</a>
-<a href="#192" id="192">192</a>
-<a href="#193" id="193">193</a>
-<a href="#194" id="194">194</a>
-<a href="#195" id="195">195</a>
-<a href="#196" id="196">196</a>
-<a href="#197" id="197">197</a>
-<a href="#198" id="198">198</a>
-<a href="#199" id="199">199</a>
-<a href="#200" id="200">200</a>
-<a href="#201" id="201">201</a>
-<a href="#202" id="202">202</a>
-<a href="#203" id="203">203</a>
-<a href="#204" id="204">204</a>
-<a href="#205" id="205">205</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -223,14 +136,9 @@
 // under the License.
 
 </span><span class="kw">use </span>std::io::SeekFrom;
-<span class="kw">use </span>std::pin::Pin;
 <span class="kw">use </span>std::sync::Arc;
-<span class="kw">use </span>std::task::ready;
-<span class="kw">use </span>std::task::Context;
-<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>bytes::Bytes;
-<span class="kw">use </span>futures::Future;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
@@ -242,22 +150,9 @@
     acc: Arc&lt;A&gt;,
     path: Arc&lt;String&gt;,
     op: OpRead,
-    state: State&lt;R&gt;,
+    reader: <span class="prelude-ty">Option</span>&lt;R&gt;,
 }
 
-<span class="kw">enum </span>State&lt;R&gt; {
-    Idle,
-    Send(BoxedFuture&lt;<span class="prelude-ty">Result</span>&lt;(RpRead, R)&gt;&gt;),
-    Read(R),
-}
-
-<span class="doccomment">/// # Safety
-///
-/// wasm32 is a special target that we only have one event-loop for this state.
-</span><span class="kw">unsafe impl</span>&lt;R&gt; Send <span class="kw">for </span>State&lt;R&gt; {}
-<span class="doccomment">/// Safety: State will only be accessed under &amp;mut.
-</span><span class="kw">unsafe impl</span>&lt;R&gt; Sync <span class="kw">for </span>State&lt;R&gt; {}
-
 <span class="kw">impl</span>&lt;A, R&gt; LazyReader&lt;A, R&gt;
 <span class="kw">where
     </span>A: Accessor,
@@ -269,7 +164,7 @@
             path: Arc::new(path.to_string()),
             op,
 
-            state: State::&lt;R&gt;::Idle,
+            reader: <span class="prelude-val">None</span>,
         }
     }
 }
@@ -279,12 +174,13 @@
     </span>A: Accessor&lt;Reader = R&gt;,
     R: oio::Read,
 {
-    <span class="kw">fn </span>read_future(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; BoxedFuture&lt;<span class="prelude-ty">Result</span>&lt;(RpRead, R)&gt;&gt; {
-        <span class="kw">let </span>acc = <span class="self">self</span>.acc.clone();
-        <span class="kw">let </span>path = <span class="self">self</span>.path.clone();
-        <span class="kw">let </span>op = <span class="self">self</span>.op.clone();
+    <span class="kw">async fn </span>reader(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="kw-2">&amp;mut </span>R&gt; {
+        <span class="kw">if </span><span class="self">self</span>.reader.is_none() {
+            <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="self">self</span>.acc.read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, <span class="self">self</span>.op.clone()).<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="self">self</span>.reader = <span class="prelude-val">Some</span>(r);
+        }
 
-        Box::pin(<span class="kw">async move </span>{ acc.read(<span class="kw-2">&amp;</span>path, op).<span class="kw">await </span>})
+        <span class="prelude-val">Ok</span>(<span class="self">self</span>.reader.as_mut().expect(<span class="string">"reader must be valid"</span>))
     }
 }
 
@@ -293,64 +189,28 @@
     </span>A: Accessor&lt;Reader = R&gt;,
     R: oio::Read,
 {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="self">self</span>.state = State::Send(<span class="self">self</span>.read_future());
-                <span class="self">self</span>.poll_read(cx, buf)
-            }
-            State::Send(fut) =&gt; {
-                <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="macro">ready!</span>(Pin::new(fut).poll(cx)).map_err(|err| {
-                    <span class="comment">// If read future returns an error, we should reset
-                    // state to Idle so that we can retry it.
-                    </span><span class="self">self</span>.state = State::Idle;
-                    err
-                })<span class="question-mark">?</span>;
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.poll_read(cx, buf)
-            }
-            State::Read(r) =&gt; r.poll_read(cx, buf),
-        }
-    }
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.reader().<span class="kw">await</span><span class="question-mark">?</span>.seek(pos).<span class="kw">await
+    </span>}
+
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
+        <span class="kw">let </span>r = <span class="self">self</span>.reader().<span class="kw">await</span><span class="question-mark">?</span>;
+        r.read(size).<span class="kw">await
+    </span>}
+}
 
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="self">self</span>.state = State::Send(<span class="self">self</span>.read_future());
-                <span class="self">self</span>.poll_seek(cx, pos)
-            }
-            State::Send(fut) =&gt; {
-                <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="macro">ready!</span>(Pin::new(fut).poll(cx)).map_err(|err| {
-                    <span class="comment">// If read future returns an error, we should reset
-                    // state to Idle so that we can retry it.
-                    </span><span class="self">self</span>.state = State::Idle;
-                    err
-                })<span class="question-mark">?</span>;
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.poll_seek(cx, pos)
-            }
-            State::Read(r) =&gt; r.poll_seek(cx, pos),
+<span class="kw">impl</span>&lt;A, R&gt; LazyReader&lt;A, R&gt;
+<span class="kw">where
+    </span>A: Accessor&lt;BlockingReader = R&gt;,
+    R: oio::BlockingRead,
+{
+    <span class="kw">fn </span>blocking_reader(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="kw-2">&amp;mut </span>R&gt; {
+        <span class="kw">if </span><span class="self">self</span>.reader.is_none() {
+            <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="self">self</span>.acc.blocking_read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, <span class="self">self</span>.op.clone())<span class="question-mark">?</span>;
+            <span class="self">self</span>.reader = <span class="prelude-val">Some</span>(r);
         }
-    }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="self">self</span>.state = State::Send(<span class="self">self</span>.read_future());
-                <span class="self">self</span>.poll_next(cx)
-            }
-            State::Send(fut) =&gt; {
-                <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="macro">ready!</span>(Pin::new(fut).poll(cx)).map_err(|err| {
-                    <span class="comment">// If read future returns an error, we should reset
-                    // state to Idle so that we can retry it.
-                    </span><span class="self">self</span>.state = State::Idle;
-                    err
-                })<span class="question-mark">?</span>;
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.poll_next(cx)
-            }
-            State::Read(r) =&gt; r.poll_next(cx),
-        }
+        <span class="prelude-val">Ok</span>(<span class="self">self</span>.reader.as_mut().expect(<span class="string">"reader must be valid"</span>))
     }
 }
 
@@ -360,54 +220,20 @@
     R: oio::BlockingRead,
 {
     <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="self">self</span>.acc.blocking_read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, <span class="self">self</span>.op.clone())<span class="question-mark">?</span>;
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.read(buf)
-            }
-            State::Read(r) =&gt; r.read(buf),
-            State::Send(<span class="kw">_</span>) =&gt; {
-                <span class="macro">unreachable!</span>(
-                    <span class="string">"It's invalid to go into State::Send for BlockingRead, please report this bug"
-                </span>)
-            }
-        }
+        <span class="self">self</span>.blocking_reader()<span class="question-mark">?</span>.read(buf)
     }
 
     <span class="kw">fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="kw">let </span>(<span class="kw">_</span>, r) = <span class="self">self</span>.acc.blocking_read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, <span class="self">self</span>.op.clone())<span class="question-mark">?</span>;
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.seek(pos)
-            }
-            State::Read(r) =&gt; r.seek(pos),
-            State::Send(<span class="kw">_</span>) =&gt; {
-                <span class="macro">unreachable!</span>(
-                    <span class="string">"It's invalid to go into State::Send for BlockingRead, please report this bug"
-                </span>)
-            }
-        }
+        <span class="self">self</span>.blocking_reader()<span class="question-mark">?</span>.seek(pos)
     }
 
     <span class="kw">fn </span>next(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="kw">let </span>r = <span class="kw">match </span><span class="self">self</span>.acc.blocking_read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, <span class="self">self</span>.op.clone()) {
-                    <span class="prelude-val">Ok</span>((<span class="kw">_</span>, r)) =&gt; r,
-                    <span class="prelude-val">Err</span>(err) =&gt; <span class="kw">return </span><span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)),
-                };
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.next()
-            }
-            State::Read(r) =&gt; r.next(),
-            State::Send(<span class="kw">_</span>) =&gt; {
-                <span class="macro">unreachable!</span>(
-                    <span class="string">"It's invalid to go into State::Send for BlockingRead, please report this bug"
-                </span>)
-            }
-        }
+        <span class="kw">let </span>r = <span class="kw">match </span><span class="self">self</span>.blocking_reader() {
+            <span class="prelude-val">Ok</span>(r) =&gt; r,
+            <span class="prelude-val">Err</span>(err) =&gt; <span class="kw">return </span><span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)),
+        };
+
+        r.next()
     }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/raw/oio/read/mod.rs.html b/docs/rust/src/opendal/raw/oio/read/mod.rs.html
index d5e5321165..e0097bde07 100644
--- a/docs/rust/src/opendal/raw/oio/read/mod.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/mod.rs.html
@@ -52,7 +52,6 @@
 <a href="#50" id="50">50</a>
 <a href="#51" id="51">51</a>
 <a href="#52" id="52">52</a>
-<a href="#53" id="53">53</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -74,7 +73,6 @@
 <span class="kw">pub use </span>api::BlockingRead;
 <span class="kw">pub use </span>api::BlockingReader;
 <span class="kw">pub use </span>api::Read;
-<span class="kw">pub use </span>api::ReadExt;
 <span class="kw">pub use </span>api::ReadOperation;
 <span class="kw">pub use </span>api::Reader;
 
diff --git a/docs/rust/src/opendal/raw/oio/read/range_read.rs.html b/docs/rust/src/opendal/raw/oio/read/range_read.rs.html
index 0499ef41b4..61c796e663 100644
--- a/docs/rust/src/opendal/raw/oio/read/range_read.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/range_read.rs.html
@@ -645,191 +645,6 @@
 <a href="#643" id="643">643</a>
 <a href="#644" id="644">644</a>
 <a href="#645" id="645">645</a>
-<a href="#646" id="646">646</a>
-<a href="#647" id="647">647</a>
-<a href="#648" id="648">648</a>
-<a href="#649" id="649">649</a>
-<a href="#650" id="650">650</a>
-<a href="#651" id="651">651</a>
-<a href="#652" id="652">652</a>
-<a href="#653" id="653">653</a>
-<a href="#654" id="654">654</a>
-<a href="#655" id="655">655</a>
-<a href="#656" id="656">656</a>
-<a href="#657" id="657">657</a>
-<a href="#658" id="658">658</a>
-<a href="#659" id="659">659</a>
-<a href="#660" id="660">660</a>
-<a href="#661" id="661">661</a>
-<a href="#662" id="662">662</a>
-<a href="#663" id="663">663</a>
-<a href="#664" id="664">664</a>
-<a href="#665" id="665">665</a>
-<a href="#666" id="666">666</a>
-<a href="#667" id="667">667</a>
-<a href="#668" id="668">668</a>
-<a href="#669" id="669">669</a>
-<a href="#670" id="670">670</a>
-<a href="#671" id="671">671</a>
-<a href="#672" id="672">672</a>
-<a href="#673" id="673">673</a>
-<a href="#674" id="674">674</a>
-<a href="#675" id="675">675</a>
-<a href="#676" id="676">676</a>
-<a href="#677" id="677">677</a>
-<a href="#678" id="678">678</a>
-<a href="#679" id="679">679</a>
-<a href="#680" id="680">680</a>
-<a href="#681" id="681">681</a>
-<a href="#682" id="682">682</a>
-<a href="#683" id="683">683</a>
-<a href="#684" id="684">684</a>
-<a href="#685" id="685">685</a>
-<a href="#686" id="686">686</a>
-<a href="#687" id="687">687</a>
-<a href="#688" id="688">688</a>
-<a href="#689" id="689">689</a>
-<a href="#690" id="690">690</a>
-<a href="#691" id="691">691</a>
-<a href="#692" id="692">692</a>
-<a href="#693" id="693">693</a>
-<a href="#694" id="694">694</a>
-<a href="#695" id="695">695</a>
-<a href="#696" id="696">696</a>
-<a href="#697" id="697">697</a>
-<a href="#698" id="698">698</a>
-<a href="#699" id="699">699</a>
-<a href="#700" id="700">700</a>
-<a href="#701" id="701">701</a>
-<a href="#702" id="702">702</a>
-<a href="#703" id="703">703</a>
-<a href="#704" id="704">704</a>
-<a href="#705" id="705">705</a>
-<a href="#706" id="706">706</a>
-<a href="#707" id="707">707</a>
-<a href="#708" id="708">708</a>
-<a href="#709" id="709">709</a>
-<a href="#710" id="710">710</a>
-<a href="#711" id="711">711</a>
-<a href="#712" id="712">712</a>
-<a href="#713" id="713">713</a>
-<a href="#714" id="714">714</a>
-<a href="#715" id="715">715</a>
-<a href="#716" id="716">716</a>
-<a href="#717" id="717">717</a>
-<a href="#718" id="718">718</a>
-<a href="#719" id="719">719</a>
-<a href="#720" id="720">720</a>
-<a href="#721" id="721">721</a>
-<a href="#722" id="722">722</a>
-<a href="#723" id="723">723</a>
-<a href="#724" id="724">724</a>
-<a href="#725" id="725">725</a>
-<a href="#726" id="726">726</a>
-<a href="#727" id="727">727</a>
-<a href="#728" id="728">728</a>
-<a href="#729" id="729">729</a>
-<a href="#730" id="730">730</a>
-<a href="#731" id="731">731</a>
-<a href="#732" id="732">732</a>
-<a href="#733" id="733">733</a>
-<a href="#734" id="734">734</a>
-<a href="#735" id="735">735</a>
-<a href="#736" id="736">736</a>
-<a href="#737" id="737">737</a>
-<a href="#738" id="738">738</a>
-<a href="#739" id="739">739</a>
-<a href="#740" id="740">740</a>
-<a href="#741" id="741">741</a>
-<a href="#742" id="742">742</a>
-<a href="#743" id="743">743</a>
-<a href="#744" id="744">744</a>
-<a href="#745" id="745">745</a>
-<a href="#746" id="746">746</a>
-<a href="#747" id="747">747</a>
-<a href="#748" id="748">748</a>
-<a href="#749" id="749">749</a>
-<a href="#750" id="750">750</a>
-<a href="#751" id="751">751</a>
-<a href="#752" id="752">752</a>
-<a href="#753" id="753">753</a>
-<a href="#754" id="754">754</a>
-<a href="#755" id="755">755</a>
-<a href="#756" id="756">756</a>
-<a href="#757" id="757">757</a>
-<a href="#758" id="758">758</a>
-<a href="#759" id="759">759</a>
-<a href="#760" id="760">760</a>
-<a href="#761" id="761">761</a>
-<a href="#762" id="762">762</a>
-<a href="#763" id="763">763</a>
-<a href="#764" id="764">764</a>
-<a href="#765" id="765">765</a>
-<a href="#766" id="766">766</a>
-<a href="#767" id="767">767</a>
-<a href="#768" id="768">768</a>
-<a href="#769" id="769">769</a>
-<a href="#770" id="770">770</a>
-<a href="#771" id="771">771</a>
-<a href="#772" id="772">772</a>
-<a href="#773" id="773">773</a>
-<a href="#774" id="774">774</a>
-<a href="#775" id="775">775</a>
-<a href="#776" id="776">776</a>
-<a href="#777" id="777">777</a>
-<a href="#778" id="778">778</a>
-<a href="#779" id="779">779</a>
-<a href="#780" id="780">780</a>
-<a href="#781" id="781">781</a>
-<a href="#782" id="782">782</a>
-<a href="#783" id="783">783</a>
-<a href="#784" id="784">784</a>
-<a href="#785" id="785">785</a>
-<a href="#786" id="786">786</a>
-<a href="#787" id="787">787</a>
-<a href="#788" id="788">788</a>
-<a href="#789" id="789">789</a>
-<a href="#790" id="790">790</a>
-<a href="#791" id="791">791</a>
-<a href="#792" id="792">792</a>
-<a href="#793" id="793">793</a>
-<a href="#794" id="794">794</a>
-<a href="#795" id="795">795</a>
-<a href="#796" id="796">796</a>
-<a href="#797" id="797">797</a>
-<a href="#798" id="798">798</a>
-<a href="#799" id="799">799</a>
-<a href="#800" id="800">800</a>
-<a href="#801" id="801">801</a>
-<a href="#802" id="802">802</a>
-<a href="#803" id="803">803</a>
-<a href="#804" id="804">804</a>
-<a href="#805" id="805">805</a>
-<a href="#806" id="806">806</a>
-<a href="#807" id="807">807</a>
-<a href="#808" id="808">808</a>
-<a href="#809" id="809">809</a>
-<a href="#810" id="810">810</a>
-<a href="#811" id="811">811</a>
-<a href="#812" id="812">812</a>
-<a href="#813" id="813">813</a>
-<a href="#814" id="814">814</a>
-<a href="#815" id="815">815</a>
-<a href="#816" id="816">816</a>
-<a href="#817" id="817">817</a>
-<a href="#818" id="818">818</a>
-<a href="#819" id="819">819</a>
-<a href="#820" id="820">820</a>
-<a href="#821" id="821">821</a>
-<a href="#822" id="822">822</a>
-<a href="#823" id="823">823</a>
-<a href="#824" id="824">824</a>
-<a href="#825" id="825">825</a>
-<a href="#826" id="826">826</a>
-<a href="#827" id="827">827</a>
-<a href="#828" id="828">828</a>
-<a href="#829" id="829">829</a>
-<a href="#830" id="830">830</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -847,13 +662,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span>std::future::Future;
-<span class="kw">use </span>std::io::SeekFrom;
-<span class="kw">use </span>std::pin::Pin;
+</span><span class="kw">use </span>std::io::SeekFrom;
 <span class="kw">use </span>std::sync::Arc;
-<span class="kw">use </span>std::task::ready;
-<span class="kw">use </span>std::task::Context;
-<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>bytes::Bytes;
 
@@ -877,23 +687,9 @@
     offset: <span class="prelude-ty">Option</span>&lt;u64&gt;,
     size: <span class="prelude-ty">Option</span>&lt;u64&gt;,
     cur: u64,
-    state: State&lt;R&gt;,
+    reader: <span class="prelude-ty">Option</span>&lt;R&gt;,
 }
 
-<span class="kw">enum </span>State&lt;R&gt; {
-    Idle,
-    SendStat(BoxedFuture&lt;<span class="prelude-ty">Result</span>&lt;RpStat&gt;&gt;),
-    SendRead(BoxedFuture&lt;<span class="prelude-ty">Result</span>&lt;(RpRead, R)&gt;&gt;),
-    Read(R),
-}
-
-<span class="doccomment">/// # Safety
-///
-/// wasm32 is a special target that we only have one event-loop for this state.
-</span><span class="kw">unsafe impl</span>&lt;R&gt; Send <span class="kw">for </span>State&lt;R&gt; {}
-<span class="doccomment">/// Safety: State will only be accessed under &amp;mut.
-</span><span class="kw">unsafe impl</span>&lt;R&gt; Sync <span class="kw">for </span>State&lt;R&gt; {}
-
 <span class="kw">impl</span>&lt;A, R&gt; RangeReader&lt;A, R&gt;
 <span class="kw">where
     </span>A: Accessor,
@@ -927,7 +723,7 @@
             offset,
             size,
             cur: <span class="number">0</span>,
-            state: State::&lt;R&gt;::Idle,
+            reader: <span class="prelude-val">None</span>,
         }
     }
 
@@ -938,7 +734,7 @@
                 <span class="kw">if </span>size &gt; total_size {
                     <span class="comment">// If returns an error, we should reset
                     // state to Idle so that we can retry it.
-                    </span><span class="self">self</span>.state = State::Idle;
+                    </span><span class="self">self</span>.reader = <span class="prelude-val">None</span>;
                     <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
                         ErrorKind::InvalidInput,
                         <span class="string">"read to a negative or overflowing position is invalid"</span>,
@@ -1027,10 +823,7 @@
     </span>A: Accessor&lt;Reader = R&gt;,
     R: oio::Read,
 {
-    <span class="kw">fn </span>read_future(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; BoxedFuture&lt;<span class="prelude-ty">Result</span>&lt;(RpRead, R)&gt;&gt; {
-        <span class="kw">let </span>acc = <span class="self">self</span>.acc.clone();
-        <span class="kw">let </span>path = <span class="self">self</span>.path.clone();
-
+    <span class="kw">async fn </span>read_future(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;(RpRead, R)&gt; {
         <span class="kw">let </span><span class="kw-2">mut </span>op = <span class="self">self</span>.op.clone();
         <span class="comment">// cur != 0 means we have read some data out, we should convert
         // the op into deterministic to avoid ETag changes.
@@ -1040,13 +833,10 @@
         <span class="comment">// Alter OpRead with correct calculated range.
         </span>op = op.with_range(<span class="self">self</span>.calculate_range());
 
-        Box::pin(<span class="kw">async move </span>{ acc.read(<span class="kw-2">&amp;</span>path, op).<span class="kw">await </span>})
-    }
-
-    <span class="kw">fn </span>stat_future(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; BoxedFuture&lt;<span class="prelude-ty">Result</span>&lt;RpStat&gt;&gt; {
-        <span class="kw">let </span>acc = <span class="self">self</span>.acc.clone();
-        <span class="kw">let </span>path = <span class="self">self</span>.path.clone();
+        <span class="self">self</span>.acc.read(<span class="kw-2">&amp;</span><span class="self">self</span>.path, op).<span class="kw">await
+    </span>}
 
+    <span class="kw">async fn </span>stat_future(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;RpStat&gt; {
         <span class="comment">// Handle if-match and if-none-match correctly.
         </span><span class="kw">let </span><span class="kw-2">mut </span>args = OpStat::default();
         <span class="comment">// TODO: stat should support range to check if ETag matches.
@@ -1059,8 +849,8 @@
             }
         }
 
-        Box::pin(<span class="kw">async move </span>{ acc.stat(<span class="kw-2">&amp;</span>path, args).<span class="kw">await </span>})
-    }
+        <span class="self">self</span>.acc.stat(<span class="kw-2">&amp;</span><span class="self">self</span>.path, args).<span class="kw">await
+    </span>}
 }
 
 <span class="kw">impl</span>&lt;A, R&gt; RangeReader&lt;A, R&gt;
@@ -1109,192 +899,81 @@
     </span>A: Accessor&lt;Reader = R&gt;,
     R: oio::Read,
 {
-    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
-        <span class="comment">// Sanity check for normal cases.
-        </span><span class="kw">if </span>buf.is_empty() || <span class="self">self</span>.cur &gt;= <span class="self">self</span>.size.unwrap_or(u64::MAX) {
-            <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(<span class="number">0</span>));
+    <span class="kw">async fn </span>seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, pos: SeekFrom) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="comment">// There is an optimization here that we can calculate if users trying to seek
+        // the same position, for example, `reader.seek(SeekFrom::Current(0))`.
+        // In this case, we can just return current position without dropping reader.
+        </span><span class="kw">if </span>pos == SeekFrom::Current(<span class="number">0</span>) || pos == SeekFrom::Start(<span class="self">self</span>.cur) {
+            <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="self">self</span>.cur);
         }
 
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="self">self</span>.state = <span class="kw">if </span><span class="self">self</span>.offset.is_none() {
-                    <span class="comment">// Offset is none means we are doing tailing reading.
-                    // we should stat first to get the correct offset.
-                    </span>State::SendStat(<span class="self">self</span>.stat_future())
-                } <span class="kw">else </span>{
-                    State::SendRead(<span class="self">self</span>.read_future())
-                };
-
-                <span class="self">self</span>.poll_read(cx, buf)
-            }
-            State::SendStat(fut) =&gt; {
-                <span class="kw">let </span>rp = <span class="macro">ready!</span>(Pin::new(fut).poll(cx)).map_err(|err| {
-                    <span class="comment">// If stat future returns an error, we should reset
-                    // state to Idle so that we can retry it.
-                    </span><span class="self">self</span>.state = State::Idle;
-                    err
-                })<span class="question-mark">?</span>;
-
-                <span class="kw">let </span>length = rp.into_metadata().content_length();
-                <span class="self">self</span>.ensure_offset(length)<span class="question-mark">?</span>;
-
-                <span class="self">self</span>.state = State::Idle;
-                <span class="self">self</span>.poll_read(cx, buf)
-            }
-            State::SendRead(fut) =&gt; {
-                <span class="kw">let </span>(rp, r) = <span class="macro">ready!</span>(Pin::new(fut).poll(cx)).map_err(|err| {
-                    <span class="comment">// If read future returns an error, we should reset
-                    // state to Idle so that we can retry it.
-                    </span><span class="self">self</span>.state = State::Idle;
-                    err
-                })<span class="question-mark">?</span>;
+        <span class="comment">// We are seeking to other places, let's drop existing reader.
+        </span><span class="self">self</span>.reader = <span class="prelude-val">None</span>;
 
-                <span class="self">self</span>.ensure_size(rp.range().unwrap_or_default().size(), rp.size());
+        <span class="kw">let </span>(base, amt) = <span class="kw">match </span>pos {
+            SeekFrom::Start(n) =&gt; (<span class="number">0</span>, n <span class="kw">as </span>i64),
+            SeekFrom::Current(n) =&gt; (<span class="self">self</span>.cur <span class="kw">as </span>i64, n),
+            SeekFrom::End(n) =&gt; {
+                <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
+                    (size <span class="kw">as </span>i64, n)
+                } <span class="kw">else </span>{
+                    <span class="kw">let </span>rp = <span class="self">self</span>.stat_future().<span class="kw">await</span><span class="question-mark">?</span>;
+                    <span class="kw">let </span>length = rp.into_metadata().content_length();
+                    <span class="self">self</span>.ensure_offset(length)<span class="question-mark">?</span>;
 
-                <span class="self">self</span>.state = State::Read(r);
-                <span class="self">self</span>.poll_read(cx, buf)
-            }
-            State::Read(r) =&gt; <span class="kw">match </span><span class="macro">ready!</span>(Pin::new(r).poll_read(cx, buf)) {
-                <span class="prelude-val">Ok</span>(<span class="number">0</span>) =&gt; {
-                    <span class="comment">// Reset state to Idle after all data has been consumed.
-                    </span><span class="self">self</span>.state = State::Idle;
-                    Poll::Ready(<span class="prelude-val">Ok</span>(<span class="number">0</span>))
-                }
-                <span class="prelude-val">Ok</span>(n) =&gt; {
-                    <span class="self">self</span>.cur += n <span class="kw">as </span>u64;
-                    Poll::Ready(<span class="prelude-val">Ok</span>(n))
+                    (length <span class="kw">as </span>i64, n)
                 }
-                <span class="prelude-val">Err</span>(e) =&gt; {
-                    <span class="self">self</span>.state = State::Idle;
-                    Poll::Ready(<span class="prelude-val">Err</span>(e))
-                }
-            },
-        }
-    }
-
-    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="kw">let </span>(base, amt) = <span class="kw">match </span>pos {
-                    SeekFrom::Start(n) =&gt; (<span class="number">0</span>, n <span class="kw">as </span>i64),
-                    SeekFrom::Current(n) =&gt; (<span class="self">self</span>.cur <span class="kw">as </span>i64, n),
-                    SeekFrom::End(n) =&gt; {
-                        <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
-                            (size <span class="kw">as </span>i64, n)
-                        } <span class="kw">else </span>{
-                            <span class="self">self</span>.state = State::SendStat(<span class="self">self</span>.stat_future());
-                            <span class="kw">return </span><span class="self">self</span>.poll_seek(cx, pos);
-                        }
-                    }
-                };
-
-                <span class="kw">let </span>seek_pos = <span class="kw">match </span>base.checked_add(amt) {
-                    <span class="prelude-val">Some</span>(n) <span class="kw">if </span>n &gt;= <span class="number">0 </span>=&gt; n <span class="kw">as </span>u64,
-                    <span class="kw">_ </span>=&gt; {
-                        <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
-                            ErrorKind::InvalidInput,
-                            <span class="string">"invalid seek to a negative or overflowing position"</span>,
-                        )))
-                    }
-                };
-
-                <span class="self">self</span>.cur = seek_pos;
-                Poll::Ready(<span class="prelude-val">Ok</span>(<span class="self">self</span>.cur))
             }
-            State::SendStat(fut) =&gt; {
-                <span class="kw">let </span>rp = <span class="macro">ready!</span>(Pin::new(fut).poll(cx)).map_err(|err| {
-                    <span class="comment">// If stat future returns an error, we should reset
-                    // state to Idle so that we can retry it.
-                    </span><span class="self">self</span>.state = State::Idle;
-                    err
-                })<span class="question-mark">?</span>;
-
-                <span class="kw">let </span>length = rp.into_metadata().content_length();
-                <span class="self">self</span>.ensure_offset(length)<span class="question-mark">?</span>;
+        };
 
-                <span class="self">self</span>.state = State::Idle;
-                <span class="self">self</span>.poll_seek(cx, pos)
-            }
-            State::SendRead(<span class="kw">_</span>) =&gt; {
-                <span class="comment">// It's impossible for us to go into this state while
-                // poll_seek. We can just drop this future and check state.
-                </span><span class="self">self</span>.state = State::Idle;
-                <span class="self">self</span>.poll_seek(cx, pos)
+        <span class="kw">let </span>seek_pos = <span class="kw">match </span>base.checked_add(amt) {
+            <span class="prelude-val">Some</span>(n) <span class="kw">if </span>n &gt;= <span class="number">0 </span>=&gt; n <span class="kw">as </span>u64,
+            <span class="kw">_ </span>=&gt; {
+                <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+                    ErrorKind::InvalidInput,
+                    <span class="string">"invalid seek to a negative or overflowing position"</span>,
+                ))
             }
-            State::Read(<span class="kw">_</span>) =&gt; {
-                <span class="comment">// There is an optimization here that we can calculate if users trying to seek
-                // the same position, for example, `reader.seek(SeekFrom::Current(0))`.
-                // In this case, we can just return current position without dropping reader.
-                </span><span class="kw">if </span>pos == SeekFrom::Current(<span class="number">0</span>) || pos == SeekFrom::Start(<span class="self">self</span>.cur) {
-                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(<span class="self">self</span>.cur));
-                }
+        };
 
-                <span class="self">self</span>.state = State::Idle;
-                <span class="self">self</span>.poll_seek(cx, pos)
-            }
-        }
+        <span class="self">self</span>.cur = seek_pos;
+        <span class="prelude-val">Ok</span>(<span class="self">self</span>.cur)
     }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">'_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
+    <span class="kw">async fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: usize) -&gt; <span class="prelude-ty">Result</span>&lt;Bytes&gt; {
         <span class="comment">// Sanity check for normal cases.
         </span><span class="kw">if </span><span class="self">self</span>.cur &gt;= <span class="self">self</span>.size.unwrap_or(u64::MAX) {
-            <span class="kw">return </span>Poll::Ready(<span class="prelude-val">None</span>);
+            <span class="kw">return </span><span class="prelude-val">Ok</span>(Bytes::new());
         }
 
-        <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            State::Idle =&gt; {
-                <span class="self">self</span>.state = <span class="kw">if </span><span class="self">self</span>.offset.is_none() {
-                    <span class="comment">// Offset is none means we are doing tailing reading.
-                    // we should stat first to get the correct offset.
-                    </span>State::SendStat(<span class="self">self</span>.stat_future())
-                } <span class="kw">else </span>{
-                    State::SendRead(<span class="self">self</span>.read_future())
-                };
-
-                <span class="self">self</span>.poll_next(cx)
-            }
-            State::SendStat(fut) =&gt; {
-                <span class="kw">let </span>rp = <span class="macro">ready!</span>(Pin::new(fut).poll(cx)).map_err(|err| {
... 3332 lines suppressed ...