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 2023/09/06 03:39:36 UTC

[incubator-opendal] branch gh-pages updated: deploy: 43d0327f488f26169454cd124fe34253eeb2dfe2

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/incubator-opendal.git


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

commit e3944adf01d48c5c9980e2d25bbbd8cb1939d442
Author: Xuanwo <Xu...@users.noreply.github.com>
AuthorDate: Wed Sep 6 03:39:31 2023 +0000

    deploy: 43d0327f488f26169454cd124fe34253eeb2dfe2
---
 404.html                                           |   4 +-
 .../{054cd2fb.27ffe3b8.js => 054cd2fb.18c660e5.js} |   2 +-
 assets/js/093f5f04.023ce88a.js                     |   1 -
 assets/js/093f5f04.bb698fa1.js                     |   1 +
 .../{136e1c50.24773eeb.js => 136e1c50.f6b0a8aa.js} |   2 +-
 .../{151cd40f.616d8354.js => 151cd40f.133952f6.js} |   2 +-
 .../{1957547a.6b812d48.js => 1957547a.f57a015e.js} |   2 +-
 .../{1db64337.7fc6aff5.js => 1db64337.ba871bd8.js} |   2 +-
 .../{22d8fa67.bb2ebd0c.js => 22d8fa67.77dca51d.js} |   2 +-
 .../{29b208a4.960c2b71.js => 29b208a4.17ea83a3.js} |   2 +-
 .../{2cbf1097.ca3a8391.js => 2cbf1097.ea58046a.js} |   2 +-
 .../{434bbc94.8045f704.js => 434bbc94.5ee83de4.js} |   2 +-
 .../{57a16c1d.77cede19.js => 57a16c1d.0bc696db.js} |   2 +-
 .../{592d1076.cf321b65.js => 592d1076.02c39924.js} |   2 +-
 assets/js/5a65e608.65c8b3a1.js                     |   1 +
 assets/js/5a65e608.b7cc8cd4.js                     |   1 -
 .../{62a401e9.2d43e889.js => 62a401e9.7ce17db1.js} |   2 +-
 assets/js/6eb7fe18.44970fc2.js                     |   1 +
 assets/js/6eb7fe18.57369752.js                     |   1 -
 .../{7263c0b5.8e08b831.js => 7263c0b5.fbfb5962.js} |   2 +-
 .../{8b18d929.8c837ca2.js => 8b18d929.2d979ca0.js} |   2 +-
 .../{8cc9519e.bbb7ffe5.js => 8cc9519e.916e44dd.js} |   2 +-
 .../{8f4159f2.b63b3941.js => 8f4159f2.aed9e222.js} |   2 +-
 .../{939f74f6.3cffc9b7.js => 939f74f6.4a3f8ffb.js} |   2 +-
 assets/js/9fedeb09.94fdaefb.js                     |   1 -
 assets/js/9fedeb09.b84f3117.js                     |   1 +
 .../{a0405932.f9d6e37d.js => a0405932.b328c75d.js} |   2 +-
 .../{ab10c306.ac57ae34.js => ab10c306.020d997c.js} |   2 +-
 assets/js/ae4554eb.9afefdeb.js                     |   1 +
 assets/js/ae4554eb.9d65c477.js                     |   1 -
 .../{b56f9725.b712fa87.js => b56f9725.07088943.js} |   2 +-
 assets/js/b9ae8b37.2887c093.js                     |   1 -
 assets/js/b9ae8b37.7ecc8014.js                     |   1 +
 .../{bb5b2057.fb0ae7a4.js => bb5b2057.19c179cc.js} |   2 +-
 .../{c46c6b55.fa9dc3b2.js => c46c6b55.8e05eb93.js} |   2 +-
 assets/js/c6ab695b.df685b7f.js                     |   1 +
 assets/js/c6ab695b.f7708fc9.js                     |   1 -
 .../{cc62039a.87373183.js => cc62039a.bdbcdc40.js} |   2 +-
 .../{d3c0d8d5.81dc5a98.js => d3c0d8d5.a3aca177.js} |   2 +-
 assets/js/d5c31a96.9cd214d0.js                     |   1 -
 assets/js/d5c31a96.d1c6ba48.js                     |   1 +
 .../{ddccef4c.7ee83a5a.js => ddccef4c.2bd76abf.js} |   2 +-
 .../{e892cec6.ee465ea7.js => e892cec6.f7d49e2a.js} |   2 +-
 .../{f1ca5a39.8dfaf693.js => f1ca5a39.bfe4680a.js} |   2 +-
 .../{fde7cc64.e56e1d3c.js => fde7cc64.60f80210.js} |   2 +-
 ...e~main.bb5b6511.js => runtime~main.dcb1754b.js} |   2 +-
 blog/archive/index.html                            |   4 +-
 blog/how-opendal-read-data/index.html              |   4 +-
 blog/index.html                                    |   4 +-
 blog/opendal-access-data-freely/index.html         |   4 +-
 blog/opendal-entered-apache-incubator/index.html   |   4 +-
 blog/tags/announcement/index.html                  |   4 +-
 blog/tags/index.html                               |   4 +-
 blog/tags/internal/index.html                      |   4 +-
 docs/category/contributing/index.html              |   4 +-
 docs/category/reference/index.html                 |   4 +-
 docs/category/services/index.html                  |   4 +-
 docs/contributing/committer/index.html             |   6 +-
 docs/contributing/podling-report/index.html        |   6 +-
 .../reference/generate_release_note/index.html     |   6 +-
 docs/contributing/reference/setup_gpg/index.html   |   6 +-
 docs/contributing/release/index.html               |   6 +-
 docs/contributing/verify/index.html                |   6 +-
 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/Entry.html                     |   4 +-
 docs/nodejs/classes/Lister.html                    |   4 +-
 docs/nodejs/classes/Metadata.html                  |  18 +-
 docs/nodejs/classes/Operator.html                  |  58 ++---
 docs/nodejs/interfaces/PresignedRequest.html       |   8 +-
 docs/overview/index.html                           |   6 +-
 docs/python/opendal.html                           |  54 ++--
 docs/python/search.js                              |   2 +-
 docs/rust/implementors/core/clone/trait.Clone.js   |   2 +-
 docs/rust/implementors/core/marker/trait.Freeze.js |   2 +-
 docs/rust/implementors/core/marker/trait.Send.js   |   2 +-
 docs/rust/implementors/core/marker/trait.Sync.js   |   2 +-
 docs/rust/implementors/core/marker/trait.Unpin.js  |   2 +-
 .../core/panic/unwind_safe/trait.RefUnwindSafe.js  |   2 +-
 .../core/panic/unwind_safe/trait.UnwindSafe.js     |   2 +-
 .../futures_core/stream/trait.Stream.js            |   2 +-
 docs/rust/opendal/all.html                         |   2 +-
 docs/rust/opendal/layers/struct.RetryLayer.html    |  18 +-
 docs/rust/opendal/layers/struct.ThrottleLayer.html |   6 +-
 .../opendal/layers/trait.RetryInterceptor.html     |   4 +-
 .../rust/opendal/raw/oio/enum.ThreeWaysWriter.html |  12 +-
 docs/rust/opendal/raw/oio/enum.TwoWaysWriter.html  |  12 +-
 docs/rust/opendal/raw/oio/enum.WriteOperation.html |   6 +-
 .../oio/fn.into_cloneable_reader_within_std.html   |   4 +
 .../oio/fn.into_cloneable_reader_within_tokio.html |   4 +
 .../opendal/raw/oio/fn.into_read_from_stream.html  |   2 +
 docs/rust/opendal/raw/oio/index.html               |   9 +-
 .../fn.into_cloneable_reader_within_std.html       |  11 +
 .../fn.into_cloneable_reader_within_tokio.html     |  11 +
 .../struct.CloneableReaderWithinStd.html}          |   6 +-
 .../struct.CloneableReaderWithinTokio.html}        |   6 +-
 .../fn.into_read_from_stream.html                  |  11 +
 .../struct.FromStreamReader.html}                  |   6 +-
 docs/rust/opendal/raw/oio/sidebar-items.js         |   2 +-
 .../opendal/raw/oio/struct.AppendObjectWriter.html |  16 +-
 .../rust/opendal/raw/oio/struct.ChunkedCursor.html |   8 +-
 .../raw/oio/struct.CloneableReaderWithinStd.html   |  37 +++
 .../raw/oio/struct.CloneableReaderWithinTokio.html |  37 +++
 docs/rust/opendal/raw/oio/struct.Cursor.html       |   6 +-
 .../opendal/raw/oio/struct.ExactBufWriter.html     |  24 +-
 .../opendal/raw/oio/struct.FromFileReader.html     |   2 +-
 ...BufWriter.html => struct.FromStreamReader.html} |  63 ++---
 .../raw/oio/struct.MultipartUploadWriter.html      |  10 +-
 .../rust/opendal/raw/oio/struct.OneShotWriter.html |   6 +-
 .../opendal/raw/oio/trait.AppendObjectWrite.html   |   6 +-
 docs/rust/opendal/raw/oio/trait.Read.html          |  12 +-
 docs/rust/opendal/raw/oio/trait.Stream.html        |   6 +-
 docs/rust/opendal/raw/oio/trait.StreamExt.html     |  12 +-
 docs/rust/opendal/raw/oio/trait.Write.html         |  24 +-
 docs/rust/opendal/raw/trait.Layer.html             |   2 +-
 docs/rust/opendal/struct.BlockingWriter.html       |   8 +-
 docs/rust/opendal/struct.Writer.html               |  22 +-
 docs/rust/search-index.js                          |   2 +-
 docs/rust/source-files.js                          |   2 +-
 docs/rust/src/opendal/layers/complete.rs.html      |  10 +-
 .../src/opendal/layers/concurrent_limit.rs.html    |   4 +-
 docs/rust/src/opendal/layers/error_context.rs.html |   6 +-
 docs/rust/src/opendal/layers/logging.rs.html       |   8 +-
 docs/rust/src/opendal/layers/madsim.rs.html        |   2 +-
 docs/rust/src/opendal/layers/metrics.rs.html       |   4 +-
 docs/rust/src/opendal/layers/minitrace.rs.html     |   6 +-
 docs/rust/src/opendal/layers/oteltrace.rs.html     |   4 +-
 docs/rust/src/opendal/layers/prometheus.rs.html    |   4 +-
 docs/rust/src/opendal/layers/retry.rs.html         |  18 +-
 docs/rust/src/opendal/layers/throttle.rs.html      |   6 +-
 docs/rust/src/opendal/layers/timeout.rs.html       |   6 +-
 docs/rust/src/opendal/layers/tracing.rs.html       |   4 +-
 .../src/opendal/raw/adapters/kv/backend.rs.html    |   2 +-
 .../opendal/raw/adapters/typed_kv/backend.rs.html  |   2 +-
 docs/rust/src/opendal/raw/oio/cursor.rs.html       |   2 +-
 .../opendal/raw/oio/read/cloneable_read.rs.html    | 275 ++++++++++++++++++++
 .../raw/oio/read/into_read_from_file.rs.html       |   4 +-
 .../raw/oio/read/into_read_from_stream.rs.html     | 167 ++++++++++++
 docs/rust/src/opendal/raw/oio/read/mod.rs.html     |  20 ++
 docs/rust/src/opendal/raw/oio/stream/api.rs.html   |  24 ++
 docs/rust/src/opendal/raw/oio/write/api.rs.html    |  14 +-
 .../raw/oio/write/append_object_write.rs.html      |   6 +-
 .../raw/oio/write/at_least_buf_write.rs.html       | 281 ---------------------
 .../opendal/raw/oio/write/compose_write.rs.html    |  16 +-
 .../opendal/raw/oio/write/exact_buf_write.rs.html  | 236 ++++++++---------
 docs/rust/src/opendal/raw/oio/write/mod.rs.html    |   6 -
 .../raw/oio/write/multipart_upload_write.rs.html   |  14 +-
 .../opendal/raw/oio/write/one_shot_write.rs.html   |   4 +-
 .../src/opendal/services/azblob/writer.rs.html     |  10 +-
 .../rust/src/opendal/services/azdfs/writer.rs.html |   2 +-
 docs/rust/src/opendal/services/cos/backend.rs.html |   6 +-
 .../src/opendal/services/dropbox/writer.rs.html    |   2 +-
 docs/rust/src/opendal/services/fs/writer.rs.html   |   2 +-
 docs/rust/src/opendal/services/ftp/writer.rs.html  |   2 +-
 docs/rust/src/opendal/services/gcs/writer.rs.html  |  16 +-
 .../src/opendal/services/gdrive/writer.rs.html     |   2 +-
 docs/rust/src/opendal/services/ghac/writer.rs.html |   2 +-
 docs/rust/src/opendal/services/hdfs/writer.rs.html |   2 +-
 .../rust/src/opendal/services/ipmfs/writer.rs.html |   2 +-
 docs/rust/src/opendal/services/obs/backend.rs.html |   6 +-
 .../src/opendal/services/onedrive/writer.rs.html   |   2 +-
 docs/rust/src/opendal/services/oss/backend.rs.html |   6 +-
 docs/rust/src/opendal/services/s3/backend.rs.html  |  28 +-
 docs/rust/src/opendal/services/sftp/writer.rs.html |   2 +-
 .../src/opendal/services/supabase/writer.rs.html   |   2 +-
 .../services/vercel_artifacts/writer.rs.html       |   2 +-
 .../src/opendal/services/wasabi/writer.rs.html     |   2 +-
 .../src/opendal/services/webdav/writer.rs.html     |   6 +-
 .../src/opendal/services/webhdfs/writer.rs.html    |   2 +-
 docs/rust/src/opendal/types/writer.rs.html         |  26 +-
 docs/services/azblob/index.html                    |   6 +-
 docs/services/azdfs/index.html                     |   6 +-
 docs/services/cos/index.html                       |   6 +-
 docs/services/dashmap/index.html                   |   6 +-
 docs/services/dropbox/index.html                   |   6 +-
 docs/services/etcd/index.html                      |   6 +-
 docs/services/foundationdb/index.html              |   6 +-
 docs/services/fs/index.html                        |   6 +-
 docs/services/ftp/index.html                       |   6 +-
 docs/services/gcs/index.html                       |   6 +-
 docs/services/hdfs/index.html                      |   6 +-
 docs/services/http/index.html                      |   6 +-
 docs/services/ipfs/index.html                      |   6 +-
 docs/services/ipmfs/index.html                     |   6 +-
 docs/services/memcached/index.html                 |   6 +-
 docs/services/memory/index.html                    |   6 +-
 docs/services/moka/index.html                      |   6 +-
 docs/services/obs/index.html                       |   6 +-
 docs/services/oss/index.html                       |   6 +-
 docs/services/redis/index.html                     |   6 +-
 docs/services/rocksdb/index.html                   |   6 +-
 docs/services/s3/index.html                        |   6 +-
 docs/services/sftp/index.html                      |   6 +-
 docs/services/sled/index.html                      |   6 +-
 docs/services/supabase/index.html                  |   6 +-
 docs/services/wasabi/index.html                    |   6 +-
 docs/services/webdav/index.html                    |   6 +-
 docs/services/webhdfs/index.html                   |   6 +-
 docs/vision/index.html                             |   6 +-
 download/index.html                                |   4 +-
 index.html                                         |   4 +-
 203 files changed, 1244 insertions(+), 1000 deletions(-)

