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/07/18 11:31:41 UTC

[incubator-opendal] branch gh-pages updated: deploy: a1921e928d740f6867fb9751a93ded7d2ae04480

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 54d5c3243 deploy: a1921e928d740f6867fb9751a93ded7d2ae04480
54d5c3243 is described below

commit 54d5c324319f40afda39d3deb251e0ef3f7d8664
Author: Xuanwo <Xu...@users.noreply.github.com>
AuthorDate: Tue Jul 18 11:31:38 2023 +0000

    deploy: a1921e928d740f6867fb9751a93ded7d2ae04480
---
 404.html                                           |   4 +-
 .../{054cd2fb.e6b995f9.js => 054cd2fb.365a63e0.js} |   2 +-
 .../{136e1c50.6235be29.js => 136e1c50.e9ebc597.js} |   2 +-
 .../{1957547a.129a3189.js => 1957547a.73af6061.js} |   2 +-
 assets/js/1db64337.16f06ea6.js                     |   1 +
 assets/js/1db64337.57d5db53.js                     |   1 -
 .../{22d8fa67.e048f3df.js => 22d8fa67.56645370.js} |   2 +-
 .../{2cbf1097.fc309a92.js => 2cbf1097.fb5a85bf.js} |   2 +-
 .../{434bbc94.6bd365ba.js => 434bbc94.3420ce34.js} |   2 +-
 .../{57a16c1d.79528159.js => 57a16c1d.995d7c93.js} |   2 +-
 assets/js/5a65e608.636d4035.js                     |   1 +
 assets/js/5a65e608.68e61fee.js                     |   1 -
 .../{62a401e9.e45eada0.js => 62a401e9.f283b0d5.js} |   2 +-
 assets/js/6eb7fe18.1986413e.js                     |   1 +
 assets/js/6eb7fe18.d501206a.js                     |   1 -
 .../{8cc9519e.6809a179.js => 8cc9519e.2d5fb06c.js} |   2 +-
 .../{8f4159f2.386be63a.js => 8f4159f2.cdaa06ec.js} |   2 +-
 .../{a0405932.caec2e03.js => a0405932.a19b3d62.js} |   2 +-
 .../{ab10c306.f2995bfa.js => ab10c306.d964821f.js} |   2 +-
 assets/js/ae4554eb.9e638c45.js                     |   1 -
 assets/js/ae4554eb.a31a4f4f.js                     |   1 +
 .../{b56f9725.8ccabf7f.js => b56f9725.88112f51.js} |   2 +-
 .../{bb5b2057.2984d4c1.js => bb5b2057.4f07dcb1.js} |   2 +-
 .../{c6ab695b.b1c8494f.js => c6ab695b.a55f0a31.js} |   2 +-
 .../{cc62039a.0af20375.js => cc62039a.cdb6af21.js} |   2 +-
 assets/js/d5c31a96.64fed920.js                     |   1 -
 assets/js/d5c31a96.87ae49c6.js                     |   1 +
 .../{e892cec6.29aa354a.js => e892cec6.8b1fcf8d.js} |   2 +-
 .../{f1ca5a39.9081f058.js => f1ca5a39.8fe445fc.js} |   2 +-
 assets/js/runtime~main.411809a4.js                 |   1 -
 assets/js/runtime~main.7e185f83.js                 |   1 +
 blog/archive/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 +-
 docs/category/contributing/index.html              |   4 +-
 docs/category/reference/index.html                 |   4 +-
 docs/category/services/index.html                  |   4 +-
 .../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                           |  48 +-
 docs/python/search.js                              |   2 +-
 docs/rust/implementors/core/clone/trait.Clone.js   |   2 +-
 .../implementors/core/default/trait.Default.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 +-
 docs/rust/opendal/all.html                         |   2 +-
 docs/rust/opendal/layers/index.html                |   4 +-
 .../layers/retry/trait.RetryInterceptor.html       |  11 +
 docs/rust/opendal/layers/sidebar-items.js          |   2 +-
 docs/rust/opendal/layers/struct.RetryLayer.html    |  92 ++-
 .../opendal/layers/trait.RetryInterceptor.html     |  17 +
 docs/rust/opendal/raw/trait.Layer.html             |   2 +-
 docs/rust/opendal/services/struct.S3.html          |  10 +-
 docs/rust/opendal/struct.BlockingOperator.html     |  17 +-
 docs/rust/opendal/struct.BlockingWriter.html       |   8 +-
 docs/rust/opendal/struct.Writer.html               |  29 +-
 docs/rust/opendal/trait.Builder.html               |   2 +-
 docs/rust/search-index.js                          |   2 +-
 docs/rust/src/opendal/layers/mod.rs.html           |   2 +
 docs/rust/src/opendal/layers/retry.rs.html         | 886 +++++++++++++++++----
 docs/rust/src/opendal/services/s3/backend.rs.html  |   6 +-
 .../types/operator/blocking_operator.rs.html       |   4 +-
 docs/rust/src/opendal/types/writer.rs.html         |  12 +-
 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/fs/index.html                        |   6 +-
 docs/services/ftp/index.html                       |   6 +-
 docs/services/hdfs/index.html                      |   6 +-
 docs/services/ipfs/index.html                      |   6 +-
 docs/services/ipmfs/index.html                     |   6 +-
 docs/services/memory/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/webhdfs/index.html                   |   6 +-
 docs/vision/index.html                             |   6 +-
 download/index.html                                |   4 +-
 index.html                                         |   4 +-
 102 files changed, 1074 insertions(+), 436 deletions(-)

diff --git a/404.html b/404.html
index b54b40a52..63039dcda 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.js"></script>
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/assets/js/054cd2fb.e6b995f9.js b/assets/js/054cd2fb.365a63e0.js
similarity index 84%
rename from assets/js/054cd2fb.e6b995f9.js
rename to assets/js/054cd2fb.365a63e0.js
index 050e81ff2..6f67adb07 100644
--- a/assets/js/054cd2fb.e6b995f9.js
+++ b/assets/js/054cd2fb.365a63e0.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/136e1c50.6235be29.js b/assets/js/136e1c50.e9ebc597.js
similarity index 83%
rename from assets/js/136e1c50.6235be29.js
rename to assets/js/136e1c50.e9ebc597.js
index 88b564a16..5cc872043 100644
--- a/assets/js/136e1c50.6235be29.js
+++ b/assets/js/136e1c50.e9ebc597.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/1957547a.129a3189.js b/assets/js/1957547a.73af6061.js
similarity index 74%
rename from assets/js/1957547a.129a3189.js
rename to assets/js/1957547a.73af6061.js
index 72736e6a4..53ad20eb3 100644
--- a/assets/js/1957547a.129a3189.js
+++ b/assets/js/1957547a.73af6061.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.16f06ea6.js b/assets/js/1db64337.16f06ea6.js
new file mode 100644
index 000000000..5bc85ca5f
--- /dev/null
+++ b/assets/js/1db64337.16f06ea6.js
@@ -0,0 +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
diff --git a/assets/js/1db64337.57d5db53.js b/assets/js/1db64337.57d5db53.js
deleted file mode 100644
index fba05a2aa..000000000
--- a/assets/js/1db64337.57d5db53.js
+++ /dev/null
@@ -1 +0,0 @@
-"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.e048f3df.js b/assets/js/22d8fa67.56645370.js
similarity index 85%
rename from assets/js/22d8fa67.e048f3df.js
rename to assets/js/22d8fa67.56645370.js
index 8235fb099..38625a9f9 100644
--- a/assets/js/22d8fa67.e048f3df.js
+++ b/assets/js/22d8fa67.56645370.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4536],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,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:()=>c,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/2cbf1097.fc309a92.js b/assets/js/2cbf1097.fb5a85bf.js
similarity index 91%
rename from assets/js/2cbf1097.fc309a92.js
rename to assets/js/2cbf1097.fb5a85bf.js
index 2cb0eb58a..a8d2267af 100644
--- a/assets/js/2cbf1097.fc309a92.js
+++ b/assets/js/2cbf1097.fb5a85bf.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.6bd365ba.js b/assets/js/434bbc94.3420ce34.js
similarity index 86%
rename from assets/js/434bbc94.6bd365ba.js
rename to assets/js/434bbc94.3420ce34.js
index 51828df40..886b15a2b 100644
--- a/assets/js/434bbc94.6bd365ba.js
+++ b/assets/js/434bbc94.3420ce34.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.79528159.js b/assets/js/57a16c1d.995d7c93.js
similarity index 83%
rename from assets/js/57a16c1d.79528159.js
rename to assets/js/57a16c1d.995d7c93.js
index 9f1401d8f..9d0e9b654 100644
--- a/assets/js/57a16c1d.79528159.js
+++ b/assets/js/57a16c1d.995d7c93.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/5a65e608.636d4035.js b/assets/js/5a65e608.636d4035.js
new file mode 100644
index 000000000..695ce6b59
--- /dev/null
+++ b/assets/js/5a65e608.636d4035.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 o(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.68e61fee.js b/assets/js/5a65e608.68e61fee.js
deleted file mode 100644
index 83e62bfeb..000000000
--- a/assets/js/5a65e608.68e61fee.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 o(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.e45eada0.js b/assets/js/62a401e9.f283b0d5.js
similarity index 84%
rename from assets/js/62a401e9.e45eada0.js
rename to assets/js/62a401e9.f283b0d5.js
index 42b0768db..f94791376 100644
--- a/assets/js/62a401e9.e45eada0.js
+++ b/assets/js/62a401e9.f283b0d5.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.1986413e.js b/assets/js/6eb7fe18.1986413e.js
new file mode 100644
index 000000000..c0829e8d1
--- /dev/null
+++ b/assets/js/6eb7fe18.1986413e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3922],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,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/6eb7fe18.d501206a.js b/assets/js/6eb7fe18.d501206a.js
deleted file mode 100644
index c5663612e..000000000
--- a/assets/js/6eb7fe18.d501206a.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3922],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,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/8cc9519e.6809a179.js b/assets/js/8cc9519e.2d5fb06c.js
similarity index 89%
rename from assets/js/8cc9519e.6809a179.js
rename to assets/js/8cc9519e.2d5fb06c.js
index 9c765f787..1ad47608b 100644
--- a/assets/js/8cc9519e.6809a179.js
+++ b/assets/js/8cc9519e.2d5fb06c.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.386be63a.js b/assets/js/8f4159f2.cdaa06ec.js
similarity index 89%
rename from assets/js/8f4159f2.386be63a.js
rename to assets/js/8f4159f2.cdaa06ec.js
index 950938c20..e0f226e73 100644
--- a/assets/js/8f4159f2.386be63a.js
+++ b/assets/js/8f4159f2.cdaa06ec.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/a0405932.caec2e03.js b/assets/js/a0405932.a19b3d62.js
similarity index 84%
rename from assets/js/a0405932.caec2e03.js
rename to assets/js/a0405932.a19b3d62.js
index 4d7fc9677..e8a93c773 100644
--- a/assets/js/a0405932.caec2e03.js
+++ b/assets/js/a0405932.a19b3d62.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.f2995bfa.js b/assets/js/ab10c306.d964821f.js
similarity index 68%
rename from assets/js/ab10c306.f2995bfa.js
rename to assets/js/ab10c306.d964821f.js
index 2b15afa21..1b6f9f2b6 100644
--- a/assets/js/ab10c306.f2995bfa.js
+++ b/assets/js/ab10c306.d964821f.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.9e638c45.js b/assets/js/ae4554eb.9e638c45.js
deleted file mode 100644
index e96c5ee32..000000000
--- a/assets/js/ae4554eb.9e638c45.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/ae4554eb.a31a4f4f.js b/assets/js/ae4554eb.a31a4f4f.js
new file mode 100644
index 000000000..5ade41bfc
--- /dev/null
+++ b/assets/js/ae4554eb.a31a4f4f.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/b56f9725.8ccabf7f.js b/assets/js/b56f9725.88112f51.js
similarity index 84%
rename from assets/js/b56f9725.8ccabf7f.js
rename to assets/js/b56f9725.88112f51.js
index 7a6f88a3f..6745fe8ed 100644
--- a/assets/js/b56f9725.8ccabf7f.js
+++ b/assets/js/b56f9725.88112f51.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/bb5b2057.2984d4c1.js b/assets/js/bb5b2057.4f07dcb1.js
similarity index 83%
rename from assets/js/bb5b2057.2984d4c1.js
rename to assets/js/bb5b2057.4f07dcb1.js
index 35dee0f54..c4a27c724 100644
--- a/assets/js/bb5b2057.2984d4c1.js
+++ b/assets/js/bb5b2057.4f07dcb1.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/c6ab695b.b1c8494f.js b/assets/js/c6ab695b.a55f0a31.js
similarity index 72%
rename from assets/js/c6ab695b.b1c8494f.js
rename to assets/js/c6ab695b.a55f0a31.js
index c6b494611..ca5875c2c 100644
--- a/assets/js/c6ab695b.b1c8494f.js
+++ b/assets/js/c6ab695b.a55f0a31.js
@@ -1 +1 @@
-"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
+"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.0af20375.js b/assets/js/cc62039a.cdb6af21.js
similarity index 88%
rename from assets/js/cc62039a.0af20375.js
rename to assets/js/cc62039a.cdb6af21.js
index 144f5a2e9..4fab3005f 100644
--- a/assets/js/cc62039a.0af20375.js
+++ b/assets/js/cc62039a.cdb6af21.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1011],{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([[1011],{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/d5c31a96.64fed920.js b/assets/js/d5c31a96.64fed920.js
deleted file mode 100644
index 63a3fe895..000000000
--- a/assets/js/d5c31a96.64fed920.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.87ae49c6.js b/assets/js/d5c31a96.87ae49c6.js
new file mode 100644
index 000000000..ad6dc82d2
--- /dev/null
+++ b/assets/js/d5c31a96.87ae49c6.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/e892cec6.29aa354a.js b/assets/js/e892cec6.8b1fcf8d.js
similarity index 86%
rename from assets/js/e892cec6.29aa354a.js
rename to assets/js/e892cec6.8b1fcf8d.js
index 4f5cf0b24..90e9da661 100644
--- a/assets/js/e892cec6.29aa354a.js
+++ b/assets/js/e892cec6.8b1fcf8d.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.9081f058.js b/assets/js/f1ca5a39.8fe445fc.js
similarity index 87%
rename from assets/js/f1ca5a39.9081f058.js
rename to assets/js/f1ca5a39.8fe445fc.js
index 30c70cee2..16eaeff2b 100644
--- a/assets/js/f1ca5a39.9081f058.js
+++ b/assets/js/f1ca5a39.8fe445fc.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/runtime~main.411809a4.js b/assets/js/runtime~main.411809a4.js
deleted file mode 100644
index 4ff8b03ff..000000000
--- a/assets/js/runtime~main.411809a4.js
+++ /dev/null
@@ -1 +0,0 @@
-(()=>{"use strict";var e,a,t,c,r,f={},b={};function d(e){var a=b[e];if(void 0!==a)return a.exports;var t=b[e]={exports:{}};return f[e].call(t.exports,t,t.exports,d),t.exports}d.m=f,e=[],d.O=(a,t,c,r)=>{if(!t){var f=1/0;for(i=0;i<e.length;i++){t=e[i][0],c=e[i][1],r=e[i][2];for(var b=!0,o=0;o<t.length;o++)(!1&r||f>=r)&&Object.keys(d.O).every((e=>d.O[e](t[o])))?t.splice(o--,1):(b=!1,r<f&&(f=r));if(b){e.splice(i--,1);var n=c();void 0!==n&&(a=n)}}return a}r=r||0;for(var i=e.length;i>0&&e[i-1] [...]
\ No newline at end of file
diff --git a/assets/js/runtime~main.7e185f83.js b/assets/js/runtime~main.7e185f83.js
new file mode 100644
index 000000000..36f7016d6
--- /dev/null
+++ b/assets/js/runtime~main.7e185f83.js
@@ -0,0 +1 @@
+(()=>{"use strict";var e,a,t,c,r,f={},d={};function b(e){var a=d[e];if(void 0!==a)return a.exports;var t=d[e]={exports:{}};return f[e].call(t.exports,t,t.exports,b),t.exports}b.m=f,e=[],b.O=(a,t,c,r)=>{if(!t){var f=1/0;for(i=0;i<e.length;i++){t=e[i][0],c=e[i][1],r=e[i][2];for(var d=!0,o=0;o<t.length;o++)(!1&r||f>=r)&&Object.keys(b.O).every((e=>b.O[e](t[o])))?t.splice(o--,1):(d=!1,r<f&&(f=r));if(d){e.splice(i--,1);var n=c();void 0!==n&&(a=n)}}return a}r=r||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 5852b77e9..d0e36fdb1 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.js"></script>
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/index.html b/blog/index.html
index 296d42e02..51f0f6431 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.js"></script>
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 1c18485e5..53d30a11c 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.js"></script>
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 aafa60ae9..f0ce5ce95 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.js"></script>
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 d86472f46..57d06ba62 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.js"></script>
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/tags/index.html b/blog/tags/index.html
index 90a9ef65e..678ca08a7 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.js"></script>
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 a2b3c6c8b..03317c8c2 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.js"></script>
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 d51885aa9..321a68c37 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.js"></script>
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 a2518211f..3997eab25 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.js"></script>
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 4f353be06..6522389d5 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 eaceb8264..288fb2d62 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 5f753e124..bedc90dab 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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 [...]
 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, also, is necessary for a release. And OpenDAL will only have source release.</p><p>Please remember that publishing software [...]
 we will abandon that version and prepare for the next one.
-Our release page will only display ASF releases instead of GitHub Releases.</p><blockquote><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></ul></blockquote><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-an-asf-release">Create an ASF Release<a href="#create-an-asf-release" class="hash-link" aria-label="Direct link to Create an ASF Release" ti [...]
-<script src="/assets/js/runtime~main.411809a4.js"></script>
+Our release page will only display ASF releases instead of GitHub Releases.</p><blockquote><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></ul></blockquote><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-an-asf-release">Create an ASF Release<a href="#create-an-asf-release" class="hash-link" aria-label="Direct link to Create an ASF Release" ti [...]
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 24535e050..059b64415 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 389ee1d7e..dad9b225e 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-07-18 09:58:29 </i>
+<i style="float:right;">Last updated 2023-07-18 11:24:57 </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 161b9c071..f48f5700c 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-07-18 09:58:29 </i>
+<i style="float:right;">Last updated 2023-07-18 11:24:57 </i>
 </div> <!-- id="about" -->
 </div> <!-- id="container" -->
 </body>
diff --git a/docs/lua/index.html b/docs/lua/index.html
index af2ab14bc..04279df91 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-07-18 09:58:29 </i>
+<i style="float:right;">Last updated 2023-07-18 11:24:57 </i>
 </div> <!-- id="about" -->
 </div> <!-- id="container" -->
 </body>
diff --git a/docs/nodejs/classes/BlockingLister.html b/docs/nodejs/classes/BlockingLister.html
index 0fe0cf78b..d472f3b85 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/3d8f0f5/bindings/nodejs/index.d.ts#L434">index.d.ts:434</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L434">index.d.ts:434</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/3d8f0f5/bindings/nodejs/index.d.ts#L435">index.d.ts:435</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L435">index.d.ts:435</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 ec36c277e..8826235c4 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/3d8f0f5/bindings/nodejs/index.d.ts#L397">index.d.ts:397</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L397">index.d.ts:397</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/3d8f0f5/bindings/nodejs/index.d.ts#L399">index.d.ts:399</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L399">index.d.ts:399</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 62cfd792b..25647802a 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/3d8f0f5/bindings/nodejs/index.d.ts#L423">index.d.ts:423</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L423">index.d.ts:423</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/3d8f0f5/bindings/nodejs/index.d.ts#L432">index.d.ts:432</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L432">index.d.ts:432</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 5690cdca9..16ecfcb6d 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/3d8f0f5/bindings/nodejs/index.d.ts#L401">index.d.ts:401</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L401">index.d.ts:401</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/3d8f0f5/bindings/nodejs/index.d.ts#L407">index.d.ts:407</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L407">index.d.ts:407</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/3d8f0f5/bindings/nodejs/index.d.ts#L409">index.d.ts:409</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L409">index.d.ts:409</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/3d8f0f5/bindings/nodejs/index.d.ts#L411">index.d.ts:411</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L411">index.d.ts:411</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/3d8f0f5/bindings/nodejs/index.d.ts#L413">index.d.ts:413</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L413">index.d.ts:413</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/3d8f0f5/bindings/nodejs/index.d.ts#L415">index.d.ts:415</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L415">index.d.ts:415</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/3d8f0f5/bindings/nodejs/index.d.ts#L421">index.d.ts:421</a></li></ul></aside></li></ul></section></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L421">index.d.ts:421</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/3d8f0f5/bindings/nodejs/index.d.ts#L403">index.d.ts:403</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L403">index.d.ts:403</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/3d8f0f5/bindings/nodejs/index.d.ts#L405">index.d.ts:405</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L405">index.d.ts:405</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 1753264ac..df178d24c 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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/bindings/nodejs/index.d.ts#L268">index.d.ts:268</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L268">index.d.ts:268</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/3d8f0f5/bindings/nodejs/index.d.ts#L277">index.d.ts:277</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L277">index.d.ts:277</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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/bindings/nodejs/index.d.ts#L324">index.d.ts:324</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L324">index.d.ts:324</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/3d8f0f5/bindings/nodejs/index.d.ts#L347">index.d.ts:347</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L347">index.d.ts:347</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/3d8f0f5/bindings/nodejs/index.d.ts#L363">index.d.ts:363</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L363">index.d.ts:363</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/3d8f0f5/bindings/nodejs/index.d.ts#L395">index.d.ts:395</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L395">index.d.ts:395</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/3d8f0f5/bindings/nodejs/index.d.ts#L379">index.d.ts:379</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L379">index.d.ts:379</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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/bindings/nodejs/index.d.ts#L289">index.d.ts:289</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L289">index.d.ts:289</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/3d8f0f5/bindings/nodejs/index.d.ts#L301">index.d.ts:301</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L301">index.d.ts:301</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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/bindings/nodejs/index.d.ts#L233">index.d.ts:233</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L233">index.d.ts:233</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/3d8f0f5/bindings/nodejs/index.d.ts#L256">index.d.ts:256</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/a1921e9/bindings/nodejs/index.d.ts#L256">index.d.ts:256</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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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 cde1c856c..4a03043e4 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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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/3d8f0f5/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/a1921e9/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 3faa29051..e55b19237 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/python/opendal.html b/docs/python/opendal.html
index 81738fa92..24819f05f 100644
--- a/docs/python/opendal.html
+++ b/docs/python/opendal.html
@@ -156,22 +156,22 @@
                     <a class="class" href="#Metadata">Metadata</a>
                             <ul class="memberlist">
                         <li>
-                                <a class="variable" href="#Metadata.etag">etag</a>
+                                <a class="variable" href="#Metadata.content_md5">content_md5</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Metadata.content_md5">content_md5</a>
+                                <a class="variable" href="#Metadata.etag">etag</a>
                         </li>
                         <li>
                                 <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_disposition">content_disposition</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Metadata.content_type">content_type</a>
+                                <a class="variable" href="#Metadata.content_length">content_length</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Metadata.content_disposition">content_disposition</a>
+                                <a class="variable" href="#Metadata.content_type">content_type</a>
                         </li>
                 </ul>
 
@@ -855,28 +855,28 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
     
     
 
-                            <div id="Metadata.etag" class="classattr">
+                            <div id="Metadata.content_md5" class="classattr">
                                 <div class="attr variable">
-            <span class="name">etag</span><span class="annotation">: Optional[str]</span>
+            <span class="name">content_md5</span><span class="annotation">: Optional[str]</span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.etag"></a>
+    <a class="headerlink" href="#Metadata.content_md5"></a>
     
-            <div class="docstring"><p>ETag of this entry.</p>
+            <div class="docstring"><p>Content MD5 of this entry.</p>
 </div>
 
 
                             </div>
-                            <div id="Metadata.content_md5" class="classattr">
+                            <div id="Metadata.etag" class="classattr">
                                 <div class="attr variable">
-            <span class="name">content_md5</span><span class="annotation">: Optional[str]</span>
+            <span class="name">etag</span><span class="annotation">: Optional[str]</span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.content_md5"></a>
+    <a class="headerlink" href="#Metadata.etag"></a>
     
-            <div class="docstring"><p>Content MD5 of this entry.</p>
+            <div class="docstring"><p>ETag of this entry.</p>
 </div>
 
 
@@ -893,6 +893,17 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
 </div>
 
 
+                            </div>
+                            <div id="Metadata.content_disposition" class="classattr">
+                                <div class="attr variable">
+            <span class="name">content_disposition</span><span class="annotation">: Optional[str]</span>
+
+        
+    </div>
+    <a class="headerlink" href="#Metadata.content_disposition"></a>
+    
+    
+
                             </div>
                             <div id="Metadata.content_length" class="classattr">
                                 <div class="attr variable">
@@ -919,17 +930,6 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
 </div>
 
 
-                            </div>
-                            <div id="Metadata.content_disposition" class="classattr">
-                                <div class="attr variable">
-            <span class="name">content_disposition</span><span class="annotation">: Optional[str]</span>
-
-        
-    </div>
-    <a class="headerlink" href="#Metadata.content_disposition"></a>
-    
-    
-
                             </div>
                 </section>
                 <section id="Error">
diff --git a/docs/python/search.js b/docs/python/search.js
index eaee1cced..b7f76949a 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 b12b04383..a88c389df 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.71.0/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"opendal/struct.BlockingOperator.html\" title=\"struct opendal::BlockingOperator\">BlockingOperator</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.0/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"opendal/struct.OperatorInfo.html [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.0/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"opendal/struct.BlockingOperator.html\" title=\"struct opendal::BlockingOperator\">BlockingOperator</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.0/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"opendal/struct.OperatorInfo.html [...]
 };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/default/trait.Default.js b/docs/rust/implementors/core/default/trait.Default.js
index 1f1211387..327f4b89d 100644
--- a/docs/rust/implementors/core/default/trait.Default.js
+++ b/docs/rust/implementors/core/default/trait.Default.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.0/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"opendal/raw/struct.OpAppend.html\" title=\"struct opendal::raw::OpAppend\">OpAppend</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.0/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"opendal/services/struct.Fs. [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.0/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"opendal/raw/struct.OpAppend.html\" title=\"struct opendal::raw::OpAppend\">OpAppend</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.0/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"opendal/services/struct.Fs. [...]
 };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 b644481e7..de09df370 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 71294dda4..e6783bbe8 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.71.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.71.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.71.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.71.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 275684921..dcb55bd3d 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.71.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.71.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.71.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.71.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 08d4c5f25..a4acab78b 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.71.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.71.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.71.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.71.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 3645ffd1d..6d2461aac 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.71.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.71.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.71.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.71.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 78dd74226..169b33c91 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.71.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.71.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.71.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.71.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/opendal/all.html b/docs/rust/opendal/all.html
index 273ce696c..8d60b9c38 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/index.html b/docs/rust/opendal/layers/index.html
index 54b143f4e..6a97d5912 100644
--- a/docs/rust/opendal/layers/index.html
+++ b/docs/rust/opendal/layers/index.html
@@ -1,2 +1,2 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="`Layer` is the mechanism to intercept operations."><title>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 href=" [...]
-</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.ChaosLayer.html" title="struct opendal::layers::ChaosLayer">ChaosLayer</a></div><div class="desc docblock-short">Inject chaos into underlying services for robustness test.</div></li><li><div class="item-name"><a class="struct" href="struct.ConcurrentLimitLayer.html" title="struct opendal::layers::ConcurrentLimitL [...]
\ 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="`Layer` is the mechanism to intercept operations."><title>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 href=" [...]
+</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.ChaosLayer.html" title="struct opendal::layers::ChaosLayer">ChaosLayer</a></div><div class="desc docblock-short">Inject chaos into underlying services for robustness test.</div></li><li><div class="item-name"><a class="struct" href="struct.ConcurrentLimitLayer.html" title="struct opendal::layers::ConcurrentLimitL [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/layers/retry/trait.RetryInterceptor.html b/docs/rust/opendal/layers/retry/trait.RetryInterceptor.html
new file mode 100644
index 000000000..0a48d75c0
--- /dev/null
+++ b/docs/rust/opendal/layers/retry/trait.RetryInterceptor.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" content="0;URL=../../../opendal/layers/trait.RetryInterceptor.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a href="../../../opendal/layers/trait.RetryInterceptor.html">../../../opendal/layers/trait.RetryInterceptor.html</a>...</p>
+    <script>location.replace("../../../opendal/layers/trait.RetryInterceptor.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/rust/opendal/layers/sidebar-items.js b/docs/rust/opendal/layers/sidebar-items.js
index 417c21bf1..a12732d6d 100644
--- a/docs/rust/opendal/layers/sidebar-items.js
+++ b/docs/rust/opendal/layers/sidebar-items.js
@@ -1 +1 @@
-window.SIDEBAR_ITEMS = {"struct":["ChaosLayer","ConcurrentLimitLayer","ImmutableIndexLayer","LoggingLayer","MadsimLayer","MadsimServer","MetricsLayer","MinitraceLayer","OtelTraceLayer","PrometheusLayer","RetryLayer","ThrottleLayer","TimeoutLayer","TracingLayer"]};
\ No newline at end of file
+window.SIDEBAR_ITEMS = {"struct":["ChaosLayer","ConcurrentLimitLayer","ImmutableIndexLayer","LoggingLayer","MadsimLayer","MadsimServer","MetricsLayer","MinitraceLayer","OtelTraceLayer","PrometheusLayer","RetryLayer","ThrottleLayer","TimeoutLayer","TracingLayer"],"trait":["RetryInterceptor"]};
\ 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 03523c746..52b65c179 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
@@ -15,7 +15,33 @@ returns true. If operation still failed, this layer will set error to
     .expect(<span class="string">&quot;must init&quot;</span>)
     .layer(RetryLayer::new())
     .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#71-130">source</a><a href="#impl-RetryLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.RetryLayer.html" title=" [...]
+<h3 id="customize-retry-interceptor"><a href="#customize-retry-interceptor">Customize retry interceptor</a></h3>
+<p>RetryLayer accepts <a href="trait.RetryInterceptor.html" title="trait opendal::layers::RetryInterceptor"><code>RetryInterceptor</code></a> to allow users to customize
+their own retry interceptor logic.</p>
+
+<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>std::time::Duration;
+
+<span class="kw">use </span>anyhow::Result;
+<span class="kw">use </span>opendal::layers::RetryInterceptor;
+<span class="kw">use </span>opendal::layers::RetryLayer;
+<span class="kw">use </span>opendal::services;
+<span class="kw">use </span>opendal::Error;
+<span class="kw">use </span>opendal::Operator;
+<span class="kw">use </span>opendal::Scheme;
+
+<span class="kw">struct </span>MyRetryInterceptor;
+
+<span class="kw">impl </span>RetryInterceptor <span class="kw">for </span>MyRetryInterceptor {
+    <span class="kw">fn </span>intercept(<span class="kw-2">&amp;</span><span class="self">self</span>, err: <span class="kw-2">&amp;</span>Error, dur: Duration, ctx: <span class="kw-2">&amp;</span>[(<span class="kw-2">&amp;</span>str, <span class="kw-2">&amp;</span>str)]) {
+        <span class="comment">// do something
+    </span>}
+}
+
+<span class="kw">let _ </span>= Operator::new(services::Memory::default())
+    .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= [...]
 <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;
@@ -26,34 +52,62 @@ returns true. If operation still failed, this layer will set error to
 <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_jitter" class="method"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#94-97">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_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 class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>std::time::Duration;
+
+<span class="kw">use </span>anyhow::Result;
+<span class="kw">use </span>opendal::layers::RetryInterceptor;
+<span class="kw">use </span>opendal::layers::RetryLayer;
+<span class="kw">use </span>opendal::services;
+<span class="kw">use </span>opendal::Error;
+<span class="kw">use </span>opendal::Operator;
+<span class="kw">use </span>opendal::Scheme;
+
+<span class="kw">struct </span>MyRetryInterceptor;
+
+<span class="kw">impl </span>RetryInterceptor <span class="kw">for </span>MyRetryInterceptor {
+    <span class="kw">fn </span>intercept(<span class="kw-2">&amp;</span><span class="self">self</span>, err: <span class="kw-2">&amp;</span>Error, dur: Duration, ctx: <span class="kw-2">&amp;</span>[(<span class="kw-2">&amp;</span>str, <span class="kw-2">&amp;</span>str)]) {
+        <span class="comment">// do something
+    </span>}
+}
+
+<span class="kw">let _ </span>= Operator::new(services::Memory::default())
+    .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>
 <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#104-107">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.71.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#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.71.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#110-113">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.71.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#118-121">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.71.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#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.71.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.71.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#126-129">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.71.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#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.71.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" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/retry.rs.html#68">source</a><a href="#impl-Clone-for-RetryLayer" class="anchor">§</a><h3 class="code-header [...]
-    T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.71.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.71.0/src/core/any.rs.html#201">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.71.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.71.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.71.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.71.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-RetryLayer" class="impl"><a href="#impl-FutureExt-for-RetryLayer" 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">§</a><h4 class="code-header"> [...]
+</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 [...]
+    I: <a class="trait" href="https://doc.rust-lang.org/1.71.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.71.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> [...]
+    I: <a class="trait" href="https://doc.rust-lang.org/1.71.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.71.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.71.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.71.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. [...]
+    I: <a class="trait" href="https://doc.rust-lang.org/1.71.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</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-RetryLayer%3CI%3E [...]
+    T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.71.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.71.0/src/core/any.rs.html#201">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.71.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.71.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.71.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.71.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-RetryLayer%3CI%3E" class="impl"><a href="#impl-FutureExt-for-RetryLayer%3CI%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">§</a><h4 class= [...]
 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-RetryLayer" 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-RetryLayer" 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.Instrument.html" title="trait tra [...]
+wrapper. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Instrument-for-RetryLayer%3CI%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-RetryLayer%3CI%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.Instrument.html" ti [...]
 <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-RetryLayer" class="impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.71.0/src/core/convert/mod.rs.html#707">source</a><a href="#impl-Into%3CU%3E-for-RetryLayer" class="anchor">§</a><h3 class="code-head [...]
+<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-RetryLayer%3CI%3E" class="impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.71.0/src/core/convert/mod.rs.html#707">source</a><a href="#impl-Into%3CU%3E-for-RetryLayer%3CI%3E" class="anchor">§</a><h3 cl [...]
     U: <a class="trait" href="https://doc.rust-lang.org/1.71.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.71.0/src/core/convert/mod.rs.html#716">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.71.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-Pointable-for-RetryLayer" class="impl"><a href="#impl-Pointable-for-RetryLayer" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h4 class="code- [...]
-    T: <a class="trait" href="https://doc.rust-lang.org/1.71.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.71.0/alloc/borrow/trait.ToOwned.html#associatedtype.Owned" class="associated [...]
-    U: <a class="trait" href="https://doc.rust-lang.org/1.71.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.71.0/core/convert/trait.TryFrom.html#associatedtype.Error" class=" [...]
-    U: <a class="trait" href="https://doc.rust-lang.org/1.71.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.71.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-RetryLayer" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#334">sour [...]
+</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Pointable-for-RetryLayer%3CI%3E" class="impl"><a href="#impl-Pointable-for-RetryLayer%3CI%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedconstant.ALIGN" class="associatedconstant trait-impl"><a href="#associatedconstant.ALIGN" class="anchor">§</a><h [...]
+    T: <a class="trait" href="https://doc.rust-lang.org/1.71.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.71.0/alloc/borrow/trait.ToOwned.html#associatedtype.Owned" class="associated [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.71.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.71.0/core/convert/trait.TryFrom.html#associatedtype.Error" class=" [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.71.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.71.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-RetryLayer%3CI%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#33 [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.71.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/layers/trait.RetryInterceptor.html b/docs/rust/opendal/layers/trait.RetryInterceptor.html
new file mode 100644
index 000000000..e7221c2fc
--- /dev/null
+++ b/docs/rust/opendal/layers/trait.RetryInterceptor.html
@@ -0,0 +1,17 @@
+<!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.71.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.71.0/std/primitive.str.html">str</a>, &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.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 [...]
+<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>
+<ul>
+<li>err: The error that caused the current retry.</li>
+<li>dur: The duration that will sleep before next retry.</li>
+<li>ctx: The context (<code>name</code>, <code>value</code>) of current operation, like <code>operation</code> and <code>path</code>.</li>
+</ul>
+<h5 id="notes"><a href="#notes">Notes</a></h5>
+<p>The intercept must be quick and non-blocking. No heavy IO is
+allowed. Otherwise the retry will be blocked.</p>
+</div></details></div><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"></div><script src="../../implementors/opendal/layers/retry/trait.RetryInterceptor.js" async></script></section></div></main></body></html>
\ 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 3ac2d63b0..0c26db676 100644
--- a/docs/rust/opendal/raw/trait.Layer.html
+++ b/docs/rust/opendal/raw/trait.Layer.html
@@ -91,4 +91,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#124">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#127">source</a><h4 class="code-header">fn <a href="#tymethod.layer" class="fn">layer</a>(&amp;self, inner: A) -&gt; Self::<a class="associatedtype" href="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-ChaosLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/chaos.rs.html#82-92">source</a><a href="#impl-Layer%3CA%3E-for-ChaosLayer" class="anchor">§</a><h3 class="code-header">impl&lt;A: <a class="trait" href="trai [...]
\ 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-ChaosLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/chaos.rs.html#82-92">source</a><a href="#impl-Layer%3CA%3E-for-ChaosLayer" class="anchor">§</a><h3 class="code-header">impl&lt;A: <a class="trait" href="trai [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/services/struct.S3.html b/docs/rust/opendal/services/struct.S3.html
index 35cbb0cab..8bc4764cd 100644
--- a/docs/rust/opendal/services/struct.S3.html
+++ b/docs/rust/opendal/services/struct.S3.html
@@ -330,7 +330,7 @@ builder.bucket(<span class="string">&quot;&lt;bucket_name&gt;&quot;</span>);</co
 <li><code>region</code>: When you create a new bucket, the data location is set to Automatic by default. So please use <code>auto</code> for region.</li>
 <li><code>batch_max_operations</code>: R2’s delete objects will return <code>Internal Error</code> if the batch is larger than <code>700</code>. Please set this value <code>&lt;= 700</code> to make sure batch delete work as expected.</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-S3Builder" class="impl"><a class="srclink rightside" href="../../src/opendal/services/s3/backend.rs.html#114-632">source</a><a href="#impl-S3Builder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.S3.html" title="st [...]
+</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-S3Builder" class="impl"><a class="srclink rightside" href="../../src/opendal/services/s3/backend.rs.html#114-634">source</a><a href="#impl-S3Builder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.S3.html" title="st [...]
 <p>All operations will happen under this root.</p>
 </div></details><details class="toggle method-toggle" open><summary><section id="method.bucket" class="method"><a class="srclink rightside" href="../../src/opendal/services/s3/backend.rs.html#129-133">source</a><h4 class="code-header">pub fn <a href="#method.bucket" class="fn">bucket</a>(&amp;mut self, bucket: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.re [...]
 </div></details><details class="toggle method-toggle" open><summary><section id="method.endpoint" class="method"><a class="srclink rightside" href="../../src/opendal/services/s3/backend.rs.html#146-153">source</a><h4 class="code-header">pub fn <a href="#method.endpoint" class="fn">endpoint</a>(&amp;mut self, endpoint: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/prim [...]
@@ -471,7 +471,7 @@ during minor updates.</p>
 </div></details><details class="toggle method-toggle" open><summary><section id="method.write_min_size" class="method"><a class="srclink rightside" href="../../src/opendal/services/s3/backend.rs.html#511-515">source</a><h4 class="code-header">pub fn <a href="#method.write_min_size" class="fn">write_min_size</a>(&amp;mut self, write_min_size: <a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.usize.html">usize</a>) -&gt; <a class="primitive" href="https://doc.rust-l [...]
 Reference: <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html">Amazon S3 multipart upload limits</a></p>
 </div></details><details class="toggle method-toggle" open><summary><section id="method.batch_max_operations" class="method"><a class="srclink rightside" href="../../src/opendal/services/s3/backend.rs.html#517-521">source</a><h4 class="code-header">pub fn <a href="#method.batch_max_operations" class="fn">batch_max_operations</a>(&amp;mut self, batch_max_operations: <a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.usize.html">usize</a>) -&gt; <a class="primitive"  [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.detect_region" class="method"><a class="srclink rightside" href="../../src/opendal/services/s3/backend.rs.html#559-631">source</a><h4 class="code-header">pub async fn <a href="#method.detect_region" class="fn">detect_region</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.detect_region" class="method"><a class="srclink rightside" href="../../src/opendal/services/s3/backend.rs.html#561-633">source</a><h4 class="code-header">pub async fn <a href="#method.detect_region" class="fn">detect_region</a>(
     &amp;self,
     endpoint: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.str.html">str</a>,
     bucket: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.str.html">str</a>
@@ -502,12 +502,14 @@ Reference: <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>opendal::services::S3;
 
 <span class="kw">let </span>builder = S3::default();
-<span class="kw">let </span>region: <span class="prelude-ty">Option</span>&lt;String&gt; = builder.detect_region(<span class="string">&quot;https://s3.amazonaws.com&quot;</span>, <span class="string">&quot;example&quot;</span>).<span class="kw">await</span>;</code></pre></div>
+<span class="kw">let </span>region: <span class="prelude-ty">Option</span>&lt;String&gt; = builder
+    .detect_region(<span class="string">&quot;https://s3.amazonaws.com&quot;</span>, <span class="string">&quot;example&quot;</span>)
+    .<span class="kw">await</span>;</code></pre></div>
 <h5 id="reference"><a href="#reference">Reference</a></h5>
 <ul>
 <li><a href="https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_HeadBucket.html">Amazon S3 HeadBucket API</a></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-Builder-for-S3Builder" class="impl"><a class="srclink rightside" href="../../src/opendal/services/s3/backend.rs.html#634-846">source</a><a href="#impl-Builder-for-S3Builder" class="anchor">§</a><h3 clas [...]
+</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-Builder-for-S3Builder" class="impl"><a class="srclink rightside" href="../../src/opendal/services/s3/backend.rs.html#636-848">source</a><a href="#impl-Builder-for-S3Builder" class="anchor">§</a><h3 clas [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.71.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.71.0/src/core/any.rs.html#201">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.71.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.71.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.71.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.71.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/struct.BlockingOperator.html b/docs/rust/opendal/struct.BlockingOperator.html
index 3d66dde15..7860219c8 100644
--- a/docs/rust/opendal/struct.BlockingOperator.html
+++ b/docs/rust/opendal/struct.BlockingOperator.html
@@ -28,7 +28,7 @@
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>opendal::BlockingOperator;
 
 <span class="kw">let </span>info = op.info();</code></pre></div>
-</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingOperator-1" class="impl"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#116-917">source</a><a href="#impl-BlockingOperator-1" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.BlockingOperator.html" title="struct opendal::BlockingOperator">BlockingOperator</a></h3></section></summary><div class="docbl [...]
+</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingOperator-1" class="impl"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#116-918">source</a><a href="#impl-BlockingOperator-1" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.BlockingOperator.html" title="struct opendal::BlockingOperator">BlockingOperator</a></h3></section></summary><div class="docbl [...]
 <h5 id="notes"><a href="#notes">Notes</a></h5>
 <p>Use <code>stat</code> if you:</p>
 <ul>
@@ -202,7 +202,7 @@ w.close()<span class="question-mark">?</span>;</code></pre></div>
 </ul>
 <h5 id="examples-14"><a href="#examples-14">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>op.delete(<span class="string">&quot;path/to/file&quot;</span>)<span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.delete_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#700-713">source</a><h4 class="code-header">pub fn <a href="#method.delete_with" class="fn">delete_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_functions/struct.Functio [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.delete_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#701-714">source</a><h4 class="code-header">pub fn <a href="#method.delete_with" class="fn">delete_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_functions/struct.Functio [...]
 <h5 id="notes-9"><a href="#notes-9">Notes</a></h5>
 <ul>
 <li>Delete not existing error won’t return errors.</li>
@@ -210,24 +210,25 @@ w.close()<span class="question-mark">?</span>;</code></pre></div>
 <h5 id="examples-15"><a href="#examples-15">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">let _ </span>= op
     .delete_with(<span class="string">&quot;path/to/file&quot;</span>)
-    .version(<span class="string">&quot;example_version&quot;</span>).call()<span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.remove_via" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#735-740">source</a><h4 class="code-header">pub fn <a href="#method.remove_via" class="fn">remove_via</a>(&amp;self, input: impl <a class="trait" href="https://doc.rust-lang.org/1.71.0/core/iter/traits/iterator/trait.Iterator.html" title="trait core::iter::traits::iterator::Iterator">It [...]
+    .version(<span class="string">&quot;example_version&quot;</span>)
+    .call()<span class="question-mark">?</span>;</code></pre></div>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.remove_via" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#736-741">source</a><h4 class="code-header">pub fn <a href="#method.remove_via" class="fn">remove_via</a>(&amp;self, input: impl <a class="trait" href="https://doc.rust-lang.org/1.71.0/core/iter/traits/iterator/trait.Iterator.html" title="trait core::iter::traits::iterator::Iterator">It [...]
 <p>remove_via will remove files via the given vector iterators.</p>
 <h5 id="notes-10"><a href="#notes-10">Notes</a></h5>
 <p>We don’t support batch delete now.</p>
 <h5 id="examples-16"><a href="#examples-16">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">let </span>stream = <span class="macro">vec!</span>[<span class="string">&quot;abc&quot;</span>.to_string(), <span class="string">&quot;def&quot;</span>.to_string()].into_iter();
 op.remove_via(stream)<span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.remove" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#757-761">source</a><h4 class="code-header">pub fn <a href="#method.remove" class="fn">remove</a>(&amp;self, paths: <a class="struct" href="https://doc.rust-lang.org/1.71.0/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" href="https://doc.rust-lang.org [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.remove" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#758-762">source</a><h4 class="code-header">pub fn <a href="#method.remove" class="fn">remove</a>(&amp;self, paths: <a class="struct" href="https://doc.rust-lang.org/1.71.0/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" href="https://doc.rust-lang.org [...]
 <p>We don’t support batch delete now.</p>
 <h5 id="examples-17"><a href="#examples-17">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>op.remove(<span class="macro">vec!</span>[<span class="string">&quot;abc&quot;</span>.to_string(), <span class="string">&quot;def&quot;</span>.to_string()])<span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.remove_all" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#780-809">source</a><h4 class="code-header">pub fn <a href="#method.remove_all" class="fn">remove_all</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal: [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.remove_all" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#781-810">source</a><h4 class="code-header">pub fn <a href="#method.remove_all" class="fn">remove_all</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal: [...]
 <h5 id="notes-12"><a href="#notes-12">Notes</a></h5>
 <p>We don’t support batch delete now.</p>
 <h5 id="examples-18"><a href="#examples-18">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>op.remove_all(<span class="string">&quot;path/to/dir&quot;</span>)<span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.list" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#844-859">source</a><h4 class="code-header">pub fn <a href="#method.list" class="fn">list</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.list" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#845-860">source</a><h4 class="code-header">pub fn <a href="#method.list" class="fn">list</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a [...]
 <p>This function will create a new handle to list entries.</p>
 <p>An error will be returned if path doesn’t end with <code>/</code>.</p>
 <h5 id="examples-19"><a href="#examples-19">Examples</a></h5>
@@ -247,7 +248,7 @@ op.remove_via(stream)<span class="question-mark">?</span>;</code></pre></div>
         EntryMode::Unknown =&gt; <span class="kw">continue</span>,
     }
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.scan" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#899-916">source</a><h4 class="code-header">pub fn <a href="#method.scan" class="fn">scan</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.scan" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/blocking_operator.rs.html#900-917">source</a><h4 class="code-header">pub fn <a href="#method.scan" class="fn">scan</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a [...]
 <p>Also, this function can be used to list a prefix.</p>
 <p>An error will be returned if given path doesn’t end with <code>/</code>.</p>
 <h5 id="notes-13"><a href="#notes-13">Notes</a></h5>
diff --git a/docs/rust/opendal/struct.BlockingWriter.html b/docs/rust/opendal/struct.BlockingWriter.html
index 521c967a8..61abf50fa 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#382-405">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#402-404">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.71.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#407-419">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#379-402">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#399-401">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.71.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#404-416">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.71.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.71.0/src/std/io/mod.rs.html#1494">source</a></span><a href="#method.write_vecto [...]
 implementation. <a href="https://doc.rust-lang.org/1.71.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.71.0/src/std/io/mod.rs.html#1571">source</a></span><a href="#method.write_all" class="anchor"> [...]
 encountered. <a href="https://doc.rust-lang.org/1.71.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.71.0/src/std/io/mod.rs.html#1748-1750">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 6c87d3dc8..cd491a675 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-225">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-222">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#126-142">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.71.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.71.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.71.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> + <a class="trait" href="https://doc.rust-lang.org/1.71.0/core/marker/trait.Unpin.html" title="trait core::marker::Un [...]
     T: <a class="trait" href="https://doc.rust-lang.org/1.71.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,7 +45,7 @@ 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#177-190">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.71.0/std/primitive.u64.html">u64</a>, read_from: R) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">R [...]
+</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#174-187">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.71.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.71.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.71.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> + <a class="trait" href="https://doc.rust-lang.org/1.71.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>
 <p>copy will read data from given reader and write them into writer
 directly with only one constant in-memory buffer.</p>
@@ -58,46 +58,43 @@ directly with only one constant in-memory buffer.</p>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>std::io::Result;
 
 <span class="kw">use </span>bytes::Bytes;
+<span class="kw">use </span>futures::io::Cursor;
 <span class="kw">use </span>futures::stream;
 <span class="kw">use </span>futures::StreamExt;
 <span class="kw">use </span>opendal::Operator;
-<span class="kw">use </span>futures::io::Cursor;
 
 <span class="attr">#[tokio::main]
 </span><span class="kw">async fn </span>copy_example(op: Operator) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-    <span class="kw">let </span><span class="kw-2">mut </span>w = op
-        .writer_with(<span class="string">&quot;path/to/file&quot;</span>)
-        .content_length(<span class="number">4096</span>)
-        .<span class="kw">await</span><span class="question-mark">?</span>;
-    <span class="kw">let </span>reader = Cursor::new(<span class="macro">vec!</span>[<span class="number">0</span>;<span class="number">4096</span>]);
+    <span class="kw">let </span><span class="kw-2">mut </span>w = op.writer_with(<span class="string">&quot;path/to/file&quot;</span>).content_length(<span class="number">4096</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+    <span class="kw">let </span>reader = Cursor::new(<span class="macro">vec!</span>[<span class="number">0</span>; <span class="number">4096</span>]);
     w.copy(<span class="number">4096</span>, reader).<span class="kw">await</span><span class="question-mark">?</span>;
     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#198-207">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.71.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#195-204">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.71.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#215-224">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.71.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#212-221">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.71.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#243-308">source</a><a href="#impl-AsyncWrite-for-Writer" class="anchor">§</a><h3 class="code-he [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.poll_write" class="method trait-impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#244-275">source</a><a href="#method.poll_write" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_write</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-AsyncWrite-for-Writer" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#240-305">source</a><a href="#impl-AsyncWrite-for-Writer" class="anchor">§</a><h3 class="code-he [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.poll_write" class="method trait-impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#241-272">source</a><a href="#method.poll_write" 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.71.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.71.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.71.0/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.71.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.71.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.71.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.71.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.71.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.71.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.71.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.71.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.71.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.71.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.71.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.usize.html">usize</a>, <a class="struct" href="https://doc.rust-lang.org/1.71.0/std/io/error/struct.Error.html" title="struct std::io::error::E [...]
-IO operations. <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#310-374">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= [...]
+IO operations. <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#307-371">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= [...]
     self: <a class="struct" href="https://doc.rust-lang.org/1.71.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.71.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.71.0/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.71.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.71.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.71.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#348-373">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.71.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>& [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.71.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.71.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.71.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#345-370">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.71.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-1" class="method trait-impl"><a href="#method.poll_write_vectored-1" 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.71.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.71.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.71.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
diff --git a/docs/rust/opendal/trait.Builder.html b/docs/rust/opendal/trait.Builder.html
index 02ba6e4df..94d8dcea3 100644
--- a/docs/rust/opendal/trait.Builder.html
+++ b/docs/rust/opendal/trait.Builder.html
@@ -22,4 +22,4 @@ We also promise that every public API will provide detailed documentation.</p>
 </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.from_map" class="method"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#45">source</a><h4 class="code-header">fn <a href="#tymethod.from_map" class="fn">from_map</a>(map: <a class="struct" href="https://doc.rust-lang.org/1.71. [...]
 </div></details><details class="toggle method-toggle" open><summary><section id="tymethod.build" class="method"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#48">source</a><h4 class="code-header">fn <a href="#tymethod.build" class="fn">build</a>(&amp;mut self) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;Self::<a class="associatedtype" href="trait.Builder.html#associatedtype.Accessor" title="type opendal::Builder::Acce [...]
 </div></details></div><h2 id="foreign-impls" class="small-section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-Builder-for-()" class="impl"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#52-62">source</a><a href="#impl-Builder-for-()" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.Builder.html" title="trait opendal::Bu [...]
-</div><div class="impl-items"><section id="associatedconstant.SCHEME-1" class="associatedconstant trait-impl"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#53">source</a><a href="#associatedconstant.SCHEME-1" class="anchor">§</a><h4 class="code-header">const <a href="#associatedconstant.SCHEME" class="constant">SCHEME</a>: <a class="enum" href="enum.Scheme.html" title="enum opendal::Scheme">Scheme</a> = _</h4></section><section id="associatedtype.Accessor-1" cla [...]
\ No newline at end of file
+</div><div class="impl-items"><section id="associatedconstant.SCHEME-1" class="associatedconstant trait-impl"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#53">source</a><a href="#associatedconstant.SCHEME-1" class="anchor">§</a><h4 class="code-header">const <a href="#associatedconstant.SCHEME" class="constant">SCHEME</a>: <a class="enum" href="enum.Scheme.html" title="enum opendal::Scheme">Scheme</a> = _</h4></section><section id="associatedtype.Accessor-1" cla [...]
\ No newline at end of file
diff --git a/docs/rust/search-index.js b/docs/rust/search-index.js
index c6390036c..6da6dfa41 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":"QNDNNDDDDINNDNNNNNNNNNNNNNNNDEDENNNNNNNNNNNNNNNDNNDENNNNNNNDDDNNNNDNNGNNSENNNNNNNNNNNDLLLMLMMMLLMMMLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLMLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLL [...]
+"opendal":{"doc":"OpenDAL is the Open Data Access Layer to <strong>freely</strong> access …","t":"QNDNNDDDDINNDNNNNNNNNNNNNNNNDEDENNNNNNNNNNNNNNNDNNDENNNNNNNDDDNNNNDNNGNNSENNNNNNNNNNNDLLLMLMMMLLMMMLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLMLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLL [...]
 }');
 if (typeof window !== 'undefined' && window.initSearch) {window.initSearch(searchIndex)};
 if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
diff --git a/docs/rust/src/opendal/layers/mod.rs.html b/docs/rust/src/opendal/layers/mod.rs.html
index 5dfd1403b..5c9e4a28a 100644
--- a/docs/rust/src/opendal/layers/mod.rs.html
+++ b/docs/rust/src/opendal/layers/mod.rs.html
@@ -83,6 +83,7 @@
 <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>
 </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
@@ -130,6 +131,7 @@
 </span><span class="kw">pub use </span><span class="self">self</span>::prometheus::PrometheusLayer;
 
 <span class="kw">mod </span>retry;
+<span class="kw">pub use </span><span class="self">self</span>::retry::RetryInterceptor;
 <span class="kw">pub use </span><span class="self">self</span>::retry::RetryLayer;
 
 <span class="attr">#[cfg(feature = <span class="string">&quot;layers-tracing&quot;</span>)]
diff --git a/docs/rust/src/opendal/layers/retry.rs.html b/docs/rust/src/opendal/layers/retry.rs.html
index d19bf3ff8..40f7922cb 100644
--- a/docs/rust/src/opendal/layers/retry.rs.html
+++ b/docs/rust/src/opendal/layers/retry.rs.html
@@ -1115,6 +1115,283 @@
 <a href="#1115" id="1115">1115</a>
 <a href="#1116" id="1116">1116</a>
 <a href="#1117" id="1117">1117</a>
+<a href="#1118" id="1118">1118</a>
+<a href="#1119" id="1119">1119</a>
+<a href="#1120" id="1120">1120</a>
+<a href="#1121" id="1121">1121</a>
+<a href="#1122" id="1122">1122</a>
+<a href="#1123" id="1123">1123</a>
+<a href="#1124" id="1124">1124</a>
+<a href="#1125" id="1125">1125</a>
+<a href="#1126" id="1126">1126</a>
+<a href="#1127" id="1127">1127</a>
+<a href="#1128" id="1128">1128</a>
+<a href="#1129" id="1129">1129</a>
+<a href="#1130" id="1130">1130</a>
+<a href="#1131" id="1131">1131</a>
+<a href="#1132" id="1132">1132</a>
+<a href="#1133" id="1133">1133</a>
+<a href="#1134" id="1134">1134</a>
+<a href="#1135" id="1135">1135</a>
+<a href="#1136" id="1136">1136</a>
+<a href="#1137" id="1137">1137</a>
+<a href="#1138" id="1138">1138</a>
+<a href="#1139" id="1139">1139</a>
+<a href="#1140" id="1140">1140</a>
+<a href="#1141" id="1141">1141</a>
+<a href="#1142" id="1142">1142</a>
+<a href="#1143" id="1143">1143</a>
+<a href="#1144" id="1144">1144</a>
+<a href="#1145" id="1145">1145</a>
+<a href="#1146" id="1146">1146</a>
+<a href="#1147" id="1147">1147</a>
+<a href="#1148" id="1148">1148</a>
+<a href="#1149" id="1149">1149</a>
+<a href="#1150" id="1150">1150</a>
+<a href="#1151" id="1151">1151</a>
+<a href="#1152" id="1152">1152</a>
+<a href="#1153" id="1153">1153</a>
+<a href="#1154" id="1154">1154</a>
+<a href="#1155" id="1155">1155</a>
+<a href="#1156" id="1156">1156</a>
+<a href="#1157" id="1157">1157</a>
+<a href="#1158" id="1158">1158</a>
+<a href="#1159" id="1159">1159</a>
+<a href="#1160" id="1160">1160</a>
+<a href="#1161" id="1161">1161</a>
+<a href="#1162" id="1162">1162</a>
+<a href="#1163" id="1163">1163</a>
+<a href="#1164" id="1164">1164</a>
+<a href="#1165" id="1165">1165</a>
+<a href="#1166" id="1166">1166</a>
+<a href="#1167" id="1167">1167</a>
+<a href="#1168" id="1168">1168</a>
+<a href="#1169" id="1169">1169</a>
+<a href="#1170" id="1170">1170</a>
+<a href="#1171" id="1171">1171</a>
+<a href="#1172" id="1172">1172</a>
+<a href="#1173" id="1173">1173</a>
+<a href="#1174" id="1174">1174</a>
+<a href="#1175" id="1175">1175</a>
+<a href="#1176" id="1176">1176</a>
+<a href="#1177" id="1177">1177</a>
+<a href="#1178" id="1178">1178</a>
+<a href="#1179" id="1179">1179</a>
+<a href="#1180" id="1180">1180</a>
+<a href="#1181" id="1181">1181</a>
+<a href="#1182" id="1182">1182</a>
+<a href="#1183" id="1183">1183</a>
+<a href="#1184" id="1184">1184</a>
+<a href="#1185" id="1185">1185</a>
+<a href="#1186" id="1186">1186</a>
+<a href="#1187" id="1187">1187</a>
+<a href="#1188" id="1188">1188</a>
+<a href="#1189" id="1189">1189</a>
+<a href="#1190" id="1190">1190</a>
+<a href="#1191" id="1191">1191</a>
+<a href="#1192" id="1192">1192</a>
+<a href="#1193" id="1193">1193</a>
+<a href="#1194" id="1194">1194</a>
+<a href="#1195" id="1195">1195</a>
+<a href="#1196" id="1196">1196</a>
+<a href="#1197" id="1197">1197</a>
+<a href="#1198" id="1198">1198</a>
+<a href="#1199" id="1199">1199</a>
+<a href="#1200" id="1200">1200</a>
+<a href="#1201" id="1201">1201</a>
+<a href="#1202" id="1202">1202</a>
+<a href="#1203" id="1203">1203</a>
+<a href="#1204" id="1204">1204</a>
+<a href="#1205" id="1205">1205</a>
+<a href="#1206" id="1206">1206</a>
+<a href="#1207" id="1207">1207</a>
+<a href="#1208" id="1208">1208</a>
+<a href="#1209" id="1209">1209</a>
+<a href="#1210" id="1210">1210</a>
+<a href="#1211" id="1211">1211</a>
+<a href="#1212" id="1212">1212</a>
+<a href="#1213" id="1213">1213</a>
+<a href="#1214" id="1214">1214</a>
+<a href="#1215" id="1215">1215</a>
+<a href="#1216" id="1216">1216</a>
+<a href="#1217" id="1217">1217</a>
+<a href="#1218" id="1218">1218</a>
+<a href="#1219" id="1219">1219</a>
+<a href="#1220" id="1220">1220</a>
+<a href="#1221" id="1221">1221</a>
+<a href="#1222" id="1222">1222</a>
+<a href="#1223" id="1223">1223</a>
+<a href="#1224" id="1224">1224</a>
+<a href="#1225" id="1225">1225</a>
+<a href="#1226" id="1226">1226</a>
+<a href="#1227" id="1227">1227</a>
+<a href="#1228" id="1228">1228</a>
+<a href="#1229" id="1229">1229</a>
+<a href="#1230" id="1230">1230</a>
+<a href="#1231" id="1231">1231</a>
+<a href="#1232" id="1232">1232</a>
+<a href="#1233" id="1233">1233</a>
+<a href="#1234" id="1234">1234</a>
+<a href="#1235" id="1235">1235</a>
+<a href="#1236" id="1236">1236</a>
+<a href="#1237" id="1237">1237</a>
+<a href="#1238" id="1238">1238</a>
+<a href="#1239" id="1239">1239</a>
+<a href="#1240" id="1240">1240</a>
+<a href="#1241" id="1241">1241</a>
+<a href="#1242" id="1242">1242</a>
+<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>
+<a href="#1257" id="1257">1257</a>
+<a href="#1258" id="1258">1258</a>
+<a href="#1259" id="1259">1259</a>
+<a href="#1260" id="1260">1260</a>
+<a href="#1261" id="1261">1261</a>
+<a href="#1262" id="1262">1262</a>
+<a href="#1263" id="1263">1263</a>
+<a href="#1264" id="1264">1264</a>
+<a href="#1265" id="1265">1265</a>
+<a href="#1266" id="1266">1266</a>
+<a href="#1267" id="1267">1267</a>
+<a href="#1268" id="1268">1268</a>
+<a href="#1269" id="1269">1269</a>
+<a href="#1270" id="1270">1270</a>
+<a href="#1271" id="1271">1271</a>
+<a href="#1272" id="1272">1272</a>
+<a href="#1273" id="1273">1273</a>
+<a href="#1274" id="1274">1274</a>
+<a href="#1275" id="1275">1275</a>
+<a href="#1276" id="1276">1276</a>
+<a href="#1277" id="1277">1277</a>
+<a href="#1278" id="1278">1278</a>
+<a href="#1279" id="1279">1279</a>
+<a href="#1280" id="1280">1280</a>
+<a href="#1281" id="1281">1281</a>
+<a href="#1282" id="1282">1282</a>
+<a href="#1283" id="1283">1283</a>
+<a href="#1284" id="1284">1284</a>
+<a href="#1285" id="1285">1285</a>
+<a href="#1286" id="1286">1286</a>
+<a href="#1287" id="1287">1287</a>
+<a href="#1288" id="1288">1288</a>
+<a href="#1289" id="1289">1289</a>
+<a href="#1290" id="1290">1290</a>
+<a href="#1291" id="1291">1291</a>
+<a href="#1292" id="1292">1292</a>
+<a href="#1293" id="1293">1293</a>
+<a href="#1294" id="1294">1294</a>
+<a href="#1295" id="1295">1295</a>
+<a href="#1296" id="1296">1296</a>
+<a href="#1297" id="1297">1297</a>
+<a href="#1298" id="1298">1298</a>
+<a href="#1299" id="1299">1299</a>
+<a href="#1300" id="1300">1300</a>
+<a href="#1301" id="1301">1301</a>
+<a href="#1302" id="1302">1302</a>
+<a href="#1303" id="1303">1303</a>
+<a href="#1304" id="1304">1304</a>
+<a href="#1305" id="1305">1305</a>
+<a href="#1306" id="1306">1306</a>
+<a href="#1307" id="1307">1307</a>
+<a href="#1308" id="1308">1308</a>
+<a href="#1309" id="1309">1309</a>
+<a href="#1310" id="1310">1310</a>
+<a href="#1311" id="1311">1311</a>
+<a href="#1312" id="1312">1312</a>
+<a href="#1313" id="1313">1313</a>
+<a href="#1314" id="1314">1314</a>
+<a href="#1315" id="1315">1315</a>
+<a href="#1316" id="1316">1316</a>
+<a href="#1317" id="1317">1317</a>
+<a href="#1318" id="1318">1318</a>
+<a href="#1319" id="1319">1319</a>
+<a href="#1320" id="1320">1320</a>
+<a href="#1321" id="1321">1321</a>
+<a href="#1322" id="1322">1322</a>
+<a href="#1323" id="1323">1323</a>
+<a href="#1324" id="1324">1324</a>
+<a href="#1325" id="1325">1325</a>
+<a href="#1326" id="1326">1326</a>
+<a href="#1327" id="1327">1327</a>
+<a href="#1328" id="1328">1328</a>
+<a href="#1329" id="1329">1329</a>
+<a href="#1330" id="1330">1330</a>
+<a href="#1331" id="1331">1331</a>
+<a href="#1332" id="1332">1332</a>
+<a href="#1333" id="1333">1333</a>
+<a href="#1334" id="1334">1334</a>
+<a href="#1335" id="1335">1335</a>
+<a href="#1336" id="1336">1336</a>
+<a href="#1337" id="1337">1337</a>
+<a href="#1338" id="1338">1338</a>
+<a href="#1339" id="1339">1339</a>
+<a href="#1340" id="1340">1340</a>
+<a href="#1341" id="1341">1341</a>
+<a href="#1342" id="1342">1342</a>
+<a href="#1343" id="1343">1343</a>
+<a href="#1344" id="1344">1344</a>
+<a href="#1345" id="1345">1345</a>
+<a href="#1346" id="1346">1346</a>
+<a href="#1347" id="1347">1347</a>
+<a href="#1348" id="1348">1348</a>
+<a href="#1349" id="1349">1349</a>
+<a href="#1350" id="1350">1350</a>
+<a href="#1351" id="1351">1351</a>
+<a href="#1352" id="1352">1352</a>
+<a href="#1353" id="1353">1353</a>
+<a href="#1354" id="1354">1354</a>
+<a href="#1355" id="1355">1355</a>
+<a href="#1356" id="1356">1356</a>
+<a href="#1357" id="1357">1357</a>
+<a href="#1358" id="1358">1358</a>
+<a href="#1359" id="1359">1359</a>
+<a href="#1360" id="1360">1360</a>
+<a href="#1361" id="1361">1361</a>
+<a href="#1362" id="1362">1362</a>
+<a href="#1363" id="1363">1363</a>
+<a href="#1364" id="1364">1364</a>
+<a href="#1365" id="1365">1365</a>
+<a href="#1366" id="1366">1366</a>
+<a href="#1367" id="1367">1367</a>
+<a href="#1368" id="1368">1368</a>
+<a href="#1369" id="1369">1369</a>
+<a href="#1370" id="1370">1370</a>
+<a href="#1371" id="1371">1371</a>
+<a href="#1372" id="1372">1372</a>
+<a href="#1373" id="1373">1373</a>
+<a href="#1374" id="1374">1374</a>
+<a href="#1375" id="1375">1375</a>
+<a href="#1376" id="1376">1376</a>
+<a href="#1377" id="1377">1377</a>
+<a href="#1378" id="1378">1378</a>
+<a href="#1379" id="1379">1379</a>
+<a href="#1380" id="1380">1380</a>
+<a href="#1381" id="1381">1381</a>
+<a href="#1382" id="1382">1382</a>
+<a href="#1383" id="1383">1383</a>
+<a href="#1384" id="1384">1384</a>
+<a href="#1385" id="1385">1385</a>
+<a href="#1386" id="1386">1386</a>
+<a href="#1387" id="1387">1387</a>
+<a href="#1388" id="1388">1388</a>
+<a href="#1389" id="1389">1389</a>
+<a href="#1390" id="1390">1390</a>
+<a href="#1391" id="1391">1391</a>
+<a href="#1392" id="1392">1392</a>
+<a href="#1393" id="1393">1393</a>
+<a href="#1394" id="1394">1394</a>
 </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
@@ -1136,6 +1413,7 @@
 <span class="kw">use </span>std::fmt::Formatter;
 <span class="kw">use </span>std::io;
 <span class="kw">use </span>std::pin::Pin;
+<span class="kw">use </span>std::sync::Arc;
 <span class="kw">use </span>std::task::ready;
 <span class="kw">use </span>std::task::Context;
 <span class="kw">use </span>std::task::Poll;
@@ -1182,8 +1460,58 @@
 ///     .layer(RetryLayer::new())
 ///     .finish();
 /// ```
-</span><span class="attr">#[derive(Default, Clone)]
-</span><span class="kw">pub struct </span>RetryLayer(ExponentialBuilder);
+///
+/// ## Customize retry interceptor
+///
+/// RetryLayer accepts [`RetryInterceptor`] to allow users to customize
+/// their own retry interceptor logic.
+///
+/// ```
+/// use std::time::Duration;
+///
+/// use anyhow::Result;
+/// use opendal::layers::RetryInterceptor;
+/// use opendal::layers::RetryLayer;
+/// use opendal::services;
+/// use opendal::Error;
+/// use opendal::Operator;
+/// use opendal::Scheme;
+///
+/// struct MyRetryInterceptor;
+///
+/// impl RetryInterceptor for MyRetryInterceptor {
+///     fn intercept(&amp;self, err: &amp;Error, dur: Duration, ctx: &amp;[(&amp;str, &amp;str)]) {
+///         // do something
+///     }
+/// }
+///
+/// let _ = Operator::new(services::Memory::default())
+///     .expect(&quot;must init&quot;)
+///     .layer(RetryLayer::new().with_notify(MyRetryInterceptor))
+///     .finish();
+/// ```
+</span><span class="kw">pub struct </span>RetryLayer&lt;I = DefaultRetryInterceptor&gt; {
+    builder: ExponentialBuilder,
+    notify: Arc&lt;I&gt;,
+}
+
+<span class="kw">impl</span>&lt;I&gt; Clone <span class="kw">for </span>RetryLayer&lt;I&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>{
+            builder: <span class="self">self</span>.builder.clone(),
+            notify: <span class="self">self</span>.notify.clone(),
+        }
+    }
+}
+
+<span class="kw">impl </span>Default <span class="kw">for </span>RetryLayer {
+    <span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
+        <span class="self">Self </span>{
+            builder: ExponentialBuilder::default(),
+            notify: Arc::new(DefaultRetryInterceptor),
+        }
+    }
+}
 
 <span class="kw">impl </span>RetryLayer {
     <span class="doccomment">/// Create a new retry layer.
@@ -1204,12 +1532,45 @@
         <span class="self">Self</span>::default()
     }
 
+    <span class="doccomment">/// Set the retry interceptor as new notify.
+    ///
+    /// ```
+    /// use std::time::Duration;
+    ///
+    /// use anyhow::Result;
+    /// use opendal::layers::RetryInterceptor;
+    /// use opendal::layers::RetryLayer;
+    /// use opendal::services;
+    /// use opendal::Error;
+    /// use opendal::Operator;
+    /// use opendal::Scheme;
+    ///
+    /// struct MyRetryInterceptor;
+    ///
+    /// impl RetryInterceptor for MyRetryInterceptor {
+    ///     fn intercept(&amp;self, err: &amp;Error, dur: Duration, ctx: &amp;[(&amp;str, &amp;str)]) {
+    ///         // do something
+    ///     }
+    /// }
+    ///
+    /// let _ = Operator::new(services::Memory::default())
+    ///     .expect(&quot;must init&quot;)
+    ///     .layer(RetryLayer::new().with_notify(MyRetryInterceptor))
+    ///     .finish();
+    /// ```
+    </span><span class="kw">pub fn </span>with_notify&lt;I: RetryInterceptor&gt;(<span class="self">self</span>, notify: I) -&gt; RetryLayer&lt;I&gt; {
+        RetryLayer {
+            builder: <span class="self">self</span>.builder,
+            notify: Arc::new(notify),
+        }
+    }
+
     <span class="doccomment">/// Set jitter of current backoff.
     ///
     /// If jitter is enabled, ExponentialBackoff will add a random jitter in `[0, min_delay)
     /// to current delay.
     </span><span class="kw">pub fn </span>with_jitter(<span class="kw-2">mut </span><span class="self">self</span>) -&gt; <span class="self">Self </span>{
-        <span class="self">self</span>.<span class="number">0 </span>= <span class="self">self</span>.<span class="number">0</span>.with_jitter();
+        <span class="self">self</span>.builder = <span class="self">self</span>.builder.with_jitter();
         <span class="self">self
     </span>}
 
@@ -1219,13 +1580,13 @@
     ///
     /// This function will panic if input factor smaller than `1.0`.
     </span><span class="kw">pub fn </span>with_factor(<span class="kw-2">mut </span><span class="self">self</span>, factor: f32) -&gt; <span class="self">Self </span>{
-        <span class="self">self</span>.<span class="number">0 </span>= <span class="self">self</span>.<span class="number">0</span>.with_factor(factor);
+        <span class="self">self</span>.builder = <span class="self">self</span>.builder.with_factor(factor);
         <span class="self">self
     </span>}
 
     <span class="doccomment">/// Set min_delay of current backoff.
     </span><span class="kw">pub fn </span>with_min_delay(<span class="kw-2">mut </span><span class="self">self</span>, min_delay: Duration) -&gt; <span class="self">Self </span>{
-        <span class="self">self</span>.<span class="number">0 </span>= <span class="self">self</span>.<span class="number">0</span>.with_min_delay(min_delay);
+        <span class="self">self</span>.builder = <span class="self">self</span>.builder.with_min_delay(min_delay);
         <span class="self">self
     </span>}
 
@@ -1233,7 +1594,7 @@
     ///
     /// Delay will not increasing if current delay is larger than max_delay.
     </span><span class="kw">pub fn </span>with_max_delay(<span class="kw-2">mut </span><span class="self">self</span>, max_delay: Duration) -&gt; <span class="self">Self </span>{
-        <span class="self">self</span>.<span class="number">0 </span>= <span class="self">self</span>.<span class="number">0</span>.with_max_delay(max_delay);
+        <span class="self">self</span>.builder = <span class="self">self</span>.builder.with_max_delay(max_delay);
         <span class="self">self
     </span>}
 
@@ -1241,29 +1602,69 @@
     ///
     /// Backoff will return `None` if max times is reaching.
     </span><span class="kw">pub fn </span>with_max_times(<span class="kw-2">mut </span><span class="self">self</span>, max_times: usize) -&gt; <span class="self">Self </span>{
-        <span class="self">self</span>.<span class="number">0 </span>= <span class="self">self</span>.<span class="number">0</span>.with_max_times(max_times);
+        <span class="self">self</span>.builder = <span class="self">self</span>.builder.with_max_times(max_times);
         <span class="self">self
     </span>}
 }
 
-<span class="kw">impl</span>&lt;A: Accessor&gt; Layer&lt;A&gt; <span class="kw">for </span>RetryLayer {
-    <span class="kw">type </span>LayeredAccessor = RetryAccessor&lt;A&gt;;
+<span class="kw">impl</span>&lt;A: Accessor, I: RetryInterceptor&gt; Layer&lt;A&gt; <span class="kw">for </span>RetryLayer&lt;I&gt; {
+    <span class="kw">type </span>LayeredAccessor = RetryAccessor&lt;A, I&gt;;
 
     <span class="kw">fn </span>layer(<span class="kw-2">&amp;</span><span class="self">self</span>, inner: A) -&gt; <span class="self">Self</span>::LayeredAccessor {
         RetryAccessor {
             inner,
-            builder: <span class="self">self</span>.<span class="number">0</span>.clone(),
+            builder: <span class="self">self</span>.builder.clone(),
+            notify: <span class="self">self</span>.notify.clone(),
         }
     }
 }
 
-<span class="attr">#[derive(Clone)]
-</span><span class="kw">pub struct </span>RetryAccessor&lt;A: Accessor&gt; {
+<span class="doccomment">/// RetryInterceptor is used to intercept while retry happened.
+</span><span class="kw">pub trait </span>RetryInterceptor: Send + Sync + <span class="lifetime">&#39;static </span>{
+    <span class="doccomment">/// Everytime RetryLayer is retrying, this function will be called.
+    ///
+    /// # Timing
+    ///
+    /// just before the retry sleep.
+    ///
+    /// # Inputs
+    ///
+    /// - err: The error that caused the current retry.
+    /// - dur: The duration that will sleep before next retry.
+    /// - ctx: The context (`name`, `value`) of current operation, like `operation` and `path`.
+    ///
+    /// # Notes
+    ///
+    /// The intercept must be quick and non-blocking. No heavy IO is
+    /// allowed. Otherwise the retry will be blocked.
+    </span><span class="kw">fn </span>intercept(<span class="kw-2">&amp;</span><span class="self">self</span>, err: <span class="kw-2">&amp;</span>Error, dur: Duration, ctx: <span class="kw-2">&amp;</span>[(<span class="kw-2">&amp;</span>str, <span class="kw-2">&amp;</span>str)]);
+}
+
+<span class="doccomment">/// The DefaultRetryInterceptor will log the retry error in warning level.
+</span><span class="kw">pub struct </span>DefaultRetryInterceptor;
+
+<span class="kw">impl </span>RetryInterceptor <span class="kw">for </span>DefaultRetryInterceptor {
+    <span class="kw">fn </span>intercept(<span class="kw-2">&amp;</span><span class="self">self</span>, err: <span class="kw-2">&amp;</span>Error, dur: Duration, ctx: <span class="kw-2">&amp;</span>[(<span class="kw-2">&amp;</span>str, <span class="kw-2">&amp;</span>str)]) {
+        <span class="kw">let </span>context = ctx
+            .iter()
+            .map(|(k, v)| <span class="macro">format!</span>(<span class="string">&quot;{}={}&quot;</span>, k, v))
+            .collect::&lt;Vec&lt;<span class="kw">_</span>&gt;&gt;()
+            .join(<span class="string">&quot; &quot;</span>);
+
+        <span class="macro">warn!</span>(
+            target: <span class="string">&quot;opendal::service&quot;</span>,
+            <span class="string">&quot;{} -&gt; retry after {}s: error={:?}&quot;</span>,
+            context, dur.as_secs_f64(), err)
+    }
+}
+
+<span class="kw">pub struct </span>RetryAccessor&lt;A: Accessor, I: RetryInterceptor&gt; {
     inner: A,
     builder: ExponentialBuilder,
+    notify: Arc&lt;I&gt;,
 }
 
-<span class="kw">impl</span>&lt;A: Accessor&gt; Debug <span class="kw">for </span>RetryAccessor&lt;A&gt; {
+<span class="kw">impl</span>&lt;A: Accessor, I: RetryInterceptor&gt; Debug <span class="kw">for </span>RetryAccessor&lt;A, I&gt; {
     <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>Formatter&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; std::fmt::Result {
         f.debug_struct(<span class="string">&quot;RetryAccessor&quot;</span>)
             .field(<span class="string">&quot;inner&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.inner)
@@ -1272,15 +1673,15 @@
 }
 
 <span class="attr">#[async_trait]
-</span><span class="kw">impl</span>&lt;A: Accessor&gt; LayeredAccessor <span class="kw">for </span>RetryAccessor&lt;A&gt; {
+</span><span class="kw">impl</span>&lt;A: Accessor, I: RetryInterceptor&gt; LayeredAccessor <span class="kw">for </span>RetryAccessor&lt;A, I&gt; {
     <span class="kw">type </span>Inner = A;
-    <span class="kw">type </span>Reader = RetryWrapper&lt;A::Reader&gt;;
-    <span class="kw">type </span>BlockingReader = RetryWrapper&lt;A::BlockingReader&gt;;
-    <span class="kw">type </span>Writer = RetryWrapper&lt;A::Writer&gt;;
-    <span class="kw">type </span>BlockingWriter = RetryWrapper&lt;A::BlockingWriter&gt;;
-    <span class="kw">type </span>Appender = RetryWrapper&lt;A::Appender&gt;;
-    <span class="kw">type </span>Pager = RetryWrapper&lt;A::Pager&gt;;
-    <span class="kw">type </span>BlockingPager = RetryWrapper&lt;A::BlockingPager&gt;;
+    <span class="kw">type </span>Reader = RetryWrapper&lt;A::Reader, I&gt;;
+    <span class="kw">type </span>BlockingReader = RetryWrapper&lt;A::BlockingReader, I&gt;;
+    <span class="kw">type </span>Writer = RetryWrapper&lt;A::Writer, I&gt;;
+    <span class="kw">type </span>BlockingWriter = RetryWrapper&lt;A::BlockingWriter, I&gt;;
+    <span class="kw">type </span>Appender = RetryWrapper&lt;A::Appender, I&gt;;
+    <span class="kw">type </span>Pager = RetryWrapper&lt;A::Pager, I&gt;;
+    <span class="kw">type </span>BlockingPager = RetryWrapper&lt;A::BlockingPager, I&gt;;
 
     <span class="kw">fn </span>inner(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span><span class="self">Self</span>::Inner {
         <span class="kw-2">&amp;</span><span class="self">self</span>.inner
@@ -1290,11 +1691,15 @@
         { || <span class="self">self</span>.inner.create_dir(path, args.clone()) }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
-            .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::CreateDir, dur.as_secs_f64(), err)
+            .notify(|err, dur: Duration| {
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, Operation::CreateDir.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, path),
+                    ],
+                )
             })
             .map(|v| v.map_err(|e| e.set_persistent()))
             .<span class="kw">await
@@ -1305,14 +1710,20 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::Read, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[(<span class="string">&quot;operation&quot;</span>, Operation::Read.into_static()), (<span class="string">&quot;path&quot;</span>, path)],
+                )
             })
             .map(|v| {
-                v.map(|(rp, r)| (rp, RetryWrapper::new(r, path, <span class="self">self</span>.builder.clone())))
-                    .map_err(|e| e.set_persistent())
+                v.map(|(rp, r)| {
+                    (
+                        rp,
+                        RetryWrapper::new(r, <span class="self">self</span>.notify.clone(), path, <span class="self">self</span>.builder.clone()),
+                    )
+                })
+                .map_err(|e| e.set_persistent())
             })
             .<span class="kw">await
     </span>}
@@ -1325,14 +1736,23 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::Write, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, Operation::Write.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, path),
+                    ],
+                )
             })
             .map(|v| {
-                v.map(|(rp, r)| (rp, RetryWrapper::new(r, path, <span class="self">self</span>.builder.clone())))
-                    .map_err(|e| e.set_persistent())
+                v.map(|(rp, r)| {
+                    (
+                        rp,
+                        RetryWrapper::new(r, <span class="self">self</span>.notify.clone(), path, <span class="self">self</span>.builder.clone()),
+                    )
+                })
+                .map_err(|e| e.set_persistent())
             })
             .<span class="kw">await
     </span>}
@@ -1342,14 +1762,23 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::Append, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, Operation::Append.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, path),
+                    ],
+                )
             })
             .map(|v| {
-                v.map(|(rp, r)| (rp, RetryWrapper::new(r, path, <span class="self">self</span>.builder.clone())))
-                    .map_err(|e| e.set_persistent())
+                v.map(|(rp, r)| {
+                    (
+                        rp,
+                        RetryWrapper::new(r, <span class="self">self</span>.notify.clone(), path, <span class="self">self</span>.builder.clone()),
+                    )
+                })
+                .map_err(|e| e.set_persistent())
             })
             .<span class="kw">await
     </span>}
@@ -1359,10 +1788,11 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::Stat, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[(<span class="string">&quot;operation&quot;</span>, Operation::Stat.into_static()), (<span class="string">&quot;path&quot;</span>, path)],
+                )
             })
             .map(|v| v.map_err(|e| e.set_persistent()))
             .<span class="kw">await
@@ -1373,10 +1803,14 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::Delete, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, Operation::Delete.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, path),
+                    ],
+                )
             })
             .map(|v| v.map_err(|e| e.set_persistent()))
             .<span class="kw">await