diff --git a/404.html b/404.html
index 402cfee8d..b886a102d 100644
--- a/404.html
+++ b/404.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.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" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/assets/js/054cd2fb.27ffe3b8.js b/assets/js/054cd2fb.18c660e5.js
similarity index 84%
rename from assets/js/054cd2fb.27ffe3b8.js
rename to assets/js/054cd2fb.18c660e5.js
index 87ecb8733..afd026352 100644
--- a/assets/js/054cd2fb.27ffe3b8.js
+++ b/assets/js/054cd2fb.18c660e5.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1846],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1846],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/093f5f04.023ce88a.js b/assets/js/093f5f04.023ce88a.js
deleted file mode 100644
index 7a39945d3..000000000
--- a/assets/js/093f5f04.023ce88a.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6915],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/093f5f04.bb698fa1.js b/assets/js/093f5f04.bb698fa1.js
new file mode 100644
index 000000000..54e28e145
--- /dev/null
+++ b/assets/js/093f5f04.bb698fa1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6915],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/136e1c50.24773eeb.js b/assets/js/136e1c50.f6b0a8aa.js
similarity index 83%
rename from assets/js/136e1c50.24773eeb.js
rename to assets/js/136e1c50.f6b0a8aa.js
index 769bd4f83..366e24786 100644
--- a/assets/js/136e1c50.24773eeb.js
+++ b/assets/js/136e1c50.f6b0a8aa.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3057],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3057],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/151cd40f.616d8354.js b/assets/js/151cd40f.133952f6.js
similarity index 86%
rename from assets/js/151cd40f.616d8354.js
rename to assets/js/151cd40f.133952f6.js
index 2c69a4ef0..8c95e1670 100644
--- a/assets/js/151cd40f.616d8354.js
+++ b/assets/js/151cd40f.133952f6.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3702],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3702],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/1957547a.6b812d48.js b/assets/js/1957547a.f57a015e.js
similarity index 72%
rename from assets/js/1957547a.6b812d48.js
rename to assets/js/1957547a.f57a015e.js
index 0ac15c6d9..e73e4fa24 100644
--- a/assets/js/1957547a.6b812d48.js
+++ b/assets/js/1957547a.f57a015e.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4477],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4477],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/1db64337.7fc6aff5.js b/assets/js/1db64337.ba871bd8.js
similarity index 50%
rename from assets/js/1db64337.7fc6aff5.js
rename to assets/js/1db64337.ba871bd8.js
index 34bf68cf8..63a3a31dc 100644
--- a/assets/js/1db64337.7fc6aff5.js
+++ b/assets/js/1db64337.ba871bd8.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1372],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1372],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}retu [...]
\ No newline at end of file
diff --git a/assets/js/22d8fa67.bb2ebd0c.js b/assets/js/22d8fa67.77dca51d.js
similarity index 72%
rename from assets/js/22d8fa67.bb2ebd0c.js
rename to assets/js/22d8fa67.77dca51d.js
index 7dd5f5ff7..38f391b51 100644
--- a/assets/js/22d8fa67.bb2ebd0c.js
+++ b/assets/js/22d8fa67.77dca51d.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4536],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4536],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}retu [...]
\ No newline at end of file
diff --git a/assets/js/29b208a4.960c2b71.js b/assets/js/29b208a4.17ea83a3.js
similarity index 70%
rename from assets/js/29b208a4.960c2b71.js
rename to assets/js/29b208a4.17ea83a3.js
index 9d6a89d32..58ce698bd 100644
--- a/assets/js/29b208a4.960c2b71.js
+++ b/assets/js/29b208a4.17ea83a3.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6152],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6152],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/2cbf1097.ca3a8391.js b/assets/js/2cbf1097.ea58046a.js
similarity index 91%
rename from assets/js/2cbf1097.ca3a8391.js
rename to assets/js/2cbf1097.ea58046a.js
index 94dc45e69..7715a969c 100644
--- a/assets/js/2cbf1097.ca3a8391.js
+++ b/assets/js/2cbf1097.ea58046a.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2804],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2804],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/434bbc94.8045f704.js b/assets/js/434bbc94.5ee83de4.js
similarity index 85%
rename from assets/js/434bbc94.8045f704.js
rename to assets/js/434bbc94.5ee83de4.js
index af76b8ac1..372351d26 100644
--- a/assets/js/434bbc94.8045f704.js
+++ b/assets/js/434bbc94.5ee83de4.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1163],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1163],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/57a16c1d.77cede19.js b/assets/js/57a16c1d.0bc696db.js
similarity index 83%
rename from assets/js/57a16c1d.77cede19.js
rename to assets/js/57a16c1d.0bc696db.js
index c4510ba30..a078d786f 100644
--- a/assets/js/57a16c1d.77cede19.js
+++ b/assets/js/57a16c1d.0bc696db.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7757],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7757],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/592d1076.cf321b65.js b/assets/js/592d1076.02c39924.js
similarity index 83%
rename from assets/js/592d1076.cf321b65.js
rename to assets/js/592d1076.02c39924.js
index 96020c087..da07b46fb 100644
--- a/assets/js/592d1076.cf321b65.js
+++ b/assets/js/592d1076.02c39924.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[990],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retur [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[990],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retur [...]
\ No newline at end of file
diff --git a/assets/js/5a65e608.65c8b3a1.js b/assets/js/5a65e608.65c8b3a1.js
new file mode 100644
index 000000000..83a43f97a
--- /dev/null
+++ b/assets/js/5a65e608.65c8b3a1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6427],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>m});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/5a65e608.b7cc8cd4.js b/assets/js/5a65e608.b7cc8cd4.js
deleted file mode 100644
index aa42920e6..000000000
--- a/assets/js/5a65e608.b7cc8cd4.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6427],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>m});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/62a401e9.2d43e889.js b/assets/js/62a401e9.7ce17db1.js
similarity index 84%
rename from assets/js/62a401e9.2d43e889.js
rename to assets/js/62a401e9.7ce17db1.js
index fd4dbc68a..473be1208 100644
--- a/assets/js/62a401e9.2d43e889.js
+++ b/assets/js/62a401e9.7ce17db1.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6089],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6089],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/6eb7fe18.44970fc2.js b/assets/js/6eb7fe18.44970fc2.js
new file mode 100644
index 000000000..540a9d78e
--- /dev/null
+++ b/assets/js/6eb7fe18.44970fc2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3922],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/6eb7fe18.57369752.js b/assets/js/6eb7fe18.57369752.js
deleted file mode 100644
index 8d1618ff0..000000000
--- a/assets/js/6eb7fe18.57369752.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3922],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/7263c0b5.8e08b831.js b/assets/js/7263c0b5.fbfb5962.js
similarity index 72%
rename from assets/js/7263c0b5.8e08b831.js
rename to assets/js/7263c0b5.fbfb5962.js
index 998210b39..8ad02827b 100644
--- a/assets/js/7263c0b5.8e08b831.js
+++ b/assets/js/7263c0b5.fbfb5962.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4649],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4649],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/8b18d929.8c837ca2.js b/assets/js/8b18d929.2d979ca0.js
similarity index 89%
rename from assets/js/8b18d929.8c837ca2.js
rename to assets/js/8b18d929.2d979ca0.js
index 30d1268f6..b0239cdb2 100644
--- a/assets/js/8b18d929.8c837ca2.js
+++ b/assets/js/8b18d929.2d979ca0.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6299],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6299],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/8cc9519e.bbb7ffe5.js b/assets/js/8cc9519e.916e44dd.js
similarity index 89%
rename from assets/js/8cc9519e.bbb7ffe5.js
rename to assets/js/8cc9519e.916e44dd.js
index 4812b6a51..08b7056cb 100644
--- a/assets/js/8cc9519e.bbb7ffe5.js
+++ b/assets/js/8cc9519e.916e44dd.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1652],{3905:(e,t,a)=>{a.d(t,{Zo:()=>o,kt:()=>k});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1652],{3905:(e,t,a)=>{a.d(t,{Zo:()=>o,kt:()=>k});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}retu [...]
\ No newline at end of file
diff --git a/assets/js/8f4159f2.b63b3941.js b/assets/js/8f4159f2.aed9e222.js
similarity index 88%
rename from assets/js/8f4159f2.b63b3941.js
rename to assets/js/8f4159f2.aed9e222.js
index 6f5d0aad2..1b118cade 100644
--- a/assets/js/8f4159f2.b63b3941.js
+++ b/assets/js/8f4159f2.aed9e222.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4719],{3905:(e,t,a)=>{a.d(t,{Zo:()=>o,kt:()=>k});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4719],{3905:(e,t,a)=>{a.d(t,{Zo:()=>o,kt:()=>k});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}retu [...]
\ No newline at end of file
diff --git a/assets/js/939f74f6.3cffc9b7.js b/assets/js/939f74f6.4a3f8ffb.js
similarity index 86%
rename from assets/js/939f74f6.3cffc9b7.js
rename to assets/js/939f74f6.4a3f8ffb.js
index 6a3385f04..a98e4d91c 100644
--- a/assets/js/939f74f6.3cffc9b7.js
+++ b/assets/js/939f74f6.4a3f8ffb.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4277],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4277],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/9fedeb09.94fdaefb.js b/assets/js/9fedeb09.94fdaefb.js
deleted file mode 100644
index 301b70038..000000000
--- a/assets/js/9fedeb09.94fdaefb.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[9782],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/9fedeb09.b84f3117.js b/assets/js/9fedeb09.b84f3117.js
new file mode 100644
index 000000000..deb113362
--- /dev/null
+++ b/assets/js/9fedeb09.b84f3117.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[9782],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/a0405932.f9d6e37d.js b/assets/js/a0405932.b328c75d.js
similarity index 84%
rename from assets/js/a0405932.f9d6e37d.js
rename to assets/js/a0405932.b328c75d.js
index fdc24c04b..c4082869c 100644
--- a/assets/js/a0405932.f9d6e37d.js
+++ b/assets/js/a0405932.b328c75d.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[716],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retur [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[716],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retur [...]
\ No newline at end of file
diff --git a/assets/js/ab10c306.ac57ae34.js b/assets/js/ab10c306.020d997c.js
similarity index 67%
rename from assets/js/ab10c306.ac57ae34.js
rename to assets/js/ab10c306.020d997c.js
index a279950f3..a0cc4a5c0 100644
--- a/assets/js/ab10c306.ac57ae34.js
+++ b/assets/js/ab10c306.020d997c.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[380],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retur [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[380],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retur [...]
\ No newline at end of file
diff --git a/assets/js/ae4554eb.9afefdeb.js b/assets/js/ae4554eb.9afefdeb.js
new file mode 100644
index 000000000..bbe40908e
--- /dev/null
+++ b/assets/js/ae4554eb.9afefdeb.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6983],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/ae4554eb.9d65c477.js b/assets/js/ae4554eb.9d65c477.js
deleted file mode 100644
index 9f9485f13..000000000
--- a/assets/js/ae4554eb.9d65c477.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6983],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/b56f9725.b712fa87.js b/assets/js/b56f9725.07088943.js
similarity index 84%
rename from assets/js/b56f9725.b712fa87.js
rename to assets/js/b56f9725.07088943.js
index 88579c439..9d91b6a8d 100644
--- a/assets/js/b56f9725.b712fa87.js
+++ b/assets/js/b56f9725.07088943.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[217],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>f});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retur [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[217],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>f});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retur [...]
\ No newline at end of file
diff --git a/assets/js/b9ae8b37.2887c093.js b/assets/js/b9ae8b37.2887c093.js
deleted file mode 100644
index 8ce46b803..000000000
--- a/assets/js/b9ae8b37.2887c093.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6578],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var n=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/b9ae8b37.7ecc8014.js b/assets/js/b9ae8b37.7ecc8014.js
new file mode 100644
index 000000000..a13a91e5e
--- /dev/null
+++ b/assets/js/b9ae8b37.7ecc8014.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6578],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var n=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/bb5b2057.fb0ae7a4.js b/assets/js/bb5b2057.19c179cc.js
similarity index 84%
rename from assets/js/bb5b2057.fb0ae7a4.js
rename to assets/js/bb5b2057.19c179cc.js
index 9cd0c63d0..c288e48d3 100644
--- a/assets/js/bb5b2057.fb0ae7a4.js
+++ b/assets/js/bb5b2057.19c179cc.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5214],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5214],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/c46c6b55.fa9dc3b2.js b/assets/js/c46c6b55.8e05eb93.js
similarity index 83%
rename from assets/js/c46c6b55.fa9dc3b2.js
rename to assets/js/c46c6b55.8e05eb93.js
index a77e633f3..d10e0c69b 100644
--- a/assets/js/c46c6b55.fa9dc3b2.js
+++ b/assets/js/c46c6b55.8e05eb93.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5927],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5927],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/c6ab695b.df685b7f.js b/assets/js/c6ab695b.df685b7f.js
new file mode 100644
index 000000000..54614ee0b
--- /dev/null
+++ b/assets/js/c6ab695b.df685b7f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7289],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/c6ab695b.f7708fc9.js b/assets/js/c6ab695b.f7708fc9.js
deleted file mode 100644
index 8a9c7a00f..000000000
--- a/assets/js/c6ab695b.f7708fc9.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7289],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>b});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/cc62039a.87373183.js b/assets/js/cc62039a.bdbcdc40.js
similarity index 89%
rename from assets/js/cc62039a.87373183.js
rename to assets/js/cc62039a.bdbcdc40.js
index d05da2e3a..733028974 100644
--- a/assets/js/cc62039a.87373183.js
+++ b/assets/js/cc62039a.bdbcdc40.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1011],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1011],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/d3c0d8d5.81dc5a98.js b/assets/js/d3c0d8d5.a3aca177.js
similarity index 84%
rename from assets/js/d3c0d8d5.81dc5a98.js
rename to assets/js/d3c0d8d5.a3aca177.js
index 20686c296..858c9ee5f 100644
--- a/assets/js/d3c0d8d5.81dc5a98.js
+++ b/assets/js/d3c0d8d5.a3aca177.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4790],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4790],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/d5c31a96.9cd214d0.js b/assets/js/d5c31a96.9cd214d0.js
deleted file mode 100644
index 34a015a5e..000000000
--- a/assets/js/d5c31a96.9cd214d0.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2379],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}retu [...]
\ No newline at end of file
diff --git a/assets/js/d5c31a96.d1c6ba48.js b/assets/js/d5c31a96.d1c6ba48.js
new file mode 100644
index 000000000..4986402e4
--- /dev/null
+++ b/assets/js/d5c31a96.d1c6ba48.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2379],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}retu [...]
\ No newline at end of file
diff --git a/assets/js/ddccef4c.7ee83a5a.js b/assets/js/ddccef4c.2bd76abf.js
similarity index 86%
rename from assets/js/ddccef4c.7ee83a5a.js
rename to assets/js/ddccef4c.2bd76abf.js
index 91123c6a2..91a7983bb 100644
--- a/assets/js/ddccef4c.7ee83a5a.js
+++ b/assets/js/ddccef4c.2bd76abf.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[9826],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[9826],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/e892cec6.ee465ea7.js b/assets/js/e892cec6.f7d49e2a.js
similarity index 86%
rename from assets/js/e892cec6.ee465ea7.js
rename to assets/js/e892cec6.f7d49e2a.js
index 8d19b69e3..d3124a524 100644
--- a/assets/js/e892cec6.ee465ea7.js
+++ b/assets/js/e892cec6.f7d49e2a.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3845],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>f});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3845],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>f});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/f1ca5a39.8dfaf693.js b/assets/js/f1ca5a39.bfe4680a.js
similarity index 87%
rename from assets/js/f1ca5a39.8dfaf693.js
rename to assets/js/f1ca5a39.bfe4680a.js
index 5f2b86a8c..832e3c892 100644
--- a/assets/js/f1ca5a39.8dfaf693.js
+++ b/assets/js/f1ca5a39.bfe4680a.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4538],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4538],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/fde7cc64.e56e1d3c.js b/assets/js/fde7cc64.60f80210.js
similarity index 85%
rename from assets/js/fde7cc64.e56e1d3c.js
rename to assets/js/fde7cc64.60f80210.js
index 0f36e700b..56be16ba5 100644
--- a/assets/js/fde7cc64.e56e1d3c.js
+++ b/assets/js/fde7cc64.60f80210.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3454],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3454],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/runtime~main.bb5b6511.js b/assets/js/runtime~main.dcb1754b.js
similarity index 81%
rename from assets/js/runtime~main.bb5b6511.js
rename to assets/js/runtime~main.dcb1754b.js
index 3e7d8a1c5..f94c0713a 100644
--- a/assets/js/runtime~main.bb5b6511.js
+++ b/assets/js/runtime~main.dcb1754b.js
@@ -1 +1 @@
-(()=>{"use strict";var e,a,c,f,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return d[e].call(c.exports,c,c.exports,r),c.exports}r.m=d,e=[],r.O=(a,c,f,b)=>{if(!c){var d=1/0;for(i=0;i<e.length;i++){c=e[i][0],f=e[i][1],b=e[i][2];for(var t=!0,o=0;o<c.length;o++)(!1&b||d>=b)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,b<d&&(d=b));if(t){e.splice(i--,1);var n=f();void 0!==n&&(a=n)}}return a}b=b||0;for(var i=e.length;i>0&&e[i-1] [...]
\ No newline at end of file
+(()=>{"use strict";var e,a,c,f,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return d[e].call(c.exports,c,c.exports,r),c.exports}r.m=d,e=[],r.O=(a,c,f,b)=>{if(!c){var d=1/0;for(i=0;i<e.length;i++){c=e[i][0],f=e[i][1],b=e[i][2];for(var t=!0,o=0;o<c.length;o++)(!1&b||d>=b)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,b<d&&(d=b));if(t){e.splice(i--,1);var n=f();void 0!==n&&(a=n)}}return a}b=b||0;for(var i=e.length;i>0&&e[i-1] [...]
\ No newline at end of file
diff --git a/blog/archive/index.html b/blog/archive/index.html
index 3d1d63c93..ff06ac5e8 100644
--- a/blog/archive/index.html
+++ b/blog/archive/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.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" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="t [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/how-opendal-read-data/index.html b/blog/how-opendal-read-data/index.html
index 984ac018b..b4b49fbf0 100644
--- a/blog/how-opendal-read-data/index.html
+++ b/blog/how-opendal-read-data/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">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" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:la [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/index.html b/blog/index.html
index c3db4ed66..4d552ad8d 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.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" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property="og:title" content="Blog | Apache OpenDAL"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/opendal-access-data-freely/index.html b/blog/opendal-access-data-freely/index.html
index 6363d5aa8..70ca39f01 100644
--- a/blog/opendal-access-data-freely/index.html
+++ b/blog/opendal-access-data-freely/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Apache OpenDAL(Incubating): 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" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="tru [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/opendal-entered-apache-incubator/index.html b/blog/opendal-entered-apache-incubator/index.html
index 49d12a32b..7c01c8355 100644
--- a/blog/opendal-entered-apache-incubator/index.html
+++ b/blog/opendal-entered-apache-incubator/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.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" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><m [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/tags/announcement/index.html b/blog/tags/announcement/index.html
index 1b2d5cd4c..6338355db 100644
--- a/blog/tags/announcement/index.html
+++ b/blog/tags/announcement/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">2 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" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property= [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/tags/index.html b/blog/tags/index.html
index 625d58770..67e4ea1b8 100644
--- a/blog/tags/index.html
+++ b/blog/tags/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.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" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property="og:title" content="Tags | Apache OpenDAL"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/tags/internal/index.html b/blog/tags/internal/index.html
index 2f82e440b..987a99603 100644
--- a/blog/tags/internal/index.html
+++ b/blog/tags/internal/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.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" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property="og:tit [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/category/contributing/index.html b/docs/category/contributing/index.html
index b41b42e2e..c6bf15522 100644
--- a/docs/category/contributing/index.html
+++ b/docs/category/contributing/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Contributing | 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/contributing"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="cu [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/category/reference/index.html b/docs/category/reference/index.html
index 5497cd401..1180ae658 100644
--- a/docs/category/reference/index.html
+++ b/docs/category/reference/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.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/docs/category/reference"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/category/services/index.html b/docs/category/services/index.html
index 7cd479427..0837a1eae 100644
--- a/docs/category/services/index.html
+++ b/docs/category/services/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.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" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current">< [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/committer/index.html b/docs/contributing/committer/index.html
index 75dbd75c5..8b09ae883 100644
--- a/docs/contributing/committer/index.html
+++ b/docs/contributing/committer/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Committer 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/docs/contributing/committer"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" co [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/podling-report/index.html b/docs/contributing/podling-report/index.html
index 8ed6bc12d..3e9a82f62 100644
--- a/docs/contributing/podling-report/index.html
+++ b/docs/contributing/podling-report/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.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/docs/contributing/podling-report"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_vers [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/reference/generate_release_note/index.html b/docs/contributing/reference/generate_release_note/index.html
index 813b1762f..70ea23fda 100644
--- a/docs/contributing/reference/generate_release_note/index.html
+++ b/docs/contributing/reference/generate_release_note/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.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/docs/contributing/reference/generate_release_note"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" 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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/reference/setup_gpg/index.html b/docs/contributing/reference/setup_gpg/index.html
index e56ef8af6..192adb5aa 100644
--- a/docs/contributing/reference/setup_gpg/index.html
+++ b/docs/contributing/reference/setup_gpg/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.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/docs/contributing/reference/setup_gpg"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/release/index.html b/docs/contributing/release/index.html
index a49d81ec7..f99766a68 100644
--- a/docs/contributing/release/index.html
+++ b/docs/contributing/release/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">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/docs/contributing/release"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -14,8 +14,8 @@
 how the release manager releases a new version in accordance with the Apache requirements.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2><p><code>Source Release</code> is the key point which Apache values, and is also necessary for an ASF release.</p><p>Please remember that publishing software has legal consequences.</p><p>This [...]
 we will abandon that version and prepare for the next one.
 Our release page will only display ASF releases instead of GitHub Releases.</p><ul><li><code>opendal_version</code>: the version for opendal, like <code>0.36.0</code>.</li><li><code>release_version</code>: the version for voting, like <code>0.36.0-rc1</code>.</li><li><code>rc_version</code>: the minor version for voting, like <code>rc1</code>.</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-an-asf-release">Create an ASF Release<a href="#create-an-asf-release" class="ha [...]
-please cancel the release for the current <code>release_version</code>, <em>increase th RC counting</em> and reinitiate a release with the new <code>release_version</code>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="voting">Voting<a href="#voting" class="hash-link" aria-label="Direct link to Voting" title="Direct link to Voting">​</a></h2><p>As an incubating project, OpenDAL requires votes from both the OpenDAL Community and Incubator Community.</p><ul><li><code>opendal_versio [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+please cancel the release for the current <code>release_version</code>, <em>increase th RC counting</em> and reinitiate a release with the new <code>release_version</code>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="voting">Voting<a href="#voting" class="hash-link" aria-label="Direct link to Voting" title="Direct link to Voting">​</a></h2><p>As an incubating project, OpenDAL requires votes from both the OpenDAL Community and Incubator Community.</p><ul><li><code>opendal_versio [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/verify/index.html b/docs/contributing/verify/index.html
index 7ad81e71a..7b4bdf8df 100644
--- a/docs/contributing/verify/index.html
+++ b/docs/contributing/verify/index.html
@@ -5,15 +5,15 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Verify | 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/contributing/verify"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current">< [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
 You can download it directly from <a href="https://raw.githubusercontent.com/apache/incubator-opendal/main/scripts/check.sh" target="_blank" rel="noopener noreferrer">here</a>
-or check it out from the repository:</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone git@github.com:apache/incuba [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+or check it out from the repository:</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone git@github.com:apache/incuba [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </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 46279ea53..296c13bba 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 2023-09-06 02:58:39 </i>
+<i style="float:right;">Last updated 2023-09-06 03:31:06 </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 cda37aff1..b8e8ece8d 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 2023-09-06 02:58:39 </i>
+<i style="float:right;">Last updated 2023-09-06 03:31:06 </i>
 </div> <!-- id="about" -->
 </div> <!-- id="container" -->
 </body>
diff --git a/docs/lua/index.html b/docs/lua/index.html
index 1a925174f..d880ffcf3 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 2023-09-06 02:58:39 </i>
+<i style="float:right;">Last updated 2023-09-06 03:31:06 </i>
 </div> <!-- id="about" -->
 </div> <!-- id="container" -->
 </body>
diff --git a/docs/nodejs/classes/BlockingLister.html b/docs/nodejs/classes/BlockingLister.html
index 65ccdf1fa..d26f0c798 100644
--- a/docs/nodejs/classes/BlockingLister.html
+++ b/docs/nodejs/classes/BlockingLister.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">BlockingLister</span></li></ul></section><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L435">index.d.ts:435</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L435">index.d.ts:435</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">
@@ -51,7 +51,7 @@
 <li class="tsd-description">
 <h4 class="tsd-returns-title">Returns <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></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L436">index.d.ts:436</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L436">index.d.ts:436</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-sidebar">
 <div class="page-menu">
 <div class="tsd-navigation settings">
diff --git a/docs/nodejs/classes/Entry.html b/docs/nodejs/classes/Entry.html
index 13942846e..93ad6d051 100644
--- a/docs/nodejs/classes/Entry.html
+++ b/docs/nodejs/classes/Entry.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">Entry</span></li></ul></section><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L398">index.d.ts:398</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L398">index.d.ts:398</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">
@@ -53,7 +53,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L400">index.d.ts:400</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L400">index.d.ts:400</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-sidebar">
 <div class="page-menu">
 <div class="tsd-navigation settings">
diff --git a/docs/nodejs/classes/Lister.html b/docs/nodejs/classes/Lister.html
index c0df974c9..e7e19fbe6 100644
--- a/docs/nodejs/classes/Lister.html
+++ b/docs/nodejs/classes/Lister.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">Lister</span></li></ul></section><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L424">index.d.ts:424</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L424">index.d.ts:424</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">
@@ -57,7 +57,7 @@ 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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L433">index.d.ts:433</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L433">index.d.ts:433</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-sidebar">
 <div class="page-menu">
 <div class="tsd-navigation settings">
diff --git a/docs/nodejs/classes/Metadata.html b/docs/nodejs/classes/Metadata.html
index 06551d93e..44bf37ace 100644
--- a/docs/nodejs/classes/Metadata.html
+++ b/docs/nodejs/classes/Metadata.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">Metadata</span></li></ul></section><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L402">index.d.ts:402</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L402">index.d.ts:402</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">
@@ -63,7 +63,7 @@
 </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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L408">index.d.ts:408</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L408">index.d.ts:408</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="contentLength" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>content<wbr/>Length</span><a href="#contentLength" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -73,7 +73,7 @@
 </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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L410">index.d.ts:410</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L410">index.d.ts:410</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="contentMd5" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>content<wbr/>Md5</span><a href="#contentMd5" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -83,7 +83,7 @@
 </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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L412">index.d.ts:412</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L412">index.d.ts:412</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="contentType" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>content<wbr/>Type</span><a href="#contentType" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -93,7 +93,7 @@
 </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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L414">index.d.ts:414</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L414">index.d.ts:414</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="etag" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>etag</span><a href="#etag" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -103,7 +103,7 @@
 </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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L416">index.d.ts:416</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L416">index.d.ts:416</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="lastModified" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>last<wbr/>Modified</span><a href="#lastModified" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -114,7 +114,7 @@
 </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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L422">index.d.ts:422</a></li></ul></aside></li></ul></section></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L422">index.d.ts:422</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="isDirectory" class="tsd-anchor"></a>
@@ -126,7 +126,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L404">index.d.ts:404</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L404">index.d.ts:404</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-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -136,7 +136,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L406">index.d.ts:406</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L406">index.d.ts:406</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-sidebar">
 <div class="page-menu">
 <div class="tsd-navigation settings">
diff --git a/docs/nodejs/classes/Operator.html b/docs/nodejs/classes/Operator.html
index 0a93f78ce..17734c1d0 100644
--- a/docs/nodejs/classes/Operator.html
+++ b/docs/nodejs/classes/Operator.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">Operator</span></li></ul></section><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L33">index.d.ts:33</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L33">index.d.ts:33</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">
@@ -79,7 +79,7 @@
 <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><span class="tsd-signature-type ">Record</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">&gt;</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <a href="Operator.html" class="tsd-signature-type tsd-kind-class">Operator</a></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L35">index.d.ts:35</a></li></ul></aside></li></ul></section></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L35">index.d.ts:35</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>
@@ -104,7 +104,7 @@
 <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">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L170">index.d.ts:170</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L170">index.d.ts:170</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</span><a href="#check" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -117,7 +117,7 @@
 </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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L78">index.d.ts:78</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L78">index.d.ts:78</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="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -136,7 +136,7 @@
 <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-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L179">index.d.ts:179</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L179">index.d.ts:179</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="copySync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>copy<wbr/>Sync</span><a href="#copySync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -155,7 +155,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L188">index.d.ts:188</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L188">index.d.ts:188</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="#createDir" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -172,7 +172,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L105">index.d.ts:105</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L105">index.d.ts:105</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="createDirSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>create<wbr/>Dir<wbr/>Sync</span><a href="#createDirSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -189,7 +189,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L114">index.d.ts:114</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L114">index.d.ts:114</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="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -207,7 +207,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L269">index.d.ts:269</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L269">index.d.ts:269</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="deleteSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>delete<wbr/>Sync</span><a href="#deleteSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -224,7 +224,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L278">index.d.ts:278</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L278">index.d.ts:278</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="isExist" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>is<wbr/>Exist</span><a href="#isExist" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -241,7 +241,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L87">index.d.ts:87</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L87">index.d.ts:87</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="isExistSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>is<wbr/>Exist<wbr/>Sync</span><a href="#isExistSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -258,7 +258,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L96">index.d.ts:96</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L96">index.d.ts:96</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="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -277,7 +277,7 @@
 <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="Lister.html" class="tsd-signature-type tsd-kind-class">Lister</a><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L325">index.d.ts:325</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L325">index.d.ts:325</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="listSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>list<wbr/>Sync</span><a href="#listSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -296,7 +296,7 @@
 <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="BlockingLister.html" class="tsd-signature-type tsd-kind-class">BlockingLister</a></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L348">index.d.ts:348</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L348">index.d.ts:348</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="#presignRead" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -316,7 +316,7 @@
 <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="../interfaces/PresignedRequest.html" class="tsd-signature-type tsd-kind-interface">PresignedRequest</a><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L364">index.d.ts:364</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L364">index.d.ts:364</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="#presignStat" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -336,7 +336,7 @@
 <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="../interfaces/PresignedRequest.html" class="tsd-signature-type tsd-kind-interface">PresignedRequest</a><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L396">index.d.ts:396</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L396">index.d.ts:396</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="#presignWrite" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -356,7 +356,7 @@
 <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="../interfaces/PresignedRequest.html" class="tsd-signature-type tsd-kind-interface">PresignedRequest</a><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L380">index.d.ts:380</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L380">index.d.ts:380</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="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -373,7 +373,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L123">index.d.ts:123</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L123">index.d.ts:123</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="readSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>read<wbr/>Sync</span><a href="#readSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -390,7 +390,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L132">index.d.ts:132</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L132">index.d.ts:132</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="remove" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>remove</span><a href="#remove" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -408,7 +408,7 @@
 <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">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L290">index.d.ts:290</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L290">index.d.ts:290</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="removeAll" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>remove<wbr/>All</span><a href="#removeAll" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -426,7 +426,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L302">index.d.ts:302</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L302">index.d.ts:302</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="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -446,7 +446,7 @@
 <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-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L199">index.d.ts:199</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L199">index.d.ts:199</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="renameSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>rename<wbr/>Sync</span><a href="#renameSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -466,7 +466,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L210">index.d.ts:210</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L210">index.d.ts:210</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="scan" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>scan</span><a href="#scan" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -485,7 +485,7 @@
 <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="Lister.html" class="tsd-signature-type tsd-kind-class">Lister</a><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L234">index.d.ts:234</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L234">index.d.ts:234</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="scanSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>scan<wbr/>Sync</span><a href="#scanSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -504,7 +504,7 @@
 <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="BlockingLister.html" class="tsd-signature-type tsd-kind-class">BlockingLister</a></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L257">index.d.ts:257</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L257">index.d.ts:257</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="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -527,7 +527,7 @@
 <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></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L55">index.d.ts:55</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L55">index.d.ts:55</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="statSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>stat<wbr/>Sync</span><a href="#statSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -544,7 +544,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L67">index.d.ts:67</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L67">index.d.ts:67</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="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -563,7 +563,7 @@
 <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">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L143">index.d.ts:143</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L143">index.d.ts:143</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="writeSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>write<wbr/>Sync</span><a href="#writeSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -582,7 +582,7 @@
 <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><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L154">index.d.ts:154</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L154">index.d.ts:154</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-sidebar">
 <div class="page-menu">
 <div class="tsd-navigation settings">
diff --git a/docs/nodejs/interfaces/PresignedRequest.html b/docs/nodejs/interfaces/PresignedRequest.html
index 59e90026d..9a7f74bc2 100644
--- a/docs/nodejs/interfaces/PresignedRequest.html
+++ b/docs/nodejs/interfaces/PresignedRequest.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">PresignedRequest</span></li></ul></section><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L25">index.d.ts:25</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L25">index.d.ts:25</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">
@@ -40,21 +40,21 @@
 <div class="tsd-comment tsd-typography"><p>HTTP headers of this request.</p>
 </div><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L31">index.d.ts:31</a></li></ul></aside></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L31">index.d.ts:31</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 class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <div class="tsd-signature"><span class="tsd-kind-property">method</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span></div>
 <div class="tsd-comment tsd-typography"><p>HTTP method of this request.</p>
 </div><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L27">index.d.ts:27</a></li></ul></aside></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L27">index.d.ts:27</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 class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <div class="tsd-signature"><span class="tsd-kind-property">url</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span></div>
 <div class="tsd-comment tsd-typography"><p>URL of this request.</p>
 </div><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/3760176/bindings/nodejs/index.d.ts#L29">index.d.ts:29</a></li></ul></aside></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/43d0327/bindings/nodejs/index.d.ts#L29">index.d.ts:29</a></li></ul></aside></section></section></div>
 <div class="col-sidebar">
 <div class="page-menu">
 <div class="tsd-navigation settings">
diff --git a/docs/overview/index.html b/docs/overview/index.html
index 86a351db5..8dd12932b 100644
--- a/docs/overview/index.html
+++ b/docs/overview/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Overview | 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" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/python/opendal.html b/docs/python/opendal.html
index add72fc4b..694c986c4 100644
--- a/docs/python/opendal.html
+++ b/docs/python/opendal.html
@@ -165,22 +165,22 @@
                     <a class="class" href="#Metadata">Metadata</a>
                             <ul class="memberlist">
                         <li>
-                                <a class="variable" href="#Metadata.content_md5">content_md5</a>
+                                <a class="variable" href="#Metadata.content_disposition">content_disposition</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Metadata.mode">mode</a>
+                                <a class="variable" href="#Metadata.etag">etag</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Metadata.content_disposition">content_disposition</a>
+                                <a class="variable" href="#Metadata.mode">mode</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Metadata.content_length">content_length</a>
+                                <a class="variable" href="#Metadata.content_md5">content_md5</a>
                         </li>
                         <li>
                                 <a class="variable" href="#Metadata.content_type">content_type</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Metadata.etag">etag</a>
+                                <a class="variable" href="#Metadata.content_length">content_length</a>
                         </li>
                 </ul>
 
@@ -924,52 +924,52 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
     
     
 
-                            <div id="Metadata.content_md5" class="classattr">
+                            <div id="Metadata.content_disposition" class="classattr">
                                 <div class="attr variable">
-            <span class="name">content_md5</span><span class="annotation">: Optional[str]</span>
+            <span class="name">content_disposition</span><span class="annotation">: Optional[str]</span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.content_md5"></a>
+    <a class="headerlink" href="#Metadata.content_disposition"></a>
+    
     
-            <div class="docstring"><p>Content MD5 of this entry.</p>
-</div>
-
 
                             </div>
-                            <div id="Metadata.mode" class="classattr">
+                            <div id="Metadata.etag" class="classattr">
                                 <div class="attr variable">
-            <span class="name">mode</span><span class="annotation">: <a href="#EntryMode">opendal.EntryMode</a></span>
+            <span class="name">etag</span><span class="annotation">: Optional[str]</span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.mode"></a>
+    <a class="headerlink" href="#Metadata.etag"></a>
     
-            <div class="docstring"><p>mode represent this entry's mode.</p>
+            <div class="docstring"><p>ETag of this entry.</p>
 </div>
 
 
                             </div>
-                            <div id="Metadata.content_disposition" class="classattr">
+                            <div id="Metadata.mode" class="classattr">
                                 <div class="attr variable">
-            <span class="name">content_disposition</span><span class="annotation">: Optional[str]</span>
+            <span class="name">mode</span><span class="annotation">: <a href="#EntryMode">opendal.EntryMode</a></span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.content_disposition"></a>
-    
+    <a class="headerlink" href="#Metadata.mode"></a>
     
+            <div class="docstring"><p>mode represent this entry's mode.</p>
+</div>
+
 
                             </div>
-                            <div id="Metadata.content_length" class="classattr">
+                            <div id="Metadata.content_md5" class="classattr">
                                 <div class="attr variable">
-            <span class="name">content_length</span><span class="annotation">: int</span>
+            <span class="name">content_md5</span><span class="annotation">: Optional[str]</span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.content_length"></a>
+    <a class="headerlink" href="#Metadata.content_md5"></a>
     
-            <div class="docstring"><p>Content length of this entry.</p>
+            <div class="docstring"><p>Content MD5 of this entry.</p>
 </div>
 
 
@@ -987,15 +987,15 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
 
 
                             </div>
-                            <div id="Metadata.etag" class="classattr">
+                            <div id="Metadata.content_length" class="classattr">
                                 <div class="attr variable">
-            <span class="name">etag</span><span class="annotation">: Optional[str]</span>
+            <span class="name">content_length</span><span class="annotation">: int</span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.etag"></a>
+    <a class="headerlink" href="#Metadata.content_length"></a>
     
-            <div class="docstring"><p>ETag of this entry.</p>
+            <div class="docstring"><p>Content length of this entry.</p>
 </div>
 
 
diff --git a/docs/python/search.js b/docs/python/search.js
index ccae8713f..3b50cb4a9 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>OpenDAL 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=\"w\"> </span> [...]
+    /** 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>OpenDAL 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=\"w\"> </span> [...]
 
     // 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/rust/implementors/core/clone/trait.Clone.js b/docs/rust/implementors/core/clone/trait.Clone.js
index dad9b7b4a..1cd5b3110 100644
--- a/docs/rust/implementors/core/clone/trait.Clone.js
+++ b/docs/rust/implementors/core/clone/trait.Clone.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"enum\" href=\"opendal/raw/oio/enum.PageOperation.html\" title=\"enum opendal::raw::oio::PageOperation\">PageOperation</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"opendal/raw/struct.RpCopy.htm [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"enum\" href=\"opendal/raw/oio/enum.PageOperation.html\" title=\"enum opendal::raw::oio::PageOperation\">PageOperation</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"opendal/raw/struct.RpCopy.htm [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/marker/trait.Freeze.js b/docs/rust/implementors/core/marker/trait.Freeze.js
index 711310b62..b37cd847f 100644
--- a/docs/rust/implementors/core/marker/trait.Freeze.js
+++ b/docs/rust/implementors/core/marker/trait.Freeze.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl Freeze for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl Freeze for <a class=\"struct\" href=\"opendal/struct.Entry.html\" title=\"struct opendal::Entry\">Entry</a>",1,["opendal::types::entry::Entry"]],["impl Freeze for <a class=\"struct\" href=\"opendal/struct.Metadata.html\" title=\"struct opendal::Metadata\">Metadata</a>",1,["opendal::types::metadata::Metadata"]],[ [...]
+"opendal":[["impl Freeze for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl Freeze for <a class=\"struct\" href=\"opendal/struct.Entry.html\" title=\"struct opendal::Entry\">Entry</a>",1,["opendal::types::entry::Entry"]],["impl Freeze for <a class=\"struct\" href=\"opendal/struct.Metadata.html\" title=\"struct opendal::Metadata\">Metadata</a>",1,["opendal::types::metadata::Metadata"]],[ [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/marker/trait.Send.js b/docs/rust/implementors/core/marker/trait.Send.js
index b76f235a8..fce3f835b 100644
--- a/docs/rust/implementors/core/marker/trait.Send.js
+++ b/docs/rust/implementors/core/marker/trait.Send.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"opendal/struct.Entry.ht [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"opendal/struct.Entry.ht [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/marker/trait.Sync.js b/docs/rust/implementors/core/marker/trait.Sync.js
index 6f77e586a..d92452598 100644
--- a/docs/rust/implementors/core/marker/trait.Sync.js
+++ b/docs/rust/implementors/core/marker/trait.Sync.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"opendal/struct.Entry.ht [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"opendal/struct.Entry.ht [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/marker/trait.Unpin.js b/docs/rust/implementors/core/marker/trait.Unpin.js
index d4b533208..8e4338629 100644
--- a/docs/rust/implementors/core/marker/trait.Unpin.js
+++ b/docs/rust/implementors/core/marker/trait.Unpin.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"opendal/struct.En [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"opendal/struct.En [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js b/docs/rust/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
index 3c2f304e1..f71162661 100644
--- a/docs/rust/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
+++ b/docs/rust/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html\" title=\"trait core::panic::unwind_safe::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html\" title=\"trait core::panic::u [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html\" title=\"trait core::panic::unwind_safe::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html\" title=\"trait core::panic::u [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/panic/unwind_safe/trait.UnwindSafe.js b/docs/rust/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
index aed6aa6dd..8dde69f1b 100644
--- a/docs/rust/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
+++ b/docs/rust/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html\" title=\"trait core::panic::unwind_safe::UnwindSafe\">UnwindSafe</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html\" title=\"trait core::panic::unwind_safe:: [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html\" title=\"trait core::panic::unwind_safe::UnwindSafe\">UnwindSafe</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html\" title=\"trait core::panic::unwind_safe:: [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/futures_core/stream/trait.Stream.js b/docs/rust/implementors/futures_core/stream/trait.Stream.js
index 28eecfce8..9c4108d7b 100644
--- a/docs/rust/implementors/futures_core/stream/trait.Stream.js
+++ b/docs/rust/implementors/futures_core/stream/trait.Stream.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl Stream for dyn <a class=\"trait\" href=\"opendal/raw/oio/trait.Read.html\" title=\"trait opendal::raw::oio::Read\">Read</a>"],["impl Stream for <a class=\"struct\" href=\"opendal/struct.Reader.html\" title=\"struct opendal::Reader\">Reader</a>"],["impl Stream for dyn <a class=\"trait\" href=\"opendal/raw/oio/trait.Stream.html\" title=\"trait opendal::raw::oio::Stream\">Stream</a>"],["impl Stream for <a class=\"struct\" href=\"opendal/struct.Lister.html\" title=\"struct  [...]
+"opendal":[["impl Stream for dyn <a class=\"trait\" href=\"opendal/raw/oio/trait.Read.html\" title=\"trait opendal::raw::oio::Read\">Read</a>"],["impl Stream for dyn <a class=\"trait\" href=\"opendal/raw/oio/trait.Stream.html\" title=\"trait opendal::raw::oio::Stream\">Stream</a>"],["impl Stream for <a class=\"struct\" href=\"opendal/struct.Reader.html\" title=\"struct opendal::Reader\">Reader</a>"],["impl Stream for <a class=\"struct\" href=\"opendal/struct.Lister.html\" title=\"struct  [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/opendal/all.html b/docs/rust/opendal/all.html
index c3103e6ca..d7418e43a 100644
--- a/docs/rust/opendal/all.html
+++ b/docs/rust/opendal/all.html
@@ -1 +1 @@
-<!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 [...]
\ No newline at end of file
+<!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 [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/layers/struct.RetryLayer.html b/docs/rust/opendal/layers/struct.RetryLayer.html
index ddec8e258..00f092690 100644
--- a/docs/rust/opendal/layers/struct.RetryLayer.html
+++ b/docs/rust/opendal/layers/struct.RetryLayer.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="Add retry for temporary failed operations."><title>RetryLayer 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" crossorigin [...]
+<!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 retry for temporary failed operations."><title>RetryLayer 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" crossorigin [...]
 <h2 id="notes"><a href="#notes">Notes</a></h2>
 <p>This layer will retry failed operations when <a href="../struct.Error.html#method.is_temporary" title="method opendal::Error::is_temporary"><code>Error::is_temporary</code></a>
 returns true. If operation still failed, this layer will set error to
@@ -41,7 +41,7 @@ their own retry interceptor logic.</p>
     .expect(<span class="string">&quot;must init&quot;</span>)
     .layer(RetryLayer::new().with_notify(MyRetryInterceptor))
     .finish();</code></pre></div>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-RetryLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#122-214">source</a><a href="#impl-RetryLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.RetryLayer.html" title= [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-RetryLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#121-213">source</a><a href="#impl-RetryLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.RetryLayer.html" title= [...]
 <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>anyhow::Result;
 <span class="kw">use </span>opendal::layers::RetryLayer;
@@ -52,7 +52,7 @@ their own retry interceptor logic.</p>
 <span class="kw">let _ </span>= Operator::new(services::Memory::default())
     .expect(<span class="string">&quot;must init&quot;</span>)
     .layer(RetryLayer::new());</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_notify" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#167-172">source</a><h4 class="code-header">pub fn <a href="#method.with_notify" class="fn">with_notify</a>&lt;I: <a class="trait" href="trait.RetryInterceptor.html" title="trait opendal::layers::RetryInterceptor">RetryInterceptor</a>&gt;(self, notify: I) -&gt; <a class="struct" href="struct.RetryLayer [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_notify" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#166-171">source</a><h4 class="code-header">pub fn <a href="#method.with_notify" class="fn">with_notify</a>&lt;I: <a class="trait" href="trait.RetryInterceptor.html" title="trait opendal::layers::RetryInterceptor">RetryInterceptor</a>&gt;(self, notify: I) -&gt; <a class="struct" href="struct.RetryLayer [...]
 
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>std::time::Duration;
 
@@ -76,18 +76,18 @@ their own retry interceptor logic.</p>
     .expect(<span class="string">&quot;must init&quot;</span>)
     .layer(RetryLayer::new().with_notify(MyRetryInterceptor))
     .finish();</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_jitter" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#178-181">source</a><h4 class="code-header">pub fn <a href="#method.with_jitter" class="fn">with_jitter</a>(self) -&gt; Self</h4></section></summary><div class="docblock"><p>Set jitter of current backoff.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_jitter" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#177-180">source</a><h4 class="code-header">pub fn <a href="#method.with_jitter" class="fn">with_jitter</a>(self) -&gt; Self</h4></section></summary><div class="docblock"><p>Set jitter of current backoff.</p>
 <p>If jitter is enabled, ExponentialBackoff will add a random jitter in `[0, min_delay)
 to current delay.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_factor" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#188-191">source</a><h4 class="code-header">pub fn <a href="#method.with_factor" class="fn">with_factor</a>(self, factor: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.f32.html">f32</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Set factor of current backoff.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_factor" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#187-190">source</a><h4 class="code-header">pub fn <a href="#method.with_factor" class="fn">with_factor</a>(self, factor: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.f32.html">f32</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Set factor of current backoff.</p>
 <h5 id="panics"><a href="#panics">Panics</a></h5>
 <p>This function will panic if input factor smaller than <code>1.0</code>.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_min_delay" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#194-197">source</a><h4 class="code-header">pub fn <a href="#method.with_min_delay" class="fn">with_min_delay</a>(self, min_delay: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/time/struct.Duration.html" title="struct core::time::Duration">Duration</a>) -&gt; Self</h4></section></sum [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_max_delay" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#202-205">source</a><h4 class="code-header">pub fn <a href="#method.with_max_delay" class="fn">with_max_delay</a>(self, max_delay: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/time/struct.Duration.html" title="struct core::time::Duration">Duration</a>) -&gt; Self</h4></section></sum [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_min_delay" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#193-196">source</a><h4 class="code-header">pub fn <a href="#method.with_min_delay" class="fn">with_min_delay</a>(self, min_delay: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/time/struct.Duration.html" title="struct core::time::Duration">Duration</a>) -&gt; Self</h4></section></sum [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_max_delay" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#201-204">source</a><h4 class="code-header">pub fn <a href="#method.with_max_delay" class="fn">with_max_delay</a>(self, max_delay: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/time/struct.Duration.html" title="struct core::time::Duration">Duration</a>) -&gt; Self</h4></section></sum [...]
 <p>Delay will not increasing if current delay is larger than max_delay.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_max_times" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#210-213">source</a><h4 class="code-header">pub fn <a href="#method.with_max_times" class="fn">with_max_times</a>(self, max_times: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Set max_time [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_max_times" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#209-212">source</a><h4 class="code-header">pub fn <a href="#method.with_max_times" class="fn">with_max_times</a>(self, max_times: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Set max_time [...]
 <p>Backoff will return <code>None</code> if max times is reaching.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="small-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-RetryLayer%3CI%3E" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#104-111">source</a><a href="#impl-Clone-for-RetryLayer%3CI%3E" class="anchor">§</a><h3 [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-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-RetryLayer%3CI%3E" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#103-110">source</a><a href="#impl-Clone-for-RetryLayer%3CI%3E" class="anchor">§</a><h3 [...]
     I: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section><section id="impl-Send-for-RetryLayer%3CI%3E" class="impl"><a href="#impl-Send-for-RetryLayer%3CI%3E" class="anchor">§</a><h3 class="code-header">impl&lt;I&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> [...]
     I: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</span></h3></section><section id="impl-Sync-for-RetryLayer%3CI%3E" class="impl"><a href="#impl-Sync-for-RetryLayer%3CI%3E" class="anchor">§</a><h3 class="code-header">impl&lt;I&gt; <a class="trait" href="https://doc.rust-lang.or [...]
     I: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</span></h3></section><section id="impl-Unpin-for-RetryLayer%3CI%3E" class="impl"><a href="#impl-Unpin-for-RetryLayer%3CI%3E" class="anchor">§</a><h3 class="code-header">impl&lt;I&gt; <a class="trait" href="https://doc.rust-lang. [...]
diff --git a/docs/rust/opendal/layers/struct.ThrottleLayer.html b/docs/rust/opendal/layers/struct.ThrottleLayer.html
index afcc3a500..26d613892 100644
--- a/docs/rust/opendal/layers/struct.ThrottleLayer.html
+++ b/docs/rust/opendal/layers/struct.ThrottleLayer.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="Add a bandwidth rate limiter to the underlying services."><title>ThrottleLayer 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/w [...]
+<!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 a bandwidth rate limiter to the underlying services."><title>ThrottleLayer 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/w [...]
 <h2 id="throttle"><a href="#throttle">Throttle</a></h2>
 <p>There are several algorithms when it come to rate limiting techniques.
 This throttle layer uses Generic Cell Rate Algorithm (GCRA) provided by
@@ -21,12 +21,12 @@ as <strong>the burst size should be larger than any possible byte length to allo
     .expect(<span class="string">&quot;must init&quot;</span>)
     .layer(ThrottleLayer::new(<span class="number">10 </span>* <span class="number">1024</span>, <span class="number">10000 </span>* <span class="number">1024</span>))
     .finish();</code></pre></div>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ThrottleLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/throttle.rs.html#77-90">source</a><a href="#impl-ThrottleLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ThrottleLayer.ht [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ThrottleLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/throttle.rs.html#76-89">source</a><a href="#impl-ThrottleLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ThrottleLayer.ht [...]
 <ul>
 <li>bandwidth: the maximum number of bytes allowed to pass through per second.</li>
 <li>burst: the maximum number of bytes allowed to pass through at once.</li>
 </ul>
-</div></details></div></details></div><h2 id="trait-implementations" class="small-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-ThrottleLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/throttle.rs.html#71">source</a><a href="#impl-Clone-for-ThrottleLayer" class="anchor">§</a><h3 class="co [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-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-ThrottleLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/throttle.rs.html#70">source</a><a href="#impl-Clone-for-ThrottleLayer" class="anchor">§</a><h3 class="co [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></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="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></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="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
diff --git a/docs/rust/opendal/layers/trait.RetryInterceptor.html b/docs/rust/opendal/layers/trait.RetryInterceptor.html
index f01e72b66..00d4e417d 100644
--- a/docs/rust/opendal/layers/trait.RetryInterceptor.html
+++ b/docs/rust/opendal/layers/trait.RetryInterceptor.html
@@ -1,8 +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="RetryInterceptor is used to intercept while retry happened."><title>RetryInterceptor 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=" [...]
+<!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="RetryInterceptor is used to intercept while retry happened."><title>RetryInterceptor 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=" [...]
     // Required method
     fn <a href="#tymethod.intercept" class="fn">intercept</a>(&amp;self, err: &amp;<a class="struct" href="../struct.Error.html" title="struct opendal::Error">Error</a>, dur: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/time/struct.Duration.html" title="struct core::time::Duration">Duration</a>, ctx: &amp;[(&amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>, &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std [...]
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>RetryInterceptor is used to intercept while retry happened.</p>
-</div></details><h2 id="required-methods" class="small-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.intercept" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#246">source</a><h4 class="code-header">fn <a href="#tymethod.intercept" class="fn">intercept</a>(&amp;self, err: &amp;<a class="struct" href="../struct.Error [...]
+</div></details><h2 id="required-methods" class="small-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.intercept" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#245">source</a><h4 class="code-header">fn <a href="#tymethod.intercept" class="fn">intercept</a>(&amp;self, err: &amp;<a class="struct" href="../struct.Error [...]
 <h5 id="timing"><a href="#timing">Timing</a></h5>
 <p>just before the retry sleep.</p>
 <h5 id="inputs"><a href="#inputs">Inputs</a></h5>
diff --git a/docs/rust/opendal/raw/oio/enum.ThreeWaysWriter.html b/docs/rust/opendal/raw/oio/enum.ThreeWaysWriter.html
index 78f3fb14e..61ebef5d3 100644
--- a/docs/rust/opendal/raw/oio/enum.ThreeWaysWriter.html
+++ b/docs/rust/opendal/raw/oio/enum.ThreeWaysWriter.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="ThreeWaysWriter is used to implement [`Write`] based on three ways."><title>ThreeWaysWriter 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=" [...]
+<!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="ThreeWaysWriter is used to implement [`Write`] based on three ways."><title>ThreeWaysWriter 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=" [...]
     One(ONE),
     Two(TWO),
     Three(THREE),
@@ -7,22 +7,22 @@
 </div></details><h2 id="variants" class="variants small-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.ThreeWaysWriter.html" title="enum opendal::raw::oio::ThreeWaysWriter"><code>ThreeWaysWriter</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.ThreeWaysWriter.html" title="enum opendal::raw::oio::ThreeWaysWriter"><code>ThreeWaysWriter</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.ThreeWaysWriter.html" title="enum opendal::raw::oio::ThreeWaysWriter"><code>ThreeWaysWriter</code></a>.</p>
-</div></div><h2 id="trait-implementations" class="small-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-Write-for-ThreeWaysWriter%3CONE,+TWO,+THREE%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#102-136">source</a><a href="#impl-Write-for-ThreeWaysWriter%3CONE,+TWO,+THR [...]
+</div></div><h2 id="trait-implementations" class="small-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-Write-for-ThreeWaysWriter%3CONE,+TWO,+THREE%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#101-135">source</a><a href="#impl-Write-for-ThreeWaysWriter%3CONE,+TWO,+THR [...]
     &amp;'life0 mut self,
     bs: Bytes
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.sink" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#113-119">source</a><a href="#method.sink" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html# [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.pipe" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#112-118">source</a><a href="#method.pipe" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html# [...]
     &amp;'life0 mut self,
     size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
-    s: <a class="type" href="type.Streamer.html" title="type opendal::raw::oio::Streamer">Streamer</a>
+    s: <a class="type" href="type.Reader.html" title="type opendal::raw::oio::Reader">Reader</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Sink given stream into writer. <a href="trait.Write.html#tymethod.sink">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#121-127">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Sink given stream into writer. <a href="trait.Write.html#tymethod.pipe">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#120-126">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html [...]
     &amp;'life0 mut self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#129-135">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.close" class="fn">close</a>&lt;'life0, 'async_trait&gt;(
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#128-134">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.close" class="fn">close</a>&lt;'life0, 'async_trait&gt;(
     &amp;'life0 mut self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
diff --git a/docs/rust/opendal/raw/oio/enum.TwoWaysWriter.html b/docs/rust/opendal/raw/oio/enum.TwoWaysWriter.html
index 52197f4e2..408fd42e8 100644
--- a/docs/rust/opendal/raw/oio/enum.TwoWaysWriter.html
+++ b/docs/rust/opendal/raw/oio/enum.TwoWaysWriter.html
@@ -1,26 +1,26 @@
-<!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="TwoWaysWrite is used to implement [`Write`] based on two ways."><title>TwoWaysWriter 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" t [...]
+<!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="TwoWaysWrite is used to implement [`Write`] based on two ways."><title>TwoWaysWriter 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" t [...]
     One(ONE),
     Two(TWO),
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>TwoWaysWrite is used to implement [<code>Write</code>] based on two ways.</p>
 <p>Users can wrap two different writers together.</p>
 </div></details><h2 id="variants" class="variants small-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.TwoWaysWriter.html" title="enum opendal::raw::oio::TwoWaysWriter"><code>TwoWaysWriter</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.TwoWaysWriter.html" title="enum opendal::raw::oio::TwoWaysWriter"><code>TwoWaysWriter</code></a>.</p>
-</div></div><h2 id="trait-implementations" class="small-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-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#59-87">source</a><a href="#impl-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="anchor [...]
+</div></div><h2 id="trait-implementations" class="small-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-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#58-86">source</a><a href="#impl-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="anchor [...]
     &amp;'life0 mut self,
     bs: Bytes
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.sink" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#67-72">source</a><a href="#method.sink" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#ty [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.pipe" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#66-71">source</a><a href="#method.pipe" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#ty [...]
     &amp;'life0 mut self,
     size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
-    s: <a class="type" href="type.Streamer.html" title="type opendal::raw::oio::Streamer">Streamer</a>
+    s: <a class="type" href="type.Reader.html" title="type opendal::raw::oio::Reader">Reader</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Sink given stream into writer. <a href="trait.Write.html#tymethod.sink">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#74-79">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#t [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Sink given stream into writer. <a href="trait.Write.html#tymethod.pipe">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#73-78">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#t [...]
     &amp;'life0 mut self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#81-86">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.close" class="fn">close</a>&lt;'life0, 'async_trait&gt;(
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#80-85">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.close" class="fn">close</a>&lt;'life0, 'async_trait&gt;(
     &amp;'life0 mut self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
diff --git a/docs/rust/opendal/raw/oio/enum.WriteOperation.html b/docs/rust/opendal/raw/oio/enum.WriteOperation.html
index d76d03690..7ac905c28 100644
--- a/docs/rust/opendal/raw/oio/enum.WriteOperation.html
+++ b/docs/rust/opendal/raw/oio/enum.WriteOperation.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="WriteOperation is the name for APIs of Writer."><title>WriteOperation 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 [...]
+<!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="WriteOperation is the name for APIs of Writer."><title>WriteOperation 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 [...]
     Write,
-    Sink,
+    Pipe,
     Abort,
     Close,
     BlockingWrite,
     BlockingClose,
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>WriteOperation is the name for APIs of Writer.</p>
 </div></details><h2 id="variants" class="variants small-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 variant [...]
-</div><section id="variant.Sink" class="variant"><a href="#variant.Sink" class="anchor">§</a><h3 class="code-header">Sink</h3></section><div class="docblock"><p>Operation for <a href="trait.Write.html#tymethod.sink" title="method opendal::raw::oio::Write::sink"><code>Write::sink</code></a></p>
+</div><section id="variant.Pipe" class="variant"><a href="#variant.Pipe" class="anchor">§</a><h3 class="code-header">Pipe</h3></section><div class="docblock"><p>Operation for <a href="trait.Write.html#tymethod.pipe" title="method opendal::raw::oio::Write::pipe"><code>Write::pipe</code></a></p>
 </div><section id="variant.Abort" class="variant"><a href="#variant.Abort" class="anchor">§</a><h3 class="code-header">Abort</h3></section><div class="docblock"><p>Operation for <a href="trait.Write.html#tymethod.abort" title="method opendal::raw::oio::Write::abort"><code>Write::abort</code></a></p>
 </div><section id="variant.Close" class="variant"><a href="#variant.Close" class="anchor">§</a><h3 class="code-header">Close</h3></section><div class="docblock"><p>Operation for <a href="trait.Write.html#tymethod.close" title="method opendal::raw::oio::Write::close"><code>Write::close</code></a></p>
 </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>
diff --git a/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_std.html b/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_std.html
new file mode 100644
index 000000000..8a1a8d62e
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_std.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="Convert given reader into a wrapper with `std::sync::Mutex` for `Send + Sync + Clone`."><title>into_cloneable_reader_within_std in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295 [...]
+    reader: R
+) -&gt; <a class="struct" href="struct.CloneableReaderWithinStd.html" title="struct opendal::raw::oio::CloneableReaderWithinStd">CloneableReaderWithinStd</a>&lt;R&gt;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Convert given reader into a wrapper with <code>std::sync::Mutex</code> for <code>Send + Sync + Clone</code>.</p>
+</div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_tokio.html b/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_tokio.html
new file mode 100644
index 000000000..5c023a0c3
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_tokio.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="Convert given reader into a wrapper with `tokio::sync::Mutex` for `Send + Sync + Clone`."><title>into_cloneable_reader_within_tokio in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac [...]
+    reader: R
+) -&gt; <a class="struct" href="struct.CloneableReaderWithinTokio.html" title="struct opendal::raw::oio::CloneableReaderWithinTokio">CloneableReaderWithinTokio</a>&lt;R&gt;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Convert given reader into a wrapper with <code>tokio::sync::Mutex</code> for <code>Send + Sync + Clone</code>.</p>
+</div></details></section></div></main></body></html>
\ No newline at end of file
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
new file mode 100644
index 000000000..7ac770de0
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/fn.into_read_from_stream.html
@@ -0,0 +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="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. [...]
+</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 250a50e94..f2e2760de 100644
--- a/docs/rust/opendal/raw/oio/index.html
+++ b/docs/rust/opendal/raw/oio/index.html
@@ -3,9 +3,10 @@ output.</p>
 <p>Those types should only be used internally and we don’t want users to
 depend on them. So we should also implement trait like <code>AsyncRead</code> for
 our <code>output</code> traits.</p>
-</div></details><h2 id="structs" class="small-section-header"><a href="#structs">Structs</a></h2><ul class="item-table"><li><div class="item-name"><a class="struct" href="struct.AppendObjectWriter.html" title="struct opendal::raw::oio::AppendObjectWriter">AppendObjectWriter</a></div><div class="desc docblock-short">AppendObjectWriter will implements [<code>Write</code>] based on append object.</div></li><li><div class="item-name"><a class="struct" href="struct.AtLeastBufWriter.html" titl [...]
-the underlying storage when the buffered size is larger.</div></li><li><div class="item-name"><a class="struct" href="struct.ByRangeSeekableReader.html" title="struct opendal::raw::oio::ByRangeSeekableReader">ByRangeSeekableReader</a></div><div class="desc docblock-short">ByRangeReader that can do seek on non-seekable reader.</div></li><li><div class="item-name"><a class="struct" href="struct.ChunkedCursor.html" title="struct opendal::raw::oio::ChunkedCursor">ChunkedCursor</a></div><div  [...]
-underlying storage when the buffered size is exactly the same as the buffer size.</div></li><li><div class="item-name"><a class="struct" href="struct.FlatPager.html" title="struct opendal::raw::oio::FlatPager">FlatPager</a></div><div class="desc docblock-short">ToFlatPager will walk dir in bottom up way:</div></li><li><div class="item-name"><a class="struct" href="struct.FromFileReader.html" title="struct opendal::raw::oio::FromFileReader">FromFileReader</a></div><div class="desc docbloc [...]
+</div></details><h2 id="structs" class="small-section-header"><a href="#structs">Structs</a></h2><ul class="item-table"><li><div class="item-name"><a class="struct" href="struct.AppendObjectWriter.html" title="struct opendal::raw::oio::AppendObjectWriter">AppendObjectWriter</a></div><div class="desc docblock-short">AppendObjectWriter will implements [<code>Write</code>] based on append object.</div></li><li><div class="item-name"><a class="struct" href="struct.ByRangeSeekableReader.html" [...]
+reader.</div></li><li><div class="item-name"><a class="struct" href="struct.CloneableReaderWithinTokio.html" title="struct opendal::raw::oio::CloneableReaderWithinTokio">CloneableReaderWithinTokio</a></div><div class="desc docblock-short">CloneableReaderWithinTokio is a Send + Sync + Clone with <code>tokio::sync::Mutex</code> wrapper of input
+reader.</div></li><li><div class="item-name"><a class="struct" href="struct.Cursor.html" title="struct opendal::raw::oio::Cursor">Cursor</a></div><div class="desc docblock-short">Cursor is the cursor for [<code>Bytes</code>] that implements <a href="trait.Read.html" title="trait opendal::raw::oio::Read"><code>oio::Read</code></a></div></li><li><div class="item-name"><a class="struct" href="struct.Entry.html" title="struct opendal::raw::oio::Entry">Entry</a></div><div class="desc docblock [...]
+underlying storage when the buffered size is exactly the same as the buffer size.</div></li><li><div class="item-name"><a class="struct" href="struct.FlatPager.html" title="struct opendal::raw::oio::FlatPager">FlatPager</a></div><div class="desc docblock-short">ToFlatPager will walk dir in bottom up way:</div></li><li><div class="item-name"><a class="struct" href="struct.FromFileReader.html" title="struct opendal::raw::oio::FromFileReader">FromFileReader</a></div><div class="desc docbloc [...]
 not needed entries.</div></li><li><div class="item-name"><a class="struct" href="struct.MultipartUploadPart.html" title="struct opendal::raw::oio::MultipartUploadPart">MultipartUploadPart</a></div><div class="desc docblock-short">The result of <a href="trait.MultipartUploadWrite.html#tymethod.write_part" title="method opendal::raw::oio::MultipartUploadWrite::write_part"><code>MultipartUploadWrite::write_part</code></a>.</div></li><li><div class="item-name"><a class="struct" href="struct. [...]
 uploads.</div></li><li><div class="item-name"><a class="struct" href="struct.OneShotWriter.html" title="struct opendal::raw::oio::OneShotWriter">OneShotWriter</a></div><div class="desc docblock-short">OneShotWrite is used to implement [<code>Write</code>] based on one shot.</div></li><li><div class="item-name"><a class="struct" href="struct.StreamableReader.html" title="struct opendal::raw::oio::StreamableReader">StreamableReader</a></div><div class="desc docblock-short">Make given read  [...]
 object. By implementing AppendObjectWrite, services don’t need to
@@ -13,4 +14,4 @@ care about the details of buffering and uploading parts.</div></li><li><div clas
 uploads. By implementing MultipartUploadWrite, services don’t need to
 care about the details of buffering and 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.Page.html" title="trait opendal::raw::oio::Page">Page</a></div><div class="desc docblock-short">Page trait is used by <a href="../trait.Accessor.html" title="trait opendal::raw::Accessor"><code>raw::Accessor</code></a> to implement <code>list</code>
-or <code>scan</code> operation.</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 is the trait that OpenDAL returns to callers.</div></li><li><div class="item-name"><a class="trait" href="trait.ReadExt.html" title="trait opendal::raw::oio::ReadExt">ReadExt</a></div><div class="desc docblock-short">Extension of <a href="trait.Read.html" title="trait opendal::raw::oio::Read" [...]
\ No newline at end of file
+or <code>scan</code> operation.</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 is the trait that OpenDAL returns to callers.</div></li><li><div class="item-name"><a class="trait" href="trait.ReadExt.html" title="trait opendal::raw::oio::ReadExt">ReadExt</a></div><div class="desc docblock-short">Extension of <a href="trait.Read.html" title="trait opendal::raw::oio::Read" [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/read/cloneable_read/fn.into_cloneable_reader_within_std.html b/docs/rust/opendal/raw/oio/read/cloneable_read/fn.into_cloneable_reader_within_std.html
new file mode 100644
index 000000000..11078848d
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/read/cloneable_read/fn.into_cloneable_reader_within_std.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/fn.into_cloneable_reader_within_std.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a href="../../../../../opendal/raw/oio/fn.into_cloneable_reader_within_std.html">../../../../../opendal/raw/oio/fn.into_cloneable_reader_within_std.html</a>...</p>
+    <script>location.replace("../../../../../opendal/raw/oio/fn.into_cloneable_reader_within_std.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/read/cloneable_read/fn.into_cloneable_reader_within_tokio.html b/docs/rust/opendal/raw/oio/read/cloneable_read/fn.into_cloneable_reader_within_tokio.html
new file mode 100644
index 000000000..b8e782a93
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/read/cloneable_read/fn.into_cloneable_reader_within_tokio.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/fn.into_cloneable_reader_within_tokio.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a href="../../../../../opendal/raw/oio/fn.into_cloneable_reader_within_tokio.html">../../../../../opendal/raw/oio/fn.into_cloneable_reader_within_tokio.html</a>...</p>
+    <script>location.replace("../../../../../opendal/raw/oio/fn.into_cloneable_reader_within_tokio.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/write/at_least_buf_write/struct.AtLeastBufWriter.html b/docs/rust/opendal/raw/oio/read/cloneable_read/struct.CloneableReaderWithinStd.html
similarity index 52%
copy from docs/rust/opendal/raw/oio/write/at_least_buf_write/struct.AtLeastBufWriter.html
copy to docs/rust/opendal/raw/oio/read/cloneable_read/struct.CloneableReaderWithinStd.html
index 71fffa73e..ce87af261 100644
--- a/docs/rust/opendal/raw/oio/write/at_least_buf_write/struct.AtLeastBufWriter.html
+++ b/docs/rust/opendal/raw/oio/read/cloneable_read/struct.CloneableReaderWithinStd.html
@@ -1,11 +1,11 @@
 <!DOCTYPE html>
 <html lang="en">
 <head>
-    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/struct.AtLeastBufWriter.html">
+    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/struct.CloneableReaderWithinStd.html">
     <title>Redirection</title>
 </head>
 <body>
-    <p>Redirecting to <a href="../../../../../opendal/raw/oio/struct.AtLeastBufWriter.html">../../../../../opendal/raw/oio/struct.AtLeastBufWriter.html</a>...</p>
-    <script>location.replace("../../../../../opendal/raw/oio/struct.AtLeastBufWriter.html" + location.search + location.hash);</script>
+    <p>Redirecting to <a href="../../../../../opendal/raw/oio/struct.CloneableReaderWithinStd.html">../../../../../opendal/raw/oio/struct.CloneableReaderWithinStd.html</a>...</p>
+    <script>location.replace("../../../../../opendal/raw/oio/struct.CloneableReaderWithinStd.html" + location.search + location.hash);</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/write/at_least_buf_write/struct.AtLeastBufWriter.html b/docs/rust/opendal/raw/oio/read/cloneable_read/struct.CloneableReaderWithinTokio.html
similarity index 52%
copy from docs/rust/opendal/raw/oio/write/at_least_buf_write/struct.AtLeastBufWriter.html
copy to docs/rust/opendal/raw/oio/read/cloneable_read/struct.CloneableReaderWithinTokio.html
index 71fffa73e..2f4a06be2 100644
--- a/docs/rust/opendal/raw/oio/write/at_least_buf_write/struct.AtLeastBufWriter.html
+++ b/docs/rust/opendal/raw/oio/read/cloneable_read/struct.CloneableReaderWithinTokio.html
@@ -1,11 +1,11 @@
 <!DOCTYPE html>
 <html lang="en">
 <head>
-    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/struct.AtLeastBufWriter.html">
+    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/struct.CloneableReaderWithinTokio.html">
     <title>Redirection</title>
 </head>
 <body>
-    <p>Redirecting to <a href="../../../../../opendal/raw/oio/struct.AtLeastBufWriter.html">../../../../../opendal/raw/oio/struct.AtLeastBufWriter.html</a>...</p>
-    <script>location.replace("../../../../../opendal/raw/oio/struct.AtLeastBufWriter.html" + location.search + location.hash);</script>
+    <p>Redirecting to <a href="../../../../../opendal/raw/oio/struct.CloneableReaderWithinTokio.html">../../../../../opendal/raw/oio/struct.CloneableReaderWithinTokio.html</a>...</p>
+    <script>location.replace("../../../../../opendal/raw/oio/struct.CloneableReaderWithinTokio.html" + location.search + location.hash);</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/read/into_read_from_stream/fn.into_read_from_stream.html b/docs/rust/opendal/raw/oio/read/into_read_from_stream/fn.into_read_from_stream.html
new file mode 100644
index 000000000..be087d29a
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/read/into_read_from_stream/fn.into_read_from_stream.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/fn.into_read_from_stream.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a href="../../../../../opendal/raw/oio/fn.into_read_from_stream.html">../../../../../opendal/raw/oio/fn.into_read_from_stream.html</a>...</p>
+    <script>location.replace("../../../../../opendal/raw/oio/fn.into_read_from_stream.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/write/at_least_buf_write/struct.AtLeastBufWriter.html b/docs/rust/opendal/raw/oio/read/into_read_from_stream/struct.FromStreamReader.html
similarity index 57%
rename from docs/rust/opendal/raw/oio/write/at_least_buf_write/struct.AtLeastBufWriter.html
rename to docs/rust/opendal/raw/oio/read/into_read_from_stream/struct.FromStreamReader.html
index 71fffa73e..be8c21edc 100644
--- a/docs/rust/opendal/raw/oio/write/at_least_buf_write/struct.AtLeastBufWriter.html
+++ b/docs/rust/opendal/raw/oio/read/into_read_from_stream/struct.FromStreamReader.html
@@ -1,11 +1,11 @@
 <!DOCTYPE html>
 <html lang="en">
 <head>
-    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/struct.AtLeastBufWriter.html">
+    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/struct.FromStreamReader.html">
     <title>Redirection</title>
 </head>
 <body>
-    <p>Redirecting to <a href="../../../../../opendal/raw/oio/struct.AtLeastBufWriter.html">../../../../../opendal/raw/oio/struct.AtLeastBufWriter.html</a>...</p>
-    <script>location.replace("../../../../../opendal/raw/oio/struct.AtLeastBufWriter.html" + location.search + location.hash);</script>
+    <p>Redirecting to <a href="../../../../../opendal/raw/oio/struct.FromStreamReader.html">../../../../../opendal/raw/oio/struct.FromStreamReader.html</a>...</p>
+    <script>location.replace("../../../../../opendal/raw/oio/struct.FromStreamReader.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 36a7580d8..8201a2c88 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":["PageOperation","ReadOperation","ThreeWaysWriter","TwoWaysWriter","WriteOperation"],"fn":["into_flat_page","into_hierarchy_page","into_read_from_file","into_seekable_read_by_range","into_stream","into_stream_from_reader","into_streamable_read"],"struct":["AppendObjectWriter","AtLeastBufWriter","ByRangeSeekableReader","ChunkedCursor","Cursor","Entry","ExactBufWriter","FlatPager","FromFileReader","HierarchyPager","MultipartUploadPart","MultipartUploadWriter" [...]
\ No newline at end of file
+window.SIDEBAR_ITEMS = {"enum":["PageOperation","ReadOperation","ThreeWaysWriter","TwoWaysWriter","WriteOperation"],"fn":["into_cloneable_reader_within_std","into_cloneable_reader_within_tokio","into_flat_page","into_hierarchy_page","into_read_from_file","into_read_from_stream","into_seekable_read_by_range","into_stream","into_stream_from_reader","into_streamable_read"],"struct":["AppendObjectWriter","ByRangeSeekableReader","ChunkedCursor","CloneableReaderWithinStd","CloneableReaderWithi [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/struct.AppendObjectWriter.html b/docs/rust/opendal/raw/oio/struct.AppendObjectWriter.html
index 17ebe1a40..a3d609f8c 100644
--- a/docs/rust/opendal/raw/oio/struct.AppendObjectWriter.html
+++ b/docs/rust/opendal/raw/oio/struct.AppendObjectWriter.html
@@ -1,26 +1,26 @@
-<!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="AppendObjectWriter will implements [`Write`] based on append object."><title>AppendObjectWriter 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"  [...]
+<!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="AppendObjectWriter will implements [`Write`] based on append object."><title>AppendObjectWriter 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"  [...]
 <h3 id="todo"><a href="#todo">TODO</a></h3>
 <ul>
 <li>Allow users to switch to un-buffered mode if users write 16MiB every time.</li>
 </ul>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AppendObjectWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#56-75">source</a><a href="#impl-AppendObjectWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-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-Write-for-AppendObjectWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#78-113">source</a><a href="#impl-Write-for-AppendObjec [...]
-    W: <a class="trait" href="trait.AppendObjectWrite.html" title="trait opendal::raw::oio::AppendObjectWrite">AppendObjectWrite</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#82-93">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">fn <a href="tra [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AppendObjectWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#55-74">source</a><a href="#impl-AppendObjectWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-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-Write-for-AppendObjectWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#77-112">source</a><a href="#impl-Write-for-AppendObjec [...]
+    W: <a class="trait" href="trait.AppendObjectWrite.html" title="trait opendal::raw::oio::AppendObjectWrite">AppendObjectWrite</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#81-92">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">fn <a href="tra [...]
     &amp;'life0 mut self,
     bs: Bytes
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.sink" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#95-104">source</a><a href="#method.sink" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write. [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.pipe" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#94-103">source</a><a href="#method.pipe" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write. [...]
     &amp;'life0 mut self,
     size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
-    s: <a class="type" href="type.Streamer.html" title="type opendal::raw::oio::Streamer">Streamer</a>
+    s: <a class="type" href="type.Reader.html" title="type opendal::raw::oio::Reader">Reader</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Sink given stream into writer. <a href="trait.Write.html#tymethod.sink">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#106-108">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Writ [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Sink given stream into writer. <a href="trait.Write.html#tymethod.pipe">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#105-107">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Writ [...]
     &amp;'life0 mut self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#110-112">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.abort" class [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#109-111">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.abort" class [...]
     &amp;'life0 mut self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
diff --git a/docs/rust/opendal/raw/oio/struct.ChunkedCursor.html b/docs/rust/opendal/raw/oio/struct.ChunkedCursor.html
index 96265a7a8..c73338f35 100644
--- a/docs/rust/opendal/raw/oio/struct.ChunkedCursor.html
+++ b/docs/rust/opendal/raw/oio/struct.ChunkedCursor.html
@@ -1,6 +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="ChunkedCursor is used represents a non-contiguous bytes in memory."><title>ChunkedCursor 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="fon [...]
 <p>This is useful when we buffer users’ random writes without copy. ChunkedCursor implements
-<a href="trait.Stream.html" title="trait opendal::raw::oio::Stream"><code>oio::Stream</code></a> so it can be used in <a href="trait.Write.html#tymethod.sink" title="method opendal::raw::oio::Write::sink"><code>oio::Write::sink</code></a> directly.</p>
+<a href="trait.Stream.html" title="trait opendal::raw::oio::Stream"><code>oio::Stream</code></a> so it can be used in <a href="trait.Write.html#tymethod.pipe" title="method opendal::raw::oio::Write::pipe"><code>oio::Write::pipe</code></a> directly.</p>
 <h2 id="todo"><a href="#todo">TODO</a></h2>
 <p>we can do some compaction during runtime. For example, merge 4K data
 into the same bytes instead.</p>
@@ -38,10 +38,10 @@ wrapper. <a>Read more</a></div></details></div></details><details class="toggle
     U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.into" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/convert/mod.rs.html#715">source</a><a href="#method.into" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
 <p>That is, this conversion is whatever the implementation of
 <code><a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt; for U</code> chooses to do.</p>
-</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-IntoRequest%3CT%3E-for-ChunkedCursor" class="impl"><a class="srclink rightside" href="https://docs.rs/tonic/0.9.2/src/tonic/request.rs.html#384">source</a><a href="#impl-IntoRequest%3CT%3E-for-ChunkedCursor" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tonic/0.9.2/tonic/request/trait.IntoRequest.html" title="trait tonic::request::IntoR [...]
-    T: <a class="trait" href="trait.Stream.html" title="trait opendal::raw::oio::Stream">Stream</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#132-134">source</a><a href="#method.next" class="anchor">§</a><h4 class="code-header">fn <a href="trait.StreamExt.html#method.next" class="fn">next</ [...]
+</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-IntoRequest%3CT%3E-for-ChunkedCursor" class="impl"><a class="srclink rightside" href="https://docs.rs/tonic/0.9.2/src/tonic/request.rs.html#384">source</a><a href="#impl-IntoRequest%3CT%3E-for-ChunkedCursor" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tonic/0.9.2/tonic/request/trait.IntoRequest.html" title="trait tonic::request::IntoR [...]
+    T: <a class="trait" href="trait.Stream.html" title="trait opendal::raw::oio::Stream">Stream</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#144-146">source</a><a href="#method.next" class="anchor">§</a><h4 class="code-header">fn <a href="trait.StreamExt.html#method.next" class="fn">next</ [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/1.72.0/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>,</span></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="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#154-162">source</a><a href="#method.collect" class="anchor">§</a><h4 class="code-header">fn <a [...]
+    S: <a class="trait" href="trait.Stream.html" title="trait opendal::raw::oio::Stream">Stream</a>,</span></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="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#166-174">source</a><a href="#method.collect" class="anchor">§</a><h4 class="code-header">fn <a [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h4></section></summary><div class='docblock'>Collect all items from this stream into a single bytes.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-ToOwned-for-ChunkedCursor" class="impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/alloc/borrow.rs.html#82">sou [...]
     T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Owned" class="associatedtype trait-impl"><a href="#associatedtype.Owned" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/alloc/borrow/trait.ToOwned.html#associatedtype.Owned" class="associated [...]
     U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl"><a href="#associatedtype.Error" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html#associatedtype.Error" class=" [...]
diff --git a/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinStd.html b/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinStd.html
new file mode 100644
index 000000000..abb28df9c
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinStd.html
@@ -0,0 +1,37 @@
+<!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="CloneableReaderWithinStd is a Send + Sync + Clone with `std::sync::Mutex` wrapper of input reader."><title>CloneableReaderWithinStd in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac [...]
+reader.</p>
+<p>Caller can clone this reader but only one thread can calling <code>oio::Read</code> API at the
+same time, otherwise, we will return error if lock block happened.</p>
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-CloneableReaderWithinStd%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/cloneable_read.rs.html#37-42">source</a><a href="#impl-CloneableReaderWithinStd%3CR%3E" class="anchor">§</a><h3 class="code-header">i [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-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-CloneableReaderWithinStd%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/cloneable_read.rs.html#44-48">source</a><a href="#impl-Clone-for-CloneableRea [...]
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/primitive.u8.html">u8</a>]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/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="meth [...]
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/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="togg [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</span></h3></section><section id="impl-Sync-for-CloneableReaderWithinStd%3CR%3E" class="impl"><a href="#impl-Sync-for-CloneableReaderWithinStd%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</span></h3></section><section id="impl-Unpin-for-CloneableReaderWithinStd%3CR%3E" class="impl"><a href="#impl-Unpin-for-CloneableReaderWithinStd%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="st [...]
+    T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></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="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
+    T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
+    T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></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="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
+</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-FromRef%3CT%3E-for-CloneableReaderWithinStd%3CR%3E" class="impl"><a href="#impl-FromRef%3CT%3E-for-CloneableReaderWithinStd%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; FromRef&lt;T&gt; for T<span class="where fmt-newline">where
+    T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.from_ref" class="method trait-impl"><a href="#method.from_ref" class="anchor">§</a><h4 class="code-header">fn <a class="fn">from_ref</a>(input: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.h [...]
+wrapper. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_context" class="method trait-impl"><a href="#method.with_current_context" class="anchor">§</a><h4 class="code-header">fn <a class="fn">with_current_context</a>(self) -&gt; WithContext&lt;Self&gt;</h4></section></summary><div class='docblock'>Attaches the current <a href="crate::Context"><code>Context</code></a> to this type, returning a <code>WithContext</code>
+wrapper. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Instrument-for-CloneableReaderWithinStd%3CR%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#276">source</a><a href="#impl-Instrument-for-CloneableReaderWithinStd%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tracing/0.1.37/tracing/instrume [...]
+<code>Instrumented</code> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html#method.instrument">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.in_current_span" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#121">source</a><a href="#method.in_current_span" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc [...]
+<code>Instrumented</code> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html#method.in_current_span">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Into%3CU%3E-for-CloneableReaderWithinStd%3CR%3E" class="impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/convert/mod.rs.html#706">source</a><a href="#impl-Into%3CU%3E-for-CloneableReaderWithinStd%3CR%3E [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.into" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/convert/mod.rs.html#715">source</a><a href="#method.into" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
+<p>That is, this conversion is whatever the implementation of
+<code><a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt; for U</code> chooses to do.</p>
+</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-IntoRequest%3CT%3E-for-CloneableReaderWithinStd%3CR%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tonic/0.9.2/src/tonic/request.rs.html#384">source</a><a href="#impl-IntoRequest%3CT%3E-for-CloneableReaderWithinStd%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tonic/0.9.2/tonic/request/trait.IntoRequest.html [...]
+    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#188-190">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&g [...]
+    T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Owned" class="associatedtype trait-impl"><a href="#associatedtype.Owned" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/alloc/borrow/trait.ToOwned.html#associatedtype.Owned" class="associated [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl"><a href="#associatedtype.Error" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html#associatedtype.Error" class=" [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error-1" class="associatedtype trait-impl"><a href="#associatedtype.Error-1" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryInto.html#associatedtype.E [...]
+    V: MultiLane&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-CloneableReaderWithinStd%3CR%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrum [...]
+    S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Dispatch&gt;,</span></h4></section></summary><div class='docblock'>Attaches the provided <a href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
+<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_subscriber">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing [...]
+<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details></div></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinTokio.html b/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinTokio.html
new file mode 100644
index 000000000..8d3b80a6e
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinTokio.html
@@ -0,0 +1,37 @@
+<!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="CloneableReaderWithinTokio is a Send + Sync + Clone with `tokio::sync::Mutex` wrapper of input reader."><title>CloneableReaderWithinTokio in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98e [...]
+reader.</p>
+<p>Caller can clone this reader but only one thread can calling <code>oio::Read</code> API at the
+same time, otherwise, we will return error if lock block happened.</p>
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-CloneableReaderWithinTokio%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/cloneable_read.rs.html#94-99">source</a><a href="#impl-CloneableReaderWithinTokio%3CR%3E" class="anchor">§</a><h3 class="code-heade [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-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-CloneableReaderWithinTokio%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/cloneable_read.rs.html#101-105">source</a><a href="#impl-Clone-for-Cloneabl [...]
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/primitive.u8.html">u8</a>]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/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="meth [...]
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/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="togg [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</span></h3></section><section id="impl-Sync-for-CloneableReaderWithinTokio%3CR%3E" class="impl"><a href="#impl-Sync-for-CloneableReaderWithinTokio%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="str [...]
+    R: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</span></h3></section><section id="impl-Unpin-for-CloneableReaderWithinTokio%3CR%3E" class="impl"><a href="#impl-Unpin-for-CloneableReaderWithinTokio%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class [...]
+    T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></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="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
+    T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
+    T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></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="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
+</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-FromRef%3CT%3E-for-CloneableReaderWithinTokio%3CR%3E" class="impl"><a href="#impl-FromRef%3CT%3E-for-CloneableReaderWithinTokio%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; FromRef&lt;T&gt; for T<span class="where fmt-newline">where
+    T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.from_ref" class="method trait-impl"><a href="#method.from_ref" class="anchor">§</a><h4 class="code-header">fn <a class="fn">from_ref</a>(input: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.h [...]
+wrapper. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_context" class="method trait-impl"><a href="#method.with_current_context" class="anchor">§</a><h4 class="code-header">fn <a class="fn">with_current_context</a>(self) -&gt; WithContext&lt;Self&gt;</h4></section></summary><div class='docblock'>Attaches the current <a href="crate::Context"><code>Context</code></a> to this type, returning a <code>WithContext</code>
+wrapper. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Instrument-for-CloneableReaderWithinTokio%3CR%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#276">source</a><a href="#impl-Instrument-for-CloneableReaderWithinTokio%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tracing/0.1.37/tracing/inst [...]
+<code>Instrumented</code> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html#method.instrument">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.in_current_span" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#121">source</a><a href="#method.in_current_span" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc [...]
+<code>Instrumented</code> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html#method.in_current_span">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Into%3CU%3E-for-CloneableReaderWithinTokio%3CR%3E" class="impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/convert/mod.rs.html#706">source</a><a href="#impl-Into%3CU%3E-for-CloneableReaderWithinTokio%3C [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.into" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/convert/mod.rs.html#715">source</a><a href="#method.into" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
+<p>That is, this conversion is whatever the implementation of
+<code><a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt; for U</code> chooses to do.</p>
+</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-IntoRequest%3CT%3E-for-CloneableReaderWithinTokio%3CR%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tonic/0.9.2/src/tonic/request.rs.html#384">source</a><a href="#impl-IntoRequest%3CT%3E-for-CloneableReaderWithinTokio%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tonic/0.9.2/tonic/request/trait.IntoRequest. [...]
+    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#188-190">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&g [...]
+    T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Owned" class="associatedtype trait-impl"><a href="#associatedtype.Owned" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/alloc/borrow/trait.ToOwned.html#associatedtype.Owned" class="associated [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl"><a href="#associatedtype.Error" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html#associatedtype.Error" class=" [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error-1" class="associatedtype trait-impl"><a href="#associatedtype.Error-1" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryInto.html#associatedtype.E [...]
+    V: MultiLane&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-CloneableReaderWithinTokio%3CR%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instr [...]
+    S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Dispatch&gt;,</span></h4></section></summary><div class='docblock'>Attaches the provided <a href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
+<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_subscriber">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing [...]
+<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details></div></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/struct.Cursor.html b/docs/rust/opendal/raw/oio/struct.Cursor.html
index 38feb819c..8c243fc42 100644
--- a/docs/rust/opendal/raw/oio/struct.Cursor.html
+++ b/docs/rust/opendal/raw/oio/struct.Cursor.html
@@ -20,10 +20,10 @@ wrapper. <a>Read more</a></div></details></div></details><details class="toggle
 <p>That is, this conversion is whatever the implementation of
 <code><a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt; for U</code> chooses to do.</p>
 </div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-IntoRequest%3CT%3E-for-Cursor" class="impl"><a class="srclink rightside" href="https://docs.rs/tonic/0.9.2/src/tonic/request.rs.html#384">source</a><a href="#impl-IntoRequest%3CT%3E-for-Cursor" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tonic/0.9.2/tonic/request/trait.IntoRequest.html" title="trait tonic::request::IntoRequest">IntoRe [...]
-    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</span></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="srclink rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#188-190">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; [...]
-    T: <a class="trait" href="trait.Stream.html" title="trait opendal::raw::oio::Stream">Stream</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-2" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#132-134">source</a><a href="#method.next-2" class="anchor">§</a><h4 class="code-header">fn <a href="trait.StreamExt.html#method.next" class="fn">ne [...]
+    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</span></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="srclink rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#188-190">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; [...]
+    T: <a class="trait" href="trait.Stream.html" title="trait opendal::raw::oio::Stream">Stream</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-2" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#144-146">source</a><a href="#method.next-2" class="anchor">§</a><h4 class="code-header">fn <a href="trait.StreamExt.html#method.next" class="fn">ne [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/1.72.0/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>,</span></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="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#154-162">source</a><a href="#method.collect" class="anchor">§</a><h4 class="code-header">fn <a [...]
+    S: <a class="trait" href="trait.Stream.html" title="trait opendal::raw::oio::Stream">Stream</a>,</span></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="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#166-174">source</a><a href="#method.collect" class="anchor">§</a><h4 class="code-header">fn <a [...]
     Self: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h4></section></summary><div class='docblock'>Collect all items from this stream into a single bytes.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-TryFrom%3CU%3E-for-Cursor" class="impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/convert/mod.rs.html#762 [...]
     U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl"><a href="#associatedtype.Error" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html#associatedtype.Error" class=" [...]
     U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error-1" class="associatedtype trait-impl"><a href="#associatedtype.Error-1" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryInto.html#associatedtype.E [...]
diff --git a/docs/rust/opendal/raw/oio/struct.ExactBufWriter.html b/docs/rust/opendal/raw/oio/struct.ExactBufWriter.html
index 0c406eaf0..9942007c6 100644
--- a/docs/rust/opendal/raw/oio/struct.ExactBufWriter.html
+++ b/docs/rust/opendal/raw/oio/struct.ExactBufWriter.html
@@ -1,33 +1,33 @@
-<!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="ExactBufWriter is used to implement `oio::Write` based on exact buffer strategy: flush the underlying storage when the buffered size is exactly the same as the buffer size."><title>ExactBufWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorig [...]
+<!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="ExactBufWriter is used to implement `oio::Write` based on exact buffer strategy: flush the underlying storage when the buffered size is exactly the same as the buffer size."><title>ExactBufWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorig [...]
 underlying storage when the buffered size is exactly the same as the buffer size.</p>
 <p>ExactBufWriter makes sure that the size of the data written to the underlying storage is exactly
 <code>buffer_size</code> bytes. It’s useful when the underlying storage requires the size to be written.</p>
 <p>For example, R2 requires all parts must be the same size except the last part.</p>
 <h3 id="notes"><a href="#notes">Notes</a></h3>
 <p>ExactBufWriter is not a good choice for most cases, because it will cause more network requests.</p>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ExactBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#49-83">source</a><a href="#impl-ExactBufWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W: <a class [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-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-Write-for-ExactBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#86-186">source</a><a href="#impl-Write-for-ExactBufWriter%3CW% [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ExactBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#47-56">source</a><a href="#impl-ExactBufWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W: <a class [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-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-Write-for-ExactBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#64-159">source</a><a href="#impl-Write-for-ExactBufWriter%3CW% [...]
     &amp;'life0 mut self,
-    __arg1: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
-    s: <a class="type" href="type.Streamer.html" title="type opendal::raw::oio::Streamer">Streamer</a>
+    bs: Bytes
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class="docblock"><h5 id="todo"><a href="#todo">TODO</a></h5>
-<p>We know every stream size, we can collect them into a buffer without chain them every time.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#87-90">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.write" class="fn">write</a>&lt;'life0, 'async_trait&gt;(
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.pipe" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#93-130">source</a><a href="#method.pipe" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html [...]
     &amp;'life0 mut self,
-    bs: Bytes
+    __arg1: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
+    s: <a class="type" href="type.Reader.html" title="type opendal::raw::oio::Reader">Reader</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#141-146">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.h [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Sink given stream into writer. <a href="trait.Write.html#tymethod.pipe">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#132-135">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.ht [...]
     &amp;'life0 mut self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#148-185">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.close" class="fn">close</a>&lt;'life0, 'async_tr [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#137-158">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.close" class="fn">close</a>&lt;'life0, 'async_tr [...]
     &amp;'life0 mut self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-ExactBufWriter%3CW%3E" class="impl"><a href="#impl-RefUnwindSafe-for-ExactBufWriter%3CW%3 [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-ExactBufWriter%3CW%3E" class="impl"><a href="#impl-RefUnwindSafe-for-ExactBufWriter%3CW%3 [...]
+    W: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section><section id="impl-Send-for-ExactBufWriter%3CW%3E" class="impl"><a href="#impl-Send-for-ExactBufWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send"> [...]
+    W: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,</span></h3></section></div><h2 id="blanket-implementations" class="small-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-ExactBufWriter%3CW%3E" cla [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></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="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></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="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
diff --git a/docs/rust/opendal/raw/oio/struct.FromFileReader.html b/docs/rust/opendal/raw/oio/struct.FromFileReader.html
index 7ea4a2460..62297effa 100644
--- a/docs/rust/opendal/raw/oio/struct.FromFileReader.html
+++ b/docs/rust/opendal/raw/oio/struct.FromFileReader.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="FdReader is a wrapper of input fd to implement `oio::Read`."><title>FromFileReader 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" typ [...]
+<!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="FromFileReader is a wrapper of input fd to implement `oio::Read`."><title>FromFileReader 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="fon [...]
 </div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-FromFileReader%3CSftpReaderInner%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/services/sftp/utils.rs.html#52-60">source</a><a href="#impl-FromFileReader%3CSftpReaderInner%3E" class="anchor">§</a><h3 class="code-header">i [...]
 </div></details></div></details></div><h2 id="trait-implementations" class="small-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-FromFileReader%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/into_read_from_file.rs.html#134-192">source</a><a href="#impl-BlockingRead-for-F [...]
     R: <a class="trait" href="https://doc.rust-lang.org/1.72.0/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/std/io/trait.Seek.html" title="trait std::io::Seek">Seek</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync"> [...]
diff --git a/docs/rust/opendal/raw/oio/struct.AtLeastBufWriter.html b/docs/rust/opendal/raw/oio/struct.FromStreamReader.html
similarity index 51%
rename from docs/rust/opendal/raw/oio/struct.AtLeastBufWriter.html
rename to docs/rust/opendal/raw/oio/struct.FromStreamReader.html
index 6978d2da4..10bb8750e 100644
--- a/docs/rust/opendal/raw/oio/struct.AtLeastBufWriter.html
+++ b/docs/rust/opendal/raw/oio/struct.FromStreamReader.html
@@ -1,47 +1,32 @@
-<!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="AtLeastBufWriter is used to implement `oio::Write` based on at least buffer strategy: flush the underlying storage when the buffered size is larger."><title>AtLeastBufWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../stat [...]
-the underlying storage when the buffered size is larger.</p>
-<p>AtLeastBufWriter makes sure that the size of the data written to the underlying storage is at
-least <code>buffer_size</code> bytes. It’s useful when the underlying storage has a minimum size limit.</p>
-<p>For example, S3 requires at least 5MiB for multipart uploads.</p>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AtLeastBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/at_least_buf_write.rs.html#47-63">source</a><a href="#impl-AtLeastBufWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W: < [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_total_size" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/at_least_buf_write.rs.html#59-62">source</a><h4 class="code-header">pub fn <a href="#method.with_total_size" class="fn">with_total_size</a>(self, total_size: <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="p [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-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-Write-for-AtLeastBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/at_least_buf_write.rs.html#66-140">source</a><a href="#impl-Write-for-AtLeastBufWrit [...]
-    &amp;'life0 mut self,
-    bs: Bytes
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.sink" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/at_least_buf_write.rs.html#95-123">source</a><a href="#method.sink" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.h [...]
-    &amp;'life0 mut self,
-    size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
-    s: <a class="type" href="type.Streamer.html" title="type opendal::raw::oio::Streamer">Streamer</a>
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Sink given stream into writer. <a href="trait.Write.html#tymethod.sink">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/at_least_buf_write.rs.html#125-128">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write [...]
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/at_least_buf_write.rs.html#130-139">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.close" class="fn">close</a>&lt;'life0, 'async [...]
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-AtLeastBufWriter%3CW%3E" class="impl"><a href="#impl-RefUnwindSafe-for-AtLeastBufWriter%3 [...]
-    W: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section><section id="impl-Send-for-AtLeastBufWriter%3CW%3E" class="impl"><a href="#impl-Send-for-AtLeastBufWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Se [...]
-    W: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,</span></h3></section></div><h2 id="blanket-implementations" class="small-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-AtLeastBufWriter%3CW%3E" c [...]
-    T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></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="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
-    T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
-    T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></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="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
-</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-FutureExt-for-AtLeastBufWriter%3CW%3E" class="impl"><a href="#impl-FutureExt-for-AtLeastBufWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; FutureExt for T</h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.with_context" class="method trait-impl"><a href="#method.with_context" class="anchor">§</ [...]
+<!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 [...]
+</div></details><h2 id="trait-implementations" class="small-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="srclink rightside" href="../../../src/opendal/raw/oio/read/into_read_from_stream.rs.html#39-83">source</a><a href="#impl-Read-for-FromStreamReader%3CS%3E" class="ancho [...]
+    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/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::mark [...]
+    T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Bytes&gt;,</span></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="srclink rightside" href="../../../src/opendal/raw/oio/read/into_read_from_stream.rs.html#44-63">source</a><a href="#method.poll_read" class="anchor">§</a><h4 class="cod [...]
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/primitive.u8.html">u8</a>]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/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="meth [...]
+    S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></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/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Se [...]
+    S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</span></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/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.Fr [...]
+    S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</span></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/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="stru [...]
+    S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</span></h3></section><section id="impl-UnwindSafe-for-FromStreamReader%3CS%3E" class="impl"><a href="#impl-UnwindSafe-for-FromStreamReader%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSa [...]
+    S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,</span></h3></section></div><h2 id="blanket-implementations" class="small-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-FromStreamReader%3CS%3E" c [...]
+    T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></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="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
+    T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
+    T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></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="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
+</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-FutureExt-for-FromStreamReader%3CS%3E" class="impl"><a href="#impl-FutureExt-for-FromStreamReader%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; FutureExt for T</h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.with_context" class="method trait-impl"><a href="#method.with_context" class="anchor">§</ [...]
 wrapper. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_context" class="method trait-impl"><a href="#method.with_current_context" class="anchor">§</a><h4 class="code-header">fn <a class="fn">with_current_context</a>(self) -&gt; WithContext&lt;Self&gt;</h4></section></summary><div class='docblock'>Attaches the current <a href="crate::Context"><code>Context</code></a> to this type, returning a <code>WithContext</code>
-wrapper. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Instrument-for-AtLeastBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#276">source</a><a href="#impl-Instrument-for-AtLeastBufWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrum [...]
+wrapper. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Instrument-for-FromStreamReader%3CS%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#276">source</a><a href="#impl-Instrument-for-FromStreamReader%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrum [...]
 <code>Instrumented</code> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html#method.instrument">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.in_current_span" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#121">source</a><a href="#method.in_current_span" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc [...]
-<code>Instrumented</code> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html#method.in_current_span">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Into%3CU%3E-for-AtLeastBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/convert/mod.rs.html#706">source</a><a href="#impl-Into%3CU%3E-for-AtLeastBufWriter%3CW%3E" class="anchor" [...]
+<code>Instrumented</code> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html#method.in_current_span">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Into%3CU%3E-for-FromStreamReader%3CS%3E" class="impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/convert/mod.rs.html#706">source</a><a href="#impl-Into%3CU%3E-for-FromStreamReader%3CS%3E" class="anchor" [...]
     U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.into" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/convert/mod.rs.html#715">source</a><a href="#method.into" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
 <p>That is, this conversion is whatever the implementation of
 <code><a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt; for U</code> chooses to do.</p>
-</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-IntoRequest%3CT%3E-for-AtLeastBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tonic/0.9.2/src/tonic/request.rs.html#384">source</a><a href="#impl-IntoRequest%3CT%3E-for-AtLeastBufWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tonic/0.9.2/tonic/request/trait.IntoRequest.html" title="trait t [...]
-    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl"><a href="#associatedtype.Error" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html#associatedtype.Error" class=" [...]
-    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error-1" class="associatedtype trait-impl"><a href="#associatedtype.Error-1" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryInto.html#associatedtype.E [...]
-    V: MultiLane&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-AtLeastBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.h [...]
+</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-IntoRequest%3CT%3E-for-FromStreamReader%3CS%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tonic/0.9.2/src/tonic/request.rs.html#384">source</a><a href="#impl-IntoRequest%3CT%3E-for-FromStreamReader%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tonic/0.9.2/tonic/request/trait.IntoRequest.html" title="trait t [...]
+    T: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.read" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#188-190">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&g [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl"><a href="#associatedtype.Error" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html#associatedtype.Error" class=" [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error-1" class="associatedtype trait-impl"><a href="#associatedtype.Error-1" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryInto.html#associatedtype.E [...]
+    V: MultiLane&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-FromStreamReader%3CS%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.h [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Dispatch&gt;,</span></h4></section></summary><div class='docblock'>Attaches the provided <a href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
 <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_subscriber">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing [...]
 <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details></div></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/struct.MultipartUploadWriter.html b/docs/rust/opendal/raw/oio/struct.MultipartUploadWriter.html
index 13dba99d1..1c6b2041c 100644
--- a/docs/rust/opendal/raw/oio/struct.MultipartUploadWriter.html
+++ b/docs/rust/opendal/raw/oio/struct.MultipartUploadWriter.html
@@ -7,23 +7,23 @@ uploads.</p>
 </ul>
 </div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#94-116">source</a><a href="#impl-MultipartUploadWriter%3CW%3E" class="anchor">§</a><h3 class="code-heade [...]
 </div></details><details class="toggle method-toggle" open><summary><section id="method.upload_id" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#106-115">source</a><h4 class="code-header">pub async fn <a href="#method.upload_id" class="fn">upload_id</a>(&amp;mut self) -&gt; <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/a [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-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-Write-for-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#119-171">source</a><a href="#impl-Write-for-Mult [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-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-Write-for-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#119-176">source</a><a href="#impl-Write-for-Mult [...]
     W: <a class="trait" href="trait.MultipartUploadWrite.html" title="trait opendal::raw::oio::MultipartUploadWrite">MultipartUploadWrite</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#123-139">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">f [...]
     &amp;'life0 mut self,
     bs: Bytes
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.sink" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#141-150">source</a><a href="#method.sink" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Wr [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.pipe" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#141-155">source</a><a href="#method.pipe" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Wr [...]
     &amp;'life0 mut self,
     size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
-    s: <a class="type" href="type.Streamer.html" title="type opendal::raw::oio::Streamer">Streamer</a>
+    s: <a class="type" href="type.Reader.html" title="type opendal::raw::oio::Reader">Reader</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Sink given stream into writer. <a href="trait.Write.html#tymethod.sink">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#152-160">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.W [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Sink given stream into writer. <a href="trait.Write.html#tymethod.pipe">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#157-165">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.W [...]
     &amp;'life0 mut self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#162-170">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.abort" cl [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#167-175">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.abort" cl [...]
     &amp;'life0 mut self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
diff --git a/docs/rust/opendal/raw/oio/struct.OneShotWriter.html b/docs/rust/opendal/raw/oio/struct.OneShotWriter.html
index 00772846d..eaaefa467 100644
--- a/docs/rust/opendal/raw/oio/struct.OneShotWriter.html
+++ b/docs/rust/opendal/raw/oio/struct.OneShotWriter.html
@@ -5,13 +5,13 @@
     bs: Bytes
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.sink" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#61-64">source</a><a href="#method.sink" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#t [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.pipe" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#61-64">source</a><a href="#method.pipe" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#t [...]
     &amp;'life0 mut self,
     size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
-    s: <a class="type" href="type.Streamer.html" title="type opendal::raw::oio::Streamer">Streamer</a>
+    s: <a class="type" href="type.Reader.html" title="type opendal::raw::oio::Reader">Reader</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Sink given stream into writer. <a href="trait.Write.html#tymethod.sink">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#66-68">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html# [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Sink given stream into writer. <a href="trait.Write.html#tymethod.pipe">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#66-68">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html# [...]
     &amp;'life0 mut self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
diff --git a/docs/rust/opendal/raw/oio/trait.AppendObjectWrite.html b/docs/rust/opendal/raw/oio/trait.AppendObjectWrite.html
index 2d5390cdc..22cef420f 100644
--- a/docs/rust/opendal/raw/oio/trait.AppendObjectWrite.html
+++ b/docs/rust/opendal/raw/oio/trait.AppendObjectWrite.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="AppendObjectWrite is used to implement [`Write`] based on append object. By implementing AppendObjectWrite, services don’t need to care about the details of buffering and uploading parts."><title>AppendObjectWrite in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="fon [...]
+<!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="AppendObjectWrite is used to implement [`Write`] based on append object. By implementing AppendObjectWrite, services don’t need to care about the details of buffering and uploading parts."><title>AppendObjectWrite in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="fon [...]
     // Required methods
     fn <a href="#tymethod.offset" class="fn">offset</a>&lt;'life0, 'async_trait&gt;(
         &amp;'life0 self
@@ -22,13 +22,13 @@ care about the details of buffering and uploading parts.</p>
 <li><code>AppendObjectWriter</code> impl <code>Write</code></li>
 <li>Expose <code>AppendObjectWriter</code> as <code>Accessor::Writer</code></li>
 </ul>
-</div></details><h2 id="required-methods" class="small-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.offset" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#39">source</a><h4 class="code-header">fn <a href="#tymethod.offset" class="fn">offset</a>&lt;'life0, 'async_trait&gt;(
+</div></details><h2 id="required-methods" class="small-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.offset" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#38">source</a><h4 class="code-header">fn <a href="#tymethod.offset" class="fn">offset</a>&lt;'life0, 'async_trait&gt;(
     &amp;'life0 self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
     'life0: 'async_trait,</span></h4></section></summary><div class="docblock"><p>Get the current offset of the append object.</p>
 <p>Returns <code>0</code> if the object is not exist.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.append" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#42">source</a><h4 class="code-header">fn <a href="#tymethod.append" class="fn">append</a>&lt;'life0, 'async_trait&gt;(
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.append" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#41">source</a><h4 class="code-header">fn <a href="#tymethod.append" class="fn">append</a>&lt;'life0, 'async_trait&gt;(
     &amp;'life0 self,
     offset: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
     size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
diff --git a/docs/rust/opendal/raw/oio/trait.Read.html b/docs/rust/opendal/raw/oio/trait.Read.html
index 699beda43..5f948be77 100644
--- a/docs/rust/opendal/raw/oio/trait.Read.html
+++ b/docs/rust/opendal/raw/oio/trait.Read.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="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 [...]
+<!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 [...]
     // Required methods
     fn <a href="#tymethod.poll_read" class="fn">poll_read</a>(
         &amp;mut self,
@@ -54,7 +54,7 @@ IO operations. <a>Read more</a></div></details></div></details><details class="t
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/primitive.usize.html">usize</a>, <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/option/enum.Option.html" ti [...]
+<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/1.72.0/std/primitive.usize.html">usize</a>, <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/option/enum.Option.html" ti [...]
     &amp;mut self,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/primitive.u8.html">u8</a>]
@@ -62,7 +62,7 @@ current task for wakeup if the value is not yet available, and returning
     &amp;mut self,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section><section id="method.poll_next-1" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#125-132 [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section><section id="method.poll_next-2" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#125-132 [...]
 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="srclink rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#138-140">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,
@@ -72,7 +72,9 @@ work as expected, we must add this impl.</p>
     &amp;mut self,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section><section id="method.poll_next-2" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#146-148 [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section><section id="method.poll_next-3" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#146-148 [...]
     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>,</span></h3></section><section id="impl-Read-for-FromFileReader%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/into_read_from_file.rs.html#60-132">source</a><a href="#impl-Read-for-FromFileReader%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 [...]
-    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</span></h3></section><section id="impl-Read-for-StreamableReader%3CR%3E" [...]
\ No newline at end of file
+    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</span></h3></section><section id="impl-Read-for-CloneableReaderWithinStd [...]
+    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/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::mark [...]
+    T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Bytes&gt;,</span></h3></section></div><script src="../../../implementors/opendal/raw/oio/read/api/trait.Read.js" data-ignore-extern-crates="std,alloc" 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 1d487cb51..eaba3e6cd 100644
--- a/docs/rust/opendal/raw/oio/trait.Stream.html
+++ b/docs/rust/opendal/raw/oio/trait.Stream.html
@@ -7,11 +7,11 @@
 <code>Unpin</code> + <code>Send</code> + <code>Sync</code>. And the item is <code>Result&lt;Bytes&gt;</code>.</p>
 </div></details><h2 id="required-methods" class="small-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_next" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#40">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=" [...]
 </div></details><details class="toggle method-toggle" open><summary><section id="tymethod.poll_reset" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#43">source</a><h4 class="code-header">fn <a href="#tymethod.poll_reset" class="fn">poll_reset</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;) -&gt; <a  [...]
-</div></details></div><h2 id="trait-implementations" class="small-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-dyn+Stream" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#116-124">source</a><a href="#impl-Stream-for-dyn+Stream" class="anchor">§</a><h3 class="code-header [...]
+</div></details></div><h2 id="trait-implementations" class="small-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-dyn+Stream" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#128-136">source</a><a href="#impl-Stream-for-dyn+Stream" class="anchor">§</a><h3 class="code-header [...]
     self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.72.0/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/1.72.0/std/primitive.usize.html">usize</a>, <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/option/enum.Option.html" ti [...]
+<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/1.72.0/std/primitive.usize.html">usize</a>, <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/option/enum.Option.html" ti [...]
 To make Streamer work as expected, we must add this impl.</p>
-</div><div class="impl-items"><section id="method.poll_next-3" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#63-65">source</a><a href="#method.poll_next-3" 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/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</ [...]
\ No newline at end of file
+</div><div class="impl-items"><section id="method.poll_next-3" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#63-65">source</a><a href="#method.poll_next-3" 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/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</ [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.StreamExt.html b/docs/rust/opendal/raw/oio/trait.StreamExt.html
index 6cc25dcf0..ffc7a344e 100644
--- a/docs/rust/opendal/raw/oio/trait.StreamExt.html
+++ b/docs/rust/opendal/raw/oio/trait.StreamExt.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="Extension of `Stream` to make it easier for use."><title>StreamExt 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" c [...]
+<!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 `Stream` to make it easier for use."><title>StreamExt 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" c [...]
     // Provided methods
     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.reset" class="fn">reset</a>(&amp;mut self) -&gt; ResetFuture&lt;'_, Self&gt; { ... }
@@ -8,12 +8,12 @@
 <span class="item-spacer"></span>    fn <a href="#method.collect" class="fn">collect</a>(self) -&gt; Collect&lt;Self&gt;
        <span class="where">where Self: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a></span> { ... }
 }</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.Stream.html" title="trait opendal::raw::oio::Stream"><code>Stream</code></a> to make it easier for use.</p>
-</div></details><h2 id="provided-methods" class="small-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.next" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#132-134">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></su [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.reset" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#137-139">source</a><h4 class="code-header">fn <a href="#method.reset" class="fn">reset</a>(&amp;mut self) -&gt; ResetFuture&lt;'_, Self&gt;</h4></section></summary><div class="docblock"><p>Build a future for <code>poll_reset</code>.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.chain" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#142-151">source</a><h4 class="code-header">fn <a href="#method.chain" class="fn">chain</a>&lt;S&gt;(self, other: S) -&gt; Chain&lt;Self, S&gt;<span class="where fmt-newline">where
+</div></details><h2 id="provided-methods" class="small-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.next" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#144-146">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></su [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.reset" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#149-151">source</a><h4 class="code-header">fn <a href="#method.reset" class="fn">reset</a>(&amp;mut self) -&gt; ResetFuture&lt;'_, Self&gt;</h4></section></summary><div class="docblock"><p>Build a future for <code>poll_reset</code>.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.chain" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#154-163">source</a><h4 class="code-header">fn <a href="#method.chain" class="fn">chain</a>&lt;S&gt;(self, other: S) -&gt; Chain&lt;Self, S&gt;<span class="where fmt-newline">where
     Self: <a class="trait" href="https://doc.rust-lang.org/1.72.0/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>,</span></h4></section></summary><div class="docblock"><p>Chain this stream with another stream.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.collect" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#154-162">source</a><h4 class="code-header">fn <a href="#method.collect" class="fn">collect</a>(self) -&gt; Collect&lt;Self&gt;<span class="where fmt-newline">where
+</div></details><details class="toggle method-toggle" open><summary><section id="method.collect" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#166-174">source</a><h4 class="code-header">fn <a href="#method.collect" class="fn">collect</a>(self) -&gt; Collect&lt;Self&gt;<span class="where fmt-newline">where
     Self: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h4></section></summary><div class="docblock"><p>Collect all items from this stream into a single bytes.</p>
-</div></details></div><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><section id="impl-StreamExt-for-T" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#127">source</a><a href="#impl-StreamExt-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T: <a class="trait" href="trait.Stream.html" title="trait opendal::raw::oio::Stream">Stream</a>&gt;  [...]
+</div></details></div><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><section id="impl-StreamExt-for-T" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/stream/api.rs.html#139">source</a><a href="#impl-StreamExt-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T: <a class="trait" href="trait.Stream.html" title="trait opendal::raw::oio::Stream">Stream</a>&gt;  [...]
 </div></div><script src="../../../implementors/opendal/raw/oio/stream/api/trait.StreamExt.js" async></script></section></div></main></body></html>
\ 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 9e60c8eeb..3b49b66d6 100644
--- a/docs/rust/opendal/raw/oio/trait.Write.html
+++ b/docs/rust/opendal/raw/oio/trait.Write.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="Write is the trait that OpenDAL returns to callers."><title>Write 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" cr [...]
+<!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="Write is the trait that OpenDAL returns to callers."><title>Write 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" cr [...]
     // Required methods
     fn <a href="#tymethod.write" class="fn">write</a>&lt;'life0, 'async_trait&gt;(
         &amp;'life0 mut self,
@@ -6,10 +6,10 @@
     ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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 open [...]
        <span class="where">where Self: 'async_trait,
              'life0: 'async_trait</span>;
-<span class="item-spacer"></span>    fn <a href="#tymethod.sink" class="fn">sink</a>&lt;'life0, 'async_trait&gt;(
+<span class="item-spacer"></span>    fn <a href="#tymethod.pipe" class="fn">pipe</a>&lt;'life0, 'async_trait&gt;(
         &amp;'life0 mut self,
         size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
-        s: <a class="type" href="type.Streamer.html" title="type opendal::raw::oio::Streamer">Streamer</a>
+        s: <a class="type" href="type.Reader.html" title="type opendal::raw::oio::Reader">Reader</a>
     ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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 open [...]
        <span class="where">where Self: 'async_trait,
              'life0: 'async_trait</span>;
@@ -37,10 +37,10 @@
 </ul>
 <p>It’s possible that <code>n &lt; bs.len()</code>, caller should pass the remaining bytes
 repeatedly until all bytes has been written.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.sink" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#99">source</a><h4 class="code-header">fn <a href="#tymethod.sink" class="fn">sink</a>&lt;'life0, 'async_trait&gt;(
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.pipe" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#99">source</a><h4 class="code-header">fn <a href="#tymethod.pipe" class="fn">pipe</a>&lt;'life0, 'async_trait&gt;(
     &amp;'life0 mut self,
     size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
-    s: <a class="type" href="type.Streamer.html" title="type opendal::raw::oio::Streamer">Streamer</a>
+    s: <a class="type" href="type.Reader.html" title="type opendal::raw::oio::Reader">Reader</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
     'life0: 'async_trait,</span></h4></section></summary><div class="docblock"><p>Sink given stream into writer.</p>
@@ -66,10 +66,10 @@ repeatedly until all bytes has been written.</p>
     bs: Bytes
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section><section id="method.sink" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#116-121">source</a><a href="#method.sink" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.sink" class="fn">sink</a>&lt;'life0, 'async_trait&gt;(
+    'life0: 'async_trait,</span></h4></section><section id="method.pipe" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#116-121">source</a><a href="#method.pipe" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.pipe" class="fn">pipe</a>&lt;'life0, 'async_trait&gt;(
     &amp;'life0 mut self,
     __arg1: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
-    __arg2: <a class="type" href="type.Streamer.html" title="type opendal::raw::oio::Streamer">Streamer</a>
+    __arg2: <a class="type" href="type.Reader.html" title="type opendal::raw::oio::Reader">Reader</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
     'life0: 'async_trait,</span></h4></section><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#123-128">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.abort" class="fn">abort</a>&lt;'life0, 'async_trait&gt;(
@@ -87,10 +87,10 @@ repeatedly until all bytes has been written.</p>
     bs: Bytes
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section><section id="method.sink-1" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#147-149">source</a><a href="#method.sink-1" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.sink" class="fn">sink</a>&lt;'life0, 'async_trait&gt;(
+    'life0: 'async_trait,</span></h4></section><section id="method.pipe-1" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#147-149">source</a><a href="#method.pipe-1" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.pipe" class="fn">pipe</a>&lt;'life0, 'async_trait&gt;(
     &amp;'life0 mut self,
     n: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
-    s: <a class="type" href="type.Streamer.html" title="type opendal::raw::oio::Streamer">Streamer</a>
+    s: <a class="type" href="type.Reader.html" title="type opendal::raw::oio::Reader">Reader</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
     'life0: 'async_trait,</span></h4></section><section id="method.abort-1" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#151-153">source</a><a href="#method.abort-1" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.abort" class="fn">abort</a>&lt;'life0, 'async_trait&gt;(
@@ -101,6 +101,6 @@ repeatedly until all bytes has been written.</p>
     &amp;'life0 mut self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/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: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></div></details><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><section id="impl-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#59-87">source</a><a href="#impl-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE: [...]
-    W: <a class="trait" href="trait.AppendObjectWrite.html" title="trait opendal::raw::oio::AppendObjectWrite">AppendObjectWrite</a>,</span></h3></section><section id="impl-Write-for-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#119-171">source</a><a href="#impl-Write-for-MultipartUploadWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W&gt; <a class="trait" href="trait.Writ [...]
-    W: <a class="trait" href="trait.MultipartUploadWrite.html" title="trait opendal::raw::oio::MultipartUploadWrite">MultipartUploadWrite</a>,</span></h3></section><section id="impl-Write-for-OneShotWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#51-73">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 [...]
\ No newline at end of file
+    'life0: 'async_trait,</span></h4></section></div></details><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><section id="impl-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#58-86">source</a><a href="#impl-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE: [...]
+    W: <a class="trait" href="trait.AppendObjectWrite.html" title="trait opendal::raw::oio::AppendObjectWrite">AppendObjectWrite</a>,</span></h3></section><section id="impl-Write-for-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#119-176">source</a><a href="#impl-Write-for-MultipartUploadWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W&gt; <a class="trait" href="trait.Writ [...]
+    W: <a class="trait" href="trait.MultipartUploadWrite.html" title="trait opendal::raw::oio::MultipartUploadWrite">MultipartUploadWrite</a>,</span></h3></section><section id="impl-Write-for-OneShotWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#51-73">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 [...]
\ 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 dc1ce74ce..bd12179bc 100644
--- a/docs/rust/opendal/raw/trait.Layer.html
+++ b/docs/rust/opendal/raw/trait.Layer.html
@@ -86,4 +86,4 @@ requires <code>Send</code> and <code>Sync</code>.</p>
 }</code></pre></div>
 </div></details><h2 id="required-associated-types" class="small-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="srclink rightside" href="../../src/opendal/raw/layer.rs.html#119">source</a><h4 class="code-header">type <a href="#associatedtype.LayeredAccessor" class="associatedtype">LayeredAccessor</a>: <a cl [...]
 </div></details></div><h2 id="required-methods" class="small-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="srclink rightside" href="../../src/opendal/raw/layer.rs.html#122">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="trai [...]
-</div></details></div><h2 id="implementors" class="small-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="srclink 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: [...]
\ No newline at end of file
+</div></details></div><h2 id="implementors" class="small-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="srclink 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: [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/struct.BlockingWriter.html b/docs/rust/opendal/struct.BlockingWriter.html
index 32948331f..d13c269bb 100644
--- a/docs/rust/opendal/struct.BlockingWriter.html
+++ b/docs/rust/opendal/struct.BlockingWriter.html
@@ -1,8 +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="BlockingWriter is designed to write data into given path in an blocking manner."><title>BlockingWriter 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" [...]
+<!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="BlockingWriter is designed to write data into given path in an blocking manner."><title>BlockingWriter 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" [...]
 manner.</p>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingWriter" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#386-416">source</a><a href="#impl-BlockingWriter" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.BlockingWriter.htm [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#413-415">source</a><h4 class="code-header">pub fn <a href="#method.close" class="fn">close</a>(&amp;mut 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/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></section></ [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-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-Write-for-BlockingWriter" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#418-430">source</a><a href="#impl-Write-for-BlockingWriter" class="anchor">§</a><h3 class="c [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingWriter" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#387-417">source</a><a href="#impl-BlockingWriter" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.BlockingWriter.htm [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#414-416">source</a><h4 class="code-header">pub fn <a href="#method.close" class="fn">close</a>(&amp;mut 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/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></section></ [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-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-Write-for-BlockingWriter" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#419-430">source</a><a href="#impl-Write-for-BlockingWriter" class="anchor">§</a><h3 class="c [...]
 contents reach their destination. <a href="https://doc.rust-lang.org/1.72.0/std/io/trait.Write.html#tymethod.flush">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.write_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="srclink" href="https://doc.rust-lang.org/1.72.0/src/std/io/mod.rs.html#1495">source</a></span><a href="#method.write_vecto [...]
 implementation. <a href="https://doc.rust-lang.org/1.72.0/std/io/trait.Write.html#method.is_write_vectored">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.write_all" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="srclink" href="https://doc.rust-lang.org/1.72.0/src/std/io/mod.rs.html#1572">source</a></span><a href="#method.write_all" class="anchor"> [...]
 encountered. <a href="https://doc.rust-lang.org/1.72.0/std/io/trait.Write.html#method.write_fmt">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.by_ref" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="srclink" href="https://doc.rust-lang.org/1.72.0/src/std/io/mod.rs.html#1749-1751">source</a></span><a href="#method.by_ref" class="anchor">§</a><h4 cla [...]
diff --git a/docs/rust/opendal/struct.Writer.html b/docs/rust/opendal/struct.Writer.html
index 6dda633e2..087ff5b14 100644
--- a/docs/rust/opendal/struct.Writer.html
+++ b/docs/rust/opendal/struct.Writer.html
@@ -15,7 +15,7 @@ be written in one request.</p>
 <p>Some services also supports <code>unsized</code> writer. They MAY buffer part of the data
 and flush them into storage at needs. And finally, the file will be available
 after <code>close</code> has been called.</p>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Writer" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#66-229">source</a><a href="#impl-Writer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Writer.html" title="struct opendal: [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Writer" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#66-232">source</a><a href="#impl-Writer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Writer.html" title="struct opendal: [...]
 </div></details><details class="toggle method-toggle" open><summary><section id="method.sink" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#135-149">source</a><h4 class="code-header">pub async fn <a href="#method.sink" class="fn">sink</a>&lt;S, T&gt;(&amp;mut self, size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>, sink_from: S) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result [...]
     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/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Un [...]
     T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Bytes&gt;,</span></h4></section></summary><div class="docblock"><p>Sink into writer.</p>
@@ -45,8 +45,8 @@ directly without extra in-memory buffer.</p>
     w.close().<span class="kw">await</span><span class="question-mark">?</span>;
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.copy" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#181-194">source</a><h4 class="code-header">pub async fn <a href="#method.copy" class="fn">copy</a>&lt;R&gt;(&amp;mut self, size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>, read_from: R) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">R [...]
-    R: AsyncRead + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + 'static,</span></h4></section></summary><div class="docblock"><p>Copy into writer.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.copy" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#181-197">source</a><h4 class="code-header">pub async fn <a href="#method.copy" class="fn">copy</a>&lt;R&gt;(&amp;mut self, size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>, read_from: R) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">R [...]
+    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + 'static,</span></h4></section></summary><div class="docblock"><p>Copy i [...]
 <p>copy will read data from given reader and write them into writer
 directly with only one constant in-memory buffer.</p>
 <h5 id="notes-3"><a href="#notes-3">Notes</a></h5>
@@ -71,31 +71,31 @@ directly with only one constant in-memory buffer.</p>
     w.close().<span class="kw">await</span><span class="question-mark">?</span>;
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#202-211">source</a><h4 class="code-header">pub async fn <a href="#method.abort" class="fn">abort</a>(&amp;mut 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/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></sect [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#205-214">source</a><h4 class="code-header">pub async fn <a href="#method.abort" class="fn">abort</a>(&amp;mut 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/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></sect [...]
 <h6 id="notes-4"><a href="#notes-4">Notes</a></h6>
 <p>Abort should only be called when the writer is not closed or
 aborted, otherwise an unexpected error could be returned.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#219-228">source</a><h4 class="code-header">pub async fn <a href="#method.close" class="fn">close</a>(&amp;mut 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/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></sect [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#222-231">source</a><h4 class="code-header">pub async fn <a href="#method.close" class="fn">close</a>(&amp;mut 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/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></sect [...]
 <h6 id="notes-5"><a href="#notes-5">Notes</a></h6>
 <p>Close should only be called when the writer is not closed or
 aborted, otherwise an unexpected error could be returned.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="small-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-AsyncWrite-for-Writer" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#314-378">source</a><a href="#impl-AsyncWrite-for-Writer" class="anchor">§</a><h3 class="code-he [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-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-AsyncWrite-for-Writer" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#316-379">source</a><a href="#impl-AsyncWrite-for-Writer" class="anchor">§</a><h3 class="code-he [...]
     self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     buf: &amp;[<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/1.72.0/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to write bytes from <code>buf</code> into the object. <a [...]
-their destination. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.poll_shutdown" class="method trait-impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#352-377">source</a><a href="#method.poll_shutdown" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_shutdown</a>(self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>& [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/1.72.0/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to write bytes from <code>buf</code> into the object. <a [...]
+their destination. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.poll_shutdown" class="method trait-impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#353-378">source</a><a href="#method.poll_shutdown" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_shutdown</a>(self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>& [...]
 the I/O connection has completely shut down. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.poll_write_vectored" class="method trait-impl"><a href="#method.poll_write_vectored" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_write_vectored</a>(
     self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     bufs: &amp;[<a class="struct" href="https://doc.rust-lang.org/1.72.0/std/io/struct.IoSlice.html" title="struct std::io::IoSlice">IoSlice</a>&lt;'_&gt;]
 ) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.72.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>, <a class="struct" href="https://doc.rust-lang.org/1.72.0/std/io/error/struct.Error.html" title="struct std::io::error::E [...]
-implementation. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncWrite-for-Writer-1" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#247-312">source</a><a href="#impl-AsyncWrite-for-Writer-1" class="anchor">§</a><h3 class="code-header">impl AsyncWrite for <a class="struct" href="struct.Writer.html" title="struct opendal::Writer">Writer</a></h3></section></summary><div class [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.poll_write-1" class="method trait-impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#248-279">source</a><a href="#method.poll_write-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_write</a>(
+implementation. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncWrite-for-Writer-1" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#250-314">source</a><a href="#impl-AsyncWrite-for-Writer-1" class="anchor">§</a><h3 class="code-header">impl AsyncWrite for <a class="struct" href="struct.Writer.html" title="struct opendal::Writer">Writer</a></h3></section></summary><div class [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.poll_write-1" class="method trait-impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#251-281">source</a><a href="#method.poll_write-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_write</a>(
     self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     buf: &amp;[<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/1.72.0/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to write bytes from <code>buf</code> into the object. <a [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/1.72.0/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to write bytes from <code>buf</code> into the object. <a [...]
     self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     bufs: &amp;[<a class="struct" href="https://doc.rust-lang.org/1.72.0/std/io/struct.IoSlice.html" title="struct std::io::IoSlice">IoSlice</a>&lt;'_&gt;]
diff --git a/docs/rust/search-index.js b/docs/rust/search-index.js
index 80ce84469..3afe25b9d 100644
--- a/docs/rust/search-index.js
+++ b/docs/rust/search-index.js
@@ -1,5 +1,5 @@
 var searchIndex = JSON.parse('{\
-"opendal":{"doc":"OpenDAL is the Open Data Access Layer to <strong>freely</strong> access …","t":"QNNNDDDDINNDNNNNNNNNNNNNNNNDEDENNNNNNNNNNNNNNNNNDNNDENNNNNNNDDDNNNNNDNNGNNSENNNNNNNNNNNNDLMMMLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLMLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL [...]
+"opendal":{"doc":"OpenDAL is the Open Data Access Layer to <strong>freely</strong> access …","t":"QNNNDDDDINNDNNNNNNNNNNNNNNNDEDENNNNNNNNNNNNNNNNNDNNDENNNNNNNDDDNNNNNDNNGNNSENNNNNNNNNNNNDLMMMLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLMLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL [...]
 }');
 if (typeof window !== 'undefined' && window.initSearch) {window.initSearch(searchIndex)};
 if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
diff --git a/docs/rust/source-files.js b/docs/rust/source-files.js
index e80e61789..fc06a3cc3 100644
--- a/docs/rust/source-files.js
+++ b/docs/rust/source-files.js
@@ -1,4 +1,4 @@
 var sourcesIndex = JSON.parse('{\
-"opendal":["",[["docs",[["comparisons",[],["mod.rs"]],["internals",[],["accessor.rs","layer.rs","mod.rs"]],["rfcs",[],["mod.rs"]]],["concepts.rs","mod.rs"]],["layers",[],["async_backtrace.rs","await_tree.rs","blocking.rs","chaos.rs","complete.rs","concurrent_limit.rs","error_context.rs","immutable_index.rs","logging.rs","madsim.rs","metrics.rs","minitrace.rs","mod.rs","oteltrace.rs","prometheus.rs","retry.rs","throttle.rs","timeout.rs","tracing.rs","type_eraser.rs"]],["raw",[["adapters", [...]
+"opendal":["",[["docs",[["comparisons",[],["mod.rs"]],["internals",[],["accessor.rs","layer.rs","mod.rs"]],["rfcs",[],["mod.rs"]]],["concepts.rs","mod.rs"]],["layers",[],["async_backtrace.rs","await_tree.rs","blocking.rs","chaos.rs","complete.rs","concurrent_limit.rs","error_context.rs","immutable_index.rs","logging.rs","madsim.rs","metrics.rs","minitrace.rs","mod.rs","oteltrace.rs","prometheus.rs","retry.rs","throttle.rs","timeout.rs","tracing.rs","type_eraser.rs"]],["raw",[["adapters", [...]
 }');
 createSourceSidebar();
diff --git a/docs/rust/src/opendal/layers/complete.rs.html b/docs/rust/src/opendal/layers/complete.rs.html
index 85d92c81e..b71dec77c 100644
--- a/docs/rust/src/opendal/layers/complete.rs.html
+++ b/docs/rust/src/opendal/layers/complete.rs.html
@@ -1723,12 +1723,12 @@
         <span class="kw">let </span>w = <span class="self">self</span>.inner.as_mut().ok_or_else(|| {
             Error::new(ErrorKind::Unexpected, <span class="string">&quot;writer has been closed or aborted&quot;</span>)
         })<span class="question-mark">?</span>;
-        w.write(bs).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="self">self</span>.written += n <span class="kw">as </span>u64;
-        <span class="prelude-val">Ok</span>(n <span class="kw">as </span>u64)
+        <span class="kw">let </span>n = w.write(bs).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="self">self</span>.written += n;
+        <span class="prelude-val">Ok</span>(n)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">if let </span><span class="prelude-val">Some</span>(total_size) = <span class="self">self</span>.size {
             <span class="kw">if </span><span class="self">self</span>.written + size &gt; total_size {
                 <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
@@ -1744,7 +1744,7 @@
         <span class="kw">let </span>w = <span class="self">self</span>.inner.as_mut().ok_or_else(|| {
             Error::new(ErrorKind::Unexpected, <span class="string">&quot;writer has been closed or aborted&quot;</span>)
         })<span class="question-mark">?</span>;
-        <span class="kw">let </span>n = w.sink(size, s).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="kw">let </span>n = w.pipe(size, s).<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="self">self</span>.written += n;
         <span class="prelude-val">Ok</span>(n)
     }
diff --git a/docs/rust/src/opendal/layers/concurrent_limit.rs.html b/docs/rust/src/opendal/layers/concurrent_limit.rs.html
index aedc327ad..c84847fe2 100644
--- a/docs/rust/src/opendal/layers/concurrent_limit.rs.html
+++ b/docs/rust/src/opendal/layers/concurrent_limit.rs.html
@@ -619,8 +619,8 @@
         <span class="self">self</span>.inner.abort().<span class="kw">await
     </span>}
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="self">self</span>.inner.sink(size, s).<span class="kw">await
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.pipe(size, s).<span class="kw">await
     </span>}
 
     <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
diff --git a/docs/rust/src/opendal/layers/error_context.rs.html b/docs/rust/src/opendal/layers/error_context.rs.html
index 1ebdab8bd..fa1c7ac88 100644
--- a/docs/rust/src/opendal/layers/error_context.rs.html
+++ b/docs/rust/src/opendal/layers/error_context.rs.html
@@ -895,9 +895,9 @@
         })
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="self">self</span>.inner.sink(size, s).<span class="kw">await</span>.map_err(|err| {
-            err.with_operation(WriteOperation::Sink)
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.pipe(size, s).<span class="kw">await</span>.map_err(|err| {
+            err.with_operation(WriteOperation::Pipe)
                 .with_context(<span class="string">&quot;service&quot;</span>, <span class="self">self</span>.scheme)
                 .with_context(<span class="string">&quot;path&quot;</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 f8c5ca10e..62ddd4a1e 100644
--- a/docs/rust/src/opendal/layers/logging.rs.html
+++ b/docs/rust/src/opendal/layers/logging.rs.html
@@ -2866,15 +2866,15 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="kw">match </span><span class="self">self</span>.inner.sink(size, s).<span class="kw">await </span>{
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">match </span><span class="self">self</span>.inner.pipe(size, s).<span class="kw">await </span>{
             <span class="prelude-val">Ok</span>(n) =&gt; {
                 <span class="self">self</span>.written += n;
                 <span class="macro">trace!</span>(
                     target: LOGGING_TARGET,
                     <span class="string">&quot;service={} operation={} path={} written={} -&gt; data sink {}B&quot;</span>,
                     <span class="self">self</span>.ctx.scheme,
-                    WriteOperation::Sink,
+                    WriteOperation::Pipe,
                     <span class="self">self</span>.path,
                     <span class="self">self</span>.written,
                     n
@@ -2888,7 +2888,7 @@
                         lvl,
                         <span class="string">&quot;service={} operation={} path={} written={} -&gt; data sink failed: {}&quot;</span>,
                         <span class="self">self</span>.ctx.scheme,
-                        WriteOperation::Sink,
+                        WriteOperation::Pipe,
                         <span class="self">self</span>.path,
                         <span class="self">self</span>.written,
                         <span class="self">self</span>.ctx.error_print(<span class="kw-2">&amp;</span>err),
diff --git a/docs/rust/src/opendal/layers/madsim.rs.html b/docs/rust/src/opendal/layers/madsim.rs.html
index b993b9fa6..1acb46e17 100644
--- a/docs/rust/src/opendal/layers/madsim.rs.html
+++ b/docs/rust/src/opendal/layers/madsim.rs.html
@@ -791,7 +791,7 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="kw">crate</span>::Result&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="kw">crate</span>::Result&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;will be supported in the future&quot;</span>,
diff --git a/docs/rust/src/opendal/layers/metrics.rs.html b/docs/rust/src/opendal/layers/metrics.rs.html
index 0240362ef..9900b6db5 100644
--- a/docs/rust/src/opendal/layers/metrics.rs.html
+++ b/docs/rust/src/opendal/layers/metrics.rs.html
@@ -1774,9 +1774,9 @@
             })
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="self">self</span>.inner
-            .sink(size, s)
+            .pipe(size, s)
             .<span class="kw">await
             </span>.map(|n| {
                 <span class="self">self</span>.bytes += n;
diff --git a/docs/rust/src/opendal/layers/minitrace.rs.html b/docs/rust/src/opendal/layers/minitrace.rs.html
index 5c2dd2f8a..ce8b339ad 100644
--- a/docs/rust/src/opendal/layers/minitrace.rs.html
+++ b/docs/rust/src/opendal/layers/minitrace.rs.html
@@ -761,11 +761,11 @@
             .<span class="kw">await
     </span>}
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="self">self</span>.inner
-            .sink(size, s)
+            .pipe(size, s)
             .in_span(Span::enter_with_parent(
-                WriteOperation::Sink.into_static(),
+                WriteOperation::Pipe.into_static(),
                 <span class="kw-2">&amp;</span><span class="self">self</span>.span,
             ))
             .<span class="kw">await
diff --git a/docs/rust/src/opendal/layers/oteltrace.rs.html b/docs/rust/src/opendal/layers/oteltrace.rs.html
index ae31d4e45..5533c5816 100644
--- a/docs/rust/src/opendal/layers/oteltrace.rs.html
+++ b/docs/rust/src/opendal/layers/oteltrace.rs.html
@@ -671,8 +671,8 @@
         <span class="self">self</span>.inner.write(bs).<span class="kw">await
     </span>}
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="self">self</span>.inner.sink(size, s).<span class="kw">await
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.pipe(size, s).<span class="kw">await
     </span>}
 
     <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
diff --git a/docs/rust/src/opendal/layers/prometheus.rs.html b/docs/rust/src/opendal/layers/prometheus.rs.html
index cebd2306c..1f0784361 100644
--- a/docs/rust/src/opendal/layers/prometheus.rs.html
+++ b/docs/rust/src/opendal/layers/prometheus.rs.html
@@ -1416,9 +1416,9 @@
             })
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="self">self</span>.inner
-            .sink(size, s)
+            .pipe(size, s)
             .<span class="kw">await
             </span>.map(|n| {
                 <span class="self">self</span>.stats
diff --git a/docs/rust/src/opendal/layers/retry.rs.html b/docs/rust/src/opendal/layers/retry.rs.html
index 2fcf54d8b..46873044d 100644
--- a/docs/rust/src/opendal/layers/retry.rs.html
+++ b/docs/rust/src/opendal/layers/retry.rs.html
@@ -1438,7 +1438,6 @@
 <span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>futures::FutureExt;
 <span class="kw">use </span>log::warn;
-<span class="kw">use </span>tokio::sync::Mutex;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::oio::PageOperation;
 <span class="kw">use </span><span class="kw">crate</span>::raw::oio::ReadOperation;
@@ -2323,26 +2322,27 @@
     /// The overhead is constant, which means the overhead will not increase with the size of
     /// stream. For example, if every `next` call cost 1ms, then the overhead will only take 0.005%
     /// which is acceptable.
-    </span><span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="kw">let </span>s = Arc::new(Mutex::new(s));
+    </span><span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">let </span>s = oio::into_cloneable_reader_within_tokio(s);
 
         <span class="kw">let </span><span class="kw-2">mut </span>backoff = <span class="self">self</span>.builder.build();
 
         <span class="kw">loop </span>{
-            <span class="kw">match </span><span class="self">self</span>.inner.sink(size, Box::new(s.clone())).<span class="kw">await </span>{
+            <span class="kw">match </span><span class="self">self</span>.inner.pipe(size, Box::new(s.clone())).<span class="kw">await </span>{
                 <span class="prelude-val">Ok</span>(n) =&gt; <span class="kw">return </span><span class="prelude-val">Ok</span>(n),
                 <span class="prelude-val">Err</span>(e) <span class="kw">if </span>!e.is_temporary() =&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
                 <span class="prelude-val">Err</span>(e) =&gt; <span class="kw">match </span>backoff.next() {
                     <span class="prelude-val">None </span>=&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
                     <span class="prelude-val">Some</span>(dur) =&gt; {
                         {
-                            <span class="kw">use </span>oio::StreamExt;
+                            <span class="kw">use </span>oio::ReadExt;
 
+                            <span class="kw">let </span>s = s.clone().into_inner();
                             <span class="kw">let </span><span class="kw-2">mut </span>stream = s.lock().<span class="kw">await</span>;
-                            <span class="comment">// Try to reset this stream.
+                            <span class="comment">// Try to reset this reader.
                             //
-                            // If error happened, we will return the sink error directly and stop retry.
-                            </span><span class="kw">if </span>stream.reset().<span class="kw">await</span>.is_err() {
+                            // If error happened, we will return the pipe error directly and stop retry.
+                            </span><span class="kw">if </span>stream.seek(io::SeekFrom::Start(<span class="number">0</span>)).<span class="kw">await</span>.is_err() {
                                 <span class="kw">return </span><span class="prelude-val">Err</span>(e);
                             }
                         }
@@ -2351,7 +2351,7 @@
                             <span class="kw-2">&amp;</span>e,
                             dur,
                             <span class="kw-2">&amp;</span>[
-                                (<span class="string">&quot;operation&quot;</span>, WriteOperation::Sink.into_static()),
+                                (<span class="string">&quot;operation&quot;</span>, WriteOperation::Pipe.into_static()),
                                 (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
                             ],
                         );
diff --git a/docs/rust/src/opendal/layers/throttle.rs.html b/docs/rust/src/opendal/layers/throttle.rs.html
index f929d12aa..4b93e8473 100644
--- a/docs/rust/src/opendal/layers/throttle.rs.html
+++ b/docs/rust/src/opendal/layers/throttle.rs.html
@@ -283,7 +283,6 @@
 <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>
 </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
@@ -319,7 +318,6 @@
 <span class="kw">use </span>governor::Quota;
 <span class="kw">use </span>governor::RateLimiter;
 
-<span class="kw">use </span><span class="kw">crate</span>::raw::oio::Streamer;
 <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>;
 
@@ -528,8 +526,8 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="self">self</span>.inner.sink(size, s).<span class="kw">await
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.pipe(size, s).<span class="kw">await
     </span>}
 
     <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
diff --git a/docs/rust/src/opendal/layers/timeout.rs.html b/docs/rust/src/opendal/layers/timeout.rs.html
index f807eb9dc..16ed4054c 100644
--- a/docs/rust/src/opendal/layers/timeout.rs.html
+++ b/docs/rust/src/opendal/layers/timeout.rs.html
@@ -721,14 +721,14 @@
             })<span class="question-mark">?
     </span>}
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">let </span>timeout = <span class="self">self</span>.io_timeout(size);
 
-        tokio::time::timeout(timeout, <span class="self">self</span>.inner.sink(size, s))
+        tokio::time::timeout(timeout, <span class="self">self</span>.inner.pipe(size, s))
             .<span class="kw">await
             </span>.map_err(|<span class="kw">_</span>| {
                 Error::new(ErrorKind::Unexpected, <span class="string">&quot;operation timeout&quot;</span>)
-                    .with_operation(WriteOperation::Sink)
+                    .with_operation(WriteOperation::Pipe)
                     .with_context(<span class="string">&quot;timeout&quot;</span>, timeout.as_secs_f64().to_string())
                     .set_temporary()
             })<span class="question-mark">?
diff --git a/docs/rust/src/opendal/layers/tracing.rs.html b/docs/rust/src/opendal/layers/tracing.rs.html
index e4bf40000..b75c92ab4 100644
--- a/docs/rust/src/opendal/layers/tracing.rs.html
+++ b/docs/rust/src/opendal/layers/tracing.rs.html
@@ -719,8 +719,8 @@
         parent = <span class="kw-2">&amp;</span><span class="self">self</span>.span,
         level = <span class="string">&quot;trace&quot;</span>,
         skip_all)]
-    </span><span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="self">self</span>.inner.sink(size, s).<span class="kw">await
+    </span><span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.pipe(size, s).<span class="kw">await
     </span>}
 
     <span class="attr">#[tracing::instrument(
diff --git a/docs/rust/src/opendal/raw/adapters/kv/backend.rs.html b/docs/rust/src/opendal/raw/adapters/kv/backend.rs.html
index 418bc7be4..61d3fcd8d 100644
--- a/docs/rust/src/opendal/raw/adapters/kv/backend.rs.html
+++ b/docs/rust/src/opendal/raw/adapters/kv/backend.rs.html
@@ -835,7 +835,7 @@
         <span class="prelude-val">Ok</span>(size <span class="kw">as </span>u64)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/raw/adapters/typed_kv/backend.rs.html b/docs/rust/src/opendal/raw/adapters/typed_kv/backend.rs.html
index f5ddc3a85..ebac24d07 100644
--- a/docs/rust/src/opendal/raw/adapters/typed_kv/backend.rs.html
+++ b/docs/rust/src/opendal/raw/adapters/typed_kv/backend.rs.html
@@ -855,7 +855,7 @@
         <span class="prelude-val">Ok</span>(size <span class="kw">as </span>u64)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/raw/oio/cursor.rs.html b/docs/rust/src/opendal/raw/oio/cursor.rs.html
index f483016d2..7e2dd3734 100644
--- a/docs/rust/src/opendal/raw/oio/cursor.rs.html
+++ b/docs/rust/src/opendal/raw/oio/cursor.rs.html
@@ -914,7 +914,7 @@
 <span class="doccomment">/// ChunkedCursor is used represents a non-contiguous bytes in memory.
 ///
 /// This is useful when we buffer users&#39; random writes without copy. ChunkedCursor implements
-/// [`oio::Stream`] so it can be used in [`oio::Write::sink`] directly.
+/// [`oio::Stream`] so it can be used in [`oio::Write::pipe`] directly.
 ///
 /// # TODO
 ///
diff --git a/docs/rust/src/opendal/raw/oio/read/cloneable_read.rs.html b/docs/rust/src/opendal/raw/oio/read/cloneable_read.rs.html
new file mode 100644
index 000000000..2c8af971d
--- /dev/null
+++ b/docs/rust/src/opendal/raw/oio/read/cloneable_read.rs.html
@@ -0,0 +1,275 @@
+<!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="Source of the Rust file `core/src/raw/oio/read/cloneable_read.rs`."><title>cloneable_read.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type=" [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<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>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<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>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<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>
+</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
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// &quot;License&quot;); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+</span><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>;
+<span class="kw">use </span>bytes::Bytes;
+<span class="kw">use </span>std::io::SeekFrom;
+<span class="kw">use </span>std::sync::Arc;
+<span class="kw">use </span>std::task::{Context, Poll};
+
+<span class="doccomment">/// Convert given reader into a wrapper with `std::sync::Mutex` for `Send + Sync + Clone`.
+</span><span class="kw">pub fn </span>into_cloneable_reader_within_std&lt;R&gt;(reader: R) -&gt; CloneableReaderWithinStd&lt;R&gt; {
+    CloneableReaderWithinStd(Arc::new(std::sync::Mutex::new(reader)))
+}
+
+<span class="doccomment">/// CloneableReaderWithinStd is a Send + Sync + Clone with `std::sync::Mutex` wrapper of input
+/// reader.
+///
+/// Caller can clone this reader but only one thread can calling `oio::Read` API at the
+/// same time, otherwise, we will return error if lock block happened.
+</span><span class="kw">pub struct </span>CloneableReaderWithinStd&lt;R&gt;(Arc&lt;std::sync::Mutex&lt;R&gt;&gt;);
+
+<span class="kw">impl</span>&lt;R&gt; CloneableReaderWithinStd&lt;R&gt; {
+    <span class="doccomment">/// Consume self to get inner reader.
+    </span><span class="kw">pub fn </span>into_inner(<span class="self">self</span>) -&gt; Arc&lt;std::sync::Mutex&lt;R&gt;&gt; {
+        <span class="self">self</span>.<span class="number">0
+    </span>}
+}
+
+<span class="kw">impl</span>&lt;R&gt; Clone <span class="kw">for </span>CloneableReaderWithinStd&lt;R&gt; {
+    <span class="kw">fn </span>clone(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="self">Self </span>{
+        <span class="self">Self</span>(<span class="self">self</span>.<span class="number">0</span>.clone())
+    }
+}
+
+<span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>CloneableReaderWithinStd&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">&#39;_</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="number">0</span>.try_lock() {
+            <span class="prelude-val">Ok</span>(<span class="kw-2">mut </span>this) =&gt; this.poll_read(cx, buf),
+            <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                ErrorKind::Unexpected,
+                <span class="string">&quot;the cloneable reader is expected to have only one owner, but it&#39;s not&quot;</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">&#39;_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
+        <span class="kw">match </span><span class="self">self</span>.<span class="number">0</span>.try_lock() {
+            <span class="prelude-val">Ok</span>(<span class="kw-2">mut </span>this) =&gt; this.poll_seek(cx, pos),
+            <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                ErrorKind::Unexpected,
+                <span class="string">&quot;the cloneable reader is expected to have only one owner, but it&#39;s not&quot;</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">&#39;_</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="number">0</span>.try_lock() {
+            <span class="prelude-val">Ok</span>(<span class="kw-2">mut </span>this) =&gt; this.poll_next(cx),
+            <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(Error::new(
+                ErrorKind::Unexpected,
+                <span class="string">&quot;the cloneable reader is expected to have only one owner, but it&#39;s not&quot;</span>,
+            )))),
+        }
+    }
+}
+
+<span class="doccomment">/// Convert given reader into a wrapper with `tokio::sync::Mutex` for `Send + Sync + Clone`.
+</span><span class="kw">pub fn </span>into_cloneable_reader_within_tokio&lt;R&gt;(reader: R) -&gt; CloneableReaderWithinTokio&lt;R&gt; {
+    CloneableReaderWithinTokio(Arc::new(tokio::sync::Mutex::new(reader)))
+}
+
+<span class="doccomment">/// CloneableReaderWithinTokio is a Send + Sync + Clone with `tokio::sync::Mutex` wrapper of input
+/// reader.
+///
+/// Caller can clone this reader but only one thread can calling `oio::Read` API at the
+/// same time, otherwise, we will return error if lock block happened.
+</span><span class="kw">pub struct </span>CloneableReaderWithinTokio&lt;R&gt;(Arc&lt;tokio::sync::Mutex&lt;R&gt;&gt;);
+
+<span class="kw">impl</span>&lt;R&gt; CloneableReaderWithinTokio&lt;R&gt; {
+    <span class="doccomment">/// Consume self to get inner reader.
+    </span><span class="kw">pub fn </span>into_inner(<span class="self">self</span>) -&gt; Arc&lt;tokio::sync::Mutex&lt;R&gt;&gt; {
+        <span class="self">self</span>.<span class="number">0
+    </span>}
+}
+
+<span class="kw">impl</span>&lt;R&gt; Clone <span class="kw">for </span>CloneableReaderWithinTokio&lt;R&gt; {
+    <span class="kw">fn </span>clone(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="self">Self </span>{
+        <span class="self">Self</span>(<span class="self">self</span>.<span class="number">0</span>.clone())
+    }
+}
+
+<span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>CloneableReaderWithinTokio&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">&#39;_</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="number">0</span>.try_lock() {
+            <span class="prelude-val">Ok</span>(<span class="kw-2">mut </span>this) =&gt; this.poll_read(cx, buf),
+            <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                ErrorKind::Unexpected,
+                <span class="string">&quot;the cloneable reader is expected to have only one owner, but it&#39;s not&quot;</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">&#39;_</span>&gt;, pos: SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
+        <span class="kw">match </span><span class="self">self</span>.<span class="number">0</span>.try_lock() {
+            <span class="prelude-val">Ok</span>(<span class="kw-2">mut </span>this) =&gt; this.poll_seek(cx, pos),
+            <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                ErrorKind::Unexpected,
+                <span class="string">&quot;the cloneable reader is expected to have only one owner, but it&#39;s not&quot;</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">&#39;_</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="number">0</span>.try_lock() {
+            <span class="prelude-val">Ok</span>(<span class="kw-2">mut </span>this) =&gt; this.poll_next(cx),
+            <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(Error::new(
+                ErrorKind::Unexpected,
+                <span class="string">&quot;the cloneable reader is expected to have only one owner, but it&#39;s not&quot;</span>,
+            )))),
+        }
+    }
+}
+</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_file.rs.html b/docs/rust/src/opendal/raw/oio/read/into_read_from_file.rs.html
index ad4b588a8..e2e16a940 100644
--- a/docs/rust/src/opendal/raw/oio/read/into_read_from_file.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/into_read_from_file.rs.html
@@ -233,7 +233,7 @@
     }
 }
 
-<span class="doccomment">/// FdReader is a wrapper of input fd to implement [`oio::Read`].
+<span class="doccomment">/// FromFileReader is a wrapper of input fd to implement [`oio::Read`].
 </span><span class="kw">pub struct </span>FromFileReader&lt;R&gt; {
     inner: R,
 
@@ -318,7 +318,7 @@
 
         Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
-            <span class="string">&quot;output reader doesn&#39;t support seeking&quot;</span>,
+            <span class="string">&quot;output reader doesn&#39;t support next&quot;</span>,
         ))))
     }
 }
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
new file mode 100644
index 000000000..af99cd8ba
--- /dev/null
+++ b/docs/rust/src/opendal/raw/oio/read/into_read_from_stream.rs.html
@@ -0,0 +1,167 @@
+<!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="Source of the Rust file `core/src/raw/oio/read/into_read_from_stream.rs`."><title>into_read_from_stream.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<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>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<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>
+</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
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// &quot;License&quot;); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+</span><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>;
+<span class="kw">use </span>bytes::{Buf, Bytes};
+<span class="kw">use </span>futures::StreamExt;
+<span class="kw">use </span>std::io::SeekFrom;
+<span class="kw">use </span>std::task::{Context, Poll};
+
+<span class="doccomment">/// Convert given stream `futures::Stream&lt;Item = Result&lt;Bytes&gt;&gt;` into [`oio::Reader`].
+</span><span class="kw">pub fn </span>into_read_from_stream&lt;S&gt;(stream: S) -&gt; FromStreamReader&lt;S&gt; {
+    FromStreamReader {
+        inner: stream,
+        buf: Bytes::new(),
+    }
+}
+
+<span class="doccomment">/// FromStreamReader will convert a `futures::Stream&lt;Item = Result&lt;Bytes&gt;&gt;` into `oio::Read`
+</span><span class="kw">pub struct </span>FromStreamReader&lt;S&gt; {
+    inner: S,
+    buf: Bytes,
+}
+
+<span class="kw">impl</span>&lt;S, T&gt; oio::Read <span class="kw">for </span>FromStreamReader&lt;S&gt;
+<span class="kw">where
+    </span>S: futures::Stream&lt;Item = <span class="prelude-ty">Result</span>&lt;T&gt;&gt; + Send + Sync + Unpin + <span class="lifetime">&#39;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">&#39;_</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">&#39;_</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(
+            ErrorKind::Unsupported,
+            <span class="string">&quot;FromStreamReader can&#39;t support operation&quot;</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">&#39;_</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">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>),
+        }
+    }
+}
+</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 09b50c7f4..f8d3ce492 100644
--- a/docs/rust/src/opendal/raw/oio/read/mod.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/mod.rs.html
@@ -34,6 +34,16 @@
 <a href="#34" id="34">34</a>
 <a href="#35" id="35">35</a>
 <a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</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
@@ -70,4 +80,14 @@
 <span class="kw">mod </span>into_read_from_file;
 <span class="kw">pub use </span>into_read_from_file::into_read_from_file;
 <span class="kw">pub use </span>into_read_from_file::FromFileReader;
+
+<span class="kw">mod </span>into_read_from_stream;
+<span class="kw">pub use </span>into_read_from_stream::into_read_from_stream;
+<span class="kw">pub use </span>into_read_from_stream::FromStreamReader;
+
+<span class="kw">mod </span>cloneable_read;
+<span class="kw">pub use </span>cloneable_read::into_cloneable_reader_within_std;
+<span class="kw">pub use </span>cloneable_read::into_cloneable_reader_within_tokio;
+<span class="kw">pub use </span>cloneable_read::CloneableReaderWithinStd;
+<span class="kw">pub use </span>cloneable_read::CloneableReaderWithinTokio;
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/raw/oio/stream/api.rs.html b/docs/rust/src/opendal/raw/oio/stream/api.rs.html
index 2f6853dbf..77458c6d0 100644
--- a/docs/rust/src/opendal/raw/oio/stream/api.rs.html
+++ b/docs/rust/src/opendal/raw/oio/stream/api.rs.html
@@ -249,6 +249,18 @@
 <a href="#249" id="249">249</a>
 <a href="#250" id="250">250</a>
 <a href="#251" id="251">251</a>
+<a href="#252" id="252">252</a>
+<a href="#253" id="253">253</a>
+<a href="#254" id="254">254</a>
+<a href="#255" id="255">255</a>
+<a href="#256" id="256">256</a>
+<a href="#257" id="257">257</a>
+<a href="#258" id="258">258</a>
+<a href="#259" id="259">259</a>
+<a href="#260" id="260">260</a>
+<a href="#261" id="261">261</a>
+<a href="#262" id="262">262</a>
+<a href="#263" id="263">263</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
@@ -320,6 +332,18 @@
     }
 }
 
+<span class="kw">impl </span>Stream <span class="kw">for dyn </span>raw::oio::Read {
+    <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">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
+        raw::oio::Read::poll_next(<span class="self">self</span>, cx)
+    }
+
+    <span class="kw">fn </span>poll_reset(<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">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">let _ </span>= raw::oio::Read::poll_seek(<span class="self">self</span>, cx, std::io::SeekFrom::Start(<span class="number">0</span>))<span class="question-mark">?</span>;
+
+        Poll::Ready(<span class="prelude-val">Ok</span>(()))
+    }
+}
+
 <span class="kw">impl</span>&lt;T: Stream + <span class="question-mark">?</span>Sized&gt; Stream <span class="kw">for </span>Arc&lt;std::sync::Mutex&lt;T&gt;&gt; {
     <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">&#39;_</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>.try_lock() {
diff --git a/docs/rust/src/opendal/raw/oio/write/api.rs.html b/docs/rust/src/opendal/raw/oio/write/api.rs.html
index b72ac33a1..3f7f4da43 100644
--- a/docs/rust/src/opendal/raw/oio/write/api.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/api.rs.html
@@ -228,8 +228,8 @@
 </span><span class="kw">pub enum </span>WriteOperation {
     <span class="doccomment">/// Operation for [`Write::write`]
     </span>Write,
-    <span class="doccomment">/// Operation for [`Write::sink`]
-    </span>Sink,
+    <span class="doccomment">/// Operation for [`Write::pipe`]
+    </span>Pipe,
     <span class="doccomment">/// Operation for [`Write::abort`]
     </span>Abort,
     <span class="doccomment">/// Operation for [`Write::close`]
@@ -259,7 +259,7 @@
 
         <span class="kw">match </span>v {
             Write =&gt; <span class="string">&quot;Writer::write&quot;</span>,
-            Sink =&gt; <span class="string">&quot;Writer::sink&quot;</span>,
+            Pipe =&gt; <span class="string">&quot;Writer::pipe&quot;</span>,
             Abort =&gt; <span class="string">&quot;Writer::abort&quot;</span>,
             Close =&gt; <span class="string">&quot;Writer::close&quot;</span>,
             BlockingWrite =&gt; <span class="string">&quot;BlockingWriter::write&quot;</span>,
@@ -294,7 +294,7 @@
     ///
     /// It&#39;s possible that `n &lt; size`, caller should pass the remaining bytes
     /// repeatedly until all bytes has been written.
-    </span><span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt;;
+    </span><span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt;;
 
     <span class="doccomment">/// Abort the pending writer.
     </span><span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt;;
@@ -311,7 +311,7 @@
         <span class="macro">unimplemented!</span>(<span class="string">&quot;write is required to be implemented for oio::Write&quot;</span>)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: u64, <span class="kw">_</span>: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: u64, <span class="kw">_</span>: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;output writer doesn&#39;t support sink&quot;</span>,
@@ -342,8 +342,8 @@
         (<span class="kw-2">**</span><span class="self">self</span>).write(bs).<span class="kw">await
     </span>}
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, n: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        (<span class="kw-2">**</span><span class="self">self</span>).sink(n, s).<span class="kw">await
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, n: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        (<span class="kw-2">**</span><span class="self">self</span>).pipe(n, s).<span class="kw">await
     </span>}
 
     <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
diff --git a/docs/rust/src/opendal/raw/oio/write/append_object_write.rs.html b/docs/rust/src/opendal/raw/oio/write/append_object_write.rs.html
index 39cb4109a..4854fde9d 100644
--- a/docs/rust/src/opendal/raw/oio/write/append_object_write.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/append_object_write.rs.html
@@ -110,7 +110,6 @@
 <a href="#110" id="110">110</a>
 <a href="#111" id="111">111</a>
 <a href="#112" id="112">112</a>
-<a href="#113" id="113">113</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
@@ -131,7 +130,6 @@
 </span><span class="kw">use </span>async_trait::async_trait;
 <span class="kw">use </span>bytes::Bytes;
 
-<span class="kw">use </span><span class="kw">crate</span>::raw::oio::Streamer;
 <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>;
 
@@ -205,11 +203,11 @@
         <span class="prelude-val">Ok</span>(size)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">let </span>offset = <span class="self">self</span>.offset().<span class="kw">await</span><span class="question-mark">?</span>;
 
         <span class="self">self</span>.inner
-            .append(offset, size, AsyncBody::Stream(s))
+            .append(offset, size, AsyncBody::Stream(Box::new(s)))
             .<span class="kw">await
             </span>.map(|<span class="kw">_</span>| <span class="self">self</span>.offset = <span class="prelude-val">Some</span>(offset + size))<span class="question-mark">?</span>;
 
diff --git a/docs/rust/src/opendal/raw/oio/write/at_least_buf_write.rs.html b/docs/rust/src/opendal/raw/oio/write/at_least_buf_write.rs.html
deleted file mode 100644
index 2ea887987..000000000
--- a/docs/rust/src/opendal/raw/oio/write/at_least_buf_write.rs.html
+++ /dev/null
@@ -1,281 +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="Source of the Rust file `core/src/raw/oio/write/at_least_buf_write.rs`."><title>at_least_buf_write.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="fon [...]
-<a href="#2" id="2">2</a>
-<a href="#3" id="3">3</a>
-<a href="#4" id="4">4</a>
-<a href="#5" id="5">5</a>
-<a href="#6" id="6">6</a>
-<a href="#7" id="7">7</a>
-<a href="#8" id="8">8</a>
-<a href="#9" id="9">9</a>
-<a href="#10" id="10">10</a>
-<a href="#11" id="11">11</a>
-<a href="#12" id="12">12</a>
-<a href="#13" id="13">13</a>
-<a href="#14" id="14">14</a>
-<a href="#15" id="15">15</a>
-<a href="#16" id="16">16</a>
-<a href="#17" id="17">17</a>
-<a href="#18" id="18">18</a>
-<a href="#19" id="19">19</a>
-<a href="#20" id="20">20</a>
-<a href="#21" id="21">21</a>
-<a href="#22" id="22">22</a>
-<a href="#23" id="23">23</a>
-<a href="#24" id="24">24</a>
-<a href="#25" id="25">25</a>
-<a href="#26" id="26">26</a>
-<a href="#27" id="27">27</a>
-<a href="#28" id="28">28</a>
-<a href="#29" id="29">29</a>
-<a href="#30" id="30">30</a>
-<a href="#31" id="31">31</a>
-<a href="#32" id="32">32</a>
-<a href="#33" id="33">33</a>
-<a href="#34" id="34">34</a>
-<a href="#35" id="35">35</a>
-<a href="#36" id="36">36</a>
-<a href="#37" id="37">37</a>
-<a href="#38" id="38">38</a>
-<a href="#39" id="39">39</a>
-<a href="#40" id="40">40</a>
-<a href="#41" id="41">41</a>
-<a href="#42" id="42">42</a>
-<a href="#43" id="43">43</a>
-<a href="#44" id="44">44</a>
-<a href="#45" id="45">45</a>
-<a href="#46" id="46">46</a>
-<a href="#47" id="47">47</a>
-<a href="#48" id="48">48</a>
-<a href="#49" id="49">49</a>
-<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>
-<a href="#54" id="54">54</a>
-<a href="#55" id="55">55</a>
-<a href="#56" id="56">56</a>
-<a href="#57" id="57">57</a>
-<a href="#58" id="58">58</a>
-<a href="#59" id="59">59</a>
-<a href="#60" id="60">60</a>
-<a href="#61" id="61">61</a>
-<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>
-<a href="#88" id="88">88</a>
-<a href="#89" id="89">89</a>
-<a href="#90" id="90">90</a>
-<a href="#91" id="91">91</a>
-<a href="#92" id="92">92</a>
-<a href="#93" id="93">93</a>
-<a href="#94" id="94">94</a>
-<a href="#95" id="95">95</a>
-<a href="#96" id="96">96</a>
-<a href="#97" id="97">97</a>
-<a href="#98" id="98">98</a>
-<a href="#99" id="99">99</a>
-<a href="#100" id="100">100</a>
-<a href="#101" id="101">101</a>
-<a href="#102" id="102">102</a>
-<a href="#103" id="103">103</a>
-<a href="#104" id="104">104</a>
-<a href="#105" id="105">105</a>
-<a href="#106" id="106">106</a>
-<a href="#107" id="107">107</a>
-<a href="#108" id="108">108</a>
-<a href="#109" id="109">109</a>
-<a href="#110" id="110">110</a>
-<a href="#111" id="111">111</a>
-<a href="#112" id="112">112</a>
-<a href="#113" id="113">113</a>
-<a href="#114" id="114">114</a>
-<a href="#115" id="115">115</a>
-<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>
-</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
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// &quot;License&quot;); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-</span><span class="kw">use </span>async_trait::async_trait;
-<span class="kw">use </span>bytes::Bytes;
-
-<span class="kw">use </span><span class="kw">crate</span>::raw::oio::StreamExt;
-<span class="kw">use </span><span class="kw">crate</span>::raw::oio::Streamer;
-<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>;
-
-<span class="doccomment">/// AtLeastBufWriter is used to implement [`oio::Write`] based on at least buffer strategy: flush
-/// the underlying storage when the buffered size is larger.
-///
-/// AtLeastBufWriter makes sure that the size of the data written to the underlying storage is at
-/// least `buffer_size` bytes. It&#39;s useful when the underlying storage has a minimum size limit.
-///
-/// For example, S3 requires at least 5MiB for multipart uploads.
-</span><span class="kw">pub struct </span>AtLeastBufWriter&lt;W: oio::Write&gt; {
-    inner: W,
-
-    <span class="doccomment">/// The total size of the data.
-    ///
-    /// If the total size is known, we will write to underlying storage directly without buffer it
-    /// when possible.
-    </span>total_size: <span class="prelude-ty">Option</span>&lt;u64&gt;,
-
-    <span class="doccomment">/// The size for buffer, we will flush the underlying storage if the buffer is full.
-    </span>buffer_size: usize,
-    buffer: oio::ChunkedCursor,
-}
-
-<span class="kw">impl</span>&lt;W: oio::Write&gt; AtLeastBufWriter&lt;W&gt; {
-    <span class="doccomment">/// Create a new at least buf writer.
-    </span><span class="kw">pub fn </span>new(inner: W, buffer_size: usize) -&gt; <span class="self">Self </span>{
-        <span class="self">Self </span>{
-            inner,
-            total_size: <span class="prelude-val">None</span>,
-            buffer_size,
-            buffer: oio::ChunkedCursor::new(),
-        }
-    }
-
-    <span class="doccomment">/// Configure the total size for writer.
-    </span><span class="kw">pub fn </span>with_total_size(<span class="kw-2">mut </span><span class="self">self</span>, total_size: <span class="prelude-ty">Option</span>&lt;u64&gt;) -&gt; <span class="self">Self </span>{
-        <span class="self">self</span>.total_size = total_size;
-        <span class="self">self
-    </span>}
-}
-
-<span class="attr">#[async_trait]
-</span><span class="kw">impl</span>&lt;W: oio::Write&gt; oio::Write <span class="kw">for </span>AtLeastBufWriter&lt;W&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="comment">// If total size is known and equals to given bytes, we can write it directly.
-        </span><span class="kw">if let </span><span class="prelude-val">Some</span>(total_size) = <span class="self">self</span>.total_size {
-            <span class="kw">if </span>total_size == bs.len() <span class="kw">as </span>u64 {
-                <span class="kw">return </span><span class="self">self</span>.inner.write(bs).<span class="kw">await</span>;
-            }
-        }
-
-        <span class="comment">// Push the bytes into the buffer if the buffer is not full.
-        </span><span class="kw">if </span><span class="self">self</span>.buffer.len() + bs.len() &lt; <span class="self">self</span>.buffer_size {
-            <span class="kw">let </span>size = bs.len();
-            <span class="self">self</span>.buffer.push(bs);
-            <span class="kw">return </span><span class="prelude-val">Ok</span>(size <span class="kw">as </span>u64);
-        }
-
-        <span class="kw">let </span><span class="kw-2">mut </span>buf = <span class="self">self</span>.buffer.clone();
-        buf.push(bs);
-
-        <span class="self">self</span>.inner
-            .sink(buf.len() <span class="kw">as </span>u64, Box::new(buf))
-            .<span class="kw">await
-            </span><span class="comment">// Clear buffer if the write is successful.
-            </span>.map(|v| {
-                <span class="self">self</span>.buffer.clear();
-                v
-            })
-    }
-
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="comment">// If total size is known and equals to given stream, we can write it directly.
-        </span><span class="kw">if let </span><span class="prelude-val">Some</span>(total_size) = <span class="self">self</span>.total_size {
-            <span class="kw">if </span>total_size == size {
-                <span class="kw">return </span><span class="self">self</span>.inner.sink(size, s).<span class="kw">await</span>;
-            }
-        }
-
-        <span class="comment">// Push the bytes into the buffer if the buffer is not full.
-        </span><span class="kw">if </span><span class="self">self</span>.buffer.len() <span class="kw">as </span>u64 + size &lt; <span class="self">self</span>.buffer_size <span class="kw">as </span>u64 {
-            <span class="kw">let </span>bs = s.collect().<span class="kw">await</span><span class="question-mark">?</span>;
-            <span class="kw">let </span>size = bs.len() <span class="kw">as </span>u64;
-            <span class="self">self</span>.buffer.push(bs);
-            <span class="kw">return </span><span class="prelude-val">Ok</span>(size);
-        }
-
-        <span class="kw">let </span>buf = <span class="self">self</span>.buffer.clone();
-        <span class="kw">let </span>buffer_size = buf.len() <span class="kw">as </span>u64;
-        <span class="kw">let </span>stream = buf.chain(s);
-
-        <span class="self">self</span>.inner
-            .sink(buffer_size + size, Box::new(stream))
-            .<span class="kw">await
-            </span><span class="comment">// Clear buffer if the write is successful.
-            </span>.map(|v| {
-                <span class="self">self</span>.buffer.clear();
-                v
-            })
-    }
-
-    <span class="kw">async fn </span>abort(<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>.buffer.clear();
-        <span class="self">self</span>.inner.abort().<span class="kw">await
-    </span>}
-
-    <span class="kw">async 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="kw">if </span>!<span class="self">self</span>.buffer.is_empty() {
-            <span class="self">self</span>.inner
-                .sink(<span class="self">self</span>.buffer.len() <span class="kw">as </span>u64, Box::new(<span class="self">self</span>.buffer.clone()))
-                .<span class="kw">await</span><span class="question-mark">?</span>;
-            <span class="self">self</span>.buffer.clear();
-        }
-
-        <span class="self">self</span>.inner.close().<span class="kw">await
-    </span>}
-}
-</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/raw/oio/write/compose_write.rs.html b/docs/rust/src/opendal/raw/oio/write/compose_write.rs.html
index 27d238d8c..d81c51f5e 100644
--- a/docs/rust/src/opendal/raw/oio/write/compose_write.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/compose_write.rs.html
@@ -133,7 +133,6 @@
 <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>
 </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
@@ -177,7 +176,6 @@
 </span><span class="kw">use </span>async_trait::async_trait;
 <span class="kw">use </span>bytes::Bytes;
 
-<span class="kw">use </span><span class="kw">crate</span>::raw::oio::Streamer;
 <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>;
 
@@ -200,10 +198,10 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&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(one) =&gt; one.sink(size, s).<span class="kw">await</span>,
-            <span class="self">Self</span>::Two(two) =&gt; two.sink(size, s).<span class="kw">await</span>,
+            <span class="self">Self</span>::One(one) =&gt; one.pipe(size, s).<span class="kw">await</span>,
+            <span class="self">Self</span>::Two(two) =&gt; two.pipe(size, s).<span class="kw">await</span>,
         }
     }
 
@@ -246,11 +244,11 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&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(one) =&gt; one.sink(size, s).<span class="kw">await</span>,
-            <span class="self">Self</span>::Two(two) =&gt; two.sink(size, s).<span class="kw">await</span>,
-            <span class="self">Self</span>::Three(three) =&gt; three.sink(size, s).<span class="kw">await</span>,
+            <span class="self">Self</span>::One(one) =&gt; one.pipe(size, s).<span class="kw">await</span>,
+            <span class="self">Self</span>::Two(two) =&gt; two.pipe(size, s).<span class="kw">await</span>,
+            <span class="self">Self</span>::Three(three) =&gt; three.pipe(size, s).<span class="kw">await</span>,
         }
     }
 
diff --git a/docs/rust/src/opendal/raw/oio/write/exact_buf_write.rs.html b/docs/rust/src/opendal/raw/oio/write/exact_buf_write.rs.html
index 3cc77099c..8edb28589 100644
--- a/docs/rust/src/opendal/raw/oio/write/exact_buf_write.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/exact_buf_write.rs.html
@@ -270,22 +270,6 @@
 <a href="#270" id="270">270</a>
 <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>
 </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
@@ -306,10 +290,10 @@
 </span><span class="kw">use </span>std::cmp::min;
 
 <span class="kw">use </span>async_trait::async_trait;
-<span class="kw">use </span>bytes::Bytes;
+<span class="kw">use </span>bytes::{Buf, BufMut, Bytes, BytesMut};
+<span class="kw">use </span>tokio::io::ReadBuf;
 
-<span class="kw">use </span><span class="kw">crate</span>::raw::oio::StreamExt;
-<span class="kw">use </span><span class="kw">crate</span>::raw::oio::Streamer;
+<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>;
 
@@ -329,9 +313,7 @@
 
     <span class="doccomment">/// The size for buffer, we will flush the underlying storage at the size of this buffer.
     </span>buffer_size: usize,
-    buffer: oio::ChunkedCursor,
-
-    buffer_stream: <span class="prelude-ty">Option</span>&lt;Streamer&gt;,
+    buffer: Buffer,
 }
 
 <span class="kw">impl</span>&lt;W: oio::Write&gt; ExactBufWriter&lt;W&gt; {
@@ -340,133 +322,108 @@
         <span class="self">Self </span>{
             inner,
             buffer_size,
-            buffer: oio::ChunkedCursor::new(),
-            buffer_stream: <span class="prelude-val">None</span>,
-        }
-    }
-
-    <span class="doccomment">/// Next bytes is used to fetch bytes from buffer or input streamer.
-    ///
-    /// We need this function because we need to make sure our write is reentrant.
-    /// We can&#39;t mutate state unless we are sure that the write is successful.
-    </span><span class="kw">async fn </span>next_bytes(<span class="kw-2">&amp;mut </span><span class="self">self</span>, s: <span class="kw-2">&amp;mut </span>Streamer) -&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>.buffer_stream.as_mut() {
-            <span class="prelude-val">None </span>=&gt; s.next().<span class="kw">await</span>,
-            <span class="prelude-val">Some</span>(bs) =&gt; <span class="kw">match </span>bs.next().<span class="kw">await </span>{
-                <span class="prelude-val">None </span>=&gt; {
-                    <span class="self">self</span>.buffer_stream = <span class="prelude-val">None</span>;
-                    s.next().<span class="kw">await
-                </span>}
-                <span class="prelude-val">Some</span>(v) =&gt; <span class="prelude-val">Some</span>(v),
-            },
+            buffer: Buffer::Filling(BytesMut::new()),
         }
     }
+}
 
-    <span class="kw">fn </span>chain_stream(<span class="kw-2">&amp;mut </span><span class="self">self</span>, s: Streamer) {
-        <span class="self">self</span>.buffer_stream = <span class="kw">match </span><span class="self">self</span>.buffer_stream.take() {
-            <span class="prelude-val">Some</span>(stream) =&gt; <span class="prelude-val">Some</span>(Box::new(stream.chain(s))),
-            <span class="prelude-val">None </span>=&gt; <span class="prelude-val">Some</span>(s),
-        }
-    }
+<span class="kw">enum </span>Buffer {
+    Filling(BytesMut),
+    Consuming(Bytes),
 }
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;W: oio::Write&gt; oio::Write <span class="kw">for </span>ExactBufWriter&lt;W&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="self">self</span>.sink(bs.len() <span class="kw">as </span>u64, Box::new(oio::Cursor::from(bs)))
-            .<span class="kw">await
-    </span>}
-
-    <span class="doccomment">/// # TODO
-    ///
-    /// We know every stream size, we can collect them into a buffer without chain them every time.
-    </span><span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: u64, <span class="kw-2">mut </span>s: Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="kw">if </span><span class="self">self</span>.buffer.len() &gt;= <span class="self">self</span>.buffer_size {
-            <span class="kw">let </span><span class="kw-2">mut </span>buf = <span class="self">self</span>.buffer.clone();
-            <span class="kw">let </span>to_write = buf.split_to(<span class="self">self</span>.buffer_size);
-            <span class="kw">return </span><span class="self">self
-                </span>.inner
-                .sink(to_write.len() <span class="kw">as </span>u64, Box::new(to_write))
-                .<span class="kw">await
-                </span><span class="comment">// Replace buffer with remaining if the write is successful.
-                </span>.map(|v| {
-                    <span class="self">self</span>.buffer = buf;
-                    <span class="self">self</span>.chain_stream(s);
-                    v
-                });
-        }
-
-        <span class="kw">let </span><span class="kw-2">mut </span>buf = <span class="self">self</span>.buffer.clone();
-        <span class="kw">while </span>buf.len() &lt; <span class="self">self</span>.buffer_size {
-            <span class="kw">let </span>bs = <span class="self">self</span>.next_bytes(<span class="kw-2">&amp;mut </span>s).<span class="kw">await</span>.transpose()<span class="question-mark">?</span>;
-            <span class="kw">match </span>bs {
-                <span class="prelude-val">None </span>=&gt; <span class="kw">break</span>,
-                <span class="prelude-val">Some</span>(bs) =&gt; buf.push(bs),
+    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw-2">mut </span>bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.buffer {
+                Buffer::Filling(fill) =&gt; {
+                    <span class="kw">if </span>fill.len() &gt;= <span class="self">self</span>.buffer_size {
+                        <span class="self">self</span>.buffer = Buffer::Consuming(fill.split().freeze());
+                        <span class="kw">continue</span>;
+                    }
+
+                    <span class="kw">let </span>size = min(<span class="self">self</span>.buffer_size - fill.len(), bs.len());
+                    fill.extend_from_slice(<span class="kw-2">&amp;</span>bs[..size]);
+                    bs.advance(size);
+                    <span class="kw">return </span><span class="prelude-val">Ok</span>(size <span class="kw">as </span>u64);
+                }
+                Buffer::Consuming(consume) =&gt; {
+                    <span class="comment">// Make sure filled buffer has been flushed.
+                    //
+                    // TODO: maybe we can re-fill it after a successful write.
+                    </span><span class="kw">while </span>!consume.is_empty() {
+                        <span class="kw">let </span>n = <span class="self">self</span>.inner.write(consume.clone()).<span class="kw">await</span><span class="question-mark">?</span>;
+                        consume.advance(n <span class="kw">as </span>usize);
+                    }
+                    <span class="self">self</span>.buffer = Buffer::Filling(BytesMut::new());
+                }
             }
         }
+    }
 
-        <span class="comment">// Return directly if the buffer is not full.
-        //
-        // We don&#39;t need to chain stream here because it must be consumed.
-        </span><span class="kw">if </span>buf.len() &lt; <span class="self">self</span>.buffer_size {
-            <span class="kw">let </span>size = buf.len() <span class="kw">as </span>u64;
-            <span class="self">self</span>.buffer = buf;
-            <span class="kw">return </span><span class="prelude-val">Ok</span>(size);
-        }
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: u64, <span class="kw-2">mut </span>s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.buffer {
+                Buffer::Filling(fill) =&gt; {
+                    <span class="kw">if </span>fill.len() &gt;= <span class="self">self</span>.buffer_size {
+                        <span class="self">self</span>.buffer = Buffer::Consuming(fill.split().freeze());
+                        <span class="kw">continue</span>;
+                    }
+
+                    <span class="comment">// Reserve to buffer size.
+                    </span>fill.reserve(<span class="self">self</span>.buffer_size - fill.len());
+                    <span class="kw">let </span>dst = fill.spare_capacity_mut();
+                    <span class="kw">let </span>dst_len = dst.len();
+                    <span class="kw">let </span><span class="kw-2">mut </span>buf = ReadBuf::uninit(dst);
+
+                    <span class="comment">// Safety: the input buffer is created with_capacity(length).
+                    </span><span class="kw">unsafe </span>{ buf.assume_init(dst_len) };
 
-        <span class="kw">let </span>to_write = buf.split_to(<span class="self">self</span>.buffer_size);
-        <span class="self">self</span>.inner
-            .sink(to_write.len() <span class="kw">as </span>u64, Box::new(to_write))
-            .<span class="kw">await
-            </span><span class="comment">// Replace buffer with remaining if the write is successful.
-            </span>.map(|v| {
-                <span class="self">self</span>.buffer = buf;
-                <span class="self">self</span>.chain_stream(s);
-                v
-            })
+                    <span class="kw">let </span>n = s.read(buf.initialize_unfilled()).<span class="kw">await</span><span class="question-mark">?</span>;
+
+                    <span class="comment">// Safety: read makes sure this buffer has been filled.
+                    </span><span class="kw">unsafe </span>{ fill.advance_mut(n) };
+
+                    <span class="kw">return </span><span class="prelude-val">Ok</span>(n <span class="kw">as </span>u64);
+                }
+                Buffer::Consuming(consume) =&gt; {
+                    <span class="comment">// Make sure filled buffer has been flushed.
+                    //
+                    // TODO: maybe we can re-fill it after a successful write.
+                    </span><span class="kw">while </span>!consume.is_empty() {
+                        <span class="kw">let </span>n = <span class="self">self</span>.inner.write(consume.clone()).<span class="kw">await</span><span class="question-mark">?</span>;
+                        consume.advance(n <span class="kw">as </span>usize);
+                    }
+                    <span class="self">self</span>.buffer = Buffer::Filling(BytesMut::new());
+                }
+            }
+        }
     }
 
     <span class="kw">async fn </span>abort(<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>.buffer.clear();
-        <span class="self">self</span>.buffer_stream = <span class="prelude-val">None</span>;
-
+        <span class="self">self</span>.buffer = Buffer::Filling(BytesMut::new());
         <span class="self">self</span>.inner.abort().<span class="kw">await
     </span>}
 
     <span class="kw">async 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="kw">while let </span><span class="prelude-val">Some</span>(stream) = <span class="self">self</span>.buffer_stream.as_mut() {
-            <span class="kw">let </span>bs = stream.next().<span class="kw">await</span>.transpose()<span class="question-mark">?</span>;
-            <span class="kw">match </span>bs {
-                <span class="prelude-val">None </span>=&gt; {
-                    <span class="self">self</span>.buffer_stream = <span class="prelude-val">None</span>;
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.buffer {
+                Buffer::Filling(fill) =&gt; {
+                    <span class="self">self</span>.buffer = Buffer::Consuming(fill.split().freeze());
+                    <span class="kw">continue</span>;
                 }
-                <span class="prelude-val">Some</span>(bs) =&gt; {
-                    <span class="self">self</span>.buffer.push(bs);
+                Buffer::Consuming(consume) =&gt; {
+                    <span class="comment">// Make sure filled buffer has been flushed.
+                    //
+                    // TODO: maybe we can re-fill it after a successful write.
+                    </span><span class="kw">while </span>!consume.is_empty() {
+                        <span class="kw">let </span>n = <span class="self">self</span>.inner.write(consume.clone()).<span class="kw">await</span><span class="question-mark">?</span>;
+                        consume.advance(n <span class="kw">as </span>usize);
+                    }
+                    <span class="kw">break</span>;
                 }
             }
-
-            <span class="kw">if </span><span class="self">self</span>.buffer.len() &gt;= <span class="self">self</span>.buffer_size {
-                <span class="kw">let </span><span class="kw-2">mut </span>buf = <span class="self">self</span>.buffer.clone();
-                <span class="kw">let </span>to_write = buf.split_to(<span class="self">self</span>.buffer_size);
-                <span class="self">self</span>.inner
-                    .sink(to_write.len() <span class="kw">as </span>u64, Box::new(to_write))
-                    .<span class="kw">await
-                    </span><span class="comment">// Replace buffer with remaining if the write is successful.
-                    </span>.map(|<span class="kw">_</span>| {
-                        <span class="self">self</span>.buffer = buf;
-                    })<span class="question-mark">?</span>;
-            }
-        }
-
-        <span class="kw">while </span>!<span class="self">self</span>.buffer.is_empty() {
-            <span class="kw">let </span><span class="kw-2">mut </span>buf = <span class="self">self</span>.buffer.clone();
-            <span class="kw">let </span>to_write = buf.split_to(min(<span class="self">self</span>.buffer_size, buf.len()));
-
-            <span class="self">self</span>.inner
-                .sink(to_write.len() <span class="kw">as </span>u64, Box::new(to_write))
-                .<span class="kw">await
-                </span><span class="comment">// Replace buffer with remaining if the write is successful.
-                </span>.map(|<span class="kw">_</span>| <span class="self">self</span>.buffer = buf)<span class="question-mark">?</span>;
         }
 
         <span class="self">self</span>.inner.close().<span class="kw">await
@@ -475,6 +432,7 @@
 
 <span class="attr">#[cfg(test)]
 </span><span class="kw">mod </span>tests {
+    <span class="kw">use </span>futures::AsyncReadExt;
     <span class="kw">use </span>log::debug;
     <span class="kw">use </span>pretty_assertions::assert_eq;
     <span class="kw">use </span>rand::thread_rng;
@@ -484,7 +442,6 @@
     <span class="kw">use </span>sha2::Sha256;
 
     <span class="kw">use super</span>::<span class="kw-2">*</span>;
-    <span class="kw">use </span><span class="kw">crate</span>::raw::oio::StreamExt;
     <span class="kw">use </span><span class="kw">crate</span>::raw::oio::Write;
 
     <span class="kw">struct </span>MockWriter {
@@ -500,10 +457,11 @@
             <span class="prelude-val">Ok</span>(bs.len() <span class="kw">as </span>u64)
         }
 
-        <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-            <span class="kw">let </span>bs = s.collect().<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, <span class="kw-2">mut </span>s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+            <span class="kw">let </span><span class="kw-2">mut </span>bs = <span class="macro">vec!</span>[];
+            s.read_to_end(<span class="kw-2">&amp;mut </span>bs).<span class="kw">await</span>.unwrap();
             <span class="macro">assert_eq!</span>(bs.len() <span class="kw">as </span>u64, size);
-            <span class="self">self</span>.write(bs).<span class="kw">await
+            <span class="self">self</span>.write(bs.into()).<span class="kw">await
         </span>}
 
         <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
@@ -529,7 +487,12 @@
 
         <span class="kw">let </span><span class="kw-2">mut </span>w = ExactBufWriter::new(MockWriter { buf: <span class="macro">vec!</span>[] }, <span class="number">10</span>);
 
-        w.write(Bytes::from(expected.clone())).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="kw">let </span><span class="kw-2">mut </span>bs = Bytes::from(expected.clone());
+        <span class="kw">while </span>!bs.is_empty() {
+            <span class="kw">let </span>n = w.write(bs.clone()).<span class="kw">await</span><span class="question-mark">?</span>;
+            bs.advance(n <span class="kw">as </span>usize);
+        }
+
         w.close().<span class="kw">await</span><span class="question-mark">?</span>;
 
         <span class="macro">assert_eq!</span>(w.inner.buf.len(), expected.len());
@@ -562,7 +525,12 @@
             rng.fill_bytes(<span class="kw-2">&amp;mut </span>content);
 
             expected.extend_from_slice(<span class="kw-2">&amp;</span>content);
-            writer.write(Bytes::from(content)).<span class="kw">await</span><span class="question-mark">?</span>;
+
+            <span class="kw">let </span><span class="kw-2">mut </span>bs = Bytes::from(content.clone());
+            <span class="kw">while </span>!bs.is_empty() {
+                <span class="kw">let </span>n = writer.write(bs.clone()).<span class="kw">await</span><span class="question-mark">?</span>;
+                bs.advance(n <span class="kw">as </span>usize);
+            }
         }
         writer.close().<span class="kw">await</span><span class="question-mark">?</span>;
 
diff --git a/docs/rust/src/opendal/raw/oio/write/mod.rs.html b/docs/rust/src/opendal/raw/oio/write/mod.rs.html
index 7fe02e395..432452420 100644
--- a/docs/rust/src/opendal/raw/oio/write/mod.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/mod.rs.html
@@ -41,9 +41,6 @@
 <a href="#41" id="41">41</a>
 <a href="#42" id="42">42</a>
 <a href="#43" id="43">43</a>
-<a href="#44" id="44">44</a>
-<a href="#45" id="45">45</a>
-<a href="#46" id="46">46</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
@@ -85,9 +82,6 @@
 <span class="kw">pub use </span>one_shot_write::OneShotWrite;
 <span class="kw">pub use </span>one_shot_write::OneShotWriter;
 
-<span class="kw">mod </span>at_least_buf_write;
-<span class="kw">pub use </span>at_least_buf_write::AtLeastBufWriter;
-
 <span class="kw">mod </span>exact_buf_write;
 <span class="kw">pub use </span>exact_buf_write::ExactBufWriter;
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/raw/oio/write/multipart_upload_write.rs.html b/docs/rust/src/opendal/raw/oio/write/multipart_upload_write.rs.html
index 73ed7f2a1..a46dad5a6 100644
--- a/docs/rust/src/opendal/raw/oio/write/multipart_upload_write.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/multipart_upload_write.rs.html
@@ -169,6 +169,11 @@
 <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>
 </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
@@ -309,11 +314,16 @@
         <span class="prelude-val">Ok</span>(size <span class="kw">as </span>u64)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">let </span>upload_id = <span class="self">self</span>.upload_id().<span class="kw">await</span><span class="question-mark">?</span>;
 
         <span class="self">self</span>.inner
-            .write_part(<span class="kw-2">&amp;</span>upload_id, <span class="self">self</span>.parts.len(), size, AsyncBody::Stream(s))
+            .write_part(
+                <span class="kw-2">&amp;</span>upload_id,
+                <span class="self">self</span>.parts.len(),
+                size,
+                AsyncBody::Stream(Box::new(s)),
+            )
             .<span class="kw">await
             </span>.map(|v| <span class="self">self</span>.parts.push(v))<span class="question-mark">?</span>;
 
diff --git a/docs/rust/src/opendal/raw/oio/write/one_shot_write.rs.html b/docs/rust/src/opendal/raw/oio/write/one_shot_write.rs.html
index 5abd2d9a3..122aa6ebb 100644
--- a/docs/rust/src/opendal/raw/oio/write/one_shot_write.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/one_shot_write.rs.html
@@ -131,8 +131,8 @@
         <span class="prelude-val">Ok</span>(size)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="self">self</span>.inner.write_once(size, s).<span class="kw">await</span><span class="question-mark">?</span>;
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.inner.write_once(size, Box::new(s)).<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="prelude-val">Ok</span>(size)
     }
 
diff --git a/docs/rust/src/opendal/services/azblob/writer.rs.html b/docs/rust/src/opendal/services/azblob/writer.rs.html
index da6d57f6f..16a02a5f6 100644
--- a/docs/rust/src/opendal/services/azblob/writer.rs.html
+++ b/docs/rust/src/opendal/services/azblob/writer.rs.html
@@ -205,6 +205,8 @@
 <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>
 </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
@@ -387,9 +389,10 @@
         <span class="prelude-val">Ok</span>(size)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">if </span><span class="self">self</span>.op.append() {
-            <span class="self">self</span>.append_oneshot(size, AsyncBody::Stream(s)).<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="self">self</span>.append_oneshot(size, AsyncBody::Stream(Box::new(s)))
+                .<span class="kw">await</span><span class="question-mark">?</span>;
         } <span class="kw">else </span>{
             <span class="kw">if </span><span class="self">self</span>.op.content_length().is_none() {
                 <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
@@ -398,7 +401,8 @@
                 ));
             }
 
-            <span class="self">self</span>.write_oneshot(size, AsyncBody::Stream(s)).<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="self">self</span>.write_oneshot(size, AsyncBody::Stream(Box::new(s)))
+                .<span class="kw">await</span><span class="question-mark">?</span>;
         }
 
         <span class="prelude-val">Ok</span>(size)
diff --git a/docs/rust/src/opendal/services/azdfs/writer.rs.html b/docs/rust/src/opendal/services/azdfs/writer.rs.html
index 33823be90..1a861ec8f 100644
--- a/docs/rust/src/opendal/services/azdfs/writer.rs.html
+++ b/docs/rust/src/opendal/services/azdfs/writer.rs.html
@@ -193,7 +193,7 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/services/cos/backend.rs.html b/docs/rust/src/opendal/services/cos/backend.rs.html
index 789356f1f..502b578d5 100644
--- a/docs/rust/src/opendal/services/cos/backend.rs.html
+++ b/docs/rust/src/opendal/services/cos/backend.rs.html
@@ -448,7 +448,6 @@
 <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>
 </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
@@ -700,7 +699,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>CosBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = oio::TwoWaysWriter&lt;CosWriters, oio::AtLeastBufWriter&lt;CosWriters&gt;&gt;;
+    <span class="kw">type </span>Writer = oio::TwoWaysWriter&lt;CosWriters, oio::ExactBufWriter&lt;CosWriters&gt;&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = CosPager;
     <span class="kw">type </span>BlockingPager = ();
@@ -799,8 +798,7 @@
         <span class="kw">let </span>w = <span class="kw">if let </span><span class="prelude-val">Some</span>(buffer_size) = args.buffer_size() {
             <span class="kw">let </span>buffer_size = max(MINIMUM_MULTIPART_SIZE, buffer_size);
 
-            <span class="kw">let </span>w =
-                oio::AtLeastBufWriter::new(w, buffer_size).with_total_size(args.content_length());
+            <span class="kw">let </span>w = oio::ExactBufWriter::new(w, buffer_size);
 
             oio::TwoWaysWriter::Two(w)
         } <span class="kw">else </span>{
diff --git a/docs/rust/src/opendal/services/dropbox/writer.rs.html b/docs/rust/src/opendal/services/dropbox/writer.rs.html
index 00b4d8008..cdde9c065 100644
--- a/docs/rust/src/opendal/services/dropbox/writer.rs.html
+++ b/docs/rust/src/opendal/services/dropbox/writer.rs.html
@@ -141,7 +141,7 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/services/fs/writer.rs.html b/docs/rust/src/opendal/services/fs/writer.rs.html
index e22b9715e..55a707b9b 100644
--- a/docs/rust/src/opendal/services/fs/writer.rs.html
+++ b/docs/rust/src/opendal/services/fs/writer.rs.html
@@ -195,7 +195,7 @@
         <span class="prelude-val">Ok</span>(size)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, <span class="kw-2">mut </span>s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, <span class="kw-2">mut </span>s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="kw">while let </span><span class="prelude-val">Some</span>(bs) = s.next().<span class="kw">await </span>{
             <span class="kw">let </span>bs = bs<span class="question-mark">?</span>;
             <span class="self">self</span>.f
diff --git a/docs/rust/src/opendal/services/ftp/writer.rs.html b/docs/rust/src/opendal/services/ftp/writer.rs.html
index b1a14ef70..cce63b1d1 100644
--- a/docs/rust/src/opendal/services/ftp/writer.rs.html
+++ b/docs/rust/src/opendal/services/ftp/writer.rs.html
@@ -127,7 +127,7 @@
         <span class="prelude-val">Ok</span>(size <span class="kw">as </span>u64)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/services/gcs/writer.rs.html b/docs/rust/src/opendal/services/gcs/writer.rs.html
index 07d7ed98d..f9cd05a89 100644
--- a/docs/rust/src/opendal/services/gcs/writer.rs.html
+++ b/docs/rust/src/opendal/services/gcs/writer.rs.html
@@ -216,11 +216,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>
 </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
@@ -361,11 +356,6 @@
             }
         };
 
-        <span class="comment">// Ignore empty bytes
-        </span><span class="kw">if </span>bs.is_empty() {
-            <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="number">0</span>);
-        }
-
         <span class="self">self</span>.buffer.push(bs);
         <span class="comment">// Return directly if the buffer is not full
         </span><span class="kw">if </span><span class="self">self</span>.buffer.len() &lt;= <span class="self">self</span>.write_fixed_size {
@@ -373,7 +363,6 @@
         }
 
         <span class="kw">let </span>bs = <span class="self">self</span>.buffer.peak_exact(<span class="self">self</span>.write_fixed_size);
-        <span class="kw">let </span>size = bs.len() <span class="kw">as </span>u64;
 
         <span class="kw">match </span><span class="self">self</span>.write_part(location, bs).<span class="kw">await </span>{
             <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {
@@ -390,8 +379,9 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="self">self</span>.write_oneshot(size, AsyncBody::Stream(s)).<span class="kw">await</span><span class="question-mark">?</span>;
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.write_oneshot(size, AsyncBody::Stream(Box::new(s)))
+            .<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="prelude-val">Ok</span>(size)
     }
 
diff --git a/docs/rust/src/opendal/services/gdrive/writer.rs.html b/docs/rust/src/opendal/services/gdrive/writer.rs.html
index 29938a68c..7b18b0290 100644
--- a/docs/rust/src/opendal/services/gdrive/writer.rs.html
+++ b/docs/rust/src/opendal/services/gdrive/writer.rs.html
@@ -226,7 +226,7 @@
         <span class="prelude-val">Ok</span>(size)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(ErrorKind::Unsupported, <span class="string">&quot;sink is not supported&quot;</span>))
     }
 
diff --git a/docs/rust/src/opendal/services/ghac/writer.rs.html b/docs/rust/src/opendal/services/ghac/writer.rs.html
index e338c0d40..7f1067e86 100644
--- a/docs/rust/src/opendal/services/ghac/writer.rs.html
+++ b/docs/rust/src/opendal/services/ghac/writer.rs.html
@@ -151,7 +151,7 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/services/hdfs/writer.rs.html b/docs/rust/src/opendal/services/hdfs/writer.rs.html
index 17769141b..1adc9f675 100644
--- a/docs/rust/src/opendal/services/hdfs/writer.rs.html
+++ b/docs/rust/src/opendal/services/hdfs/writer.rs.html
@@ -159,7 +159,7 @@
         <span class="prelude-val">Ok</span>(size <span class="kw">as </span>u64)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/services/ipmfs/writer.rs.html b/docs/rust/src/opendal/services/ipmfs/writer.rs.html
index 9e511e6eb..366f6a81b 100644
--- a/docs/rust/src/opendal/services/ipmfs/writer.rs.html
+++ b/docs/rust/src/opendal/services/ipmfs/writer.rs.html
@@ -123,7 +123,7 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/services/obs/backend.rs.html b/docs/rust/src/opendal/services/obs/backend.rs.html
index 9eee4db32..092a1593e 100644
--- a/docs/rust/src/opendal/services/obs/backend.rs.html
+++ b/docs/rust/src/opendal/services/obs/backend.rs.html
@@ -453,7 +453,6 @@
 <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>
 </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
@@ -712,7 +711,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>ObsBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = oio::TwoWaysWriter&lt;ObsWriters, oio::AtLeastBufWriter&lt;ObsWriters&gt;&gt;;
+    <span class="kw">type </span>Writer = oio::TwoWaysWriter&lt;ObsWriters, oio::ExactBufWriter&lt;ObsWriters&gt;&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = ObsPager;
     <span class="kw">type </span>BlockingPager = ();
@@ -842,8 +841,7 @@
         <span class="kw">let </span>w = <span class="kw">if let </span><span class="prelude-val">Some</span>(buffer_size) = args.buffer_size() {
             <span class="kw">let </span>buffer_size = max(MINIMUM_MULTIPART_SIZE, buffer_size);
 
-            <span class="kw">let </span>w =
-                oio::AtLeastBufWriter::new(w, buffer_size).with_total_size(args.content_length());
+            <span class="kw">let </span>w = oio::ExactBufWriter::new(w, buffer_size);
 
             oio::TwoWaysWriter::Two(w)
         } <span class="kw">else </span>{
diff --git a/docs/rust/src/opendal/services/onedrive/writer.rs.html b/docs/rust/src/opendal/services/onedrive/writer.rs.html
index 6383ad0d4..d14b5410c 100644
--- a/docs/rust/src/opendal/services/onedrive/writer.rs.html
+++ b/docs/rust/src/opendal/services/onedrive/writer.rs.html
@@ -241,7 +241,7 @@
         <span class="prelude-val">Ok</span>(size <span class="kw">as </span>u64)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/services/oss/backend.rs.html b/docs/rust/src/opendal/services/oss/backend.rs.html
index d3835b3c2..84bf2bccd 100644
--- a/docs/rust/src/opendal/services/oss/backend.rs.html
+++ b/docs/rust/src/opendal/services/oss/backend.rs.html
@@ -644,7 +644,6 @@
 <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>
 </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
@@ -1028,7 +1027,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>OssBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = oio::TwoWaysWriter&lt;OssWriters, oio::AtLeastBufWriter&lt;OssWriters&gt;&gt;;
+    <span class="kw">type </span>Writer = oio::TwoWaysWriter&lt;OssWriters, oio::ExactBufWriter&lt;OssWriters&gt;&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = OssPager;
     <span class="kw">type </span>BlockingPager = ();
@@ -1131,8 +1130,7 @@
         <span class="kw">let </span>w = <span class="kw">if let </span><span class="prelude-val">Some</span>(buffer_size) = args.buffer_size() {
             <span class="kw">let </span>buffer_size = max(MINIMUM_MULTIPART_SIZE, buffer_size);
 
-            <span class="kw">let </span>w =
-                oio::AtLeastBufWriter::new(w, buffer_size).with_total_size(args.content_length());
+            <span class="kw">let </span>w = oio::ExactBufWriter::new(w, buffer_size);
 
             oio::TwoWaysWriter::Two(w)
         } <span class="kw">else </span>{
diff --git a/docs/rust/src/opendal/services/s3/backend.rs.html b/docs/rust/src/opendal/services/s3/backend.rs.html
index f2c988ade..561c41271 100644
--- a/docs/rust/src/opendal/services/s3/backend.rs.html
+++ b/docs/rust/src/opendal/services/s3/backend.rs.html
@@ -1243,17 +1243,6 @@
 <a href="#1243" id="1243">1243</a>
 <a href="#1244" id="1244">1244</a>
 <a href="#1245" id="1245">1245</a>
-<a href="#1246" id="1246">1246</a>
-<a href="#1247" id="1247">1247</a>
-<a href="#1248" id="1248">1248</a>
-<a href="#1249" id="1249">1249</a>
-<a href="#1250" id="1250">1250</a>
-<a href="#1251" id="1251">1251</a>
-<a href="#1252" id="1252">1252</a>
-<a href="#1253" id="1253">1253</a>
-<a href="#1254" id="1254">1254</a>
-<a href="#1255" id="1255">1255</a>
-<a href="#1256" id="1256">1256</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
@@ -2144,11 +2133,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>S3Backend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = oio::ThreeWaysWriter&lt;
-        S3Writers,
-        oio::AtLeastBufWriter&lt;S3Writers&gt;,
-        oio::ExactBufWriter&lt;S3Writers&gt;,
-    &gt;;
+    <span class="kw">type </span>Writer = oio::TwoWaysWriter&lt;S3Writers, oio::ExactBufWriter&lt;S3Writers&gt;&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = S3Pager;
     <span class="kw">type </span>BlockingPager = ();
@@ -2247,16 +2232,9 @@
         <span class="kw">let </span>w = <span class="kw">if let </span><span class="prelude-val">Some</span>(buffer_size) = args.buffer_size() {
             <span class="kw">let </span>buffer_size = max(MINIMUM_MULTIPART_SIZE, buffer_size);
 
-            <span class="kw">if </span><span class="self">self</span>.core.enable_exact_buf_write {
-                oio::ThreeWaysWriter::Three(oio::ExactBufWriter::new(w, buffer_size))
-            } <span class="kw">else </span>{
-                oio::ThreeWaysWriter::Two(
-                    oio::AtLeastBufWriter::new(w, buffer_size)
-                        .with_total_size(args.content_length()),
-                )
-            }
+            oio::TwoWaysWriter::Two(oio::ExactBufWriter::new(w, buffer_size))
         } <span class="kw">else </span>{
-            oio::ThreeWaysWriter::One(w)
+            oio::TwoWaysWriter::One(w)
         };
 
         <span class="prelude-val">Ok</span>((RpWrite::default(), w))
diff --git a/docs/rust/src/opendal/services/sftp/writer.rs.html b/docs/rust/src/opendal/services/sftp/writer.rs.html
index 30799e2f6..1c2e796a3 100644
--- a/docs/rust/src/opendal/services/sftp/writer.rs.html
+++ b/docs/rust/src/opendal/services/sftp/writer.rs.html
@@ -106,7 +106,7 @@
         <span class="prelude-val">Ok</span>(size)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/services/supabase/writer.rs.html b/docs/rust/src/opendal/services/supabase/writer.rs.html
index 828454a67..574b48e00 100644
--- a/docs/rust/src/opendal/services/supabase/writer.rs.html
+++ b/docs/rust/src/opendal/services/supabase/writer.rs.html
@@ -174,7 +174,7 @@
         <span class="prelude-val">Ok</span>(size <span class="kw">as </span>u64)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/services/vercel_artifacts/writer.rs.html b/docs/rust/src/opendal/services/vercel_artifacts/writer.rs.html
index 6860aa10a..4c1c139ed 100644
--- a/docs/rust/src/opendal/services/vercel_artifacts/writer.rs.html
+++ b/docs/rust/src/opendal/services/vercel_artifacts/writer.rs.html
@@ -141,7 +141,7 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/services/wasabi/writer.rs.html b/docs/rust/src/opendal/services/wasabi/writer.rs.html
index 0458ebf8d..9f9b98bee 100644
--- a/docs/rust/src/opendal/services/wasabi/writer.rs.html
+++ b/docs/rust/src/opendal/services/wasabi/writer.rs.html
@@ -147,7 +147,7 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/services/webdav/writer.rs.html b/docs/rust/src/opendal/services/webdav/writer.rs.html
index a517c4bdf..cae8744b4 100644
--- a/docs/rust/src/opendal/services/webdav/writer.rs.html
+++ b/docs/rust/src/opendal/services/webdav/writer.rs.html
@@ -84,6 +84,7 @@
 <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
@@ -156,8 +157,9 @@
         <span class="prelude-val">Ok</span>(size)
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="self">self</span>.write_oneshot(size, AsyncBody::Stream(s)).<span class="kw">await</span><span class="question-mark">?</span>;
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="self">self</span>.write_oneshot(size, AsyncBody::Stream(Box::new(s)))
+            .<span class="kw">await</span><span class="question-mark">?</span>;
 
         <span class="prelude-val">Ok</span>(size)
     }
diff --git a/docs/rust/src/opendal/services/webhdfs/writer.rs.html b/docs/rust/src/opendal/services/webhdfs/writer.rs.html
index 4cdfe2f2a..1d09e3ce5 100644
--- a/docs/rust/src/opendal/services/webhdfs/writer.rs.html
+++ b/docs/rust/src/opendal/services/webhdfs/writer.rs.html
@@ -145,7 +145,7 @@
         }
     }
 
-    <span class="kw">async fn </span>sink(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Streamer) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+    <span class="kw">async fn </span>pipe(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _size: u64, _s: oio::Reader) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
         <span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;Write::sink is not supported&quot;</span>,
diff --git a/docs/rust/src/opendal/types/writer.rs.html b/docs/rust/src/opendal/types/writer.rs.html
index ec6bcb104..24dd7f848 100644
--- a/docs/rust/src/opendal/types/writer.rs.html
+++ b/docs/rust/src/opendal/types/writer.rs.html
@@ -568,8 +568,8 @@
         T: Into&lt;Bytes&gt;,
     {
         <span class="kw">if let </span>State::Idle(<span class="prelude-val">Some</span>(w)) = <span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            <span class="kw">let </span>s = Box::new(oio::into_stream(sink_from.map_ok(|v| v.into())));
-            w.sink(size, s).<span class="kw">await
+            <span class="kw">let </span>r = Box::new(oio::into_read_from_stream(sink_from.map_ok(|v| v.into())));
+            w.pipe(size, r).<span class="kw">await
         </span>} <span class="kw">else </span>{
             <span class="macro">unreachable!</span>(
                 <span class="string">&quot;writer state invalid while sink, expect Idle, actual {}&quot;</span>,
@@ -610,11 +610,14 @@
     /// ```
     </span><span class="kw">pub async fn </span>copy&lt;R&gt;(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, read_from: R) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt;
     <span class="kw">where
-        </span>R: futures::AsyncRead + Send + Sync + Unpin + <span class="lifetime">&#39;static</span>,
+        </span>R: futures::AsyncRead + futures::AsyncSeek + Send + Sync + Unpin + <span class="lifetime">&#39;static</span>,
     {
         <span class="kw">if let </span>State::Idle(<span class="prelude-val">Some</span>(w)) = <span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
-            <span class="kw">let </span>s = Box::new(oio::into_stream_from_reader(read_from));
-            w.sink(size, s).<span class="kw">await
+            <span class="kw">let </span>r = Box::new(oio::into_streamable_read(
+                oio::into_read_from_file(read_from, <span class="number">0</span>, size),
+                <span class="number">64 </span>* <span class="number">1024</span>,
+            ));
+            w.pipe(size, r).<span class="kw">await
         </span>} <span class="kw">else </span>{
             <span class="macro">unreachable!</span>(
                 <span class="string">&quot;writer state invalid while copy, expect Idle, actual {}&quot;</span>,
@@ -687,10 +690,9 @@
                         .take()
                         .expect(<span class="string">&quot;invalid state of writer: Idle state with empty write&quot;</span>);
                     <span class="kw">let </span>bs = Bytes::from(buf.to_vec());
-                    <span class="kw">let </span>size = bs.len();
                     <span class="kw">let </span>fut = <span class="kw">async move </span>{
-                        w.write(bs).<span class="kw">await</span><span class="question-mark">?</span>;
-                        <span class="prelude-val">Ok</span>((size, w))
+                        <span class="kw">let </span>n = w.write(bs).<span class="kw">await</span><span class="question-mark">?</span>;
+                        <span class="prelude-val">Ok</span>((n <span class="kw">as </span>usize, w))
                     };
                     <span class="self">self</span>.state = State::Write(Box::pin(fut));
                 }
@@ -754,10 +756,9 @@
                         .take()
                         .expect(<span class="string">&quot;invalid state of writer: Idle state with empty write&quot;</span>);
                     <span class="kw">let </span>bs = Bytes::from(buf.to_vec());
-                    <span class="kw">let </span>size = bs.len();
                     <span class="kw">let </span>fut = <span class="kw">async move </span>{
-                        w.write(bs).<span class="kw">await</span><span class="question-mark">?</span>;
-                        <span class="prelude-val">Ok</span>((size, w))
+                        <span class="kw">let </span>n = w.write(bs).<span class="kw">await</span><span class="question-mark">?</span>;
+                        <span class="prelude-val">Ok</span>((n <span class="kw">as </span>usize, w))
                     };
                     <span class="self">self</span>.state = State::Write(Box::pin(fut));
                 }
@@ -847,10 +848,9 @@
 
 <span class="kw">impl </span>io::Write <span class="kw">for </span>BlockingWriter {
     <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;usize&gt; {
-        <span class="kw">let </span>size = buf.len();
         <span class="self">self</span>.inner
             .write(Bytes::from(buf.to_vec()))
-            .map(|<span class="kw">_</span>| size)
+            .map(|n| n <span class="kw">as </span>usize)
             .map_err(|err| io::Error::new(io::ErrorKind::Other, err))
     }
 
diff --git a/docs/services/azblob/index.html b/docs/services/azblob/index.html
index 929c41650..ecb0cb70c 100644
--- a/docs/services/azblob/index.html
+++ b/docs/services/azblob/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Azblob | 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/services/azblob"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/azdfs/index.html b/docs/services/azdfs/index.html
index 551e0a75e..e36d3a99f 100644
--- a/docs/services/azdfs/index.html
+++ b/docs/services/azdfs/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Azdfs | 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/services/azdfs"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/cos/index.html b/docs/services/cos/index.html
index fee9c9fe5..cf65c3ef1 100644
--- a/docs/services/cos/index.html
+++ b/docs/services/cos/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">COS | 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/services/cos"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/dashmap/index.html b/docs/services/dashmap/index.html
index be20654d2..53142de7c 100644
--- a/docs/services/dashmap/index.html
+++ b/docs/services/dashmap/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">DashMap | 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/services/dashmap"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><me [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/dropbox/index.html b/docs/services/dropbox/index.html
index fcdea9fd8..4b120f7b8 100644
--- a/docs/services/dropbox/index.html
+++ b/docs/services/dropbox/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Dropbox | 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/services/dropbox"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><me [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -15,8 +15,8 @@ Please notice its expiration.</li></ul><h4 class="anchor anchorWithStickyNavbar_
 please provide the following fields:</p><ul><li><code>refresh_token</code>: set the refresh_token for dropbox api</li><li><code>client_id</code>: set the client_id for dropbox api</li><li><code>client_secret</code>: set the client_secret for dropbox api</li></ul><p>OpenDAL is a library, it cannot do the first step of OAuth2 for you.
 You need to get authorization code from user by calling Dropbox&#x27;s authorize url
 and exchange it for refresh token.</p><p>Please refer to <a href="https://www.dropbox.com/developers/reference/oauth-guide" target="_blank" rel="noopener noreferrer">Dropbox OAuth2 Guide</a>
-for more information.</p><p>You can refer to <!-- -->[<code>DropboxBuilder</code>]<!-- -->&#x27;s docs for more information</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="example">Example<a href="#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="via-builder">Via Builder<a href="#via-builder" class="hash-link" aria-label="Direct link to Via Builder" title="Direct link to Via Bu [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+for more information.</p><p>You can refer to <!-- -->[<code>DropboxBuilder</code>]<!-- -->&#x27;s docs for more information</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="example">Example<a href="#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="via-builder">Via Builder<a href="#via-builder" class="hash-link" aria-label="Direct link to Via Builder" title="Direct link to Via Bu [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/etcd/index.html b/docs/services/etcd/index.html
index 642b0b2b0..4a40a5c1a 100644
--- a/docs/services/etcd/index.html
+++ b/docs/services/etcd/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Etcd | 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/services/etcd"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/foundationdb/index.html b/docs/services/foundationdb/index.html
index 2eac00fc1..87beb5704 100644
--- a/docs/services/foundationdb/index.html
+++ b/docs/services/foundationdb/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">FoundationDB | 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/services/foundationdb"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="cu [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/fs/index.html b/docs/services/fs/index.html
index 27de40e46..83e1b1abf 100644
--- a/docs/services/fs/index.html
+++ b/docs/services/fs/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Fs | 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/services/fs"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/ftp/index.html b/docs/services/ftp/index.html
index 835e4f1ba..d4c3f34d7 100644
--- a/docs/services/ftp/index.html
+++ b/docs/services/ftp/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">FTP | 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/services/ftp"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/gcs/index.html b/docs/services/gcs/index.html
index 2b77a5cf7..cf942f77a 100644
--- a/docs/services/gcs/index.html
+++ b/docs/services/gcs/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Gcs | 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/services/gcs"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/hdfs/index.html b/docs/services/hdfs/index.html
index a6a133c67..098a99c36 100644
--- a/docs/services/hdfs/index.html
+++ b/docs/services/hdfs/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">HDFS | 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/services/hdfs"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/http/index.html b/docs/services/http/index.html
index fbf7d9ec8..9e5e60da6 100644
--- a/docs/services/http/index.html
+++ b/docs/services/http/index.html
@@ -5,14 +5,14 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Http | 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/services/http"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-HTTP Server like nginx, caddy.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2><ul><li><code>endpoint</code>: set the endpoint for http</li><li><code>root</code>: Set the work directory for backend</li></ul><p>You can refer to <!-- -->[<code>HttpBuilder</code>]<!-- -->&#x27;s docs for more information</p><h2 class="anchor an [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+HTTP Server like nginx, caddy.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2><ul><li><code>endpoint</code>: set the endpoint for http</li><li><code>root</code>: Set the work directory for backend</li></ul><p>You can refer to <!-- -->[<code>HttpBuilder</code>]<!-- -->&#x27;s docs for more information</p><h2 class="anchor an [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/ipfs/index.html b/docs/services/ipfs/index.html
index 5bf18827e..378ecd1b2 100644
--- a/docs/services/ipfs/index.html
+++ b/docs/services/ipfs/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">IPFS | 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/services/ipfs"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/ipmfs/index.html b/docs/services/ipmfs/index.html
index 4824f4883..b028d708e 100644
--- a/docs/services/ipmfs/index.html
+++ b/docs/services/ipmfs/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">IPMFS | 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/services/ipmfs"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/memcached/index.html b/docs/services/memcached/index.html
index b94b1b974..627659599 100644
--- a/docs/services/memcached/index.html
+++ b/docs/services/memcached/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Memcached | 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/services/memcached"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/memory/index.html b/docs/services/memory/index.html
index 7af42561b..a83ae8f5f 100644
--- a/docs/services/memory/index.html
+++ b/docs/services/memory/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Memory | 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/services/memory"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/moka/index.html b/docs/services/moka/index.html
index b52b261b3..31541bcfa 100644
--- a/docs/services/moka/index.html
+++ b/docs/services/moka/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Moka | 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/services/moka"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/obs/index.html b/docs/services/obs/index.html
index afc84a466..fef250008 100644
--- a/docs/services/obs/index.html
+++ b/docs/services/obs/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Obs | 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/services/obs"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/oss/index.html b/docs/services/oss/index.html
index c91caf2e1..128ad8c5d 100644
--- a/docs/services/oss/index.html
+++ b/docs/services/oss/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">OSS | 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/services/oss"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/redis/index.html b/docs/services/redis/index.html
index e7ed0c686..dd3a06d92 100644
--- a/docs/services/redis/index.html
+++ b/docs/services/redis/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Redis | 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/services/redis"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/rocksdb/index.html b/docs/services/rocksdb/index.html
index 5046f04e7..faeb29cab 100644
--- a/docs/services/rocksdb/index.html
+++ b/docs/services/rocksdb/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">RocksDB | 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/services/rocksdb"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><me [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -13,8 +13,8 @@
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
 issues. It is advisable to follow the steps provided in the <a href="https://github.com/facebook/rocksdb/blob/main/INSTALL.md" target="_blank" rel="noopener noreferrer"><code>INSTALL</code></a>
 file to build rocksdb, rather than relying on system libraries that
-may be outdated and incompatible.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2><ul><li><code>root</code>: Set the working directory of <code>OpenDAL</code></li><li><code>datadir</code>: Set the path to the rocksdb data directory</li></ul><p>You can refer to <!-- -->[<code>RocksdbBuilder</code>]<!-- -->&#x27;s docs for mor [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+may be outdated and incompatible.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2><ul><li><code>root</code>: Set the working directory of <code>OpenDAL</code></li><li><code>datadir</code>: Set the path to the rocksdb data directory</li></ul><p>You can refer to <!-- -->[<code>RocksdbBuilder</code>]<!-- -->&#x27;s docs for mor [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/s3/index.html b/docs/services/s3/index.html
index d5651de34..f37542306 100644
--- a/docs/services/s3/index.html
+++ b/docs/services/s3/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">S3 | 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/services/s3"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/sftp/index.html b/docs/services/sftp/index.html
index d78eb89eb..27f8ceba1 100644
--- a/docs/services/sftp/index.html
+++ b/docs/services/sftp/index.html
@@ -5,15 +5,15 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">SFTP | 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/services/sftp"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
 lots of files, you should pay attention to close the file after using it.</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="capabilities">Capabilities<a href="#capabilities" class="hash-link" aria-label="Direct link to Capabilities" title="Direct link to Capabilities">​</a></h2><p>This service can be used to:</p><ul class="contains-task-list containsTaskList_mC6p"><li class="task-list-item"><input type="checkbox" checked="" disabled=""> <!-- -->stat</li><li class="task-li [...]
-Welcome to leave your comments or make contributions.</p><p>You can refer to <!-- -->[<code>SftpBuilder</code>]<!-- -->&#x27;s docs for more information</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="example">Example<a href="#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="via-builder">Via Builder<a href="#via-builder" class="hash-link" aria-label="Direct link to Via Builder" [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+Welcome to leave your comments or make contributions.</p><p>You can refer to <!-- -->[<code>SftpBuilder</code>]<!-- -->&#x27;s docs for more information</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="example">Example<a href="#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="via-builder">Via Builder<a href="#via-builder" class="hash-link" aria-label="Direct link to Via Builder" [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/sled/index.html b/docs/services/sled/index.html
index fcf8a2792..2a356d19f 100644
--- a/docs/services/sled/index.html
+++ b/docs/services/sled/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Sled | 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/services/sled"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/supabase/index.html b/docs/services/supabase/index.html
index f4454103e..736d16d1b 100644
--- a/docs/services/supabase/index.html
+++ b/docs/services/supabase/index.html
@@ -5,15 +5,15 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Supabase | 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/services/supabase"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current">< [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
 service_role_key(Secret key). The former one can only write public resources while the latter one
-can access all resources. Note that if you want to read public resources, do not set the key.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="example">Example<a href="#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="via-builder">Via Builder<a href="#via-builder" class="hash-link" aria-label="Direct link to Via Builder" title="Direct link to Via Builder">​</a></h3><div class="l [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+can access all resources. Note that if you want to read public resources, do not set the key.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="example">Example<a href="#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="via-builder">Via Builder<a href="#via-builder" class="hash-link" aria-label="Direct link to Via Builder" title="Direct link to Via Builder">​</a></h3><div class="l [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/wasabi/index.html b/docs/services/wasabi/index.html
index b5a92393b..bd7b56119 100644
--- a/docs/services/wasabi/index.html
+++ b/docs/services/wasabi/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Wasabi | 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/services/wasabi"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/webdav/index.html b/docs/services/webdav/index.html
index c728fcfb9..aab031b87 100644
--- a/docs/services/webdav/index.html
+++ b/docs/services/webdav/index.html
@@ -5,14 +5,14 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">WebDAV | 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/services/webdav"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-Users can use <code>webdav</code> to connect those services.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2><ul><li><code>endpoint</code>: set the endpoint for webdav</li><li><code>root</code>: Set the work directory for backend</li></ul><p>You can refer to <!-- -->[<code>WebdavBuilder</code>]<!-- -->&#x27;s docs for more i [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+Users can use <code>webdav</code> to connect those services.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2><ul><li><code>endpoint</code>: set the endpoint for webdav</li><li><code>root</code>: Set the work directory for backend</li></ul><p>You can refer to <!-- -->[<code>WebdavBuilder</code>]<!-- -->&#x27;s docs for more i [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/services/webhdfs/index.html b/docs/services/webhdfs/index.html
index a64da9f4a..f4bec3d4b 100644
--- a/docs/services/webhdfs/index.html
+++ b/docs/services/webhdfs/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">WebHDFS | 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/services/webhdfs"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><me [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/vision/index.html b/docs/vision/index.html
index 30b16d6f2..bc7f11015 100644
--- a/docs/vision/index.html
+++ b/docs/vision/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Vision | 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/vision"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/download/index.html b/download/index.html
index 100191102..edb50f295 100644
--- a/download/index.html
+++ b/download/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Download | 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/download"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><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.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/index.html b/index.html
index 907717944..1a1977746 100644
--- a/index.html
+++ b/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Apache OpenDAL</title><meta data-rh="true" property="og:title" content="Apache OpenDAL"><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/"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docse [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.bb5b6511.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dcb1754b.js" as="script">
 <link rel="preload" href="/assets/js/main.5c2e863e.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div id="__docusaurus-base-url-issue-banner-container"></div><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria [...]
-<script src="/assets/js/runtime~main.bb5b6511.js"></script>
+<script src="/assets/js/runtime~main.dcb1754b.js"></script>
 <script src="/assets/js/main.5c2e863e.js"></script>
 </body>
 </html>
\ No newline at end of file