@@ -1387,10 +1821,15 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::Copy, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, Operation::Copy.into_static()),
+                        (<span class="string">&quot;from&quot;</span>, from),
+                        (<span class="string">&quot;to&quot;</span>, to),
+                    ],
+                )
             })
             .map(|v| v.map_err(|e| e.set_persistent()))
             .<span class="kw">await
@@ -1401,10 +1840,15 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::Rename, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, Operation::Rename.into_static()),
+                        (<span class="string">&quot;from&quot;</span>, from),
+                        (<span class="string">&quot;to&quot;</span>, to),
+                    ],
+                )
             })
             .map(|v| v.map_err(|e| e.set_persistent()))
             .<span class="kw">await
@@ -1415,14 +1859,16 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::List, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[(<span class="string">&quot;operation&quot;</span>, Operation::List.into_static()), (<span class="string">&quot;path&quot;</span>, path)],
+                )
             })
             .map(|v| {
                 v.map(|(l, p)| {
-                    <span class="kw">let </span>pager = RetryWrapper::new(p, path, <span class="self">self</span>.builder.clone());
+                    <span class="kw">let </span>pager =
+                        RetryWrapper::new(p, <span class="self">self</span>.notify.clone(), path, <span class="self">self</span>.builder.clone());
                     (l, pager)
                 })
                 .map_err(|e| e.set_persistent())
@@ -1445,10 +1891,14 @@
         .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
         .when(|e: <span class="kw-2">&amp;</span>Error| e.is_temporary())
         .notify(|err, dur| {
-            <span class="macro">warn!</span>(
-                target: <span class="string">&quot;opendal::service&quot;</span>,
-                <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                Operation::Batch, dur.as_secs_f64(), err)
+            <span class="self">self</span>.notify.intercept(
+                err,
+                dur,
+                <span class="kw-2">&amp;</span>[
+                    (<span class="string">&quot;operation&quot;</span>, Operation::Batch.into_static()),
+                    (<span class="string">&quot;count&quot;</span>, <span class="kw-2">&amp;</span>args.operation().len().to_string()),
+                ],
+            )
         })
         .<span class="kw">await
         </span>.map_err(|e| e.set_persistent())
@@ -1459,10 +1909,14 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::BlockingCreateDir, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, Operation::BlockingCreateDir.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, path),
+                    ],
+                )
             })
             .call()
             .map_err(|e| e.set_persistent())
@@ -1473,13 +1927,22 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::BlockingRead, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, Operation::BlockingRead.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, path),
+                    ],
+                )
             })
             .call()
-            .map(|(rp, r)| (rp, RetryWrapper::new(r, path, <span class="self">self</span>.builder.clone())))
+            .map(|(rp, r)| {
+                (
+                    rp,
+                    RetryWrapper::new(r, <span class="self">self</span>.notify.clone(), path, <span class="self">self</span>.builder.clone()),
+                )
+            })
             .map_err(|e| e.set_persistent())
     }
 
@@ -1488,13 +1951,22 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::BlockingWrite, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, Operation::BlockingWrite.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, path),
+                    ],
+                )
             })
             .call()
-            .map(|(rp, r)| (rp, RetryWrapper::new(r, path, <span class="self">self</span>.builder.clone())))
+            .map(|(rp, r)| {
+                (
+                    rp,
+                    RetryWrapper::new(r, <span class="self">self</span>.notify.clone(), path, <span class="self">self</span>.builder.clone()),
+                )
+            })
             .map_err(|e| e.set_persistent())
     }
 
@@ -1503,10 +1975,14 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::BlockingStat, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, Operation::BlockingStat.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, path),
+                    ],
+                )
             })
             .call()
             .map_err(|e| e.set_persistent())
@@ -1517,10 +1993,14 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::BlockingDelete, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, Operation::BlockingDelete.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, path),
+                    ],
+                )
             })
             .call()
             .map_err(|e| e.set_persistent())
@@ -1531,32 +2011,40 @@
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
             .notify(|err, dur| {
-                <span class="macro">warn!</span>(
-                    target: <span class="string">&quot;opendal::service&quot;</span>,
-                    <span class="string">&quot;operation={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                    Operation::BlockingList, dur.as_secs_f64(), err)
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, Operation::BlockingList.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, path),
+                    ],
+                )
             })
             .call()
             .map(|(rp, p)| {
-                <span class="kw">let </span>p = RetryWrapper::new(p, path, <span class="self">self</span>.builder.clone());
+                <span class="kw">let </span>p = RetryWrapper::new(p, <span class="self">self</span>.notify.clone(), path, <span class="self">self</span>.builder.clone());
                 (rp, p)
             })
             .map_err(|e| e.set_persistent())
     }
 }
 
-<span class="kw">pub struct </span>RetryWrapper&lt;R&gt; {
+<span class="kw">pub struct </span>RetryWrapper&lt;R, I&gt; {
     inner: R,
+    notify: Arc&lt;I&gt;,
+
     path: String,
     builder: ExponentialBuilder,
     current_backoff: <span class="prelude-ty">Option</span>&lt;ExponentialBackoff&gt;,
     sleep: <span class="prelude-ty">Option</span>&lt;Pin&lt;Box&lt;tokio::time::Sleep&gt;&gt;&gt;,
 }
 
-<span class="kw">impl</span>&lt;R&gt; RetryWrapper&lt;R&gt; {
-    <span class="kw">fn </span>new(inner: R, path: <span class="kw-2">&amp;</span>str, backoff: ExponentialBuilder) -&gt; <span class="self">Self </span>{
+<span class="kw">impl</span>&lt;R, I&gt; RetryWrapper&lt;R, I&gt; {
+    <span class="kw">fn </span>new(inner: R, notify: Arc&lt;I&gt;, path: <span class="kw-2">&amp;</span>str, backoff: ExponentialBuilder) -&gt; <span class="self">Self </span>{
         <span class="self">Self </span>{
             inner,
+            notify,
+
             path: path.to_string(),
             builder: backoff,
             current_backoff: <span class="prelude-val">None</span>,
@@ -1565,7 +2053,7 @@
     }
 }
 
-<span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>RetryWrapper&lt;R&gt; {
+<span class="kw">impl</span>&lt;R: oio::Read, I: RetryInterceptor&gt; oio::Read <span class="kw">for </span>RetryWrapper&lt;R, I&gt; {
     <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#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 let </span><span class="prelude-val">Some</span>(sleep) = <span class="self">self</span>.sleep.as_mut() {
             <span class="macro">ready!</span>(sleep.poll_unpin(cx));
@@ -1596,10 +2084,14 @@
                         Poll::Ready(<span class="prelude-val">Err</span>(err))
                     }
                     <span class="prelude-val">Some</span>(dur) =&gt; {
-                        <span class="macro">warn!</span>(
-                            target: <span class="string">&quot;opendal::service&quot;</span>,
-                            <span class="string">&quot;operation={} path={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                            ReadOperation::Read, <span class="self">self</span>.path, dur.as_secs_f64(), err);
+                        <span class="self">self</span>.notify.intercept(
+                            <span class="kw-2">&amp;</span>err,
+                            dur,
+                            <span class="kw-2">&amp;</span>[
+                                (<span class="string">&quot;operation&quot;</span>, ReadOperation::Read.into_static()),
+                                (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                            ],
+                        );
                         <span class="self">self</span>.sleep = <span class="prelude-val">Some</span>(Box::pin(tokio::time::sleep(dur)));
                         <span class="self">self</span>.poll_read(cx, buf)
                     }
@@ -1638,10 +2130,14 @@
                         Poll::Ready(<span class="prelude-val">Err</span>(err))
                     }
                     <span class="prelude-val">Some</span>(dur) =&gt; {
-                        <span class="macro">warn!</span>(
-                            target: <span class="string">&quot;opendal::service&quot;</span>,
-                            <span class="string">&quot;operation={} path={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                             ReadOperation::Seek, <span class="self">self</span>.path, dur.as_secs_f64(), err);
+                        <span class="self">self</span>.notify.intercept(
+                            <span class="kw-2">&amp;</span>err,
+                            dur,
+                            <span class="kw-2">&amp;</span>[
+                                (<span class="string">&quot;operation&quot;</span>, ReadOperation::Seek.into_static()),
+                                (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                            ],
+                        );
                         <span class="self">self</span>.sleep = <span class="prelude-val">Some</span>(Box::pin(tokio::time::sleep(dur)));
                         <span class="self">self</span>.poll_seek(cx, pos)
                     }
@@ -1684,10 +2180,14 @@
                         Poll::Ready(<span class="prelude-val">Some</span>(<span class="prelude-val">Err</span>(err)))
                     }
                     <span class="prelude-val">Some</span>(dur) =&gt; {
-                        <span class="macro">warn!</span>(
-                            target: <span class="string">&quot;opendal::service&quot;</span>,
-                            <span class="string">&quot;operation={} path={} -&gt; retry after {}s: error={:?}&quot;</span>,
-                            ReadOperation::Next, <span class="self">self</span>.path, dur.as_secs_f64(), err);
+                        <span class="self">self</span>.notify.intercept(
+                            <span class="kw-2">&amp;</span>err,
+                            dur,
+                            <span class="kw-2">&amp;</span>[
+                                (<span class="string">&quot;operation&quot;</span>, ReadOperation::Next.into_static()),
+                                (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                            ],
+                        );
                         <span class="self">self</span>.sleep = <span class="prelude-val">Some</span>(Box::pin(tokio::time::sleep(dur)));
                         <span class="self">self</span>.poll_next(cx)
                     }
@@ -1697,16 +2197,20 @@
     }
 }
 
-<span class="kw">impl</span>&lt;R: oio::BlockingRead&gt; oio::BlockingRead <span class="kw">for </span>RetryWrapper&lt;R&gt; {
+<span class="kw">impl</span>&lt;R: oio::BlockingRead, I: RetryInterceptor&gt; oio::BlockingRead <span class="kw">for </span>RetryWrapper&lt;R, I&gt; {
     <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
         { || <span class="self">self</span>.inner.read(buf) }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
-            .notify(<span class="kw">move </span>|err, dur| {
-                <span class="macro">warn!</span>(
-                target: <span class="string">&quot;opendal::service&quot;</span>,
-                <span class="string">&quot;operation={} -&gt; pager retry after {}s: error={:?}&quot;</span>,
-                ReadOperation::BlockingRead, dur.as_secs_f64(), err)
+            .notify(|err, dur| {
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, ReadOperation::BlockingRead.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                    ],
+                );
             })
             .call()
             .map_err(|e| e.set_persistent())
@@ -1716,11 +2220,15 @@
         { || <span class="self">self</span>.inner.seek(pos) }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
-            .notify(<span class="kw">move </span>|err, dur| {
-                <span class="macro">warn!</span>(
-                target: <span class="string">&quot;opendal::service&quot;</span>,
-                <span class="string">&quot;operation={} -&gt; pager retry after {}s: error={:?}&quot;</span>,
-                ReadOperation::BlockingSeek, dur.as_secs_f64(), err)
+            .notify(|err, dur| {
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, ReadOperation::BlockingSeek.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                    ],
+                );
             })
             .call()
             .map_err(|e| e.set_persistent())
@@ -1730,11 +2238,15 @@
         { || <span class="self">self</span>.inner.next().transpose() }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
-            .notify(<span class="kw">move </span>|err, dur| {
-                <span class="macro">warn!</span>(
-                target: <span class="string">&quot;opendal::service&quot;</span>,
-                <span class="string">&quot;operation={} -&gt; pager retry after {}s: error={:?}&quot;</span>,
-                ReadOperation::BlockingNext, dur.as_secs_f64(), err)
+            .notify(|err, dur| {
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, ReadOperation::BlockingNext.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                    ],
+                );
             })
             .call()
             .map_err(|e| e.set_persistent())
@@ -1743,7 +2255,7 @@
 }
 
 <span class="attr">#[async_trait]
-</span><span class="kw">impl</span>&lt;R: oio::Write&gt; oio::Write <span class="kw">for </span>RetryWrapper&lt;R&gt; {
+</span><span class="kw">impl</span>&lt;R: oio::Write, I: RetryInterceptor&gt; oio::Write <span class="kw">for </span>RetryWrapper&lt;R, I&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;()&gt; {
         <span class="kw">let </span><span class="kw-2">mut </span>backoff = <span class="self">self</span>.builder.build();
 
@@ -1754,9 +2266,14 @@
                 <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="macro">warn!</span>(target: <span class="string">&quot;opendal::service&quot;</span>,
-                              <span class="string">&quot;operation={} path={} -&gt; pager retry after {}s: error={:?}&quot;</span>,
-                              WriteOperation::Write, <span class="self">self</span>.path, dur.as_secs_f64(), e);
+                        <span class="self">self</span>.notify.intercept(
+                            <span class="kw-2">&amp;</span>e,
+                            dur,
+                            <span class="kw-2">&amp;</span>[
+                                (<span class="string">&quot;operation&quot;</span>, WriteOperation::Write.into_static()),
+                                (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                            ],
+                        );
                         tokio::time::sleep(dur).<span class="kw">await</span>;
                         <span class="kw">continue</span>;
                     }
@@ -1780,9 +2297,14 @@
                 <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="macro">warn!</span>(target: <span class="string">&quot;opendal::service&quot;</span>,
-                              <span class="string">&quot;operation={} path={} -&gt; pager retry after {}s: error={:?}&quot;</span>,
-                              WriteOperation::Abort, <span class="self">self</span>.path, dur.as_secs_f64(), e);
+                        <span class="self">self</span>.notify.intercept(
+                            <span class="kw-2">&amp;</span>e,
+                            dur,
+                            <span class="kw-2">&amp;</span>[
+                                (<span class="string">&quot;operation&quot;</span>, WriteOperation::Abort.into_static()),
+                                (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                            ],
+                        );
                         tokio::time::sleep(dur).<span class="kw">await</span>;
                         <span class="kw">continue</span>;
                     }
@@ -1801,9 +2323,14 @@
                 <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="macro">warn!</span>(target: <span class="string">&quot;opendal::service&quot;</span>,
-                              <span class="string">&quot;operation={} path={} -&gt; pager retry after {}s: error={:?}&quot;</span>,
-                              WriteOperation::Close, <span class="self">self</span>.path, dur.as_secs_f64(), e);
+                        <span class="self">self</span>.notify.intercept(
+                            <span class="kw-2">&amp;</span>e,
+                            dur,
+                            <span class="kw-2">&amp;</span>[
+                                (<span class="string">&quot;operation&quot;</span>, WriteOperation::Close.into_static()),
+                                (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                            ],
+                        );
                         tokio::time::sleep(dur).<span class="kw">await</span>;
                         <span class="kw">continue</span>;
                     }
@@ -1813,16 +2340,20 @@
     }
 }
 
-<span class="kw">impl</span>&lt;R: oio::BlockingWrite&gt; oio::BlockingWrite <span class="kw">for </span>RetryWrapper&lt;R&gt; {
+<span class="kw">impl</span>&lt;R: oio::BlockingWrite, I: RetryInterceptor&gt; oio::BlockingWrite <span class="kw">for </span>RetryWrapper&lt;R, I&gt; {
     <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
         { || <span class="self">self</span>.inner.write(bs.clone()) }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
-            .notify(<span class="kw">move </span>|err, dur| {
-                <span class="macro">warn!</span>(
-                target: <span class="string">&quot;opendal::service&quot;</span>,
-                <span class="string">&quot;operation={} -&gt; pager retry after {}s: error={:?}&quot;</span>,
-                WriteOperation::BlockingWrite, dur.as_secs_f64(), err)
+            .notify(|err, dur| {
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, WriteOperation::BlockingWrite.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                    ],
+                );
             })
             .call()
             .map_err(|e| e.set_persistent())
@@ -1832,11 +2363,15 @@
         { || <span class="self">self</span>.inner.close() }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
-            .notify(<span class="kw">move </span>|err, dur| {
-                <span class="macro">warn!</span>(
-                target: <span class="string">&quot;opendal::service&quot;</span>,
-                <span class="string">&quot;operation={} -&gt; pager retry after {}s: error={:?}&quot;</span>,
-               WriteOperation::BlockingClose, dur.as_secs_f64(), err)
+            .notify(|err, dur| {
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, WriteOperation::BlockingClose.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                    ],
+                );
             })
             .call()
             .map_err(|e| e.set_persistent())
@@ -1844,7 +2379,7 @@
 }
 
 <span class="attr">#[async_trait]
-</span><span class="kw">impl</span>&lt;A: oio::Append&gt; oio::Append <span class="kw">for </span>RetryWrapper&lt;A&gt; {
+</span><span class="kw">impl</span>&lt;A: oio::Append, I: RetryInterceptor&gt; oio::Append <span class="kw">for </span>RetryWrapper&lt;A, I&gt; {
     <span class="kw">async fn </span>append(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
         <span class="kw">let </span><span class="kw-2">mut </span>backoff = <span class="self">self</span>.builder.build();
 
@@ -1855,9 +2390,14 @@
                 <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="macro">warn!</span>(target: <span class="string">&quot;opendal::service&quot;</span>,
-                              <span class="string">&quot;operation={} path={} -&gt; appender retry after {}s: error={:?}&quot;</span>,
-                              AppendOperation::Append, <span class="self">self</span>.path, dur.as_secs_f64(), e);
+                        <span class="self">self</span>.notify.intercept(
+                            <span class="kw-2">&amp;</span>e,
+                            dur,
+                            <span class="kw-2">&amp;</span>[
+                                (<span class="string">&quot;operation&quot;</span>, AppendOperation::Append.into_static()),
+                                (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                            ],
+                        );
                         tokio::time::sleep(dur).<span class="kw">await</span>;
                         <span class="kw">continue</span>;
                     }
@@ -1876,9 +2416,14 @@
                 <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="macro">warn!</span>(target: <span class="string">&quot;opendal::service&quot;</span>,
-                              <span class="string">&quot;operation={} path={} -&gt; appender retry after {}s: error={:?}&quot;</span>,
-                              AppendOperation::Close, <span class="self">self</span>.path, dur.as_secs_f64(), e);
+                        <span class="self">self</span>.notify.intercept(
+                            <span class="kw-2">&amp;</span>e,
+                            dur,
+                            <span class="kw-2">&amp;</span>[
+                                (<span class="string">&quot;operation&quot;</span>, AppendOperation::Close.into_static()),
+                                (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                            ],
+                        );
                         tokio::time::sleep(dur).<span class="kw">await</span>;
                         <span class="kw">continue</span>;
                     }
@@ -1889,7 +2434,7 @@
 }
 
 <span class="attr">#[async_trait]
-</span><span class="kw">impl</span>&lt;P: oio::Page&gt; oio::Page <span class="kw">for </span>RetryWrapper&lt;P&gt; {
+</span><span class="kw">impl</span>&lt;P: oio::Page, I: RetryInterceptor&gt; oio::Page <span class="kw">for </span>RetryWrapper&lt;P, I&gt; {
     <span class="kw">async fn </span>next(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="prelude-ty">Option</span>&lt;Vec&lt;oio::Entry&gt;&gt;&gt; {
         <span class="kw">let </span><span class="kw-2">mut </span>backoff = <span class="self">self</span>.builder.build();
 
@@ -1900,9 +2445,14 @@
                 <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="macro">warn!</span>(target: <span class="string">&quot;opendal::service&quot;</span>,
-                              <span class="string">&quot;operation={} path={} -&gt; pager retry after {}s: error={:?}&quot;</span>,
-                              PageOperation::Next, <span class="self">self</span>.path, dur.as_secs_f64(), e);
+                        <span class="self">self</span>.notify.intercept(
+                            <span class="kw-2">&amp;</span>e,
+                            dur,
+                            <span class="kw-2">&amp;</span>[
+                                (<span class="string">&quot;operation&quot;</span>, PageOperation::Next.into_static()),
+                                (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                            ],
+                        );
                         tokio::time::sleep(dur).<span class="kw">await</span>;
                         <span class="kw">continue</span>;
                     }
@@ -1912,16 +2462,20 @@
     }
 }
 
-<span class="kw">impl</span>&lt;P: oio::BlockingPage&gt; oio::BlockingPage <span class="kw">for </span>RetryWrapper&lt;P&gt; {
+<span class="kw">impl</span>&lt;P: oio::BlockingPage, I: RetryInterceptor&gt; oio::BlockingPage <span class="kw">for </span>RetryWrapper&lt;P, I&gt; {
     <span class="kw">fn </span>next(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="prelude-ty">Option</span>&lt;Vec&lt;oio::Entry&gt;&gt;&gt; {
         { || <span class="self">self</span>.inner.next() }
             .retry(<span class="kw-2">&amp;</span><span class="self">self</span>.builder)
             .when(|e| e.is_temporary())
-            .notify(<span class="kw">move </span>|err, dur| {
-                <span class="macro">warn!</span>(
-                target: <span class="string">&quot;opendal::service&quot;</span>,
-                <span class="string">&quot;operation={} -&gt; pager retry after {}s: error={:?}&quot;</span>,
-                PageOperation::BlockingNext, dur.as_secs_f64(), err)
+            .notify(|err, dur| {
+                <span class="self">self</span>.notify.intercept(
+                    err,
+                    dur,
+                    <span class="kw-2">&amp;</span>[
+                        (<span class="string">&quot;operation&quot;</span>, PageOperation::BlockingNext.into_static()),
+                        (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
+                    ],
+                );
             })
             .call()
             .map_err(|e| e.set_persistent())
diff --git a/docs/rust/src/opendal/services/s3/backend.rs.html b/docs/rust/src/opendal/services/s3/backend.rs.html
index 70a3e3924..5e321e52d 100644
--- a/docs/rust/src/opendal/services/s3/backend.rs.html
+++ b/docs/rust/src/opendal/services/s3/backend.rs.html
@@ -1211,6 +1211,8 @@
 <a href="#1211" id="1211">1211</a>
 <a href="#1212" id="1212">1212</a>
 <a href="#1213" id="1213">1213</a>
+<a href="#1214" id="1214">1214</a>
+<a href="#1215" id="1215">1215</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
@@ -1762,7 +1764,9 @@
     ///
     /// # async fn example() {
     /// let builder = S3::default();
-    /// let region: Option&lt;String&gt; = builder.detect_region(&quot;https://s3.amazonaws.com&quot;, &quot;example&quot;).await;
+    /// let region: Option&lt;String&gt; = builder
+    ///     .detect_region(&quot;https://s3.amazonaws.com&quot;, &quot;example&quot;)
+    ///     .await;
     /// # }
     /// ```
     ///
diff --git a/docs/rust/src/opendal/types/operator/blocking_operator.rs.html b/docs/rust/src/opendal/types/operator/blocking_operator.rs.html
index c588ce29b..8b207c92d 100644
--- a/docs/rust/src/opendal/types/operator/blocking_operator.rs.html
+++ b/docs/rust/src/opendal/types/operator/blocking_operator.rs.html
@@ -915,6 +915,7 @@
 <a href="#915" id="915">915</a>
 <a href="#916" id="916">916</a>
 <a href="#917" id="917">917</a>
+<a href="#918" id="918">918</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
@@ -1610,7 +1611,8 @@
     /// # fn test(op: BlockingOperator) -&gt; Result&lt;()&gt; {
     /// let _ = op
     ///     .delete_with(&quot;path/to/file&quot;)
-    ///     .version(&quot;example_version&quot;).call()?;
+    ///     .version(&quot;example_version&quot;)
+    ///     .call()?;
     /// # Ok(())
     /// # }
     /// ```
diff --git a/docs/rust/src/opendal/types/writer.rs.html b/docs/rust/src/opendal/types/writer.rs.html
index d3a4dbc4d..c4cbec458 100644
--- a/docs/rust/src/opendal/types/writer.rs.html
+++ b/docs/rust/src/opendal/types/writer.rs.html
@@ -414,9 +414,6 @@
 <a href="#414" id="414">414</a>
 <a href="#415" id="415">415</a>
 <a href="#416" id="416">416</a>
-<a href="#417" id="417">417</a>
-<a href="#418" id="418">418</a>
-<a href="#419" id="419">419</a>
 </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
@@ -576,18 +573,15 @@
     /// use std::io::Result;
     ///
     /// use bytes::Bytes;
+    /// use futures::io::Cursor;
     /// use futures::stream;
     /// use futures::StreamExt;
     /// use opendal::Operator;
-    /// use futures::io::Cursor;
     ///
     /// #[tokio::main]
     /// async fn copy_example(op: Operator) -&gt; Result&lt;()&gt; {
-    ///     let mut w = op
-    ///         .writer_with(&quot;path/to/file&quot;)
-    ///         .content_length(4096)
-    ///         .await?;
-    ///     let reader = Cursor::new(vec![0;4096]);
+    ///     let mut w = op.writer_with(&quot;path/to/file&quot;).content_length(4096).await?;
+    ///     let reader = Cursor::new(vec![0; 4096]);
     ///     w.copy(4096, reader).await?;
     ///     w.close().await?;
     ///     Ok(())
diff --git a/docs/services/azblob/index.html b/docs/services/azblob/index.html
index 3fd20a8d4..d02b06421 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 5a65582ae..c0bf403be 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 fe06d5ddb..687538949 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 02b32ee6e..86534602b 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 5bc9aa95f..d0a9ad7e6 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 c1c3db94a..61efdee08 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 162cb4647..bdc114459 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 fe34be102..989604816 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 7e2ca64c9..1ddf069e9 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 98b8292bb..9152ad59d 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 b6b3653c8..3750c2743 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 cb30830bd..4dbebb681 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 faae1f299..f05dbc3e3 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 c09cc1f48..3d4cf9419 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 3cec385b7..3b1c43508 100644
--- a/docs/services/sftp/index.html
+++ b/docs/services/sftp/index.html
@@ -5,14 +5,14 @@
 <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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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 [...]
-<script src="/assets/js/runtime~main.411809a4.js"></script>
+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 [...]
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 d19e33a02..ecf635851 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.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 7a6096523..bda5469bb 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/vision/index.html b/docs/vision/index.html
index 7250c9de1..f020b60fb 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.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.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/download/index.html b/download/index.html
index cab36b19d..ec823903e 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.js"></script>
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/index.html b/index.html
index 96a006141..6c1527db5 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.411809a4.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.7e185f83.js" as="script">
 <link rel="preload" href="/assets/js/main.33d8db5d.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.411809a4.js"></script>
+<script src="/assets/js/runtime~main.7e185f83.js"></script>
 <script src="/assets/js/main.33d8db5d.js"></script>
 </body>
 </html>
\ No newline at end of file