You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by gi...@apache.org on 2024/05/17 14:08:53 UTC
(opendal) branch gh-pages updated: deploy: 08b2a96c338815208ea9b7e852034f76965ac8e6
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/opendal.git
The following commit(s) were added to refs/heads/gh-pages by this push:
new 0c5a4c8168 deploy: 08b2a96c338815208ea9b7e852034f76965ac8e6
0c5a4c8168 is described below
commit 0c5a4c8168005b9bb5247b80e54abd3b1836b060
Author: Xuanwo <Xu...@users.noreply.github.com>
AuthorDate: Fri May 17 14:08:46 2024 +0000
deploy: 08b2a96c338815208ea9b7e852034f76965ac8e6
---
404.html | 2 +-
assets/js/{main.29d7c87a.js => main.0984b5d4.js} | 4 +-
...js.LICENSE.txt => main.0984b5d4.js.LICENSE.txt} | 0
blog/apache-opendal-graduated/index.html | 2 +-
.../index.html | 2 +-
.../index.html | 2 +-
blog/archive/index.html | 2 +-
blog/how-opendal-read-data/index.html | 2 +-
blog/index.html | 2 +-
blog/opendal-access-data-freely/index.html | 2 +-
blog/opendal-entered-apache-incubator/index.html | 2 +-
blog/owo-1/index.html | 2 +-
blog/tags/announcement/index.html | 2 +-
blog/tags/index.html | 2 +-
blog/tags/internal/index.html | 2 +-
blog/tags/owo/index.html | 2 +-
community/category/committers/index.html | 2 +-
community/category/events/index.html | 2 +-
community/category/pmc-members/index.html | 2 +-
community/category/reference/index.html | 2 +-
community/committers/onboarding/index.html | 2 +-
.../reference/generate_release_note/index.html | 2 +-
.../committers/reference/setup_gpg/index.html | 2 +-
community/committers/release/index.html | 2 +-
.../request_for_adding_secrets/index.html | 2 +-
community/committers/verify/index.html | 2 +-
community/events/gsoc-proposal-guide/index.html | 2 +-
community/events/ospp-proposal-guide/index.html | 2 +-
community/index.html | 2 +-
community/maturity/index.html | 2 +-
community/pmc_members/board-reporting/index.html | 2 +-
.../pmc_members/nominate-committer/index.html | 2 +-
.../pmc_members/nominate-pmc-member/index.html | 2 +-
community/pmc_members/onboarding/index.html | 2 +-
community/security/index.html | 2 +-
docs/category/integrations/index.html | 2 +-
docs/category/services/index.html | 2 +-
docs/integrations/dav-server-opendalfs/index.html | 2 +-
docs/integrations/object_store_opendal/index.html | 2 +-
docs/lua/classes/opendal.metadata.html | 2 +-
docs/lua/classes/opendal.operator.html | 2 +-
docs/lua/index.html | 2 +-
docs/nodejs/classes/BlockingLister.html | 4 +-
docs/nodejs/classes/BlockingReader.html | 4 +-
docs/nodejs/classes/BlockingWriter.html | 8 +-
docs/nodejs/classes/Capability.html | 74 +-
docs/nodejs/classes/Entry.html | 4 +-
docs/nodejs/classes/ExternalObject.html | 4 +-
docs/nodejs/classes/Layer.html | 2 +-
docs/nodejs/classes/Lister.html | 4 +-
docs/nodejs/classes/Metadata.html | 18 +-
docs/nodejs/classes/Operator.html | 66 +-
docs/nodejs/classes/Reader.html | 6 +-
docs/nodejs/classes/RetryLayer.html | 14 +-
docs/nodejs/classes/Writer.html | 8 +-
docs/nodejs/interfaces/ListOptions.html | 4 +-
docs/nodejs/interfaces/PresignedRequest.html | 8 +-
docs/overview/index.html | 2 +-
docs/python/opendal.html | 446 ++++----
docs/python/search.js | 2 +-
docs/quickstart/index.html | 2 +-
docs/rust/opendal/all.html | 2 +-
docs/rust/opendal/enum.EntryMode.html | 2 +-
docs/rust/opendal/enum.ErrorKind.html | 2 +-
docs/rust/opendal/enum.Metakey.html | 4 +-
docs/rust/opendal/enum.Scheme.html | 14 +-
docs/rust/opendal/raw/enum.FourWays.html | 4 +-
docs/rust/opendal/raw/enum.Operation.html | 2 +-
docs/rust/opendal/raw/oio/struct.FlatLister.html | 4 +-
docs/rust/opendal/raw/oio/trait.BlockingList.html | 2 +-
docs/rust/opendal/raw/oio/trait.BlockingWrite.html | 2 +-
docs/rust/opendal/raw/oio/trait.Write.html | 2 +-
docs/rust/opendal/raw/struct.BytesRange.html | 2 +-
.../backend/struct.AliyunDriveBuilder.html | 11 +
.../backend/struct.AliyunDriveConfig.html | 11 +
docs/rust/opendal/services/index.html | 4 +-
docs/rust/opendal/services/sidebar-items.js | 2 +-
.../struct.AliyunDrive.html} | 122 +-
.../struct.AliyunDriveConfig.html} | 90 +-
docs/rust/opendal/struct.Buffer.html | 6 +-
docs/rust/opendal/struct.Operator.html | 6 +-
docs/rust/opendal/struct.OperatorBuilder.html | 8 +-
docs/rust/opendal/trait.Builder.html | 2 +-
docs/rust/search-index.js | 2 +-
docs/rust/search.desc/opendal/opendal-desc-0-.js | 2 +-
docs/rust/src-files.js | 2 +-
.../opendal/services/aliyun_drive/backend.rs.html | 943 ++++++++++++++++
.../src/opendal/services/aliyun_drive/core.rs.html | 1193 ++++++++++++++++++++
.../opendal/services/aliyun_drive/error.rs.html | 111 ++
.../opendal/services/aliyun_drive/lister.rs.html | 305 +++++
.../src/opendal/services/aliyun_drive/mod.rs.html | 53 +
.../opendal/services/aliyun_drive/reader.rs.html | 143 +++
.../opendal/services/aliyun_drive/writer.rs.html | 545 +++++++++
docs/rust/src/opendal/services/mod.rs.html | 16 +-
.../src/opendal/types/operator/builder.rs.html | 4 +
docs/rust/src/opendal/types/scheme.rs.html | 12 +
docs/rust/trait.impl/core/default/trait.Default.js | 2 +-
docs/rust/trait.impl/core/fmt/trait.Debug.js | 2 +-
docs/rust/trait.impl/core/marker/trait.Freeze.js | 2 +-
docs/rust/trait.impl/core/marker/trait.Send.js | 2 +-
docs/rust/trait.impl/core/marker/trait.Sync.js | 2 +-
docs/rust/trait.impl/core/marker/trait.Unpin.js | 2 +-
.../core/panic/unwind_safe/trait.RefUnwindSafe.js | 2 +-
.../core/panic/unwind_safe/trait.UnwindSafe.js | 2 +-
docs/rust/trait.impl/serde/de/trait.Deserialize.js | 2 +-
docs/services/atomicserver/index.html | 2 +-
docs/services/azblob/index.html | 2 +-
docs/services/azdls/index.html | 2 +-
docs/services/cacache/index.html | 2 +-
docs/services/cos/index.html | 2 +-
docs/services/d1/index.html | 2 +-
docs/services/dashmap/index.html | 2 +-
docs/services/dropbox/index.html | 2 +-
docs/services/etcd/index.html | 2 +-
docs/services/foundationdb/index.html | 2 +-
docs/services/fs/index.html | 2 +-
docs/services/ftp/index.html | 2 +-
docs/services/gcs/index.html | 2 +-
docs/services/gdrive/index.html | 2 +-
docs/services/ghac/index.html | 2 +-
docs/services/gridfs/index.html | 2 +-
docs/services/hdfs/index.html | 2 +-
docs/services/http/index.html | 2 +-
docs/services/huggingface/index.html | 2 +-
docs/services/ipfs/index.html | 2 +-
docs/services/ipmfs/index.html | 2 +-
docs/services/libsql/index.html | 2 +-
docs/services/memcached/index.html | 2 +-
docs/services/memory/index.html | 2 +-
docs/services/moka/index.html | 2 +-
docs/services/mongodb/index.html | 2 +-
docs/services/mysql/index.html | 2 +-
docs/services/obs/index.html | 2 +-
docs/services/onedrive/index.html | 2 +-
docs/services/oss/index.html | 2 +-
docs/services/persy/index.html | 2 +-
docs/services/postgresql/index.html | 2 +-
docs/services/redb/index.html | 2 +-
docs/services/redis/index.html | 2 +-
docs/services/rocksdb/index.html | 2 +-
docs/services/s3/index.html | 2 +-
docs/services/sftp/index.html | 2 +-
docs/services/sled/index.html | 2 +-
docs/services/sqlite/index.html | 2 +-
docs/services/supabase/index.html | 2 +-
docs/services/swift/index.html | 2 +-
docs/services/tikv/index.html | 2 +-
docs/services/vercel_artifacts/index.html | 2 +-
docs/services/webdav/index.html | 2 +-
docs/services/webhdfs/index.html | 2 +-
download/index.html | 2 +-
index.html | 2 +-
lunr-index-1715950394456.json | 1 -
lunr-index-1715954882439.json | 1 +
lunr-index.json | 2 +-
search-doc-1715950394456.json | 1 -
search-doc-1715954882439.json | 1 +
search-doc.json | 2 +-
158 files changed, 3935 insertions(+), 584 deletions(-)
diff --git a/404.html b/404.html
index 2f937fe213..8f8d4b5438 100644
--- a/404.html
+++ b/404.html
@@ -6,7 +6,7 @@
<title data-rh="true">Page Not Found | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/404.html"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="tr [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/assets/js/main.29d7c87a.js b/assets/js/main.0984b5d4.js
similarity index 99%
rename from assets/js/main.29d7c87a.js
rename to assets/js/main.0984b5d4.js
index c64ca7d40e..4f66cdfe53 100644
--- a/assets/js/main.29d7c87a.js
+++ b/assets/js/main.0984b5d4.js
@@ -1,2 +1,2 @@
-/*! For license information please see main.29d7c87a.js.LICENSE.txt */
-(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[179],{8852:(e,t,n)=>{var r={"./prism-groovy":1199,"./prism-java":955,"./prism-rust":457};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=8852},7812:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(959);var r=n(9010),o=n.n(r),a=n(6887);const [...]
\ No newline at end of file
+/*! For license information please see main.0984b5d4.js.LICENSE.txt */
+(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[179],{8852:(e,t,n)=>{var r={"./prism-groovy":1199,"./prism-java":955,"./prism-rust":457};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=8852},7812:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(959);var r=n(9010),o=n.n(r),a=n(6887);const [...]
\ No newline at end of file
diff --git a/assets/js/main.29d7c87a.js.LICENSE.txt b/assets/js/main.0984b5d4.js.LICENSE.txt
similarity index 100%
rename from assets/js/main.29d7c87a.js.LICENSE.txt
rename to assets/js/main.0984b5d4.js.LICENSE.txt
diff --git a/blog/apache-opendal-graduated/index.html b/blog/apache-opendal-graduated/index.html
index 85b8383d6b..34fec47f78 100644
--- a/blog/apache-opendal-graduated/index.html
+++ b/blog/apache-opendal-graduated/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Apache OpenDAL™ is now Graduated | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/apache-opendal-graduated"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_t [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/blog/apache-opendal-participates-in-gsoc-2024/index.html b/blog/apache-opendal-participates-in-gsoc-2024/index.html
index 1c74c04a01..2cfc8be524 100644
--- a/blog/apache-opendal-participates-in-gsoc-2024/index.html
+++ b/blog/apache-opendal-participates-in-gsoc-2024/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Apache OpenDAL™ participates in Google Summer of Code 2024 | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/apache-opendal-participates-in-gsoc-2024"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="e [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/blog/apache-opendal-participates-in-ospp-2024/index.html b/blog/apache-opendal-participates-in-ospp-2024/index.html
index b77f46fcc7..7b9b3b7c4c 100644
--- a/blog/apache-opendal-participates-in-ospp-2024/index.html
+++ b/blog/apache-opendal-participates-in-ospp-2024/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Apache OpenDAL™ participates in Open Source Promotion Plan 2024 | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/apache-opendal-participates-in-ospp-2024"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" conte [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/blog/archive/index.html b/blog/archive/index.html
index 1c221763d2..4962bacc30 100644
--- a/blog/archive/index.html
+++ b/blog/archive/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Archive | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/archive"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/blog/how-opendal-read-data/index.html b/blog/how-opendal-read-data/index.html
index e2fcd3d97e..229f6b088b 100644
--- a/blog/how-opendal-read-data/index.html
+++ b/blog/how-opendal-read-data/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Apache OpenDAL™ Internal: Data Reading | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/how-opendal-read-data"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusauru [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/blog/index.html b/blog/index.html
index 2bdf044328..38c7b831cb 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Blog | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property="o [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/blog/opendal-access-data-freely/index.html b/blog/opendal-access-data-freely/index.html
index d9092e7748..60277032d8 100644
--- a/blog/opendal-access-data-freely/index.html
+++ b/blog/opendal-access-data-freely/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Apache OpenDAL™: Access Data Freely | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/opendal-access-data-freely"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusau [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/blog/opendal-entered-apache-incubator/index.html b/blog/opendal-entered-apache-incubator/index.html
index c143759954..c0cead83df 100644
--- a/blog/opendal-entered-apache-incubator/index.html
+++ b/blog/opendal-entered-apache-incubator/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Way to Go: OpenDAL successfully entered Apache Incubator | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/opendal-entered-apache-incubator"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta d [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/blog/owo-1/index.html b/blog/owo-1/index.html
index f789dddab7..4213a6c31a 100644
--- a/blog/owo-1/index.html
+++ b/blog/owo-1/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">OwO #1: The v0.40 Release | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/owo-1"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><met [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/blog/tags/announcement/index.html b/blog/tags/announcement/index.html
index dbc0bf9e47..dfc4fc04f9 100644
--- a/blog/tags/announcement/index.html
+++ b/blog/tags/announcement/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">5 posts tagged with "announcement" | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/tags/announcement"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsear [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/blog/tags/index.html b/blog/tags/index.html
index 0ff4ca234a..9cd67acff6 100644
--- a/blog/tags/index.html
+++ b/blog/tags/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Tags | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/tags"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" proper [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/blog/tags/internal/index.html b/blog/tags/internal/index.html
index 2434406e3e..d146e3f643 100644
--- a/blog/tags/internal/index.html
+++ b/blog/tags/internal/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">One post tagged with "internal" | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/tags/internal"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:lang [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/blog/tags/owo/index.html b/blog/tags/owo/index.html
index 771ca0a5b5..3686d35ff5 100644
--- a/blog/tags/owo/index.html
+++ b/blog/tags/owo/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">One post tagged with "owo" | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/tags/owo"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" cont [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/category/committers/index.html b/community/category/committers/index.html
index aee102b27c..d9b5a56aff 100644
--- a/community/category/committers/index.html
+++ b/community/category/committers/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Committers | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/category/committers"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en">< [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/category/events/index.html b/community/category/events/index.html
index ae8c0c1b94..32e407a876 100644
--- a/community/category/events/index.html
+++ b/community/category/events/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Events | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/category/events"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta dat [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/category/pmc-members/index.html b/community/category/pmc-members/index.html
index 02417adcdf..8a20db5c41 100644
--- a/community/category/pmc-members/index.html
+++ b/community/category/pmc-members/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Committers | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/category/pmc-members"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"> [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/category/reference/index.html b/community/category/reference/index.html
index 796fde0f8d..750d9dc7bc 100644
--- a/community/category/reference/index.html
+++ b/community/category/reference/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Reference | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/category/reference"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><me [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/committers/onboarding/index.html b/community/committers/onboarding/index.html
index 5707664908..3c90918d4e 100644
--- a/community/committers/onboarding/index.html
+++ b/community/committers/onboarding/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Onboarding | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/committers/onboarding"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/committers/reference/generate_release_note/index.html b/community/committers/reference/generate_release_note/index.html
index 4624221ab7..e445c02c95 100644
--- a/community/committers/reference/generate_release_note/index.html
+++ b/community/committers/reference/generate_release_note/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Generate release note | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/committers/reference/generate_release_note"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name=" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/committers/reference/setup_gpg/index.html b/community/committers/reference/setup_gpg/index.html
index 722c5afbbf..aaf70e638e 100644
--- a/community/committers/reference/setup_gpg/index.html
+++ b/community/committers/reference/setup_gpg/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Setup GPG key | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/committers/reference/setup_gpg"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/committers/release/index.html b/community/committers/release/index.html
index 0af3cbbd02..56fa0c1947 100644
--- a/community/committers/release/index.html
+++ b/community/committers/release/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Create a release | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/committers/release"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content=" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/committers/request_for_adding_secrets/index.html b/community/committers/request_for_adding_secrets/index.html
index 324a95580d..9ae528a5b5 100644
--- a/community/committers/request_for_adding_secrets/index.html
+++ b/community/committers/request_for_adding_secrets/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Request for adding secrets | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/committers/request_for_adding_secrets"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name=" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/committers/verify/index.html b/community/committers/verify/index.html
index abab1d759e..e24d2d115a 100644
--- a/community/committers/verify/index.html
+++ b/community/committers/verify/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Verify a release candidate | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/committers/verify"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/events/gsoc-proposal-guide/index.html b/community/events/gsoc-proposal-guide/index.html
index a674289a01..5cb117f969 100644
--- a/community/events/gsoc-proposal-guide/index.html
+++ b/community/events/gsoc-proposal-guide/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">GSoC Project Proposal Guidance | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/events/gsoc-proposal-guide"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsear [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/events/ospp-proposal-guide/index.html b/community/events/ospp-proposal-guide/index.html
index 0ed93acf5b..044aa72723 100644
--- a/community/events/ospp-proposal-guide/index.html
+++ b/community/events/ospp-proposal-guide/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">OSPP Project Proposal Guidance | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/events/ospp-proposal-guide"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsear [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/index.html b/community/index.html
index f345b87e5b..605778d1e3 100644
--- a/community/index.html
+++ b/community/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Community | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/maturity/index.html b/community/maturity/index.html
index 711a0f8da5..dc643f1518 100644
--- a/community/maturity/index.html
+++ b/community/maturity/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Maturity | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/maturity"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/pmc_members/board-reporting/index.html b/community/pmc_members/board-reporting/index.html
index dce69dbfb6..b76564abd4 100644
--- a/community/pmc_members/board-reporting/index.html
+++ b/community/pmc_members/board-reporting/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Board reporting | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/pmc_members/board-reporting"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" c [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/pmc_members/nominate-committer/index.html b/community/pmc_members/nominate-committer/index.html
index bfc63106b3..80f0f0691e 100644
--- a/community/pmc_members/nominate-committer/index.html
+++ b/community/pmc_members/nominate-committer/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Nominate Committer | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/pmc_members/nominate-committer"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:langu [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/pmc_members/nominate-pmc-member/index.html b/community/pmc_members/nominate-pmc-member/index.html
index e7034eb2cd..f5b40db7a4 100644
--- a/community/pmc_members/nominate-pmc-member/index.html
+++ b/community/pmc_members/nominate-pmc-member/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Nominate PMC Member | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/pmc_members/nominate-pmc-member"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:lan [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/pmc_members/onboarding/index.html b/community/pmc_members/onboarding/index.html
index f2f5d8644a..821738cfcb 100644
--- a/community/pmc_members/onboarding/index.html
+++ b/community/pmc_members/onboarding/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Onboarding | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/pmc_members/onboarding"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/community/security/index.html b/community/security/index.html
index 988a3b1569..dc773555a7 100644
--- a/community/security/index.html
+++ b/community/security/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Security | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/community/security"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/category/integrations/index.html b/docs/category/integrations/index.html
index d70cba47ef..8361901292 100644
--- a/docs/category/integrations/index.html
+++ b/docs/category/integrations/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Integrations | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/category/integrations"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><m [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/category/services/index.html b/docs/category/services/index.html
index d603369dea..46a568e4f5 100644
--- a/docs/category/services/index.html
+++ b/docs/category/services/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Services | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/category/services"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/integrations/dav-server-opendalfs/index.html b/docs/integrations/dav-server-opendalfs/index.html
index 74a15be8d0..537e2349b3 100644
--- a/docs/integrations/dav-server-opendalfs/index.html
+++ b/docs/integrations/dav-server-opendalfs/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">dav-server-opendalfs | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/integrations/dav-server-opendalfs"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:langu [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/integrations/object_store_opendal/index.html b/docs/integrations/object_store_opendal/index.html
index 81db36694d..7d972e5bfe 100644
--- a/docs/integrations/object_store_opendal/index.html
+++ b/docs/integrations/object_store_opendal/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">object_store_opendal | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/integrations/object_store_opendal"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:langu [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/lua/classes/opendal.metadata.html b/docs/lua/classes/opendal.metadata.html
index 888dc6ea6f..3e2de22f94 100644
--- a/docs/lua/classes/opendal.metadata.html
+++ b/docs/lua/classes/opendal.metadata.html
@@ -138,7 +138,7 @@
</div> <!-- id="main" -->
<div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
-<i style="float:right;">Last updated 2024-05-17 12:40:36 </i>
+<i style="float:right;">Last updated 2024-05-17 13:52:58 </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 1364a60df8..ff6e07cddf 100644
--- a/docs/lua/classes/opendal.operator.html
+++ b/docs/lua/classes/opendal.operator.html
@@ -321,7 +321,7 @@
</div> <!-- id="main" -->
<div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
-<i style="float:right;">Last updated 2024-05-17 12:40:36 </i>
+<i style="float:right;">Last updated 2024-05-17 13:52:58 </i>
</div> <!-- id="about" -->
</div> <!-- id="container" -->
</body>
diff --git a/docs/lua/index.html b/docs/lua/index.html
index dc6596edcd..ad02b0305d 100644
--- a/docs/lua/index.html
+++ b/docs/lua/index.html
@@ -57,7 +57,7 @@
</div> <!-- id="main" -->
<div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
-<i style="float:right;">Last updated 2024-05-17 12:40:36 </i>
+<i style="float:right;">Last updated 2024-05-17 13:52:58 </i>
</div> <!-- id="about" -->
</div> <!-- id="container" -->
</body>
diff --git a/docs/nodejs/classes/BlockingLister.html b/docs/nodejs/classes/BlockingLister.html
index 8be0c6a510..164a61dd5f 100644
--- a/docs/nodejs/classes/BlockingLister.html
+++ b/docs/nodejs/classes/BlockingLister.html
@@ -1,5 +1,5 @@
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>BlockingLister | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async [...]
manner.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L655">generated.d.ts:655</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L655">generated.d.ts:655</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="BlockingLister.html#next" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>next</span></a>
-</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Blo [...]
\ No newline at end of file
+</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Blo [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/BlockingReader.html b/docs/nodejs/classes/BlockingReader.html
index 6643d59e6c..0ebb4d1ca5 100644
--- a/docs/nodejs/classes/BlockingReader.html
+++ b/docs/nodejs/classes/BlockingReader.html
@@ -1,7 +1,7 @@
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>BlockingReader | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async [...]
manner.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L546">generated.d.ts:546</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/index.d.ts#L23">index.d.ts:23</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L546">generated.d.ts:546</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/index.d.ts#L23">index.d.ts:23</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content [...]
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="BlockingReader.html#createReadStream" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>create<wbr/>Read<wbr/>Stream</span></a>
<a href="BlockingReader.html#read" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>read</span></a>
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Blo [...]
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">ReadableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Readable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
\ No newline at end of file
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">ReadableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Readable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/BlockingWriter.html b/docs/nodejs/classes/BlockingWriter.html
index 2d7d0dfde5..2437334e3c 100644
--- a/docs/nodejs/classes/BlockingWriter.html
+++ b/docs/nodejs/classes/BlockingWriter.html
@@ -1,6 +1,6 @@
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>BlockingWriter | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async [...]
manner.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L567">generated.d.ts:567</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/index.d.ts#L32">index.d.ts:32</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L567">generated.d.ts:567</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/index.d.ts#L32">index.d.ts:32</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content [...]
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="BlockingWriter.html#close" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>close</span></a>
<a href="BlockingWriter.html#createWriteStream" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>create<wbr/>Write<wbr/>Stream</span></a>
<a href="BlockingWriter.html#write" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>write</span></a>
@@ -10,11 +10,11 @@ manner.</p>
<p>Close this writer.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">writer</span><span class="hl-1"> = </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">writerSync</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">);</span><br/><span class="hl-5">writer</span><span class="hl-1 [...]
</code><button>Copy</button></pre>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L598">generated.d.ts:598</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="createWriteStream" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>create<wbr/>Write<wbr/>Stream</sp [...]
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">WritableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Writable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L598">generated.d.ts:598</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="createWriteStream" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>create<wbr/>Write<wbr/>Stream</sp [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">WritableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Writable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
<p>&mut self in async napi methods should be marked as unsafe</p>
</blockquote>
<p>Write bytes into this writer.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">writer</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">writer</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">);</span> [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul [...]
\ No newline at end of file
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Capability.html b/docs/nodejs/classes/Capability.html
index efc154c90f..e7bcb340a3 100644
--- a/docs/nodejs/classes/Capability.html
+++ b/docs/nodejs/classes/Capability.html
@@ -7,7 +7,7 @@ by current Operator.</p>
<li>What's current Operator max supports batch operations count.</li>
</ul>
<p>Add fields of Capabilities with be public and can be accessed directly.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L56">generated.d.ts:56</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L56">generated.d.ts:56</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role [...]
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Accessors</h3><div class="tsd-index-list"><a href="Capability.html#batch" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>batch</span></a>
<a href="Capability.html#batchDelete" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>batch<wbr/>Delete</span></a>
<a href="Capability.html#batchMaxOperations" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>batch<wbr/>Max<wbr/>Operations</span></a>
@@ -45,43 +45,43 @@ by current Operator.</p>
<a href="Capability.html#writeWithContentDisposition" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>write<wbr/>With<wbr/>Content<wbr/>Disposition</span></a>
<a href="Capability.html#writeWithContentType" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>write<wbr/>With<wbr/>Content<wbr/>Type</span></a>
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Cap [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L138">generated.d.ts:138</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="batchDelete" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>batch<wbr/>Delete</span><a href="#ba [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L140">generated.d.ts:140</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="batchMaxOperations" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>batch<wbr/>Max<wbr/>Operation [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L142">generated.d.ts:142</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="blocking" class="t [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L144">generated.d.ts:144</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="copy" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>copy</span><a href="#copy" aria-label="Perm [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L118">generated.d.ts:118</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="createDir" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>create<wbr/>Dir</span><a href="#create [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L114">generated.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 [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L116">generated.d.ts:116</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="list" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list</span><a href="#list" aria-label="Perm [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L122">generated.d.ts:122</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="listWithLimit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list<wbr/>With<wbr/>Limit</span><a [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L124">generated.d.ts:124</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="listWithRecursive" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list<wbr/>With<wbr/>Recursive< [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L128">generated.d.ts:128</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="listWithStartAfter" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list<wbr/>With<wbr/>Start<wbr [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L126">generated.d.ts:126</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presign" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign</span><a href="#presign" aria-la [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L130">generated.d.ts:130</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presignRead" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign<wbr/>Read</span><a href="#pr [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L132">generated.d.ts:132</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presignStat" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign<wbr/>Stat</span><a href="#pr [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L134">generated.d.ts:134</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presignWrite" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign<wbr/>Write</span><a href="# [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L136">generated.d.ts:136</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="read" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read</span><a href="#read" aria-label="Perm [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L64">generated.d.ts:64</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithIfMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>If<wbr/>Match< [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L66">generated.d.ts:66</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithIfNoneMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>If<wbr/>No [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L68">generated.d.ts:68</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithOverrideCacheControl" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>O [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L70">generated.d.ts:70</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithOverrideContentDisposition" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With< [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L72">generated.d.ts:72</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithOverrideContentType" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>Ov [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L74">generated.d.ts:74</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="rename" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>rename</span><a href="#rename" aria-label=" [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L120">generated.d.ts:120</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="stat" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>stat</span><a href="#stat" aria-label="Perm [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L58">generated.d.ts:58</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="statWithIfMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>stat<wbr/>With<wbr/>If<wbr/>Match< [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L60">generated.d.ts:60</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="statWithIfNoneMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>stat<wbr/>With<wbr/>If<wbr/>No [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L62">generated.d.ts:62</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="write" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write</span><a href="#write" aria-label="Per [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L76">generated.d.ts:76</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeCanAppend" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Can<wbr/>Append</span><a [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L82">generated.d.ts:82</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeCanEmpty" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Can<wbr/>Empty</span><a h [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L80">generated.d.ts:80</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeCanMulti" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Can<wbr/>Multi</span><a h [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L78">generated.d.ts:78</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeMultiAlignSize" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Multi<wbr/>Align<wb [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L138">generated.d.ts:138</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="batchDelete" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>batch<wbr/>Delete</span><a href="#ba [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L140">generated.d.ts:140</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="batchMaxOperations" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>batch<wbr/>Max<wbr/>Operation [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L142">generated.d.ts:142</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="blocking" class="t [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L144">generated.d.ts:144</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="copy" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>copy</span><a href="#copy" aria-label="Perm [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L118">generated.d.ts:118</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="createDir" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>create<wbr/>Dir</span><a href="#create [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L114">generated.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 [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L116">generated.d.ts:116</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="list" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list</span><a href="#list" aria-label="Perm [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L122">generated.d.ts:122</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="listWithLimit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list<wbr/>With<wbr/>Limit</span><a [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L124">generated.d.ts:124</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="listWithRecursive" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list<wbr/>With<wbr/>Recursive< [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L128">generated.d.ts:128</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="listWithStartAfter" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>list<wbr/>With<wbr/>Start<wbr [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L126">generated.d.ts:126</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presign" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign</span><a href="#presign" aria-la [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L130">generated.d.ts:130</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presignRead" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign<wbr/>Read</span><a href="#pr [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L132">generated.d.ts:132</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presignStat" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign<wbr/>Stat</span><a href="#pr [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L134">generated.d.ts:134</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="presignWrite" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>presign<wbr/>Write</span><a href="# [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L136">generated.d.ts:136</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="read" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read</span><a href="#read" aria-label="Perm [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L64">generated.d.ts:64</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithIfMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>If<wbr/>Match< [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L66">generated.d.ts:66</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithIfNoneMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>If<wbr/>No [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L68">generated.d.ts:68</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithOverrideCacheControl" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>O [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L70">generated.d.ts:70</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithOverrideContentDisposition" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With< [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L72">generated.d.ts:72</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="readWithOverrideContentType" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>read<wbr/>With<wbr/>Ov [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L74">generated.d.ts:74</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="rename" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>rename</span><a href="#rename" aria-label=" [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L120">generated.d.ts:120</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="stat" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>stat</span><a href="#stat" aria-label="Perm [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L58">generated.d.ts:58</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="statWithIfMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>stat<wbr/>With<wbr/>If<wbr/>Match< [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L60">generated.d.ts:60</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="statWithIfNoneMatch" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>stat<wbr/>With<wbr/>If<wbr/>No [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L62">generated.d.ts:62</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="write" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write</span><a href="#write" aria-label="Per [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L76">generated.d.ts:76</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeCanAppend" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Can<wbr/>Append</span><a [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L82">generated.d.ts:82</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeCanEmpty" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Can<wbr/>Empty</span><a h [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L80">generated.d.ts:80</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeCanMulti" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Can<wbr/>Multi</span><a h [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L78">generated.d.ts:78</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeMultiAlignSize" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>Multi<wbr/>Align<wb [...]
<p>For example, Google GCS requires align size to 256KiB in write_multi.</p>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L106">generated.d.ts:106</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeMultiMaxSize" [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L106">generated.d.ts:106</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeMultiMaxSize" [...]
<p>For example, AWS S3 supports 5GiB as max in write_multi.</p>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L94">generated.d.ts:94</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeMultiMinSize" c [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L94">generated.d.ts:94</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeMultiMinSize" c [...]
<p>For example, AWS S3 requires at least 5MiB in write_multi expect the last one.</p>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L100">generated.d.ts:100</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeTotalMaxSize" [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L100">generated.d.ts:100</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeTotalMaxSize" [...]
<p>For example, Cloudflare D1 supports 1MB as max in write_total.</p>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L112">generated.d.ts:112</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeWithCacheCont [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L88">generated.d.ts:88</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeWithContentDisposition" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>With<wbr/>C [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L86">generated.d.ts:86</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeWithContentType" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>With<wbr/>Content< [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L84">generated.d.ts:84</a></li></ul></aside></li></ul></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class= [...]
\ No newline at end of file
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L112">generated.d.ts:112</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeWithCacheCont [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L88">generated.d.ts:88</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeWithContentDisposition" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>With<wbr/>C [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L86">generated.d.ts:86</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="writeWithContentType" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>write<wbr/>With<wbr/>Content< [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L84">generated.d.ts:84</a></li></ul></aside></li></ul></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class= [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Entry.html b/docs/nodejs/classes/Entry.html
index 9145ffaa63..fc1b6c4d6b 100644
--- a/docs/nodejs/classes/Entry.html
+++ b/docs/nodejs/classes/Entry.html
@@ -1,5 +1,5 @@
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Entry | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../ [...]
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L515">generated.d.ts:515</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L515">generated.d.ts:515</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Entry.html#path" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>path</span></a>
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Ent [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L517">generated.d.ts:517</a></li></ul></aside></li></ul></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class [...]
\ No newline at end of file
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L517">generated.d.ts:517</a></li></ul></aside></li></ul></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/ExternalObject.html b/docs/nodejs/classes/ExternalObject.html
index 7350a9eacb..87230b3671 100644
--- a/docs/nodejs/classes/ExternalObject.html
+++ b/docs/nodejs/classes/ExternalObject.html
@@ -1,3 +1,3 @@
-<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ExternalObject | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async [...]
+<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ExternalObject | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async [...]
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Properties</h3><div class="tsd-index-list"><a href="ExternalObject.html#reflection-5" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-1024"></use></svg><span><em>Property</em></span></a>
-</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Ext [...]
\ No newline at end of file
+</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Ext [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Layer.html b/docs/nodejs/classes/Layer.html
index 94aeb68af8..0267ad60ea 100644
--- a/docs/nodejs/classes/Layer.html
+++ b/docs/nodejs/classes/Layer.html
@@ -1,3 +1,3 @@
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Layer | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../ [...]
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L659">generated.d.ts:659</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L659">generated.d.ts:659</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Lay [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Lister.html b/docs/nodejs/classes/Lister.html
index 070d9955c1..8aebe82b65 100644
--- a/docs/nodejs/classes/Lister.html
+++ b/docs/nodejs/classes/Lister.html
@@ -1,10 +1,10 @@
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Lister | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src=".. [...]
manner.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L640">generated.d.ts:640</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L640">generated.d.ts:640</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Lister.html#next" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>next</span></a>
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Lis [...]
<p>&mut self in async napi methods should be marked as unsafe</p>
</blockquote>
<p>napi will make sure the function is safe, and we didn't do unsafe
thing internally.</p>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</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">></span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5a [...]
\ No newline at end of file
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</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">></span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08 [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Metadata.html b/docs/nodejs/classes/Metadata.html
index e670985ef1..8fbcbd8477 100644
--- a/docs/nodejs/classes/Metadata.html
+++ b/docs/nodejs/classes/Metadata.html
@@ -1,5 +1,5 @@
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Metadata | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src=" [...]
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L520">generated.d.ts:520</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L520">generated.d.ts:520</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Accessors</h3><div class="tsd-index-list"><a href="Metadata.html#contentDisposition" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>content<wbr/>Disposition</span></a>
<a href="Metadata.html#contentLength" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>content<wbr/>Length</span></a>
<a href="Metadata.html#contentMd5" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>content<wbr/>Md5</span></a>
@@ -9,12 +9,12 @@
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Metadata.html#isDirectory" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>is<wbr/>Directory</span></a>
<a href="Metadata.html#isFile" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>is<wbr/>File</span></a>
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Met [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L526">generated.d.ts:526</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="contentLength" cla [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L528">generated.d.ts:528</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="contentMd5" class= [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L530">generated.d.ts:530</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="contentType" class [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L532">generated.d.ts:532</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="etag" class="tsd-a [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L534">generated.d.ts:534</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="lastModified" clas [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L526">generated.d.ts:526</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="contentLength" cla [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L528">generated.d.ts:528</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="contentMd5" class= [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L530">generated.d.ts:530</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="contentType" class [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L532">generated.d.ts:532</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="etag" class="tsd-a [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L534">generated.d.ts:534</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="lastModified" clas [...]
<p>We will output this time in RFC3339 format like <code>1996-12-19T16:39:57+08:00</code>.</p>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L540">generated.d.ts:540</a></li></ul></aside></li></ul></section></section><section class="tsd-panel-group tsd-member-group"><h2 [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L522">generated.d.ts:522</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="isFile" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>is<wbr/>File</span><a href="#isFile" aria [...]
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L524">generated.d.ts:524</a></li></ul></aside></li></ul></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary clas [...]
\ No newline at end of file
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L540">generated.d.ts:540</a></li></ul></aside></li></ul></section></section><section class="tsd-panel-group tsd-member-group"><h2 [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L522">generated.d.ts:522</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="isFile" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>is<wbr/>File</span><a href="#isFile" aria [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L524">generated.d.ts:524</a></li></ul></aside></li></ul></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary clas [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Operator.html b/docs/nodejs/classes/Operator.html
index 79a35c0fd7..1c228289e3 100644
--- a/docs/nodejs/classes/Operator.html
+++ b/docs/nodejs/classes/Operator.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Operator | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src=" [...]
+<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Operator | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src=" [...]
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Operator.html#append" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>append</span></a>
<a href="Operator.html#capability" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>capability</span></a>
<a href="Operator.html#check" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>check</span></a>
@@ -31,45 +31,45 @@
<a href="Operator.html#writer" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>writer</span></a>
<a href="Operator.html#writerSync" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>writer<wbr/>Sync</span></a>
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Ope [...]
-</div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L148">generated.d.ts:148</a></li></ul></aside></li></ul></section></section><section class="tsd-panel-group tsd-member-group"><h2>Methods</h2><section class="tsd-panel tsd-member"><a id="append" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>append</span><a href="#append" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24 [...]
+</div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L148">generated.d.ts:148</a></li></ul></aside></li></ul></section></section><section class="tsd-panel-group tsd-member-group"><h2>Methods</h2><section class="tsd-panel tsd-member"><a id="append" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>append</span><a href="#append" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24 [...]
<a id="md:notes" class="tsd-anchor"></a><h3><a href="#md:notes">Notes</a></h3><ul>
<li>It always appends content to the end of the file.</li>
<li>It will create file if the path not exists.</li>
</ul>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">append</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">, </span><span class="hl-5">Buffer</span><span class="hl-1">.</span><span class="hl-0">from</span><span class="hl-1">(</span><sp [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="ts [...]
-</div><h4 class="tsd-returns-title">Returns <a href="Capability.html" class="tsd-signature-type tsd-kind-class">Capability</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L150">generated.d.ts:150</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="check" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>check</ [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="ts [...]
+</div><h4 class="tsd-returns-title">Returns <a href="Capability.html" class="tsd-signature-type tsd-kind-class">Capability</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L150">generated.d.ts:150</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="check" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>check</ [...]
<p>We will send a <code>list</code> request to path and return any errors we met.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">check</span><span class="hl-1">();</span>
</code><button>Copy</button></pre>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L193">generated.d.ts:193</a></li></ul></aside></li></ul></section><section class [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L193">generated.d.ts:193</a></li></ul></aside></li></ul></section><section class [...]
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">copy</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">, </span><span class="hl-2">"path/to/dest"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-s [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-s [...]
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">copySync</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">, </span><span class="hl-2">"path/to/dest"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd [...]
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">createDir</span><span class="hl-1">(</span><span class="hl-2">"path/to/dir/"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typ [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typ [...]
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">createDirSync</span><span class="hl-1">(</span><span class="hl-2">"path/to/dir/"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generat [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generat [...]
<a id="md:notes" class="tsd-anchor"></a><h3><a href="#md:notes">Notes</a></h3><p>Delete not existing error won’t return errors.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">delete</span><span class="hl-1">(</span><span class="hl-2">"test"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typ [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typ [...]
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">deleteSync</span><span class="hl-1">(</span><span class="hl-2">"test"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generat [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generat [...]
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">isExist</span><span class="hl-1">(</span><span class="hl-2">"test"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd- [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd- [...]
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">isExistSync</span><span class="hl-1">(</span><span class="hl-2">"test"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/gene [...]
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">layer</span>: <a href="ExternalObject.html" class="tsd-signature-type tsd-kind-class">ExternalObject</a><span class="tsd-signature-symbol"><</span><a href="Layer.html" class="tsd-signature-type tsd-kind-class">Layer</a><span class="tsd-signature-symbol">></span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="Op [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/gene [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">layer</span>: <a href="ExternalObject.html" class="tsd-signature-type tsd-kind-class">ExternalObject</a><span class="tsd-signature-symbol"><</span><a href="Layer.html" class="tsd-signature-type tsd-kind-class">Layer</a><span class="tsd-signature-symbol">></span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="Op [...]
<p>This function will return an array of entries.</p>
<p>An error will be returned if given path doesn't end with <code>/</code>.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">list</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">list</span><span class="hl-1">(</span><span class="hl-2">"path/to/dir/"</span><span class="hl-1">);</span><br/ [...]
@@ -77,7 +77,7 @@
<a id="md:list-recursively" class="tsd-anchor"></a><h4><a href="#md:list-recursively">List recursively</a></h4><p>With <code>recursive</code> option, you can list recursively.</p>
<pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">list</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">list</span><span class="hl-1">(</span><span class="hl-2">"path/to/dir/"</span><span class="hl-1">, { </span><span class="hl-5">recursive:</span><span class="hl-1"> </span><span class="hl-6">true [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><a href="../interfaces/ListOptions.html" class="tsd-signature-type ts [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><a href="../interfaces/ListOptions.html" class="tsd-signature-type ts [...]
<p>This function will return a array of entries.</p>
<p>An error will be returned if given path doesn't end with <code>/</code>.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">list</span><span class="hl-1"> = </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">listSync</span><span class="hl-1">(</span><span class="hl-2">"path/to/dir/"</span><span class="hl-1">);</span><br/><span class="hl-4">for</span><span class="hl-1"> (</s [...]
@@ -85,45 +85,45 @@
<a id="md:list-recursively" class="tsd-anchor"></a><h4><a href="#md:list-recursively">List recursively</a></h4><p>With <code>recursive</code> option, you can list recursively.</p>
<pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">list</span><span class="hl-1"> = </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">listSync</span><span class="hl-1">(</span><span class="hl-2">"path/to/dir/"</span><span class="hl-1">, { </span><span class="hl-5">recursive:</span><span class="hl-1"> </span><span class="hl-6">true</span><span class="hl-1"> });</span><br/><span class= [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><a href="../interfaces/ListOptions.html" class="tsd-signature-type ts [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><a href="../interfaces/ListOptions.html" class="tsd-signature-type ts [...]
<p>Unit of expires is seconds.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">req</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">presignRead</span><span class="hl-1">(</span><span class="hl-5">path</span><span class="hl-1">, </span><span class="hl-0" [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><a href="../i [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><a href="../i [...]
<p>Unit of expires is seconds.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">req</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">presignStat</span><span class="hl-1">(</span><span class="hl-5">path</span><span class="hl-1">, </span><span class="hl-0" [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><a href="../i [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><a href="../i [...]
<p>Unit of expires is seconds.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">req</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">presignWrite</span><span class="hl-1">(</span><span class="hl-5">path</span><span class="hl-1">, </span><span class="hl-0 [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><a href="../i [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><a href="../i [...]
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">buf</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">read</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type ">Buffer</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd- [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type ">Buffer</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd- [...]
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">buf</span><span class="hl-1"> = </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">readSync</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Buffer</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/gene [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Buffer</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/gene [...]
<p>It could be used to read large file in a streaming way.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><a href="Reader.html" class="tsd-signature-type tsd-kind-class">Reader</a><span class="tsd-signature-symbol">></span></h4>< [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><a href="Reader.html" class="tsd-signature-type tsd-kind-class">Reader</a><span class="tsd-signature-symbol">></span></h4>< [...]
<p>It could be used to read large file in a streaming way.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="BlockingReader.html" class="tsd-signature-type tsd-kind-class">BlockingReader</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apach [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="BlockingReader.html" class="tsd-signature-type tsd-kind-class">BlockingReader</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apach [...]
<a id="md:notes" class="tsd-anchor"></a><h3><a href="#md:notes">Notes</a></h3><p>If underlying services support delete in batch, we will use batch delete instead.</p>
<a id="md:examples" class="tsd-anchor"></a><h3><a href="#md:examples">Examples</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">remove</span><span class="hl-1">([</span><span class="hl-2">"abc"</span><span class="hl-1">, </span><span class="hl-2">"def"</span><span class="hl-1">]);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">paths</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&g [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">paths</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&g [...]
<a id="md:notes" class="tsd-anchor"></a><h3><a href="#md:notes">Notes</a></h3><p>If underlying services support delete in batch, we will use batch delete instead.</p>
<a id="md:examples" class="tsd-anchor"></a><h3><a href="#md:examples">Examples</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">removeAll</span><span class="hl-1">(</span><span class="hl-2">"path/to/dir/"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typ [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typ [...]
<p>It's similar to <code>mv</code> command.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">rename</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">, </span><span class="hl-2">"path/to/dest"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-s [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-s [...]
<p>It's similar to <code>mv</code> command.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">renameSync</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">, </span><span class="hl-2">"path/to/dest"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">from</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd [...]
<a id="md:notes" class="tsd-anchor"></a><h3><a href="#md:notes">Notes</a></h3><p>Use stat if you:</p>
<ul>
<li>Want detect the outside changes of path.</li>
@@ -132,17 +132,17 @@
<p>You may want to use <code>metadata</code> if you are working with entries returned by <code>Lister</code>. It’s highly possible that metadata you want has already been cached.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">meta</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">stat</span><span class="hl-1">(</span><span class="hl-2">"test"</span><span class="hl-1">);</span><br/><span c [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><a href="Metadata.html" class="tsd-signature-type tsd-kind-class">Metadata</a><span class="tsd-signature-symbol">></span></ [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><a href="Metadata.html" class="tsd-signature-type tsd-kind-class">Metadata</a><span class="tsd-signature-symbol">></span></ [...]
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">meta</span><span class="hl-1"> = </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">statSync</span><span class="hl-1">(</span><span class="hl-2">"test"</span><span class="hl-1">);</span><br/><span class="hl-4">if</span><span class="hl-1"> (</span><span [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="Metadata.html" class="tsd-signature-type tsd-kind-class">Metadata</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/bl [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="Metadata.html" class="tsd-signature-type tsd-kind-class">Metadata</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/bl [...]
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">write</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">, </span><span class="hl-5">Buffer</span><span class="hl-1">.</span><span class="hl-0">from</span><span class="hl-1">(</span><spa [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="ts [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="ts [...]
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">writeSync</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">, </span><span class="hl-5">Buffer</span><span class="hl-1">.</span><span class="hl-0">from</span><span class="hl-1">(</span><span class="hl-2">"hello world"</span><span cla [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="ts [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="ts [...]
<p>It could be used to write large file in a streaming way.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><a href="Writer.html" class="tsd-signature-type tsd-kind-class">Writer</a><span class="tsd-signature-symbol">></span></h4>< [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><a href="Writer.html" class="tsd-signature-type tsd-kind-class">Writer</a><span class="tsd-signature-symbol">></span></h4>< [...]
<p>It could be used to write large file in a streaming way.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="BlockingWriter.html" class="tsd-signature-type tsd-kind-class">BlockingWriter</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apach [...]
\ No newline at end of file
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <a href="BlockingWriter.html" class="tsd-signature-type tsd-kind-class">BlockingWriter</a></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apach [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Reader.html b/docs/nodejs/classes/Reader.html
index 464e27327b..01501fed45 100644
--- a/docs/nodejs/classes/Reader.html
+++ b/docs/nodejs/classes/Reader.html
@@ -1,11 +1,11 @@
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Reader | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src=".. [...]
manner.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L553">generated.d.ts:553</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/index.d.ts#L27">index.d.ts:27</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L553">generated.d.ts:553</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/index.d.ts#L27">index.d.ts:27</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content [...]
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Reader.html#createReadStream" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>create<wbr/>Read<wbr/>Stream</span></a>
<a href="Reader.html#read" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>read</span></a>
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Rea [...]
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">ReadableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Readable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">ReadableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Readable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
<p>&mut self in async napi methods should be marked as unsafe</p>
</blockquote>
<p>Read bytes from this reader into given buffer.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">buf</span>: <span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">bigint</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-t [...]
\ No newline at end of file
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">buf</span>: <span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">bigint</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-t [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/RetryLayer.html b/docs/nodejs/classes/RetryLayer.html
index 73d17b6979..bf17686195 100644
--- a/docs/nodejs/classes/RetryLayer.html
+++ b/docs/nodejs/classes/RetryLayer.html
@@ -6,27 +6,27 @@ returns true. If operation still failed, this layer will set error to
<p><code>write</code> and <code>blocking_write</code> don't support retry so far, visit <a href="https://github.com/apache/opendal/issues/1223">this issue</a> for more details.</p>
<a id="md:examples" class="tsd-anchor"></a><h1><a href="#md:examples">Examples</a></h1><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">op</span><span class="hl-1"> = </span><span class="hl-6">new</span><span class="hl-1"> </span><span class="hl-0">Operator</span><span class="hl-1">(</span><span class="hl-2">"file"</span><span class="hl-1">, { </span><span class="hl-5">root:</span><span class="hl-1"> </span><spa [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L685">generated.d.ts:685</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L685">generated.d.ts:685</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" ro [...]
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Accessors</h3><div class="tsd-index-list"><a href="RetryLayer.html#factor" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>factor</span></a>
<a href="RetryLayer.html#jitter" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>jitter</span></a>
<a href="RetryLayer.html#maxDelay" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>max<wbr/>Delay</span></a>
<a href="RetryLayer.html#maxTimes" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>max<wbr/>Times</span></a>
<a href="RetryLayer.html#minDelay" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-262144"></use></svg><span>min<wbr/>Delay</span></a>
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="RetryLayer.html#build" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>build</span></a>
-</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Ret [...]
+</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Constructors</h2><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Ret [...]
<a id="md:panics" class="tsd-anchor"></a><h1><a href="#md:panics">Panics</a></h1><p>This function will panic if input factor smaller than <code>1.0</code>.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated. [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated. [...]
<p>If jitter is enabled, ExponentialBackoff will add a random jitter in `[0, min_delay)
to current delay.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">boolean</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">boolean</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated [...]
<p>Delay will not increasing if current delay is larger than max_delay.</p>
<a id="md:notes" class="tsd-anchor"></a><h1><a href="#md:notes">Notes</a></h1><ul>
<li>The unit of max_delay is millisecond.</li>
</ul>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated. [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated. [...]
<p>Backoff will return <code>None</code> if max times is reaching.</p>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated. [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated. [...]
<a id="md:notes" class="tsd-anchor"></a><h1><a href="#md:notes">Notes</a></h1><ul>
<li>The unit of min_delay is millisecond.</li>
</ul>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated. [...]
\ No newline at end of file
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">v</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated. [...]
\ No newline at end of file
diff --git a/docs/nodejs/classes/Writer.html b/docs/nodejs/classes/Writer.html
index 951ce08088..13b75d456c 100644
--- a/docs/nodejs/classes/Writer.html
+++ b/docs/nodejs/classes/Writer.html
@@ -1,6 +1,6 @@
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Writer | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src=".. [...]
manner.</p>
-</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L604">generated.d.ts:604</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/index.d.ts#L37">index.d.ts:37</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content [...]
+</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L604">generated.d.ts:604</a></li><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/index.d.ts#L37">index.d.ts:37</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content [...]
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Writer.html#close" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>close</span></a>
<a href="Writer.html#createWriteStream" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>create<wbr/>Write<wbr/>Stream</span></a>
<a href="Writer.html#write" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2048"></use></svg><span>write</span></a>
@@ -10,11 +10,11 @@ manner.</p>
<p>Close this writer.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">writer</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">writer</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">);</span> [...]
</code><button>Copy</button></pre>
-</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L634">generated.d.ts:634</a></li></ul></aside></li></ul></section><section class [...]
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">WritableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Writable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
+</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L634">generated.d.ts:634</a></li></ul></aside></li></ul></section><section class [...]
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type ">WritableOptions</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Writable</span></h4><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href [...]
<p>&mut self in async napi methods should be marked as unsafe</p>
</blockquote>
<p>Write bytes into this writer.</p>
<a id="md:example" class="tsd-anchor"></a><h3><a href="#md:example">Example</a></h3><pre><code class="language-javascript"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">writer</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">op</span><span class="hl-1">.</span><span class="hl-0">writer</span><span class="hl-1">(</span><span class="hl-2">"path/to/file"</span><span class="hl-1">);</span> [...]
</code><button>Copy</button></pre>
-</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type [...]
\ No newline at end of file
+</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type [...]
\ No newline at end of file
diff --git a/docs/nodejs/interfaces/ListOptions.html b/docs/nodejs/interfaces/ListOptions.html
index 3ba83bf0db..dd2418f31b 100644
--- a/docs/nodejs/interfaces/ListOptions.html
+++ b/docs/nodejs/interfaces/ListOptions.html
@@ -1,3 +1,3 @@
-<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ListOptions | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async sr [...]
+<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ListOptions | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async sr [...]
<a href="ListOptions.html#recursive" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-1024"></use></svg><span>recursive?</span></a>
-</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Properties</h2><section class="tsd-panel tsd-member"><a id="limit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><code class="tsd-tag ts-flagOptional">Optional</code> <span>limit</span><a href="#limit" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">li [...]
\ No newline at end of file
+</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Properties</h2><section class="tsd-panel tsd-member"><a id="limit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><code class="tsd-tag ts-flagOptional">Optional</code> <span>limit</span><a href="#limit" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">li [...]
\ No newline at end of file
diff --git a/docs/nodejs/interfaces/PresignedRequest.html b/docs/nodejs/interfaces/PresignedRequest.html
index 861ab53ab3..1c78d3e1cf 100644
--- a/docs/nodejs/interfaces/PresignedRequest.html
+++ b/docs/nodejs/interfaces/PresignedRequest.html
@@ -1,8 +1,8 @@
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>PresignedRequest | Apache OpenDAL™ - v0.45.2</title><meta name="description" content="Documentation for Apache OpenDAL™"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script asy [...]
-</div><div class="tsd-comment tsd-typography"></div></section><div class="tsd-signature"><span class="tsd-signature-keyword">interface </span><span class="tsd-kind-interface">PresignedRequest </span><span class="tsd-signature-symbol">{ </span><br/><span> </span><a class="tsd-kind-property" href="PresignedRequest.html#headers">headers</a><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type ">Record</span><span class="tsd-signature-symbol"><</span><span class=" [...]
+</div><div class="tsd-comment tsd-typography"></div></section><div class="tsd-signature"><span class="tsd-signature-keyword">interface </span><span class="tsd-kind-interface">PresignedRequest </span><span class="tsd-signature-symbol">{ </span><br/><span> </span><a class="tsd-kind-property" href="PresignedRequest.html#headers">headers</a><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type ">Record</span><span class="tsd-signature-symbol"><</span><span class=" [...]
<a href="PresignedRequest.html#method" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-1024"></use></svg><span>method</span></a>
<a href="PresignedRequest.html#url" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-1024"></use></svg><span>url</span></a>
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Properties</h2><section class="tsd-panel tsd-member"><a id="headers" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>headers</span><a href="#headers" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">headers</span><span class="tsd-signature-symbol">: [...]
-</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L42">generated.d.ts:42</a></li></ul></aside></section><section class="tsd-panel tsd-member"><a id="method" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>method</span><a href="#method" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a [...]
-</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L38">generated.d.ts:38</a></li></ul></aside></section><section class="tsd-panel tsd-member"><a id="url" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>url</span><a href="#url" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><di [...]
-</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/5ae4095/bindings/nodejs/generated.d.ts#L40">generated.d.ts:40</a></li></ul></aside></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="# [...]
\ No newline at end of file
+</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L42">generated.d.ts:42</a></li></ul></aside></section><section class="tsd-panel tsd-member"><a id="method" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>method</span><a href="#method" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a [...]
+</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L38">generated.d.ts:38</a></li></ul></aside></section><section class="tsd-panel tsd-member"><a id="url" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>url</span><a href="#url" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3><di [...]
+</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/apache/opendal/blob/08b2a96/bindings/nodejs/generated.d.ts#L40">generated.d.ts:40</a></li></ul></aside></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="# [...]
\ No newline at end of file
diff --git a/docs/overview/index.html b/docs/overview/index.html
index 3705523981..521f187ce1 100644
--- a/docs/overview/index.html
+++ b/docs/overview/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Welcome to Apache OpenDAL™ | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/overview"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en">< [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/python/opendal.html b/docs/python/opendal.html
index 5a890d92bd..5f400611c2 100644
--- a/docs/python/opendal.html
+++ b/docs/python/opendal.html
@@ -246,22 +246,22 @@
<a class="class" href="#Metadata">Metadata</a>
<ul class="memberlist">
<li>
- <a class="variable" href="#Metadata.content_md5">content_md5</a>
+ <a class="variable" href="#Metadata.content_length">content_length</a>
</li>
<li>
- <a class="variable" href="#Metadata.content_length">content_length</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_disposition">content_disposition</a>
+ <a class="variable" href="#Metadata.content_md5">content_md5</a>
</li>
<li>
- <a class="variable" href="#Metadata.content_type">content_type</a>
+ <a class="variable" href="#Metadata.content_disposition">content_disposition</a>
</li>
<li>
- <a class="variable" href="#Metadata.etag">etag</a>
+ <a class="variable" href="#Metadata.content_type">content_type</a>
</li>
</ul>
@@ -270,10 +270,10 @@
<a class="class" href="#PresignedRequest">PresignedRequest</a>
<ul class="memberlist">
<li>
- <a class="variable" href="#PresignedRequest.url">url</a>
+ <a class="variable" href="#PresignedRequest.headers">headers</a>
</li>
<li>
- <a class="variable" href="#PresignedRequest.headers">headers</a>
+ <a class="variable" href="#PresignedRequest.url">url</a>
</li>
<li>
<a class="variable" href="#PresignedRequest.method">method</a>
@@ -285,112 +285,112 @@
<a class="class" href="#Capability">Capability</a>
<ul class="memberlist">
<li>
- <a class="variable" href="#Capability.read_with_if_match">read_with_if_match</a>
+ <a class="variable" href="#Capability.read">read</a>
</li>
<li>
- <a class="variable" href="#Capability.create_dir">create_dir</a>
+ <a class="variable" href="#Capability.stat_with_if_match">stat_with_if_match</a>
</li>
<li>
- <a class="variable" href="#Capability.write">write</a>
+ <a class="variable" href="#Capability.stat">stat</a>
</li>
<li>
- <a class="variable" href="#Capability.write_total_max_size">write_total_max_size</a>
+ <a class="variable" href="#Capability.read_with_override_content_disposition">read_with_override_content_disposition</a>
</li>
<li>
- <a class="variable" href="#Capability.write_can_empty">write_can_empty</a>
+ <a class="variable" href="#Capability.write">write</a>
</li>
<li>
- <a class="variable" href="#Capability.batch">batch</a>
+ <a class="variable" href="#Capability.write_multi_min_size">write_multi_min_size</a>
</li>
<li>
- <a class="variable" href="#Capability.read">read</a>
+ <a class="variable" href="#Capability.write_with_content_disposition">write_with_content_disposition</a>
</li>
<li>
- <a class="variable" href="#Capability.write_multi_align_size">write_multi_align_size</a>
+ <a class="variable" href="#Capability.list_with_recursive">list_with_recursive</a>
</li>
<li>
- <a class="variable" href="#Capability.batch_delete">batch_delete</a>
+ <a class="variable" href="#Capability.read_with_if_none_match">read_with_if_none_match</a>
</li>
<li>
- <a class="variable" href="#Capability.stat_with_if_none_match">stat_with_if_none_match</a>
+ <a class="variable" href="#Capability.write_can_multi">write_can_multi</a>
</li>
<li>
- <a class="variable" href="#Capability.batch_max_operations">batch_max_operations</a>
+ <a class="variable" href="#Capability.presign_read">presign_read</a>
</li>
<li>
- <a class="variable" href="#Capability.list_with_start_after">list_with_start_after</a>
+ <a class="variable" href="#Capability.presign_stat">presign_stat</a>
</li>
<li>
- <a class="variable" href="#Capability.write_can_multi">write_can_multi</a>
+ <a class="variable" href="#Capability.blocking">blocking</a>
</li>
<li>
- <a class="variable" href="#Capability.presign">presign</a>
+ <a class="variable" href="#Capability.write_with_cache_control">write_with_cache_control</a>
</li>
<li>
- <a class="variable" href="#Capability.write_multi_min_size">write_multi_min_size</a>
+ <a class="variable" href="#Capability.copy">copy</a>
</li>
<li>
- <a class="variable" href="#Capability.read_with_override_cache_control">read_with_override_cache_control</a>
+ <a class="variable" href="#Capability.list">list</a>
</li>
<li>
- <a class="variable" href="#Capability.delete">delete</a>
+ <a class="variable" href="#Capability.rename">rename</a>
</li>
<li>
- <a class="variable" href="#Capability.stat_with_if_match">stat_with_if_match</a>
+ <a class="variable" href="#Capability.presign">presign</a>
</li>
<li>
- <a class="variable" href="#Capability.write_with_content_type">write_with_content_type</a>
+ <a class="variable" href="#Capability.write_can_append">write_can_append</a>
</li>
<li>
- <a class="variable" href="#Capability.list">list</a>
+ <a class="variable" href="#Capability.write_multi_max_size">write_multi_max_size</a>
</li>
<li>
- <a class="variable" href="#Capability.list_with_limit">list_with_limit</a>
+ <a class="variable" href="#Capability.read_with_override_cache_control">read_with_override_cache_control</a>
</li>
<li>
- <a class="variable" href="#Capability.write_multi_max_size">write_multi_max_size</a>
+ <a class="variable" href="#Capability.write_multi_align_size">write_multi_align_size</a>
</li>
<li>
- <a class="variable" href="#Capability.write_with_content_disposition">write_with_content_disposition</a>
+ <a class="variable" href="#Capability.write_can_empty">write_can_empty</a>
</li>
<li>
- <a class="variable" href="#Capability.write_with_cache_control">write_with_cache_control</a>
+ <a class="variable" href="#Capability.list_with_limit">list_with_limit</a>
</li>
<li>
- <a class="variable" href="#Capability.read_with_override_content_disposition">read_with_override_content_disposition</a>
+ <a class="variable" href="#Capability.write_with_content_type">write_with_content_type</a>
</li>
<li>
- <a class="variable" href="#Capability.write_can_append">write_can_append</a>
+ <a class="variable" href="#Capability.write_total_max_size">write_total_max_size</a>
</li>
<li>
- <a class="variable" href="#Capability.stat">stat</a>
+ <a class="variable" href="#Capability.batch_max_operations">batch_max_operations</a>
</li>
<li>
- <a class="variable" href="#Capability.presign_read">presign_read</a>
+ <a class="variable" href="#Capability.delete">delete</a>
</li>
<li>
- <a class="variable" href="#Capability.copy">copy</a>
+ <a class="variable" href="#Capability.list_with_start_after">list_with_start_after</a>
</li>
<li>
- <a class="variable" href="#Capability.presign_stat">presign_stat</a>
+ <a class="variable" href="#Capability.stat_with_if_none_match">stat_with_if_none_match</a>
</li>
<li>
- <a class="variable" href="#Capability.blocking">blocking</a>
+ <a class="variable" href="#Capability.presign_write">presign_write</a>
</li>
<li>
- <a class="variable" href="#Capability.read_with_if_none_match">read_with_if_none_match</a>
+ <a class="variable" href="#Capability.create_dir">create_dir</a>
</li>
<li>
- <a class="variable" href="#Capability.list_with_recursive">list_with_recursive</a>
+ <a class="variable" href="#Capability.batch">batch</a>
</li>
<li>
- <a class="variable" href="#Capability.read_with_override_content_type">read_with_override_content_type</a>
+ <a class="variable" href="#Capability.batch_delete">batch_delete</a>
</li>
<li>
- <a class="variable" href="#Capability.rename">rename</a>
+ <a class="variable" href="#Capability.read_with_if_match">read_with_if_match</a>
</li>
<li>
- <a class="variable" href="#Capability.presign_write">presign_write</a>
+ <a class="variable" href="#Capability.read_with_override_content_type">read_with_override_content_type</a>
</li>
</ul>
@@ -1456,28 +1456,28 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
- <div id="Metadata.content_md5" class="classattr">
+ <div id="Metadata.content_length" class="classattr">
<div class="attr variable">
- <span class="name">content_md5</span><span class="annotation">: Optional[str]</span>
+ <span class="name">content_length</span><span class="annotation">: int</span>
</div>
- <a class="headerlink" href="#Metadata.content_md5"></a>
+ <a class="headerlink" href="#Metadata.content_length"></a>
- <div class="docstring"><p>Content MD5 of this entry.</p>
+ <div class="docstring"><p>Content length of this entry.</p>
</div>
</div>
- <div id="Metadata.content_length" class="classattr">
+ <div id="Metadata.etag" class="classattr">
<div class="attr variable">
- <span class="name">content_length</span><span class="annotation">: int</span>
+ <span class="name">etag</span><span class="annotation">: Optional[str]</span>
</div>
- <a class="headerlink" href="#Metadata.content_length"></a>
+ <a class="headerlink" href="#Metadata.etag"></a>
- <div class="docstring"><p>Content length of this entry.</p>
+ <div class="docstring"><p>ETag of this entry.</p>
</div>
@@ -1494,6 +1494,19 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
</div>
+ </div>
+ <div id="Metadata.content_md5" class="classattr">
+ <div class="attr variable">
+ <span class="name">content_md5</span><span class="annotation">: Optional[str]</span>
+
+
+ </div>
+ <a class="headerlink" href="#Metadata.content_md5"></a>
+
+ <div class="docstring"><p>Content MD5 of this entry.</p>
+</div>
+
+
</div>
<div id="Metadata.content_disposition" class="classattr">
<div class="attr variable">
@@ -1518,19 +1531,6 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
</div>
- </div>
- <div id="Metadata.etag" class="classattr">
- <div class="attr variable">
- <span class="name">etag</span><span class="annotation">: Optional[str]</span>
-
-
- </div>
- <a class="headerlink" href="#Metadata.etag"></a>
-
- <div class="docstring"><p>ETag of this entry.</p>
-</div>
-
-
</div>
</section>
<section id="PresignedRequest">
@@ -1545,28 +1545,28 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
- <div id="PresignedRequest.url" class="classattr">
+ <div id="PresignedRequest.headers" class="classattr">
<div class="attr variable">
- <span class="name">url</span><span class="annotation">: str</span>
+ <span class="name">headers</span><span class="annotation">: dict[str, str]</span>
</div>
- <a class="headerlink" href="#PresignedRequest.url"></a>
+ <a class="headerlink" href="#PresignedRequest.headers"></a>
- <div class="docstring"><p>Return the URL of this request.</p>
+ <div class="docstring"><p>Return the HTTP headers of this request.</p>
</div>
</div>
- <div id="PresignedRequest.headers" class="classattr">
+ <div id="PresignedRequest.url" class="classattr">
<div class="attr variable">
- <span class="name">headers</span><span class="annotation">: dict[str, str]</span>
+ <span class="name">url</span><span class="annotation">: str</span>
</div>
- <a class="headerlink" href="#PresignedRequest.headers"></a>
+ <a class="headerlink" href="#PresignedRequest.url"></a>
- <div class="docstring"><p>Return the HTTP headers of this request.</p>
+ <div class="docstring"><p>Return the URL of this request.</p>
</div>
@@ -1600,478 +1600,478 @@ by current Operator.</p>
</div>
- <div id="Capability.read_with_if_match" class="classattr">
+ <div id="Capability.read" class="classattr">
<div class="attr variable">
- <span class="name">read_with_if_match</span><span class="annotation">: bool</span>
+ <span class="name">read</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.read_with_if_match"></a>
+ <a class="headerlink" href="#Capability.read"></a>
- <div class="docstring"><p>If operator supports read with if match.</p>
+ <div class="docstring"><p>If operator supports read.</p>
</div>
</div>
- <div id="Capability.create_dir" class="classattr">
+ <div id="Capability.stat_with_if_match" class="classattr">
<div class="attr variable">
- <span class="name">create_dir</span><span class="annotation">: bool</span>
+ <span class="name">stat_with_if_match</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.create_dir"></a>
+ <a class="headerlink" href="#Capability.stat_with_if_match"></a>
- <div class="docstring"><p>If operator supports create dir.</p>
+ <div class="docstring"><p>If operator supports stat with if match.</p>
</div>
</div>
- <div id="Capability.write" class="classattr">
+ <div id="Capability.stat" class="classattr">
<div class="attr variable">
- <span class="name">write</span><span class="annotation">: bool</span>
+ <span class="name">stat</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.write"></a>
+ <a class="headerlink" href="#Capability.stat"></a>
- <div class="docstring"><p>If operator supports write.</p>
+ <div class="docstring"><p>If operator supports stat.</p>
</div>
</div>
- <div id="Capability.write_total_max_size" class="classattr">
+ <div id="Capability.read_with_override_content_disposition" class="classattr">
<div class="attr variable">
- <span class="name">write_total_max_size</span><span class="annotation">: Optional[int]</span>
+ <span class="name">read_with_override_content_disposition</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.write_total_max_size"></a>
+ <a class="headerlink" href="#Capability.read_with_override_content_disposition"></a>
- <div class="docstring"><p>write_total_max_size is the max size that services support in write_total.</p>
-
-<p>For example, Cloudflare D1 supports 1MB as max in write_total.</p>
+ <div class="docstring"><p>if operator supports read with override content disposition.</p>
</div>
</div>
- <div id="Capability.write_can_empty" class="classattr">
+ <div id="Capability.write" class="classattr">
<div class="attr variable">
- <span class="name">write_can_empty</span><span class="annotation">: bool</span>
+ <span class="name">write</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.write_can_empty"></a>
+ <a class="headerlink" href="#Capability.write"></a>
- <div class="docstring"><p>If operator supports write with empty content.</p>
+ <div class="docstring"><p>If operator supports write.</p>
</div>
</div>
- <div id="Capability.batch" class="classattr">
+ <div id="Capability.write_multi_min_size" class="classattr">
<div class="attr variable">
- <span class="name">batch</span><span class="annotation">: bool</span>
+ <span class="name">write_multi_min_size</span><span class="annotation">: Optional[int]</span>
</div>
- <a class="headerlink" href="#Capability.batch"></a>
+ <a class="headerlink" href="#Capability.write_multi_min_size"></a>
- <div class="docstring"><p>If operator supports batch.</p>
+ <div class="docstring"><p>write_multi_min_size is the min size that services support in write_multi.</p>
+
+<p>For example, AWS S3 requires at least 5MiB in write_multi expect the last one.</p>
</div>
</div>
- <div id="Capability.read" class="classattr">
+ <div id="Capability.write_with_content_disposition" class="classattr">
<div class="attr variable">
- <span class="name">read</span><span class="annotation">: bool</span>
+ <span class="name">write_with_content_disposition</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.read"></a>
+ <a class="headerlink" href="#Capability.write_with_content_disposition"></a>
- <div class="docstring"><p>If operator supports read.</p>
+ <div class="docstring"><p>If operator supports write with content disposition.</p>
</div>
</div>
- <div id="Capability.write_multi_align_size" class="classattr">
+ <div id="Capability.list_with_recursive" class="classattr">
<div class="attr variable">
- <span class="name">write_multi_align_size</span><span class="annotation">: Optional[int]</span>
+ <span class="name">list_with_recursive</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.write_multi_align_size"></a>
+ <a class="headerlink" href="#Capability.list_with_recursive"></a>
- <div class="docstring"><p>write_multi_align_size is the align size that services required in write_multi.</p>
-
-<p>For example, Google GCS requires align size to 256KiB in write_multi.</p>
+ <div class="docstring"><p>If backend supports list without delimiter.</p>
</div>
</div>
- <div id="Capability.batch_delete" class="classattr">
+ <div id="Capability.read_with_if_none_match" class="classattr">
<div class="attr variable">
- <span class="name">batch_delete</span><span class="annotation">: bool</span>
+ <span class="name">read_with_if_none_match</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.batch_delete"></a>
+ <a class="headerlink" href="#Capability.read_with_if_none_match"></a>
- <div class="docstring"><p>If operator supports batch delete.</p>
+ <div class="docstring"><p>If operator supports read with if none match.</p>
</div>
</div>
- <div id="Capability.stat_with_if_none_match" class="classattr">
+ <div id="Capability.write_can_multi" class="classattr">
<div class="attr variable">
- <span class="name">stat_with_if_none_match</span><span class="annotation">: bool</span>
+ <span class="name">write_can_multi</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.stat_with_if_none_match"></a>
+ <a class="headerlink" href="#Capability.write_can_multi"></a>
- <div class="docstring"><p>If operator supports stat with if none match.</p>
+ <div class="docstring"><p>If operator supports write can be called in multi times.</p>
</div>
</div>
- <div id="Capability.batch_max_operations" class="classattr">
+ <div id="Capability.presign_read" class="classattr">
<div class="attr variable">
- <span class="name">batch_max_operations</span><span class="annotation">: Optional[int]</span>
+ <span class="name">presign_read</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.batch_max_operations"></a>
+ <a class="headerlink" href="#Capability.presign_read"></a>
- <div class="docstring"><p>The max operations that operator supports in batch.</p>
+ <div class="docstring"><p>If operator supports presign read.</p>
</div>
</div>
- <div id="Capability.list_with_start_after" class="classattr">
+ <div id="Capability.presign_stat" class="classattr">
<div class="attr variable">
- <span class="name">list_with_start_after</span><span class="annotation">: bool</span>
+ <span class="name">presign_stat</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.list_with_start_after"></a>
+ <a class="headerlink" href="#Capability.presign_stat"></a>
- <div class="docstring"><p>If backend supports list with start after.</p>
+ <div class="docstring"><p>If operator supports presign stat.</p>
</div>
</div>
- <div id="Capability.write_can_multi" class="classattr">
+ <div id="Capability.blocking" class="classattr">
<div class="attr variable">
- <span class="name">write_can_multi</span><span class="annotation">: bool</span>
+ <span class="name">blocking</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.write_can_multi"></a>
+ <a class="headerlink" href="#Capability.blocking"></a>
- <div class="docstring"><p>If operator supports write can be called in multi times.</p>
+ <div class="docstring"><p>If operator supports blocking.</p>
</div>
</div>
- <div id="Capability.presign" class="classattr">
+ <div id="Capability.write_with_cache_control" class="classattr">
<div class="attr variable">
- <span class="name">presign</span><span class="annotation">: bool</span>
+ <span class="name">write_with_cache_control</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.presign"></a>
+ <a class="headerlink" href="#Capability.write_with_cache_control"></a>
- <div class="docstring"><p>If operator supports presign.</p>
+ <div class="docstring"><p>If operator supports write with cache control.</p>
</div>
</div>
- <div id="Capability.write_multi_min_size" class="classattr">
+ <div id="Capability.copy" class="classattr">
<div class="attr variable">
- <span class="name">write_multi_min_size</span><span class="annotation">: Optional[int]</span>
+ <span class="name">copy</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.write_multi_min_size"></a>
+ <a class="headerlink" href="#Capability.copy"></a>
- <div class="docstring"><p>write_multi_min_size is the min size that services support in write_multi.</p>
-
-<p>For example, AWS S3 requires at least 5MiB in write_multi expect the last one.</p>
+ <div class="docstring"><p>If operator supports copy.</p>
</div>
</div>
- <div id="Capability.read_with_override_cache_control" class="classattr">
+ <div id="Capability.list" class="classattr">
<div class="attr variable">
- <span class="name">read_with_override_cache_control</span><span class="annotation">: bool</span>
+ <span class="name">list</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.read_with_override_cache_control"></a>
+ <a class="headerlink" href="#Capability.list"></a>
- <div class="docstring"><p>if operator supports read with override cache control.</p>
+ <div class="docstring"><p>If operator supports list.</p>
</div>
</div>
- <div id="Capability.delete" class="classattr">
+ <div id="Capability.rename" class="classattr">
<div class="attr variable">
- <span class="name">delete</span><span class="annotation">: bool</span>
+ <span class="name">rename</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.delete"></a>
+ <a class="headerlink" href="#Capability.rename"></a>
- <div class="docstring"><p>If operator supports delete.</p>
+ <div class="docstring"><p>If operator supports rename.</p>
</div>
</div>
- <div id="Capability.stat_with_if_match" class="classattr">
+ <div id="Capability.presign" class="classattr">
<div class="attr variable">
- <span class="name">stat_with_if_match</span><span class="annotation">: bool</span>
+ <span class="name">presign</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.stat_with_if_match"></a>
+ <a class="headerlink" href="#Capability.presign"></a>
- <div class="docstring"><p>If operator supports stat with if match.</p>
+ <div class="docstring"><p>If operator supports presign.</p>
</div>
</div>
- <div id="Capability.write_with_content_type" class="classattr">
+ <div id="Capability.write_can_append" class="classattr">
<div class="attr variable">
- <span class="name">write_with_content_type</span><span class="annotation">: bool</span>
+ <span class="name">write_can_append</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.write_with_content_type"></a>
+ <a class="headerlink" href="#Capability.write_can_append"></a>
- <div class="docstring"><p>If operator supports write with content type.</p>
+ <div class="docstring"><p>If operator supports write by append.</p>
</div>
</div>
- <div id="Capability.list" class="classattr">
+ <div id="Capability.write_multi_max_size" class="classattr">
<div class="attr variable">
- <span class="name">list</span><span class="annotation">: bool</span>
+ <span class="name">write_multi_max_size</span><span class="annotation">: Optional[int]</span>
</div>
- <a class="headerlink" href="#Capability.list"></a>
+ <a class="headerlink" href="#Capability.write_multi_max_size"></a>
- <div class="docstring"><p>If operator supports list.</p>
+ <div class="docstring"><p>write_multi_max_size is the max size that services support in write_multi.</p>
+
+<p>For example, AWS S3 supports 5GiB as max in write_multi.</p>
</div>
</div>
- <div id="Capability.list_with_limit" class="classattr">
+ <div id="Capability.read_with_override_cache_control" class="classattr">
<div class="attr variable">
- <span class="name">list_with_limit</span><span class="annotation">: bool</span>
+ <span class="name">read_with_override_cache_control</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.list_with_limit"></a>
+ <a class="headerlink" href="#Capability.read_with_override_cache_control"></a>
- <div class="docstring"><p>If backend supports list with limit.</p>
+ <div class="docstring"><p>if operator supports read with override cache control.</p>
</div>
</div>
- <div id="Capability.write_multi_max_size" class="classattr">
+ <div id="Capability.write_multi_align_size" class="classattr">
<div class="attr variable">
- <span class="name">write_multi_max_size</span><span class="annotation">: Optional[int]</span>
+ <span class="name">write_multi_align_size</span><span class="annotation">: Optional[int]</span>
</div>
- <a class="headerlink" href="#Capability.write_multi_max_size"></a>
+ <a class="headerlink" href="#Capability.write_multi_align_size"></a>
- <div class="docstring"><p>write_multi_max_size is the max size that services support in write_multi.</p>
+ <div class="docstring"><p>write_multi_align_size is the align size that services required in write_multi.</p>
-<p>For example, AWS S3 supports 5GiB as max in write_multi.</p>
+<p>For example, Google GCS requires align size to 256KiB in write_multi.</p>
</div>
</div>
- <div id="Capability.write_with_content_disposition" class="classattr">
+ <div id="Capability.write_can_empty" class="classattr">
<div class="attr variable">
- <span class="name">write_with_content_disposition</span><span class="annotation">: bool</span>
+ <span class="name">write_can_empty</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.write_with_content_disposition"></a>
+ <a class="headerlink" href="#Capability.write_can_empty"></a>
- <div class="docstring"><p>If operator supports write with content disposition.</p>
+ <div class="docstring"><p>If operator supports write with empty content.</p>
</div>
</div>
- <div id="Capability.write_with_cache_control" class="classattr">
+ <div id="Capability.list_with_limit" class="classattr">
<div class="attr variable">
- <span class="name">write_with_cache_control</span><span class="annotation">: bool</span>
+ <span class="name">list_with_limit</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.write_with_cache_control"></a>
+ <a class="headerlink" href="#Capability.list_with_limit"></a>
- <div class="docstring"><p>If operator supports write with cache control.</p>
+ <div class="docstring"><p>If backend supports list with limit.</p>
</div>
</div>
- <div id="Capability.read_with_override_content_disposition" class="classattr">
+ <div id="Capability.write_with_content_type" class="classattr">
<div class="attr variable">
- <span class="name">read_with_override_content_disposition</span><span class="annotation">: bool</span>
+ <span class="name">write_with_content_type</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.read_with_override_content_disposition"></a>
+ <a class="headerlink" href="#Capability.write_with_content_type"></a>
- <div class="docstring"><p>if operator supports read with override content disposition.</p>
+ <div class="docstring"><p>If operator supports write with content type.</p>
</div>
</div>
- <div id="Capability.write_can_append" class="classattr">
+ <div id="Capability.write_total_max_size" class="classattr">
<div class="attr variable">
- <span class="name">write_can_append</span><span class="annotation">: bool</span>
+ <span class="name">write_total_max_size</span><span class="annotation">: Optional[int]</span>
</div>
- <a class="headerlink" href="#Capability.write_can_append"></a>
+ <a class="headerlink" href="#Capability.write_total_max_size"></a>
- <div class="docstring"><p>If operator supports write by append.</p>
+ <div class="docstring"><p>write_total_max_size is the max size that services support in write_total.</p>
+
+<p>For example, Cloudflare D1 supports 1MB as max in write_total.</p>
</div>
</div>
- <div id="Capability.stat" class="classattr">
+ <div id="Capability.batch_max_operations" class="classattr">
<div class="attr variable">
- <span class="name">stat</span><span class="annotation">: bool</span>
+ <span class="name">batch_max_operations</span><span class="annotation">: Optional[int]</span>
</div>
- <a class="headerlink" href="#Capability.stat"></a>
+ <a class="headerlink" href="#Capability.batch_max_operations"></a>
- <div class="docstring"><p>If operator supports stat.</p>
+ <div class="docstring"><p>The max operations that operator supports in batch.</p>
</div>
</div>
- <div id="Capability.presign_read" class="classattr">
+ <div id="Capability.delete" class="classattr">
<div class="attr variable">
- <span class="name">presign_read</span><span class="annotation">: bool</span>
+ <span class="name">delete</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.presign_read"></a>
+ <a class="headerlink" href="#Capability.delete"></a>
- <div class="docstring"><p>If operator supports presign read.</p>
+ <div class="docstring"><p>If operator supports delete.</p>
</div>
</div>
- <div id="Capability.copy" class="classattr">
+ <div id="Capability.list_with_start_after" class="classattr">
<div class="attr variable">
- <span class="name">copy</span><span class="annotation">: bool</span>
+ <span class="name">list_with_start_after</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.copy"></a>
+ <a class="headerlink" href="#Capability.list_with_start_after"></a>
- <div class="docstring"><p>If operator supports copy.</p>
+ <div class="docstring"><p>If backend supports list with start after.</p>
</div>
</div>
- <div id="Capability.presign_stat" class="classattr">
+ <div id="Capability.stat_with_if_none_match" class="classattr">
<div class="attr variable">
- <span class="name">presign_stat</span><span class="annotation">: bool</span>
+ <span class="name">stat_with_if_none_match</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.presign_stat"></a>
+ <a class="headerlink" href="#Capability.stat_with_if_none_match"></a>
- <div class="docstring"><p>If operator supports presign stat.</p>
+ <div class="docstring"><p>If operator supports stat with if none match.</p>
</div>
</div>
- <div id="Capability.blocking" class="classattr">
+ <div id="Capability.presign_write" class="classattr">
<div class="attr variable">
- <span class="name">blocking</span><span class="annotation">: bool</span>
+ <span class="name">presign_write</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.blocking"></a>
+ <a class="headerlink" href="#Capability.presign_write"></a>
- <div class="docstring"><p>If operator supports blocking.</p>
+ <div class="docstring"><p>If operator supports presign write.</p>
</div>
</div>
- <div id="Capability.read_with_if_none_match" class="classattr">
+ <div id="Capability.create_dir" class="classattr">
<div class="attr variable">
- <span class="name">read_with_if_none_match</span><span class="annotation">: bool</span>
+ <span class="name">create_dir</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.read_with_if_none_match"></a>
+ <a class="headerlink" href="#Capability.create_dir"></a>
- <div class="docstring"><p>If operator supports read with if none match.</p>
+ <div class="docstring"><p>If operator supports create dir.</p>
</div>
</div>
- <div id="Capability.list_with_recursive" class="classattr">
+ <div id="Capability.batch" class="classattr">
<div class="attr variable">
- <span class="name">list_with_recursive</span><span class="annotation">: bool</span>
+ <span class="name">batch</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.list_with_recursive"></a>
+ <a class="headerlink" href="#Capability.batch"></a>
- <div class="docstring"><p>If backend supports list without delimiter.</p>
+ <div class="docstring"><p>If operator supports batch.</p>
</div>
</div>
- <div id="Capability.read_with_override_content_type" class="classattr">
+ <div id="Capability.batch_delete" class="classattr">
<div class="attr variable">
- <span class="name">read_with_override_content_type</span><span class="annotation">: bool</span>
+ <span class="name">batch_delete</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.read_with_override_content_type"></a>
+ <a class="headerlink" href="#Capability.batch_delete"></a>
- <div class="docstring"><p>if operator supports read with override content type.</p>
+ <div class="docstring"><p>If operator supports batch delete.</p>
</div>
</div>
- <div id="Capability.rename" class="classattr">
+ <div id="Capability.read_with_if_match" class="classattr">
<div class="attr variable">
- <span class="name">rename</span><span class="annotation">: bool</span>
+ <span class="name">read_with_if_match</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.rename"></a>
+ <a class="headerlink" href="#Capability.read_with_if_match"></a>
- <div class="docstring"><p>If operator supports rename.</p>
+ <div class="docstring"><p>If operator supports read with if match.</p>
</div>
</div>
- <div id="Capability.presign_write" class="classattr">
+ <div id="Capability.read_with_override_content_type" class="classattr">
<div class="attr variable">
- <span class="name">presign_write</span><span class="annotation">: bool</span>
+ <span class="name">read_with_override_content_type</span><span class="annotation">: bool</span>
</div>
- <a class="headerlink" href="#Capability.presign_write"></a>
+ <a class="headerlink" href="#Capability.read_with_override_content_type"></a>
- <div class="docstring"><p>If operator supports presign write.</p>
+ <div class="docstring"><p>if operator supports read with override content type.</p>
</div>
diff --git a/docs/python/search.js b/docs/python/search.js
index 809aad26b9..664f43abe5 100644
--- a/docs/python/search.js
+++ b/docs/python/search.js
@@ -1,6 +1,6 @@
window.pdocSearch = (function(){
/** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.wa [...]
- /** pdoc search index */const docs = {"version": "0.9.5", "fields": ["qualname", "fullname", "annotation", "default_value", "signature", "bases", "doc"], "ref": "fullname", "documentStore": {"docs": {"opendal": {"fullname": "opendal", "modulename": "opendal", "kind": "module", "doc": "<p>Apache OpenDAL\u2122 Python binding</p>\n\n<h2 id=\"installation\">Installation</h2>\n\n<div class=\"pdoc-code codehilite\">\n<pre><span></span><code>pip<span class=\"w\"> </span>install<span class=\ [...]
+ /** pdoc search index */const docs = {"version": "0.9.5", "fields": ["qualname", "fullname", "annotation", "default_value", "signature", "bases", "doc"], "ref": "fullname", "documentStore": {"docs": {"opendal": {"fullname": "opendal", "modulename": "opendal", "kind": "module", "doc": "<p>Apache OpenDAL\u2122 Python binding</p>\n\n<h2 id=\"installation\">Installation</h2>\n\n<div class=\"pdoc-code codehilite\">\n<pre><span></span><code>pip<span class=\"w\"> </span>install<span class=\ [...]
// mirrored in build-search-index.js (part 1)
// Also split on html tags. this is a cheap heuristic, but good enough.
diff --git a/docs/quickstart/index.html b/docs/quickstart/index.html
index 27721d5772..a438d70815 100644
--- a/docs/quickstart/index.html
+++ b/docs/quickstart/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Quickstart | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/quickstart"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh=" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/rust/opendal/all.html b/docs/rust/opendal/all.html
index a8ba7a3915..3b1fb03b99 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><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a781e4970d [...]
\ 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><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a781e4970d [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/enum.EntryMode.html b/docs/rust/opendal/enum.EntryMode.html
index d308ee8766..fdeb6f8c3c 100644
--- a/docs/rust/opendal/enum.EntryMode.html
+++ b/docs/rust/opendal/enum.EntryMode.html
@@ -8,7 +8,7 @@
</div><section id="variant.Unknown" class="variant"><a href="#variant.Unknown" class="anchor">§</a><h3 class="code-header">Unknown</h3></section><div class="docblock"><p>Unknown means we don’t know what we can do on this path.</p>
</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-EntryMode" class="impl"><a class="src rightside" href="../src/opendal/types/mode.rs.html#32-52">source</a><a href="#impl-EntryMode" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.EntryMode.html" title="enum opendal::EntryMode">En [...]
</div></details><details class="toggle method-toggle" open><summary><section id="method.is_dir" class="method"><a class="src rightside" href="../src/opendal/types/mode.rs.html#39-41">source</a><h4 class="code-header">pub fn <a href="#method.is_dir" class="fn">is_dir</a>(self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Check if this mode is DIR.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-EntryMode" class="impl"><a class="src rightside" href="../src/opendal/types/mode.rs.html#22">source</a><a href="#impl-Clone-for-EntryMode" class="anchor">§</a><h3 class="code-header">impl <a class=" [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-EntryMode" class="impl"><a class="src rightside" href="../src/opendal/types/mode.rs.html#22">source</a><a href="#impl-Clone-for-EntryMode" class="anchor">§</a><h3 class="code-header">impl <a class=" [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Copy-for-EntryMode" class="impl"><a class="src rightside" href="../src/opendal/types/mode.rs.html#22">source</a><a href="#impl-Copy-for-EntryMode" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a> for <a class="enum" href="enum.EntryMode.html" title [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
diff --git a/docs/rust/opendal/enum.ErrorKind.html b/docs/rust/opendal/enum.ErrorKind.html
index fbb81cc38b..785817f021 100644
--- a/docs/rust/opendal/enum.ErrorKind.html
+++ b/docs/rust/opendal/enum.ErrorKind.html
@@ -51,7 +51,7 @@ So users could to handle this error by themselves.</p>
</div><section id="variant.InvalidInput" class="variant"><a href="#variant.InvalidInput" class="anchor">§</a><h3 class="code-header">InvalidInput</h3></section><div class="docblock"><p>The input is invalid.</p>
<p>For example, user try to seek to a negative position</p>
</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ErrorKind" class="impl"><a class="src rightside" href="../src/opendal/types/error.rs.html#109-114">source</a><a href="#impl-ErrorKind" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.ErrorKind.html" title="enum opendal::ErrorKind" [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ErrorKind" class="impl"><a class="src rightside" href="../src/opendal/types/error.rs.html#49">source</a><a href="#impl-Clone-for-ErrorKind" class="anchor">§</a><h3 class="code-header">impl <a class= [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ErrorKind" class="impl"><a class="src rightside" href="../src/opendal/types/error.rs.html#49">source</a><a href="#impl-Clone-for-ErrorKind" class="anchor">§</a><h3 class="code-header">impl <a class= [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Copy-for-ErrorKind" class="impl"><a class="src rightside" href="../src/opendal/types/error.rs.html#49">source</a><a href="#impl-Copy-for-ErrorKind" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a> for <a class="enum" href="enum.ErrorKind.html" titl [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
diff --git a/docs/rust/opendal/enum.Metakey.html b/docs/rust/opendal/enum.Metakey.html
index 313bda9126..e633d95583 100644
--- a/docs/rust/opendal/enum.Metakey.html
+++ b/docs/rust/opendal/enum.Metakey.html
@@ -31,9 +31,9 @@ already contains all metadata.</p>
</div><section id="variant.Etag" class="variant"><a href="#variant.Etag" class="anchor">§</a><h3 class="code-header">Etag</h3></section><div class="docblock"><p>Key for etag.</p>
</div><section id="variant.LastModified" class="variant"><a href="#variant.LastModified" class="anchor">§</a><h3 class="code-header">LastModified</h3></section><div class="docblock"><p>Key for last modified.</p>
</div><section id="variant.Version" class="variant"><a href="#variant.Version" class="anchor">§</a><h3 class="code-header">Version</h3></section><div class="docblock"><p>Key for version.</p>
-</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BitAnd%3CR%3E-for-Metakey" class="impl"><a class="src rightside" href="../src/opendal/types/metadata.rs.html#512-552">source</a><a href="#impl-BitAnd%3CR%3E-for-Metakey" class="anchor">§</a><h3 class="code-header">impl<R: <a class= [...]
+</div></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BitAnd%3CR%3E-for-Metakey" class="impl"><a class="src rightside" href="../src/opendal/types/metadata.rs.html#512-552">source</a><a href="#impl-BitAnd%3CR%3E-for-Metakey" class="anchor">§</a><h3 class="code-header">impl<R: <a class= [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
-sufficient, and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Rem%3CR%3E-for-Metakey" class="impl"><a class="src rightside" href="../src/opendal/types/metadata.rs.html#512-552">source</a><a href="#impl-Rem%3CR%3E-for-Metakey" class="anchor">§</a><h3 class="code-header">impl<R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait [...]
+sufficient, and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Rem%3CR%3E-for-Metakey" class="impl"><a class="src rightside" href="../src/opendal/types/metadata.rs.html#512-552">source</a><a href="#impl-Rem%3CR%3E-for-Metakey" class="anchor">§</a><h3 class="code-header">impl<R: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/docs/rust/opendal/enum.Scheme.html b/docs/rust/opendal/enum.Scheme.html
index 32c8a01fbc..c75f8558c7 100644
--- a/docs/rust/opendal/enum.Scheme.html
+++ b/docs/rust/opendal/enum.Scheme.html
@@ -1,5 +1,6 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Services that OpenDAL supports"><title>Scheme in opendal - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a781e4970d388.woff [...]
-<details class="toggle type-contents-toggle"><summary class="hideme"><span>Show 64 variants</span></summary> Atomicserver,
+<!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="Services that OpenDAL supports"><title>Scheme in opendal - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a781e4970d388.woff [...]
+<details class="toggle type-contents-toggle"><summary class="hideme"><span>Show 65 variants</span></summary> AliyunDrive,
+ Atomicserver,
Azblob,
Azdls,
B2,
@@ -70,7 +71,8 @@
<li>New variant SHOULD be added in alphabet orders,</li>
<li>Users MUST NOT relay on its order.</li>
</ul>
-</div></details><h2 id="variants" class="variants section-header">Variants (Non-exhaustive)<a href="#variants" class="anchor">§</a></h2><details class="toggle non-exhaustive"><summary class="hideme"><span>This enum is marked as non-exhaustive</span></summary><div class="docblock">Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.</di [...]
+</div></details><h2 id="variants" class="variants section-header">Variants (Non-exhaustive)<a href="#variants" class="anchor">§</a></h2><details class="toggle non-exhaustive"><summary class="hideme"><span>This enum is marked as non-exhaustive</span></summary><div class="docblock">Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.</di [...]
+</div><section id="variant.Atomicserver" class="variant"><a href="#variant.Atomicserver" class="anchor">§</a><h3 class="code-header">Atomicserver</h3></section><div class="docblock"><p><a href="services/struct.Atomicserver.html" title="struct opendal::services::Atomicserver">atomicserver</a>: Atomicserver services.</p>
</div><section id="variant.Azblob" class="variant"><a href="#variant.Azblob" class="anchor">§</a><h3 class="code-header">Azblob</h3></section><div class="docblock"><p><a href="services/struct.Azblob.html" title="struct opendal::services::Azblob">azblob</a>: Azure Storage Blob services.</p>
</div><section id="variant.Azdls" class="variant"><a href="#variant.Azdls" class="anchor">§</a><h3 class="code-header">Azdls</h3></section><div class="docblock"><p><a href="services/struct.Azdls.html" title="struct opendal::services::Azdls">Azdls</a>: Azure Data Lake Storage Gen2.</p>
</div><section id="variant.B2" class="variant"><a href="#variant.B2" class="anchor">§</a><h3 class="code-header">B2</h3></section><div class="docblock"><p><a href="services/struct.B2.html" title="struct opendal::services::B2">B2</a>: Backblaze B2 Services.</p>
@@ -139,8 +141,8 @@
<li>Custom must not overwrite any existing services name.</li>
<li>Custom must be lowed cases.</li>
</ul>
-</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Scheme" class="impl"><a class="src rightside" href="../src/opendal/types/scheme.rs.html#171-308">source</a><a href="#impl-Scheme" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.Scheme.html" title="enum opendal::Scheme">Scheme</a> [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.enabled" class="method"><a class="src rightside" href="../src/opendal/types/scheme.rs.html#192-307">source</a><h4 class="code-header">pub fn <a href="#method.enabled" class="fn">enabled</a>() -> <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/set/struct.HashSet.html" title="struct std::collections::hash::set::HashSet">HashSet</a><<a class="enum" href="enum.Scheme.h [...]
+</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Scheme" class="impl"><a class="src rightside" href="../src/opendal/types/scheme.rs.html#173-312">source</a><a href="#impl-Scheme" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.Scheme.html" title="enum opendal::Scheme">Scheme</a> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.enabled" class="method"><a class="src rightside" href="../src/opendal/types/scheme.rs.html#194-311">source</a><h4 class="code-header">pub fn <a href="#method.enabled" class="fn">enabled</a>() -> <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/set/struct.HashSet.html" title="struct std::collections::hash::set::HashSet">HashSet</a><<a class="enum" href="enum.Scheme.h [...]
<p>OpenDAL could be compiled with different features, which will enable different schemes.
This function returns all enabled schemes so users can make decisions based on it.</p>
<h5 id="examples"><a class="doc-anchor" href="#examples">§</a>Examples</h5>
@@ -150,7 +152,7 @@ This function returns all enabled schemes so users can make decisions based on i
<span class="kw">if </span>!enabled_schemes.contains(<span class="kw-2">&</span>Scheme::Memory) {
<span class="macro">panic!</span>(<span class="string">"s3 support is not enabled"</span>)
}</code></pre></div>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Scheme" class="impl"><a class="src rightside" href="../src/opendal/types/scheme.rs.html#32">source</a><a href="#impl-Clone-for-Scheme" class="anchor">§</a><h3 class="code-header">impl <a class="trai [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Scheme" class="impl"><a class="src rightside" href="../src/opendal/types/scheme.rs.html#32">source</a><a href="#impl-Clone-for-Scheme" class="anchor">§</a><h3 class="code-header">impl <a class="trai [...]
H: <a class="trait" href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher">Hasher</a>,
Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></d [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
diff --git a/docs/rust/opendal/raw/enum.FourWays.html b/docs/rust/opendal/raw/enum.FourWays.html
index d70dcfeefd..530a8e678c 100644
--- a/docs/rust/opendal/raw/enum.FourWays.html
+++ b/docs/rust/opendal/raw/enum.FourWays.html
@@ -13,7 +13,7 @@
ONE: <a class="trait" href="oio/trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,
TWO: <a class="trait" href="oio/trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,
THREE: <a class="trait" href="oio/trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,
- FOUR: <a class="trait" href="oio/trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#229-236">source</a><a href="#method.next" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.BlockingList.html#tymethod.n [...]
+ FOUR: <a class="trait" href="oio/trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-1" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#229-236">source</a><a href="#method.next-1" class="anchor">§</a><h4 class="code-header">fn <a href="oio/trait.BlockingList.html#tymeth [...]
ONE: <a class="trait" href="oio/trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,
TWO: <a class="trait" href="oio/trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,
THREE: <a class="trait" href="oio/trait.BlockingRead.html" title="trait opendal::raw::oio::BlockingRead">BlockingRead</a>,
@@ -21,7 +21,7 @@
ONE: <a class="trait" href="oio/trait.List.html" title="trait opendal::raw::oio::List">List</a>,
TWO: <a class="trait" href="oio/trait.List.html" title="trait opendal::raw::oio::List">List</a>,
THREE: <a class="trait" href="oio/trait.List.html" title="trait opendal::raw::oio::List">List</a>,
- FOUR: <a class="trait" href="oio/trait.List.html" title="trait opendal::raw::oio::List">List</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-1" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#212-219">source</a><a href="#method.next-1" class="anchor">§</a><h4 class="code-header">async fn <a href="oio/trait.List.html#tymethod.next" class="fn">next</ [...]
+ FOUR: <a class="trait" href="oio/trait.List.html" title="trait opendal::raw::oio::List">List</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/enum_utils.rs.html#212-219">source</a><a href="#method.next" class="anchor">§</a><h4 class="code-header">async fn <a href="oio/trait.List.html#tymethod.next" class="fn">next</a>(& [...]
ONE: <a class="trait" href="oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,
TWO: <a class="trait" href="oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,
THREE: <a class="trait" href="oio/trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,
diff --git a/docs/rust/opendal/raw/enum.Operation.html b/docs/rust/opendal/raw/enum.Operation.html
index c75c9e53ea..23a256994a 100644
--- a/docs/rust/opendal/raw/enum.Operation.html
+++ b/docs/rust/opendal/raw/enum.Operation.html
@@ -39,7 +39,7 @@
</div><section id="variant.BlockingDelete" class="variant"><a href="#variant.BlockingDelete" class="anchor">§</a><h3 class="code-header">BlockingDelete</h3></section><div class="docblock"><p>Operation for <a href="trait.Access.html#method.blocking_delete" title="method opendal::raw::Access::blocking_delete"><code>crate::raw::Access::blocking_delete</code></a></p>
</div><section id="variant.BlockingList" class="variant"><a href="#variant.BlockingList" class="anchor">§</a><h3 class="code-header">BlockingList</h3></section><div class="docblock"><p>Operation for <a href="trait.Access.html#method.blocking_list" title="method opendal::raw::Access::blocking_list"><code>crate::raw::Access::blocking_list</code></a></p>
</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Operation" class="impl"><a class="src rightside" href="../../src/opendal/raw/operation.rs.html#66-71">source</a><a href="#impl-Operation" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.Operation.html" title="enum opendal::raw::Op [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Operation" class="impl"><a class="src rightside" href="../../src/opendal/raw/operation.rs.html#22">source</a><a href="#impl-Clone-for-Operation" class="anchor">§</a><h3 class="code-header">impl <a c [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Operation" class="impl"><a class="src rightside" href="../../src/opendal/raw/operation.rs.html#22">source</a><a href="#impl-Clone-for-Operation" class="anchor">§</a><h3 class="code-header">impl <a c [...]
H: <a class="trait" href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher">Hasher</a>,
Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></d [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
diff --git a/docs/rust/opendal/raw/oio/struct.FlatLister.html b/docs/rust/opendal/raw/oio/struct.FlatLister.html
index 32cc9b37ae..7b282d838f 100644
--- a/docs/rust/opendal/raw/oio/struct.FlatLister.html
+++ b/docs/rust/opendal/raw/oio/struct.FlatLister.html
@@ -29,9 +29,9 @@ always output directly while listing.</p>
A: <a class="trait" href="../trait.Access.html" title="trait opendal::raw::Access">Access</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#79-86">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(acc: A, path: &<a class="primitive" href="https://doc.rust-lang.org/nig [...]
</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingList-for-FlatLister%3CA,+P%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#132-174">source</a><a href="#impl-BlockingList-for-FlatLister%3CA,+P%3E" [...]
A: <a class="trait" href="../trait.Access.html" title="trait opendal::raw::Access">Access</a><BlockingLister = P>,
- P: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#137-173">source</a><a href="#method.next" class="anchor">§</a><h4 class="code-header">fn <a href="trait.BlockingList.html#tymethod.n [...]
+ P: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#137-173">source</a><a href="#method.next-1" class="anchor">§</a><h4 class="code-header">fn <a href="trait.BlockingList.html#tymeth [...]
A: <a class="trait" href="../trait.Access.html" title="trait opendal::raw::Access">Access</a><Lister = L>,
- L: <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#94-129">source</a><a href="#method.next-1" class="anchor">§</a><h4 class="code-header">async fn <a href="trait.List.html#tymethod.next" class="fn">next</a [...]
+ L: <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#94-129">source</a><a href="#method.next" class="anchor">§</a><h4 class="code-header">async fn <a href="trait.List.html#tymethod.next" class="fn">next</a>(&a [...]
<p>wasm32 is a special target that we only have one event-loop for this FlatLister.</p>
</div><section id="impl-Sync-for-FlatLister%3CA,+L%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#72">source</a><a href="#impl-Sync-for-FlatLister%3CA,+L%3E" class="anchor">§</a><h3 class="code-header">impl<A: <a class="trait" href="../trait.Access.html" title="trait opendal::raw::Access">Access</a>, L> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> [...]
<p>We will only take <code>&mut Self</code> reference for FsLister.</p>
diff --git a/docs/rust/opendal/raw/oio/trait.BlockingList.html b/docs/rust/opendal/raw/oio/trait.BlockingList.html
index ef4f43ef15..6e54d12bae 100644
--- a/docs/rust/opendal/raw/oio/trait.BlockingList.html
+++ b/docs/rust/opendal/raw/oio/trait.BlockingList.html
@@ -12,4 +12,4 @@ to <code>next</code> will always get the same result.</p>
ONE: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,
TWO: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,
THREE: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,
- FOUR: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section><section id="impl-BlockingList-for-HierarchyLister%3CP%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/hierarchy_list.rs.html#142-159">source</a><a href="#impl-BlockingList-for-HierarchyLister%3CP%3E" class="anchor">§</a><h3 class="code-header">impl<P: <a class="trait" href="trait.BlockingList.html" title="trait [...]
\ No newline at end of file
+ FOUR: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section><section id="impl-BlockingList-for-HierarchyLister%3CP%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/hierarchy_list.rs.html#142-159">source</a><a href="#impl-BlockingList-for-HierarchyLister%3CP%3E" class="anchor">§</a><h3 class="code-header">impl<P: <a class="trait" href="trait.BlockingList.html" title="trait [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.BlockingWrite.html b/docs/rust/opendal/raw/oio/trait.BlockingWrite.html
index 1783db8f8d..14064c7b74 100644
--- a/docs/rust/opendal/raw/oio/trait.BlockingWrite.html
+++ b/docs/rust/opendal/raw/oio/trait.BlockingWrite.html
@@ -20,4 +20,4 @@ be passed by or copied out to an owned buffer.</li>
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.close" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#182">source</a><h4 class="code-header">fn <a href="#tymethod.close" class="fn">close</a>(&mut self) -> <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>></h4></ [...]
</div></details></div><h2 id="foreign-impls" class="section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-BlockingWrite-for-()" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#185-198">source</a><a href="#impl-BlockingWrite-for-()" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.BlockingWrite.html" titl [...]
<p>To make BlockingWriter work as expected, we must add this impl.</p>
-</div><div class="impl-items"><section id="method.write-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#204-206">source</a><a href="#method.write-1" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.write" class="fn">write</a>(&mut self, bs: <a class="struct" href="../../struct.Buffer.html" title="struct opendal::Buffer">Buffer</a>) -> <a class="type" href="../../type.Result.html" title="type opendal::Resul [...]
\ No newline at end of file
+</div><div class="impl-items"><section id="method.write-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#204-206">source</a><a href="#method.write-1" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.write" class="fn">write</a>(&mut self, bs: <a class="struct" href="../../struct.Buffer.html" title="struct opendal::Buffer">Buffer</a>) -> <a class="type" href="../../type.Result.html" title="type opendal::Resul [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.Write.html b/docs/rust/opendal/raw/oio/trait.Write.html
index 61266d2f51..037e0702eb 100644
--- a/docs/rust/opendal/raw/oio/trait.Write.html
+++ b/docs/rust/opendal/raw/oio/trait.Write.html
@@ -23,4 +23,4 @@ repeatedly until all bytes has been written.</p>
</div></details></div><h2 id="object-safety" class="section-header">Object Safety<a href="#object-safety" class="anchor">§</a></h2><div class="object-safety-info">This trait is <b>not</b> <a href="https://doc.rust-lang.org/nightly/reference/items/traits.html#object-safety">object safe</a>.</div><h2 id="foreign-impls" class="section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="im [...]
W: <a class="trait" href="trait.AppendWrite.html" title="trait opendal::raw::oio::AppendWrite">AppendWrite</a>,</div></h3></section><section id="impl-Write-for-BlockWriter%3CW%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/block_write.rs.html#160-251">source</a><a href="#impl-Write-for-BlockWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl<W> <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write">Write</ [...]
W: <a class="trait" href="trait.BlockWrite.html" title="trait opendal::raw::oio::BlockWrite">BlockWrite</a>,</div></h3></section><section id="impl-Write-for-MultipartWriter%3CW%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/multipart_write.rs.html#200-323">source</a><a href="#impl-Write-for-MultipartWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl<W> <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write [...]
- W: <a class="trait" href="trait.MultipartWrite.html" title="trait opendal::raw::oio::MultipartWrite">MultipartWrite</a>,</div></h3></section><section id="impl-Write-for-OneShotWriter%3CW%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#52-78">source</a><a href="#impl-Write-for-OneShotWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl<W: <a class="trait" href="trait.OneShotWrite.html" title="trait opendal::raw::o [...]
\ No newline at end of file
+ W: <a class="trait" href="trait.MultipartWrite.html" title="trait opendal::raw::oio::MultipartWrite">MultipartWrite</a>,</div></h3></section><section id="impl-Write-for-OneShotWriter%3CW%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#52-78">source</a><a href="#impl-Write-for-OneShotWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl<W: <a class="trait" href="trait.OneShotWrite.html" title="trait opendal::raw::o [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/struct.BytesRange.html b/docs/rust/opendal/raw/struct.BytesRange.html
index b023f71056..d98dfb439b 100644
--- a/docs/rust/opendal/raw/struct.BytesRange.html
+++ b/docs/rust/opendal/raw/struct.BytesRange.html
@@ -19,7 +19,7 @@ Range: bytes=<range-start>-<range-end>
<p>If this range is full, we don’t need to specify it in http request.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.to_header" class="method"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_range.rs.html#82-84">source</a><h4 class="code-header">pub fn <a href="#method.to_header" class="fn">to_header</a>(&self) -> <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a></h4></section></summary><div class="do [...]
</div></details><details class="toggle method-toggle" open><summary><section id="method.to_range" class="method"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_range.rs.html#87-95">source</a><h4 class="code-header">pub fn <a href="#method.to_range" class="fn">to_range</a>(&self) -> impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/range/trait.RangeBounds.html" title="trait core::ops::range::RangeBounds">RangeBounds</a><<a class="primit [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-BytesRange" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_range.rs.html#41">source</a><a href="#impl-Clone-for-BytesRange" class="anchor">§</a><h3 class="code-hea [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-BytesRange" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_range.rs.html#41">source</a><a href="#impl-Clone-for-BytesRange" class="anchor">§</a><h3 class="code-hea [...]
T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/range/trait.RangeBounds.html" title="trait core::ops::range::RangeBounds">RangeBounds</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.from" class="method trait-impl"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_r [...]
by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#263">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne" class= [...]
sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Copy-for-BytesRange" class="impl"><a class="src rightside" href="../../src/opendal/raw/http_util/bytes_range.rs.html#41">source</a><a href="#impl-Copy-for-BytesRange" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a> for <a class="struct" href="stru [...]
diff --git a/docs/rust/opendal/services/aliyun_drive/backend/struct.AliyunDriveBuilder.html b/docs/rust/opendal/services/aliyun_drive/backend/struct.AliyunDriveBuilder.html
new file mode 100644
index 0000000000..6bb22da259
--- /dev/null
+++ b/docs/rust/opendal/services/aliyun_drive/backend/struct.AliyunDriveBuilder.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../opendal/services/struct.AliyunDrive.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../opendal/services/struct.AliyunDrive.html">../../../../opendal/services/struct.AliyunDrive.html</a>...</p>
+ <script>location.replace("../../../../opendal/services/struct.AliyunDrive.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/rust/opendal/services/aliyun_drive/backend/struct.AliyunDriveConfig.html b/docs/rust/opendal/services/aliyun_drive/backend/struct.AliyunDriveConfig.html
new file mode 100644
index 0000000000..417ef60d14
--- /dev/null
+++ b/docs/rust/opendal/services/aliyun_drive/backend/struct.AliyunDriveConfig.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="refresh" content="0;URL=../../../../opendal/services/struct.AliyunDriveConfig.html">
+ <title>Redirection</title>
+</head>
+<body>
+ <p>Redirecting to <a href="../../../../opendal/services/struct.AliyunDriveConfig.html">../../../../opendal/services/struct.AliyunDriveConfig.html</a>...</p>
+ <script>location.replace("../../../../opendal/services/struct.AliyunDriveConfig.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/rust/opendal/services/index.html b/docs/rust/opendal/services/index.html
index bff9591cd1..3008ea9da7 100644
--- a/docs/rust/opendal/services/index.html
+++ b/docs/rust/opendal/services/index.html
@@ -1,6 +1,6 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Services will provide builders to build underlying backends."><title>opendal::services - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSan [...]
+<!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="Services will provide builders to build underlying backends."><title>opendal::services - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSan [...]
<p>More ongoing services support is tracked at <a href="https://github.com/apache/opendal/issues/5">opendal#5</a>. Please feel free to submit issues if there are services not covered.</p>
-</div></details><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><ul class="item-table"><li><div class="item-name"><a class="struct" href="struct.Alluxio.html" title="struct opendal::services::Alluxio">Alluxio</a><span class="stab portability" title="Available on crate feature `services-alluxio` only"><code>services-alluxio</code></span></div><div class="desc docblock-short"><a href="https://www.alluxio.io/">Alluxio</a> services support.</div></l [...]
+</div></details><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><ul class="item-table"><li><div class="item-name"><a class="struct" href="struct.AliyunDrive.html" title="struct opendal::services::AliyunDrive">AliyunDrive</a><span class="stab portability" title="Available on crate feature `services-aliyun-drive` only"><code>services-aliyun-drive</code></span></div><div class="desc docblock-short">Capabilities</div></li><li><div class="item-name"> [...]
Config for Atomicserver services support</div></li><li><div class="item-name"><a class="struct" href="struct.Azblob.html" title="struct opendal::services::Azblob">Azblob</a><span class="stab portability" title="Available on crate feature `services-azblob` only"><code>services-azblob</code></span></div><div class="desc docblock-short">Capabilities</div></li><li><div class="item-name"><a class="struct" href="struct.AzblobConfig.html" title="struct opendal::services::AzblobConfig">AzblobCon [...]
As known as <code>abfs</code>, <code>azdls</code> or <code>azdls</code>.</div></li><li><div class="item-name"><a class="struct" href="struct.Azfile.html" title="struct opendal::services::Azfile">Azfile</a><span class="stab portability" title="Available on crate feature `services-azfile` only"><code>services-azfile</code></span></div><div class="desc docblock-short">Azure File services support.</div></li><li><div class="item-name"><a class="struct" href="struct.B2.html" title="struct open [...]
This service will visit the <a href="https://docs.databricks.com/api/azure/workspace/dbfs">DBFS API</a> supported by <a href="https://docs.databricks.com/en/dbfs/index.html">Databricks File System</a>.</div></li><li><div class="item-name"><a class="struct" href="struct.Dropbox.html" title="struct opendal::services::Dropbox">Dropbox</a><span class="stab portability" title="Available on crate feature `services-dropbox` only"><code>services-dropbox</code></span></div><div class="desc docblo [...]
diff --git a/docs/rust/opendal/services/sidebar-items.js b/docs/rust/opendal/services/sidebar-items.js
index 395f9fbec6..de63e9f197 100644
--- a/docs/rust/opendal/services/sidebar-items.js
+++ b/docs/rust/opendal/services/sidebar-items.js
@@ -1 +1 @@
-window.SIDEBAR_ITEMS = {"struct":["Alluxio","AlluxioConfig","Atomicserver","AtomicserverConfig","Azblob","AzblobConfig","Azdls","Azfile","B2","B2Config","Cacache","Chainsafe","ChainsafeConfig","CloudflareKv","Compfs","Cos","D1","D1Config","Dashmap","Dbfs","Dropbox","DropboxConfig","Etcd","EtcdConfig","FoundationConfig","Foundationdb","Fs","Ftp","FtpConfig","Gcs","GcsConfig","Gdrive","Ghac","Github","GithubConfig","Gridfs","Hdfs","HdfsConfig","HdfsNative","HdfsNativeConfig","Http","HttpCo [...]
\ No newline at end of file
+window.SIDEBAR_ITEMS = {"struct":["AliyunDrive","AliyunDriveConfig","Alluxio","AlluxioConfig","Atomicserver","AtomicserverConfig","Azblob","AzblobConfig","Azdls","Azfile","B2","B2Config","Cacache","Chainsafe","ChainsafeConfig","CloudflareKv","Compfs","Cos","D1","D1Config","Dashmap","Dbfs","Dropbox","DropboxConfig","Etcd","EtcdConfig","FoundationConfig","Foundationdb","Fs","Ftp","FtpConfig","Gcs","GcsConfig","Gdrive","Ghac","Github","GithubConfig","Gridfs","Hdfs","HdfsConfig","HdfsNative" [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/struct.FlatLister.html b/docs/rust/opendal/services/struct.AliyunDrive.html
similarity index 70%
copy from docs/rust/opendal/raw/oio/struct.FlatLister.html
copy to docs/rust/opendal/services/struct.AliyunDrive.html
index 32cc9b37ae..147785c01a 100644
--- a/docs/rust/opendal/raw/oio/struct.FlatLister.html
+++ b/docs/rust/opendal/services/struct.AliyunDrive.html
@@ -1,47 +1,83 @@
-<!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="FlatLister will walk dir in bottom up way:"><title>FlatLister in opendal::raw::oio - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Me [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Capabilities"><title>AliyunDrive in opendal::services - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8f9a781e4970d388.woff2,S [...]
+<p>This service can be used to:</p>
<ul>
-<li>List nested dir first</li>
-<li>Go back into parent dirs one by one</li>
+<li><input disabled="" type="checkbox" checked=""/>
+stat</li>
+<li><input disabled="" type="checkbox" checked=""/>
+read</li>
+<li><input disabled="" type="checkbox" checked=""/>
+write</li>
+<li><input disabled="" type="checkbox" checked=""/>
+create_dir</li>
+<li><input disabled="" type="checkbox" checked=""/>
+delete</li>
+<li><input disabled="" type="checkbox" checked=""/>
+copy</li>
+<li><input disabled="" type="checkbox" checked=""/>
+rename</li>
+<li><input disabled="" type="checkbox" checked=""/>
+list</li>
+<li><input disabled="" type="checkbox"/>
+presign</li>
+<li><input disabled="" type="checkbox"/>
+blocking</li>
</ul>
-<p>Given the following file tree:</p>
-<div class="example-wrap"><pre class="language-txt"><code>.
-├── dir_x/
-│ ├── dir_y/
-│ │ ├── dir_z/
-│ │ └── file_c
-│ └── file_b
-└── file_a
-</code></pre></div>
-<p>ToFlatLister will output entries like:</p>
-<div class="example-wrap"><pre class="language-txt"><code>dir_x/dir_y/dir_z/file_c
-dir_x/dir_y/dir_z/
-dir_x/dir_y/file_b
-dir_x/dir_y/
-dir_x/file_a
-dir_x/
-</code></pre></div><h2 id="note"><a class="doc-anchor" href="#note">§</a>Note</h2>
-<p>There is no guarantee about the order between files and dirs at the same level.
-We only make sure the nested dirs will show up before parent dirs.</p>
-<p>Especially, for storage services that can’t return dirs first, ToFlatLister
-may output parent dirs’ files before nested dirs, this is expected because files
-always output directly while listing.</p>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-FlatLister%3CA,+L%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#74-87">source</a><a href="#impl-FlatLister%3CA,+L%3E" class="anchor">§</a><h3 class="code-header">impl<A, L> <a class="struct" hre [...]
- A: <a class="trait" href="../trait.Access.html" title="trait opendal::raw::Access">Access</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#79-86">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(acc: A, path: &<a class="primitive" href="https://doc.rust-lang.org/nig [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingList-for-FlatLister%3CA,+P%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#132-174">source</a><a href="#impl-BlockingList-for-FlatLister%3CA,+P%3E" [...]
- A: <a class="trait" href="../trait.Access.html" title="trait opendal::raw::Access">Access</a><BlockingLister = P>,
- P: <a class="trait" href="trait.BlockingList.html" title="trait opendal::raw::oio::BlockingList">BlockingList</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#137-173">source</a><a href="#method.next" class="anchor">§</a><h4 class="code-header">fn <a href="trait.BlockingList.html#tymethod.n [...]
- A: <a class="trait" href="../trait.Access.html" title="trait opendal::raw::Access">Access</a><Lister = L>,
- L: <a class="trait" href="trait.List.html" title="trait opendal::raw::oio::List">List</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.next-1" class="method trait-impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#94-129">source</a><a href="#method.next-1" class="anchor">§</a><h4 class="code-header">async fn <a href="trait.List.html#tymethod.next" class="fn">next</a [...]
-<p>wasm32 is a special target that we only have one event-loop for this FlatLister.</p>
-</div><section id="impl-Sync-for-FlatLister%3CA,+L%3E" class="impl"><a class="src rightside" href="../../../src/opendal/raw/oio/list/flat_list.rs.html#72">source</a><a href="#impl-Sync-for-FlatLister%3CA,+L%3E" class="anchor">§</a><h3 class="code-header">impl<A: <a class="trait" href="../trait.Access.html" title="trait opendal::raw::Access">Access</a>, L> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> [...]
-<p>We will only take <code>&mut Self</code> reference for FsLister.</p>
-</div></div><h2 id="synthetic-implementations" class="section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-Freeze-for-FlatLister%3CA,+L%3E" class="impl"><a href="#impl-Freeze-for-FlatLister%3CA,+L%3E" class="anchor">§</a><h3 class="code-header">impl<A, L> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html" title="trait core::marker::Freez [...]
- A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html" title="trait core::marker::Freeze">Freeze</a>,</div></h3></section><section id="impl-RefUnwindSafe-for-FlatLister%3CA,+L%3E" class="impl"><a href="#impl-RefUnwindSafe-for-FlatLister%3CA,+L%3E" class="anchor">§</a><h3 class="code-header">impl<A, L> <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe [...]
- A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
- L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Unpin-for-FlatLister%3CA,+L%3E" class="impl"><a href="#impl-Unpin-for-FlatLister%3CA,+L%3E" class="anchor">§</a><h3 class="code-header">impl<A, L> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::U [...]
- L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</div></h3></section><section id="impl-UnwindSafe-for-FlatLister%3CA,+L%3E" class="impl"><a href="#impl-UnwindSafe-for-FlatLister%3CA,+L%3E" class="anchor">§</a><h3 class="code-header">impl<A, L> <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe [...]
- A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,
- L: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,</div></h3></section></div><h2 id="blanket-implementations" class="section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-T" class="impl"><a class="src ri [...]
+<h3 id="configuration"><a class="doc-anchor" href="#configuration">§</a>Configuration</h3>
+<ul>
+<li><code>root</code>: Set the work dir for backend.</li>
+<li><code>client_id</code>: Set the client_id for backend.</li>
+<li><code>client_secret</code>: Set the client_secret for backend.</li>
+<li><code>refresh_token</code>: Set the refresh_token for backend.</li>
+<li><code>drive_type</code>: Set the drive_type for backend.</li>
+<li><code>rapid_upload</code>: Set the rapid_upload for backend.</li>
+</ul>
+<p>Refer to <a href="struct.AliyunDrive.html" title="struct opendal::services::AliyunDrive"><code>AliyunDriveBuilder</code></a>`s public API docs for more information.</p>
+<h3 id="example"><a class="doc-anchor" href="#example">§</a>Example</h3><h4 id="basic-setup"><a class="doc-anchor" href="#basic-setup">§</a>Basic Setup</h4>
+<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>std::sync::Arc;
+
+<span class="kw">use </span>anyhow::Result;
+<span class="kw">use </span>opendal::services::AliyunDrive;
+<span class="kw">use </span>opendal::Operator;
+
+<span class="attr">#[tokio::main]
+</span><span class="kw">async fn </span>main() -> <span class="prelude-ty">Result</span><()> {
+ <span class="comment">// Create aliyun-drive backend builder.
+ </span><span class="kw">let </span><span class="kw-2">mut </span>builder = AliyunDrive::default();
+ <span class="comment">// Set the root for aliyun-drive, all operations will happen under this root.
+ //
+ // NOTE: the root must be absolute path.
+ </span>builder.root(<span class="string">"/path/to/dir"</span>);
+ <span class="comment">// Set the client_id. This is required.
+ </span>builder.client_id(<span class="string">"client_id"</span>);
+ <span class="comment">// Set the client_secret. This is required.
+ </span>builder.client_secret(<span class="string">"client_secret"</span>);
+ <span class="comment">// Set the refresh_token. This is required.
+ </span>builder.refresh_token(<span class="string">"refresh_token"</span>);
+ <span class="comment">// Set the drive_type. This is required.
+ //
+ // Fallback to the default type if no other types found.
+ </span>builder.drive_type(<span class="string">"resource"</span>);
+ <span class="comment">// Set the rapid_upload.
+ //
+ // Works only under the write_once operation for now.
+ </span>builder.rapid_upload(<span class="bool-val">true</span>);
+
+ <span class="kw">let </span>op: Operator = Operator::new(builder)<span class="question-mark">?</span>.finish();
+
+ <span class="prelude-val">Ok</span>(())
+}</code></pre></div>
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AliyunDriveBuilder" class="impl"><a class="src rightside" href="../../src/opendal/services/aliyun_drive/backend.rs.html#103-162">source</a><a href="#impl-AliyunDriveBuilder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct. [...]
+<p>All operations will happen under this root.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.client_id" class="method"><a class="src rightside" href="../../src/opendal/services/aliyun_drive/backend.rs.html#118-122">source</a><h4 class="code-header">pub fn <a href="#method.client_id" class="fn">client_id</a>(&mut self, client_id: &<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nigh [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.client_secret" class="method"><a class="src rightside" href="../../src/opendal/services/aliyun_drive/backend.rs.html#125-129">source</a><h4 class="code-header">pub fn <a href="#method.client_secret" class="fn">client_secret</a>(&mut self, client_secret: &<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -> <a class="primitive" href="https://doc.ru [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.refresh_token" class="method"><a class="src rightside" href="../../src/opendal/services/aliyun_drive/backend.rs.html#132-136">source</a><h4 class="code-header">pub fn <a href="#method.refresh_token" class="fn">refresh_token</a>(&mut self, refresh_token: &<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -> <a class="primitive" href="https://doc.ru [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.drive_type" class="method"><a class="src rightside" href="../../src/opendal/services/aliyun_drive/backend.rs.html#139-143">source</a><h4 class="code-header">pub fn <a href="#method.drive_type" class="fn">drive_type</a>(&mut self, drive_type: &<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -> <a class="primitive" href="https://doc.rust-lang.org/ [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.rapid_upload" class="method"><a class="src rightside" href="../../src/opendal/services/aliyun_drive/backend.rs.html#146-150">source</a><h4 class="code-header">pub fn <a href="#method.rapid_upload" class="fn">rapid_upload</a>(&mut self, rapid_upload: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a>) -> <a class="primitive" href="https://doc.rust-lang [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.http_client" class="method"><a class="src rightside" href="../../src/opendal/services/aliyun_drive/backend.rs.html#158-161">source</a><h4 class="code-header">pub fn <a href="#method.http_client" class="fn">http_client</a>(&mut self, client: <a class="struct" href="../raw/struct.HttpClient.html" title="struct opendal::raw::HttpClient">HttpClient</a>) -> <a class="primitive" href="https://doc.rus [...]
+<h5 id="notes"><a class="doc-anchor" href="#notes">§</a>Notes</h5>
+<p>This API is part of OpenDAL’s Raw API. <code>HttpClient</code> could be changed
+during minor updates.</p>
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Builder-for-AliyunDriveBuilder" class="impl"><a class="src rightside" href="../../src/opendal/services/aliyun_drive/backend.rs.html#164-255">source</a><a href="#impl-Builder-for-AliyunDriveBuilder" class="anc [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
@@ -150,5 +186,5 @@ builds.</div></details></div></details><details class="toggle implementors-toggl
[<code>WithDispatch</code>] wrapper. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a href="#method.with_current_subscriber" class="anchor">§</a><h4 class="code-header">fn <a class="fn">with_current_subscriber</a>(self) -> WithDispatch<Self></h4></section></summary><div class='docblock'>Attaches the current <a href="crate::dispatcher#setting-the-default-subscriber">defaul [...]
[<code>WithDispatch</code>] wrapper. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Within%3CG2%3E-for-G1" class="impl"><a href="#impl-Within%3CG2%3E-for-G1" class="anchor">§</a><h3 class="code-header">impl<G1, G2> Within<G2> for G1<div class="where">where
G2: Contains<G1>,</div></h3></section></summary><div class="impl-items"><section id="method.is_within" class="method trait-impl"><a href="#method.is_within" class="anchor">§</a><h4 class="code-header">fn <a class="fn">is_within</a>(&self, b: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&G2</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></div></details>< [...]
- G2: Contains<G1>,</div></h3></section></summary><div class="impl-items"><section id="method.is_within-1" class="method trait-impl"><a href="#method.is_within-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">is_within</a>(&self, b: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&G2</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></div></detai [...]
+ G2: Contains<G1>,</div></h3></section></summary><div class="impl-items"><section id="method.is_within-1" class="method trait-impl"><a href="#method.is_within-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">is_within</a>(&self, b: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&G2</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></div></detai [...]
T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</div></h3></section></div></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/struct.OperatorBuilder.html b/docs/rust/opendal/services/struct.AliyunDriveConfig.html
similarity index 74%
copy from docs/rust/opendal/struct.OperatorBuilder.html
copy to docs/rust/opendal/services/struct.AliyunDriveConfig.html
index f22f60689a..e2eeb36295 100644
--- a/docs/rust/opendal/struct.OperatorBuilder.html
+++ b/docs/rust/opendal/services/struct.AliyunDriveConfig.html
@@ -1,63 +1,30 @@
-<!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="OperatorBuilder is a typed builder to build an Operator."><title>OperatorBuilder in opendal - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,Fi [...]
-<h2 id="notes"><a class="doc-anchor" href="#notes">§</a>Notes</h2>
-<p>OpenDAL uses static dispatch internally and only performs dynamic
-dispatch at the outmost type erase layer. OperatorBuilder is the only
-public API provided by OpenDAL come with generic parameters.</p>
-<p>It’s required to call <code>finish</code> after the operator built.</p>
-<h2 id="examples"><a class="doc-anchor" href="#examples">§</a>Examples</h2>
-<p>For users who want to support many services, we can build a helper function like the following:</p>
-
-<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>std::collections::HashMap;
-
-<span class="kw">use </span>opendal::layers::LoggingLayer;
-<span class="kw">use </span>opendal::layers::RetryLayer;
-<span class="kw">use </span>opendal::services;
-<span class="kw">use </span>opendal::Builder;
-<span class="kw">use </span>opendal::Operator;
-<span class="kw">use </span>opendal::Result;
-<span class="kw">use </span>opendal::Scheme;
-
-<span class="kw">fn </span>init_service<B: Builder>(cfg: HashMap<String, String>) -> <span class="prelude-ty">Result</span><Operator> {
- <span class="kw">let </span>op = Operator::from_map::<B>(cfg)<span class="question-mark">?
- </span>.layer(LoggingLayer::default())
- .layer(RetryLayer::new())
- .finish();
-
- <span class="prelude-val">Ok</span>(op)
-}
-
-<span class="kw">async fn </span>init(scheme: Scheme, cfg: HashMap<String, String>) -> <span class="prelude-ty">Result</span><()> {
- <span class="kw">let _ </span>= <span class="kw">match </span>scheme {
- Scheme::S3 => init_service::<services::S3>(cfg)<span class="question-mark">?</span>,
- Scheme::Fs => init_service::<services::Fs>(cfg)<span class="question-mark">?</span>,
- <span class="kw">_ </span>=> <span class="macro">todo!</span>(),
- };
-
- <span class="prelude-val">Ok</span>(())
-}</code></pre></div>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-OperatorBuilder%3CA%3E" class="impl"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#367-418">source</a><a href="#impl-OperatorBuilder%3CA%3E" class="anchor">§</a><h3 class="code-header">impl<A: <a class="trait" href="raw/ [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.layer" class="method"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#407-411">source</a><h4 class="code-header">pub fn <a href="#method.layer" class="fn">layer</a><L: <a class="trait" href="raw/trait.Layer.html" title="trait opendal::raw::Layer">Layer</a><A>>(self, layer: L) -> <a class="struct" href="struct.OperatorBuilder.html" title="struct opendal::Oper [...]
-<h5 id="notes-1"><a class="doc-anchor" href="#notes-1">§</a>Notes</h5>
-<p><code>OperatorBuilder::layer()</code> is using static dispatch which is zero
-cost. <code>Operator::layer()</code> is using dynamic dispatch which has a
-bit runtime overhead with an extra vtable lookup and unable to
-inline.</p>
-<p>It’s always recommended to use <code>OperatorBuilder::layer()</code> instead.</p>
-<h5 id="examples-1"><a class="doc-anchor" href="#examples-1">§</a>Examples</h5>
-<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>opendal::layers::LoggingLayer;
-<span class="kw">use </span>opendal::services::Fs;
-<span class="kw">use </span>opendal::Operator;
-
-<span class="kw">let </span>op = Operator::new(Fs::default())<span class="question-mark">?
- </span>.layer(LoggingLayer::default())
- .finish();
-<span class="comment">// All operations will go through the new_layer
-</span><span class="kw">let _ </span>= op.read(<span class="string">"test_file"</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.finish" class="method"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#414-417">source</a><h4 class="code-header">pub fn <a href="#method.finish" class="fn">finish</a>(self) -> <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h4></section></summary><div class="docblock"><p>Finish the building to construct an Operator.</p>
-</div></details></div></details></div><h2 id="synthetic-implementations" class="section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-Freeze-for-OperatorBuilder%3CA%3E" class="impl"><a href="#impl-Freeze-for-OperatorBuilder%3CA%3E" class="anchor">§</a><h3 class="code-header">impl<A> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html" title [...]
- A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html" title="trait core::marker::Freeze">Freeze</a>,</div></h3></section><section id="impl-RefUnwindSafe-for-OperatorBuilder%3CA%3E" class="impl"><a href="#impl-RefUnwindSafe-for-OperatorBuilder%3CA%3E" class="anchor">§</a><h3 class="code-header">impl<A> <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_saf [...]
- A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-OperatorBuilder%3CA%3E" class="impl"><a href="#impl-Send-for-OperatorBuilder%3CA%3E" class="anchor">§</a><h3 class="code-header">impl<A> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Sen [...]
- A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,</div></h3></section></div><h2 id="blanket-implementations" class="section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-T" class="impl"><a class="src ri [...]
+<!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="Aliyun Drive services support."><title>AliyunDriveConfig in opendal::services - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium- [...]
+ pub root: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,
+ pub client_id: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>,
+ pub client_secret: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>,
+ pub refresh_token: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>,
+ pub drive_type: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>,
+ pub rapid_upload: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a>,
+}</code></pre><span class="item-info"><div class="stab portability">Available on <strong>crate feature <code>services-aliyun-drive</code></strong> only.</div></span><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Aliyun Drive services support.</p>
+</div></details><h2 id="fields" class="fields section-header">Fields (Non-exhaustive)<a href="#fields" class="anchor">§</a></h2><details class="toggle non-exhaustive"><summary class="hideme"><span>This struct is marked as non-exhaustive</span></summary><div class="docblock">Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional <code>Struct { .. }</code> syntax; cannot be matche [...]
+<p>All operations will happen under this root.</p>
+<p>default to <code>/</code> if not set.</p>
+</div><span id="structfield.client_id" class="structfield section-header"><a href="#structfield.client_id" class="anchor field">§</a><code>client_id: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a></code></span><div class="docblock"><p>client_id of this backend.</p>
+<p>required.</p>
+</div><span id="structfield.client_secret" class="structfield section-header"><a href="#structfield.client_secret" class="anchor field">§</a><code>client_secret: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a></code></span><div class="docblock"><p>client_secret of this backend.</p>
+<p>required.</p>
+</div><span id="structfield.refresh_token" class="structfield section-header"><a href="#structfield.refresh_token" class="anchor field">§</a><code>refresh_token: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a></code></span><div class="docblock"><p>refresh_token of this backend.</p>
+<p>required.</p>
+</div><span id="structfield.drive_type" class="structfield section-header"><a href="#structfield.drive_type" class="anchor field">§</a><code>drive_type: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a></code></span><div class="docblock"><p>drive_type of this backend.</p>
+<p>All operations will happen under this type of drive.</p>
+<p>Available values are <code>default</code>, <code>backup</code> and <code>resource</code>.</p>
+<p>Fallback to default if not set or no other drives can be found.</p>
+</div><span id="structfield.rapid_upload" class="structfield section-header"><a href="#structfield.rapid_upload" class="anchor field">§</a><code>rapid_upload: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></code></span><div class="docblock"><p>rapid_upload of this backend.</p>
+<p>Skip uploading files that are already in the drive by hashing their content.</p>
+<p>Only works under the write_once operation.</p>
+</div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Debug-for-AliyunDriveConfig" class="impl"><a class="src rightside" href="../../src/opendal/services/aliyun_drive/backend.rs.html#75-84">source</a><a href="#impl-Debug-for-AliyunDriveConfig" class="anchor">§</a><h3 class="code-header">impl < [...]
+ <a class="struct" href="struct.AliyunDriveConfig.html" title="struct opendal::services::AliyunDriveConfig">AliyunDriveConfig</a>: <a class="trait" href="https://doc.rust-lang.org/nightly/core/default/trait.Default.html" title="trait core::default::Default">Default</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.deserialize" class="method trait-impl"><a class="src rightside" href="../../src/opendal/serv [...]
+ __D: <a class="trait" href="https://docs.rs/serde/1.0.198/serde/de/trait.Deserializer.html" title="trait serde::de::Deserializer">Deserializer</a><'de>,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde/1.0.198/serde/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details></div><h2 id="synthetic-implementations" class="section-header">Auto Trait Implem [...]
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#141">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
@@ -166,5 +133,6 @@ builds.</div></details></div></details><details class="toggle implementors-toggl
[<code>WithDispatch</code>] wrapper. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a href="#method.with_current_subscriber" class="anchor">§</a><h4 class="code-header">fn <a class="fn">with_current_subscriber</a>(self) -> WithDispatch<Self></h4></section></summary><div class='docblock'>Attaches the current <a href="crate::dispatcher#setting-the-default-subscriber">defaul [...]
[<code>WithDispatch</code>] wrapper. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Within%3CG2%3E-for-G1" class="impl"><a href="#impl-Within%3CG2%3E-for-G1" class="anchor">§</a><h3 class="code-header">impl<G1, G2> Within<G2> for G1<div class="where">where
G2: Contains<G1>,</div></h3></section></summary><div class="impl-items"><section id="method.is_within" class="method trait-impl"><a href="#method.is_within" class="anchor">§</a><h4 class="code-header">fn <a class="fn">is_within</a>(&self, b: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&G2</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></div></details>< [...]
- G2: Contains<G1>,</div></h3></section></summary><div class="impl-items"><section id="method.is_within-1" class="method trait-impl"><a href="#method.is_within-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">is_within</a>(&self, b: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&G2</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></div></detai [...]
+ G2: Contains<G1>,</div></h3></section></summary><div class="impl-items"><section id="method.is_within-1" class="method trait-impl"><a href="#method.is_within-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">is_within</a>(&self, b: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&G2</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></div></detai [...]
+ T: for<'de> <a class="trait" href="https://docs.rs/serde/1.0.198/serde/de/trait.Deserialize.html" title="trait serde::de::Deserialize">Deserialize</a><'de>,</div></h3></section><section id="impl-MaybeSend-for-T" class="impl"><a class="src rightside" href="../../src/opendal/raw/futures_util.rs.html#57">source</a><a href="#impl-MaybeSend-for-T" class="anchor">§</a><h3 class="code-header">impl<T> <a class="trait" href="../raw/trait.MaybeSend.html" title="trait opendal: [...]
T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</div></h3></section></div></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/struct.Buffer.html b/docs/rust/opendal/struct.Buffer.html
index 9e73d9ac0d..aba4006958 100644
--- a/docs/rust/opendal/struct.Buffer.html
+++ b/docs/rust/opendal/struct.Buffer.html
@@ -71,7 +71,7 @@ Please use API from [<code>Buf</code>], <a href="https://doc.rust-lang.org/night
<p>This operation is not zero copy, it will copy all bytes into one single <a href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec"><code>Vec<u8></code></a>.
Please use API from [<code>Buf</code>], <a href="https://doc.rust-lang.org/nightly/core/iter/traits/iterator/trait.Iterator.html" title="trait core::iter::traits::iterator::Iterator"><code>Iterator</code></a> or [<code>Stream</code>] whenever possible.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.to_io_slice" class="method"><a class="src rightside" href="../src/opendal/types/buffer.rs.html#304-319">source</a><h4 class="code-header">pub fn <a href="#method.to_io_slice" class="fn">to_io_slice</a>(&self) -> <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a><<a class="struct" href="https://doc.rust-lang.org/nightly/ [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-Buffer" class="impl"><a class="src rightside" href="../src/opendal/raw/oio/read/api.rs.html#191-200">source</a><a href="#impl-BlockingRead-for-Buffer" class="anchor">§</a><h3 class="code-head [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingRead-for-Buffer" class="impl"><a class="src rightside" href="../src/opendal/raw/oio/read/api.rs.html#191-200">source</a><a href="#impl-BlockingRead-for-Buffer" class="anchor">§</a><h3 class="code-head [...]
the buffer. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.chunk" class="method trait-impl"><a class="src rightside" href="../src/opendal/types/buffer.rs.html#427-445">source</a><a href="#method.chunk" class="anchor">§</a><h4 class="code-header">fn <a class="fn">chunk</a>(&self) -> &[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>] <a href="#" class="tooltip" data-notable-ty="&a [...]
and <code>Buf::remaining()</code>. Note that this <em>can</em> return shorter slice (this allows
non-continuous internal representation). <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.chunks_vectored" class="method trait-impl"><a class="src rightside" href="../src/opendal/types/buffer.rs.html#448-477">source</a><a href="#method.chunks_vectored" class="anchor">§</a><h4 class="code-header">fn <a class="fn">chunks_vectored</a><'a>(&'a self, dst: &mut [<a class="struct" href="https://doc.rust-lang.org/nightly/std/io [...]
@@ -86,7 +86,7 @@ with this data. <a>Read more</a></div></details><details class="toggle method-to
Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Creates an adaptor which will read at most <code>limit</code> bytes from <code>self</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.chain-1" class="method trait-impl"><a href="#method.chain-1" class="anchor">§</a><h4 class="code-heade [...]
U: Buf,
Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Creates an adaptor which will chain this buffer with another. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.reader" class="method trait-impl"><a href="#method.reader" class="anchor">§</a><h4 class="code-header">fn <a class="fn">reader</a>(s [...]
- Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><span class="item-info"><div class="stab portability">Available on <strong>crate feature <code>std</code></strong> only.</div></span><div class='docblock'>Creates an adaptor which implements the <code>Read</code> trait for <code>self</code>. <a>Read more</a></div></details></div></details><details class="toggle impleme [...]
+ Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><span class="item-info"><div class="stab portability">Available on <strong>crate feature <code>std</code></strong> only.</div></span><div class='docblock'>Creates an adaptor which implements the <code>Read</code> trait for <code>self</code>. <a>Read more</a></div></details></div></details><details class="toggle impleme [...]
Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Returns a view of the buffer with the specified range. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.filled" class="method trait-impl"><a href="#method.filled" class="anchor">§</a><h4 class="code-header">fn <a class="fn">filled</a>(&sel [...]
&mut self
) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a><[Self::<a class="associatedtype" href="https://doc.rust-lang.org/nightly/core/iter/traits/iterator/trait.Iterator.html#associatedtype.Item" title="type core::iter::traits::iterator::Iterator::Item">Item</a>; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.array.html">N</a>], <a class="struct" href="https://doc.rust-lang.o [...]
@@ -280,7 +280,7 @@ greater than or equal to those of another. <a href="https://doc.rust-lang.org/ni
Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(Self::<a class="associatedtype" href="https://doc.rust-lang.org/nightly/core/iter/traits/iterator/trait.Iterator.html#associatedtype.Item" title="type core::iter::traits::iterator::Iterator::Item">Item</a>) -> K,
K: <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html" title="trait core::cmp::PartialOrd">PartialOrd</a>,</div></h4></section></summary><span class="item-info"><div class="stab unstable"><span class="emoji">🔬</span><span>This is a nightly-only experimental API. (<code>is_sorted</code>)</span></div></span><div class='docblock'>Checks if the elements of this iterator are sorted using the given key extraction
-function. <a href="https://doc.rust-lang.org/nightly/core/iter/traits/iterator/trait.Iterator.html#method.is_sorted_by_key">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-Buffer" class="impl"><a class="src rightside" href="../src/opendal/raw/oio/read/api.rs.html#116-125">source</a><a href="#impl-Read-for-Buffer" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="raw/oio/trait.Read.html [...]
+function. <a href="https://doc.rust-lang.org/nightly/core/iter/traits/iterator/trait.Iterator.html#method.is_sorted_by_key">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-Buffer" class="impl"><a class="src rightside" href="../src/opendal/raw/oio/read/api.rs.html#116-125">source</a><a href="#impl-Read-for-Buffer" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="raw/oio/trait.Read.html [...]
Each call to this function must be preceded by a successful call to
<code>poll_ready</code> which returned <code>Poll::Ready(Ok(()))</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.poll_flush" class="method trait-impl"><a class="src rightside" href="../src/opendal/types/write/buffer_sink.rs.html#66-105">source</a><a href="#method.poll_flush" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_flush</a>(self: <a class="struct" href="https://doc.rust-lang.org/nightly/core/pin/str [...]
self: <a class="struct" href="https://doc.rust-lang.org/nightly/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&mut Self</a>>,
diff --git a/docs/rust/opendal/struct.Operator.html b/docs/rust/opendal/struct.Operator.html
index 2b6f090ef9..03d38abbf5 100644
--- a/docs/rust/opendal/struct.Operator.html
+++ b/docs/rust/opendal/struct.Operator.html
@@ -974,7 +974,7 @@ extra options like <code>content_type</code>, please use <a href="struct.Operato
<span class="prelude-val">Ok</span>(())
}</code></pre></div>
-</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Operator-3" class="impl"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#47-317">source</a><a href="#impl-Operator-3" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h3></section></summary><div class="docblock"><h4 id="operator-build-api"><a class="doc-anchor" [...]
+</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Operator-3" class="impl"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#47-319">source</a><a href="#impl-Operator-3" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h3></section></summary><div class="docblock"><h4 id="operator-build-api"><a class="doc-anchor" [...]
<p>Operator should be built via <a href="struct.OperatorBuilder.html" title="struct opendal::OperatorBuilder"><code>OperatorBuilder</code></a>. We recommend to use <a href="struct.Operator.html#method.new" title="associated function opendal::Operator::new"><code>Operator::new</code></a> to get started:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>opendal::services::Fs;
@@ -1039,7 +1039,7 @@ type parameter which is not always easy to be used.</p>
<span class="prelude-val">Ok</span>(())
}</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.via_map" class="method"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#151-281">source</a><h4 class="code-header">pub fn <a href="#method.via_map" class="fn">via_map</a>(scheme: <a class="enum" href="enum.Scheme.html" title="enum opendal::Scheme">Scheme</a>, map: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title= [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.via_map" class="method"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#151-283">source</a><h4 class="code-header">pub fn <a href="#method.via_map" class="fn">via_map</a>(scheme: <a class="enum" href="enum.Scheme.html" title="enum opendal::Scheme">Scheme</a>, map: <a class="struct" href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html" title= [...]
<h5 id="notes-23"><a class="doc-anchor" href="#notes-23">§</a>Notes</h5>
<p>from_map is using static dispatch layers which is zero cost. via_map is
using dynamic dispatch layers which has a bit runtime overhead with an
@@ -1063,7 +1063,7 @@ type parameter which is not always easy to be used.</p>
<span class="prelude-val">Ok</span>(())
}</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.layer" class="method"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#312-316">source</a><h4 class="code-header">pub fn <a href="#method.layer" class="fn">layer</a><L: <a class="trait" href="raw/trait.Layer.html" title="trait opendal::raw::Layer">Layer</a><<a class="type" href="raw/type.Accessor.html" title="type opendal::raw::Accessor">Accessor</a>>>(self, lay [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.layer" class="method"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#314-318">source</a><h4 class="code-header">pub fn <a href="#method.layer" class="fn">layer</a><L: <a class="trait" href="raw/trait.Layer.html" title="trait opendal::raw::Layer">Layer</a><<a class="type" href="raw/type.Accessor.html" title="type opendal::raw::Accessor">Accessor</a>>>(self, lay [...]
<h5 id="notes-24"><a class="doc-anchor" href="#notes-24">§</a>Notes</h5>
<p><code>OperatorBuilder::layer()</code> is using static dispatch which is zero
cost. <code>Operator::layer()</code> is using dynamic dispatch which has a
diff --git a/docs/rust/opendal/struct.OperatorBuilder.html b/docs/rust/opendal/struct.OperatorBuilder.html
index f22f60689a..3058996ced 100644
--- a/docs/rust/opendal/struct.OperatorBuilder.html
+++ b/docs/rust/opendal/struct.OperatorBuilder.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="OperatorBuilder is a typed builder to build an Operator."><title>OperatorBuilder in opendal - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,Fi [...]
+<!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="OperatorBuilder is a typed builder to build an Operator."><title>OperatorBuilder in opendal - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,Fi [...]
<h2 id="notes"><a class="doc-anchor" href="#notes">§</a>Notes</h2>
<p>OpenDAL uses static dispatch internally and only performs dynamic
dispatch at the outmost type erase layer. OperatorBuilder is the only
@@ -35,8 +35,8 @@ public API provided by OpenDAL come with generic parameters.</p>
<span class="prelude-val">Ok</span>(())
}</code></pre></div>
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-OperatorBuilder%3CA%3E" class="impl"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#367-418">source</a><a href="#impl-OperatorBuilder%3CA%3E" class="anchor">§</a><h3 class="code-header">impl<A: <a class="trait" href="raw/ [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.layer" class="method"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#407-411">source</a><h4 class="code-header">pub fn <a href="#method.layer" class="fn">layer</a><L: <a class="trait" href="raw/trait.Layer.html" title="trait opendal::raw::Layer">Layer</a><A>>(self, layer: L) -> <a class="struct" href="struct.OperatorBuilder.html" title="struct opendal::Oper [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-OperatorBuilder%3CA%3E" class="impl"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#369-420">source</a><a href="#impl-OperatorBuilder%3CA%3E" class="anchor">§</a><h3 class="code-header">impl<A: <a class="trait" href="raw/ [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.layer" class="method"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#409-413">source</a><h4 class="code-header">pub fn <a href="#method.layer" class="fn">layer</a><L: <a class="trait" href="raw/trait.Layer.html" title="trait opendal::raw::Layer">Layer</a><A>>(self, layer: L) -> <a class="struct" href="struct.OperatorBuilder.html" title="struct opendal::Oper [...]
<h5 id="notes-1"><a class="doc-anchor" href="#notes-1">§</a>Notes</h5>
<p><code>OperatorBuilder::layer()</code> is using static dispatch which is zero
cost. <code>Operator::layer()</code> is using dynamic dispatch which has a
@@ -53,7 +53,7 @@ inline.</p>
.finish();
<span class="comment">// All operations will go through the new_layer
</span><span class="kw">let _ </span>= op.read(<span class="string">"test_file"</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.finish" class="method"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#414-417">source</a><h4 class="code-header">pub fn <a href="#method.finish" class="fn">finish</a>(self) -> <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h4></section></summary><div class="docblock"><p>Finish the building to construct an Operator.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.finish" class="method"><a class="src rightside" href="../src/opendal/types/operator/builder.rs.html#416-419">source</a><h4 class="code-header">pub fn <a href="#method.finish" class="fn">finish</a>(self) -> <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h4></section></summary><div class="docblock"><p>Finish the building to construct an Operator.</p>
</div></details></div></details></div><h2 id="synthetic-implementations" class="section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-Freeze-for-OperatorBuilder%3CA%3E" class="impl"><a href="#impl-Freeze-for-OperatorBuilder%3CA%3E" class="anchor">§</a><h3 class="code-header">impl<A> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html" title [...]
A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html" title="trait core::marker::Freeze">Freeze</a>,</div></h3></section><section id="impl-RefUnwindSafe-for-OperatorBuilder%3CA%3E" class="impl"><a href="#impl-RefUnwindSafe-for-OperatorBuilder%3CA%3E" class="anchor">§</a><h3 class="code-header">impl<A> <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_saf [...]
A: <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</div></h3></section><section id="impl-Send-for-OperatorBuilder%3CA%3E" class="impl"><a href="#impl-Send-for-OperatorBuilder%3CA%3E" class="anchor">§</a><h3 class="code-header">impl<A> <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Sen [...]
diff --git a/docs/rust/opendal/trait.Builder.html b/docs/rust/opendal/trait.Builder.html
index bf20b2de1f..674ae1ba50 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="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="src 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/nightly/std/col [...]
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.build" class="method"><a class="src rightside" href="../src/opendal/types/builder.rs.html#48">source</a><h4 class="code-header">fn <a href="#tymethod.build" class="fn">build</a>(&mut self) -> <a class="type" href="type.Result.html" title="type opendal::Result">Result</a><Self::<a class="associatedtype" href="trait.Builder.html#associatedtype.Accessor" title="type opendal::Builder::Accessor [...]
</div></details></div><h2 id="object-safety" class="section-header">Object Safety<a href="#object-safety" class="anchor">§</a></h2><div class="object-safety-info">This trait is <b>not</b> <a href="https://doc.rust-lang.org/nightly/reference/items/traits.html#object-safety">object safe</a>.</div><h2 id="foreign-impls" class="section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="im [...]
-</div><div class="impl-items"><section id="associatedconstant.SCHEME-1" class="associatedconstant trait-impl"><a class="src 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" class=" [...]
\ No newline at end of file
+</div><div class="impl-items"><section id="associatedconstant.SCHEME-1" class="associatedconstant trait-impl"><a class="src 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" class=" [...]
\ No newline at end of file
diff --git a/docs/rust/search-index.js b/docs/rust/search-index.js
index 8eada019f5..b2275621d9 100644
--- a/docs/rust/search-index.js
+++ b/docs/rust/search-index.js
@@ -1,5 +1,5 @@
var searchIndex = new Map(JSON.parse('[\
-["opendal",{"t":"RPPPPPPPFFFFFFKPPFPPPPPPPPPPPPPPPPPPPPFGPFGPPPPPPFFFFPPPPPPPPPPPPPPPPPPFPPFGPPPPPPPPPPFFFPPPPPPFPPIPPTGPPPPFFFPPPPPPPPPPPPPFPNNNNOOONNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNONNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN [...]
+["opendal",{"t":"RPPPPPPPPFFFFFFKPPFPPPPPPPPPPPPPPPPPPPPFGPFGPPPPPPFFFFPPPPPPPPPPPPPPPPPPFPPFGPPPPPPPPPPFFFPPPPPPFPPIPPTGPPPPFFFPPPPPPPPPPPPPFPNNNNOOONNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNONNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN [...]
]'));
if (typeof exports !== 'undefined') exports.searchIndex = searchIndex;
else if (window.initSearch) window.initSearch(searchIndex);
diff --git a/docs/rust/search.desc/opendal/opendal-desc-0-.js b/docs/rust/search.desc/opendal/opendal-desc-0-.js
index de810fa16a..7a830699bb 100644
--- a/docs/rust/search.desc/opendal/opendal-desc-0-.js
+++ b/docs/rust/search.desc/opendal/opendal-desc-0-.js
@@ -1 +1 @@
-searchState.loadedDescShard("opendal", 0, "Apache OpenDAL™ is a data access layer that allows users …\nThe accessor that built by this builder.\n[alluxio][created::services::Alluxio]: Alluxio services.\nThe given path already exists thus we failed to the …\natomicserver: Atomicserver services.\nazblob: Azure Storage Blob services.\nAzdls: Azure Data Lake Storage Gen2.\n[azfile][crate::services::azfile]: Azfile Services\nB2: Backblaze B2 Services.\nBlockingLister is designed to list entri [...]
\ No newline at end of file
+searchState.loadedDescShard("opendal", 0, "Apache OpenDAL™ is a data access layer that allows users …\nThe accessor that built by this builder.\naliyun_drive: Aliyun Drive services.\n[alluxio][created::services::Alluxio]: Alluxio services.\nThe given path already exists thus we failed to the …\natomicserver: Atomicserver services.\nazblob: Azure Storage Blob services.\nAzdls: Azure Data Lake Storage Gen2.\n[azfile][crate::services::azfile]: Azfile Services\nB2: Backblaze B2 Services.\nBl [...]
\ No newline at end of file
diff --git a/docs/rust/src-files.js b/docs/rust/src-files.js
index d86fe58d23..573d8fdf2f 100644
--- a/docs/rust/src-files.js
+++ b/docs/rust/src-files.js
@@ -1,4 +1,4 @@
var srcIndex = new Map(JSON.parse('[\
-["opendal",["",[["docs",[["comparisons",[],["mod.rs"]],["internals",[],["accessor.rs","layer.rs","mod.rs"]],["rfcs",[],["mod.rs"]]],["concepts.rs","mod.rs"]],["layers",[],["async_backtrace.rs","await_tree.rs","blocking.rs","chaos.rs","complete.rs","concurrent_limit.rs","dtrace.rs","error_context.rs","immutable_index.rs","logging.rs","madsim.rs","metrics.rs","minitrace.rs","mod.rs","oteltrace.rs","prometheus.rs","prometheus_client.rs","retry.rs","throttle.rs","timeout.rs","tracing.rs","ty [...]
+["opendal",["",[["docs",[["comparisons",[],["mod.rs"]],["internals",[],["accessor.rs","layer.rs","mod.rs"]],["rfcs",[],["mod.rs"]]],["concepts.rs","mod.rs"]],["layers",[],["async_backtrace.rs","await_tree.rs","blocking.rs","chaos.rs","complete.rs","concurrent_limit.rs","dtrace.rs","error_context.rs","immutable_index.rs","logging.rs","madsim.rs","metrics.rs","minitrace.rs","mod.rs","oteltrace.rs","prometheus.rs","prometheus_client.rs","retry.rs","throttle.rs","timeout.rs","tracing.rs","ty [...]
]'));
createSrcSidebar();
diff --git a/docs/rust/src/opendal/services/aliyun_drive/backend.rs.html b/docs/rust/src/opendal/services/aliyun_drive/backend.rs.html
new file mode 100644
index 0000000000..ebf88cf75b
--- /dev/null
+++ b/docs/rust/src/opendal/services/aliyun_drive/backend.rs.html
@@ -0,0 +1,943 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `src/services/aliyun_drive/backend.rs`."><title>backend.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans- [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
+<a href="#136" id="136">136</a>
+<a href="#137" id="137">137</a>
+<a href="#138" id="138">138</a>
+<a href="#139" id="139">139</a>
+<a href="#140" id="140">140</a>
+<a href="#141" id="141">141</a>
+<a href="#142" id="142">142</a>
+<a href="#143" id="143">143</a>
+<a href="#144" id="144">144</a>
+<a href="#145" id="145">145</a>
+<a href="#146" id="146">146</a>
+<a href="#147" id="147">147</a>
+<a href="#148" id="148">148</a>
+<a href="#149" id="149">149</a>
+<a href="#150" id="150">150</a>
+<a href="#151" id="151">151</a>
+<a href="#152" id="152">152</a>
+<a href="#153" id="153">153</a>
+<a href="#154" id="154">154</a>
+<a href="#155" id="155">155</a>
+<a href="#156" id="156">156</a>
+<a href="#157" id="157">157</a>
+<a href="#158" id="158">158</a>
+<a href="#159" id="159">159</a>
+<a href="#160" id="160">160</a>
+<a href="#161" id="161">161</a>
+<a href="#162" id="162">162</a>
+<a href="#163" id="163">163</a>
+<a href="#164" id="164">164</a>
+<a href="#165" id="165">165</a>
+<a href="#166" id="166">166</a>
+<a href="#167" id="167">167</a>
+<a href="#168" id="168">168</a>
+<a href="#169" id="169">169</a>
+<a href="#170" id="170">170</a>
+<a href="#171" id="171">171</a>
+<a href="#172" id="172">172</a>
+<a href="#173" id="173">173</a>
+<a href="#174" id="174">174</a>
+<a href="#175" id="175">175</a>
+<a href="#176" id="176">176</a>
+<a href="#177" id="177">177</a>
+<a href="#178" id="178">178</a>
+<a href="#179" id="179">179</a>
+<a href="#180" id="180">180</a>
+<a href="#181" id="181">181</a>
+<a href="#182" id="182">182</a>
+<a href="#183" id="183">183</a>
+<a href="#184" id="184">184</a>
+<a href="#185" id="185">185</a>
+<a href="#186" id="186">186</a>
+<a href="#187" id="187">187</a>
+<a href="#188" id="188">188</a>
+<a href="#189" id="189">189</a>
+<a href="#190" id="190">190</a>
+<a href="#191" id="191">191</a>
+<a href="#192" id="192">192</a>
+<a href="#193" id="193">193</a>
+<a href="#194" id="194">194</a>
+<a href="#195" id="195">195</a>
+<a href="#196" id="196">196</a>
+<a href="#197" id="197">197</a>
+<a href="#198" id="198">198</a>
+<a href="#199" id="199">199</a>
+<a href="#200" id="200">200</a>
+<a href="#201" id="201">201</a>
+<a href="#202" id="202">202</a>
+<a href="#203" id="203">203</a>
+<a href="#204" id="204">204</a>
+<a href="#205" id="205">205</a>
+<a href="#206" id="206">206</a>
+<a href="#207" id="207">207</a>
+<a href="#208" id="208">208</a>
+<a href="#209" id="209">209</a>
+<a href="#210" id="210">210</a>
+<a href="#211" id="211">211</a>
+<a href="#212" id="212">212</a>
+<a href="#213" id="213">213</a>
+<a href="#214" id="214">214</a>
+<a href="#215" id="215">215</a>
+<a href="#216" id="216">216</a>
+<a href="#217" id="217">217</a>
+<a href="#218" id="218">218</a>
+<a href="#219" id="219">219</a>
+<a href="#220" id="220">220</a>
+<a href="#221" id="221">221</a>
+<a href="#222" id="222">222</a>
+<a href="#223" id="223">223</a>
+<a href="#224" id="224">224</a>
+<a href="#225" id="225">225</a>
+<a href="#226" id="226">226</a>
+<a href="#227" id="227">227</a>
+<a href="#228" id="228">228</a>
+<a href="#229" id="229">229</a>
+<a href="#230" id="230">230</a>
+<a href="#231" id="231">231</a>
+<a href="#232" id="232">232</a>
+<a href="#233" id="233">233</a>
+<a href="#234" id="234">234</a>
+<a href="#235" id="235">235</a>
+<a href="#236" id="236">236</a>
+<a href="#237" id="237">237</a>
+<a href="#238" id="238">238</a>
+<a href="#239" id="239">239</a>
+<a href="#240" id="240">240</a>
+<a href="#241" id="241">241</a>
+<a href="#242" id="242">242</a>
+<a href="#243" id="243">243</a>
+<a href="#244" id="244">244</a>
+<a href="#245" id="245">245</a>
+<a href="#246" id="246">246</a>
+<a href="#247" id="247">247</a>
+<a href="#248" id="248">248</a>
+<a href="#249" id="249">249</a>
+<a href="#250" id="250">250</a>
+<a href="#251" id="251">251</a>
+<a href="#252" id="252">252</a>
+<a href="#253" id="253">253</a>
+<a href="#254" id="254">254</a>
+<a href="#255" id="255">255</a>
+<a href="#256" id="256">256</a>
+<a href="#257" id="257">257</a>
+<a href="#258" id="258">258</a>
+<a href="#259" id="259">259</a>
+<a href="#260" id="260">260</a>
+<a href="#261" id="261">261</a>
+<a href="#262" id="262">262</a>
+<a href="#263" id="263">263</a>
+<a href="#264" id="264">264</a>
+<a href="#265" id="265">265</a>
+<a href="#266" id="266">266</a>
+<a href="#267" id="267">267</a>
+<a href="#268" id="268">268</a>
+<a href="#269" id="269">269</a>
+<a href="#270" id="270">270</a>
+<a href="#271" id="271">271</a>
+<a href="#272" id="272">272</a>
+<a href="#273" id="273">273</a>
+<a href="#274" id="274">274</a>
+<a href="#275" id="275">275</a>
+<a href="#276" id="276">276</a>
+<a href="#277" id="277">277</a>
+<a href="#278" id="278">278</a>
+<a href="#279" id="279">279</a>
+<a href="#280" id="280">280</a>
+<a href="#281" id="281">281</a>
+<a href="#282" id="282">282</a>
+<a href="#283" id="283">283</a>
+<a href="#284" id="284">284</a>
+<a href="#285" id="285">285</a>
+<a href="#286" id="286">286</a>
+<a href="#287" id="287">287</a>
+<a href="#288" id="288">288</a>
+<a href="#289" id="289">289</a>
+<a href="#290" id="290">290</a>
+<a href="#291" id="291">291</a>
+<a href="#292" id="292">292</a>
+<a href="#293" id="293">293</a>
+<a href="#294" id="294">294</a>
+<a href="#295" id="295">295</a>
+<a href="#296" id="296">296</a>
+<a href="#297" id="297">297</a>
+<a href="#298" id="298">298</a>
+<a href="#299" id="299">299</a>
+<a href="#300" id="300">300</a>
+<a href="#301" id="301">301</a>
+<a href="#302" id="302">302</a>
+<a href="#303" id="303">303</a>
+<a href="#304" id="304">304</a>
+<a href="#305" id="305">305</a>
+<a href="#306" id="306">306</a>
+<a href="#307" id="307">307</a>
+<a href="#308" id="308">308</a>
+<a href="#309" id="309">309</a>
+<a href="#310" id="310">310</a>
+<a href="#311" id="311">311</a>
+<a href="#312" id="312">312</a>
+<a href="#313" id="313">313</a>
+<a href="#314" id="314">314</a>
+<a href="#315" id="315">315</a>
+<a href="#316" id="316">316</a>
+<a href="#317" id="317">317</a>
+<a href="#318" id="318">318</a>
+<a href="#319" id="319">319</a>
+<a href="#320" id="320">320</a>
+<a href="#321" id="321">321</a>
+<a href="#322" id="322">322</a>
+<a href="#323" id="323">323</a>
+<a href="#324" id="324">324</a>
+<a href="#325" id="325">325</a>
+<a href="#326" id="326">326</a>
+<a href="#327" id="327">327</a>
+<a href="#328" id="328">328</a>
+<a href="#329" id="329">329</a>
+<a href="#330" id="330">330</a>
+<a href="#331" id="331">331</a>
+<a href="#332" id="332">332</a>
+<a href="#333" id="333">333</a>
+<a href="#334" id="334">334</a>
+<a href="#335" id="335">335</a>
+<a href="#336" id="336">336</a>
+<a href="#337" id="337">337</a>
+<a href="#338" id="338">338</a>
+<a href="#339" id="339">339</a>
+<a href="#340" id="340">340</a>
+<a href="#341" id="341">341</a>
+<a href="#342" id="342">342</a>
+<a href="#343" id="343">343</a>
+<a href="#344" id="344">344</a>
+<a href="#345" id="345">345</a>
+<a href="#346" id="346">346</a>
+<a href="#347" id="347">347</a>
+<a href="#348" id="348">348</a>
+<a href="#349" id="349">349</a>
+<a href="#350" id="350">350</a>
+<a href="#351" id="351">351</a>
+<a href="#352" id="352">352</a>
+<a href="#353" id="353">353</a>
+<a href="#354" id="354">354</a>
+<a href="#355" id="355">355</a>
+<a href="#356" id="356">356</a>
+<a href="#357" id="357">357</a>
+<a href="#358" id="358">358</a>
+<a href="#359" id="359">359</a>
+<a href="#360" id="360">360</a>
+<a href="#361" id="361">361</a>
+<a href="#362" id="362">362</a>
+<a href="#363" id="363">363</a>
+<a href="#364" id="364">364</a>
+<a href="#365" id="365">365</a>
+<a href="#366" id="366">366</a>
+<a href="#367" id="367">367</a>
+<a href="#368" id="368">368</a>
+<a href="#369" id="369">369</a>
+<a href="#370" id="370">370</a>
+<a href="#371" id="371">371</a>
+<a href="#372" id="372">372</a>
+<a href="#373" id="373">373</a>
+<a href="#374" id="374">374</a>
+<a href="#375" id="375">375</a>
+<a href="#376" id="376">376</a>
+<a href="#377" id="377">377</a>
+<a href="#378" id="378">378</a>
+<a href="#379" id="379">379</a>
+<a href="#380" id="380">380</a>
+<a href="#381" id="381">381</a>
+<a href="#382" id="382">382</a>
+<a href="#383" id="383">383</a>
+<a href="#384" id="384">384</a>
+<a href="#385" id="385">385</a>
+<a href="#386" id="386">386</a>
+<a href="#387" id="387">387</a>
+<a href="#388" id="388">388</a>
+<a href="#389" id="389">389</a>
+<a href="#390" id="390">390</a>
+<a href="#391" id="391">391</a>
+<a href="#392" id="392">392</a>
+<a href="#393" id="393">393</a>
+<a href="#394" id="394">394</a>
+<a href="#395" id="395">395</a>
+<a href="#396" id="396">396</a>
+<a href="#397" id="397">397</a>
+<a href="#398" id="398">398</a>
+<a href="#399" id="399">399</a>
+<a href="#400" id="400">400</a>
+<a href="#401" id="401">401</a>
+<a href="#402" id="402">402</a>
+<a href="#403" id="403">403</a>
+<a href="#404" id="404">404</a>
+<a href="#405" id="405">405</a>
+<a href="#406" id="406">406</a>
+<a href="#407" id="407">407</a>
+<a href="#408" id="408">408</a>
+<a href="#409" id="409">409</a>
+<a href="#410" id="410">410</a>
+<a href="#411" id="411">411</a>
+<a href="#412" id="412">412</a>
+<a href="#413" id="413">413</a>
+<a href="#414" id="414">414</a>
+<a href="#415" id="415">415</a>
+<a href="#416" id="416">416</a>
+<a href="#417" id="417">417</a>
+<a href="#418" id="418">418</a>
+<a href="#419" id="419">419</a>
+<a href="#420" id="420">420</a>
+<a href="#421" id="421">421</a>
+<a href="#422" id="422">422</a>
+<a href="#423" id="423">423</a>
+<a href="#424" id="424">424</a>
+<a href="#425" id="425">425</a>
+<a href="#426" id="426">426</a>
+<a href="#427" id="427">427</a>
+<a href="#428" id="428">428</a>
+<a href="#429" id="429">429</a>
+<a href="#430" id="430">430</a>
+<a href="#431" id="431">431</a>
+<a href="#432" id="432">432</a>
+<a href="#433" id="433">433</a>
+<a href="#434" id="434">434</a>
+<a href="#435" id="435">435</a>
+<a href="#436" id="436">436</a>
+<a href="#437" id="437">437</a>
+<a href="#438" id="438">438</a>
+<a href="#439" id="439">439</a>
+<a href="#440" id="440">440</a>
+<a href="#441" id="441">441</a>
+<a href="#442" id="442">442</a>
+<a href="#443" id="443">443</a>
+<a href="#444" id="444">444</a>
+<a href="#445" id="445">445</a>
+<a href="#446" id="446">446</a>
+<a href="#447" id="447">447</a>
+<a href="#448" id="448">448</a>
+<a href="#449" id="449">449</a>
+<a href="#450" id="450">450</a>
+<a href="#451" id="451">451</a>
+<a href="#452" id="452">452</a>
+<a href="#453" id="453">453</a>
+<a href="#454" id="454">454</a>
+<a href="#455" id="455">455</a>
+<a href="#456" id="456">456</a>
+<a href="#457" id="457">457</a>
+<a href="#458" id="458">458</a>
+<a href="#459" id="459">459</a>
+<a href="#460" id="460">460</a>
+<a href="#461" id="461">461</a>
+<a href="#462" id="462">462</a>
+<a href="#463" id="463">463</a>
+<a href="#464" id="464">464</a>
+<a href="#465" id="465">465</a>
+<a href="#466" id="466">466</a>
+<a href="#467" id="467">467</a>
+<a href="#468" id="468">468</a>
+<a href="#469" id="469">469</a>
+<a href="#470" id="470">470</a>
+<a href="#471" id="471">471</a>
+</pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+</span><span class="kw">use </span>std::fmt::Debug;
+<span class="kw">use </span>std::fmt::Formatter;
+<span class="kw">use </span>std::sync::Arc;
+
+<span class="kw">use </span>bytes::Buf;
+<span class="kw">use </span>chrono::Utc;
+<span class="kw">use </span>log::debug;
+<span class="kw">use </span>serde::Deserialize;
+<span class="kw">use </span>tokio::sync::Mutex;
+
+<span class="kw">use </span><span class="kw">super</span>::core::<span class="kw-2">*</span>;
+<span class="kw">use </span><span class="kw">super</span>::lister::AliyunDriveLister;
+<span class="kw">use </span><span class="kw">super</span>::lister::AliyunDriveParent;
+<span class="kw">use </span><span class="kw">super</span>::reader::AliyunDriveReader;
+<span class="kw">use </span><span class="kw">super</span>::writer::{AliyunDriveWriter, AliyunDriveWriters};
+<span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
+<span class="kw">use crate</span>::<span class="kw-2">*</span>;
+
+<span class="doccomment">/// Aliyun Drive services support.
+</span><span class="attr">#[derive(Default, Deserialize)]
+#[serde(default)]
+#[non_exhaustive]
+</span><span class="kw">pub struct </span>AliyunDriveConfig {
+ <span class="doccomment">/// root of this backend.
+ ///
+ /// All operations will happen under this root.
+ ///
+ /// default to `/` if not set.
+ </span><span class="kw">pub </span>root: <span class="prelude-ty">Option</span><String>,
+ <span class="doccomment">/// client_id of this backend.
+ ///
+ /// required.
+ </span><span class="kw">pub </span>client_id: String,
+ <span class="doccomment">/// client_secret of this backend.
+ ///
+ /// required.
+ </span><span class="kw">pub </span>client_secret: String,
+ <span class="doccomment">/// refresh_token of this backend.
+ ///
+ /// required.
+ </span><span class="kw">pub </span>refresh_token: String,
+ <span class="doccomment">/// drive_type of this backend.
+ ///
+ /// All operations will happen under this type of drive.
+ ///
+ /// Available values are `default`, `backup` and `resource`.
+ ///
+ /// Fallback to default if not set or no other drives can be found.
+ </span><span class="kw">pub </span>drive_type: String,
+ <span class="doccomment">/// rapid_upload of this backend.
+ ///
+ /// Skip uploading files that are already in the drive by hashing their content.
+ ///
+ /// Only works under the write_once operation.
+ </span><span class="kw">pub </span>rapid_upload: bool,
+}
+
+<span class="kw">impl </span>Debug <span class="kw">for </span>AliyunDriveConfig {
+ <span class="kw">fn </span>fmt(<span class="kw-2">&</span><span class="self">self</span>, f: <span class="kw-2">&mut </span>Formatter<<span class="lifetime">'_</span>>) -> std::fmt::Result {
+ <span class="kw">let </span><span class="kw-2">mut </span>d = f.debug_struct(<span class="string">"AliyunDriveConfig"</span>);
+
+ d.field(<span class="string">"root"</span>, <span class="kw-2">&</span><span class="self">self</span>.root)
+ .field(<span class="string">"drive_type"</span>, <span class="kw-2">&</span><span class="self">self</span>.drive_type);
+
+ d.finish_non_exhaustive()
+ }
+}
+
+<span class="attr">#[doc = <span class="macro">include_str!</span>(<span class="string">"docs.md"</span>)]
+#[derive(Default)]
+</span><span class="kw">pub struct </span>AliyunDriveBuilder {
+ config: AliyunDriveConfig,
+
+ http_client: <span class="prelude-ty">Option</span><HttpClient>,
+}
+
+<span class="kw">impl </span>Debug <span class="kw">for </span>AliyunDriveBuilder {
+ <span class="kw">fn </span>fmt(<span class="kw-2">&</span><span class="self">self</span>, f: <span class="kw-2">&mut </span>Formatter<<span class="lifetime">'_</span>>) -> std::fmt::Result {
+ <span class="kw">let </span><span class="kw-2">mut </span>d = f.debug_struct(<span class="string">"AliyunDriveBuilder"</span>);
+
+ d.field(<span class="string">"config"</span>, <span class="kw-2">&</span><span class="self">self</span>.config);
+ d.finish_non_exhaustive()
+ }
+}
+
+<span class="kw">impl </span>AliyunDriveBuilder {
+ <span class="doccomment">/// Set root of this backend.
+ ///
+ /// All operations will happen under this root.
+ </span><span class="kw">pub fn </span>root(<span class="kw-2">&mut </span><span class="self">self</span>, root: <span class="kw-2">&</span>str) -> <span class="kw-2">&mut </span><span class="self">Self </span>{
+ <span class="self">self</span>.config.root = <span class="kw">if </span>root.is_empty() {
+ <span class="prelude-val">None
+ </span>} <span class="kw">else </span>{
+ <span class="prelude-val">Some</span>(root.to_string())
+ };
+
+ <span class="self">self
+ </span>}
+
+ <span class="doccomment">/// Set client_id of this backend.
+ </span><span class="kw">pub fn </span>client_id(<span class="kw-2">&mut </span><span class="self">self</span>, client_id: <span class="kw-2">&</span>str) -> <span class="kw-2">&mut </span><span class="self">Self </span>{
+ <span class="self">self</span>.config.client_id = client_id.to_string();
+
+ <span class="self">self
+ </span>}
+
+ <span class="doccomment">/// Set client_secret of this backend.
+ </span><span class="kw">pub fn </span>client_secret(<span class="kw-2">&mut </span><span class="self">self</span>, client_secret: <span class="kw-2">&</span>str) -> <span class="kw-2">&mut </span><span class="self">Self </span>{
+ <span class="self">self</span>.config.client_secret = client_secret.to_string();
+
+ <span class="self">self
+ </span>}
+
+ <span class="doccomment">/// Set refresh_token of this backend.
+ </span><span class="kw">pub fn </span>refresh_token(<span class="kw-2">&mut </span><span class="self">self</span>, refresh_token: <span class="kw-2">&</span>str) -> <span class="kw-2">&mut </span><span class="self">Self </span>{
+ <span class="self">self</span>.config.refresh_token = refresh_token.to_string();
+
+ <span class="self">self
+ </span>}
+
+ <span class="doccomment">/// Set drive_type of this backend.
+ </span><span class="kw">pub fn </span>drive_type(<span class="kw-2">&mut </span><span class="self">self</span>, drive_type: <span class="kw-2">&</span>str) -> <span class="kw-2">&mut </span><span class="self">Self </span>{
+ <span class="self">self</span>.config.drive_type = drive_type.to_string();
+
+ <span class="self">self
+ </span>}
+
+ <span class="doccomment">/// Set rapid_upload of this backend.
+ </span><span class="kw">pub fn </span>rapid_upload(<span class="kw-2">&mut </span><span class="self">self</span>, rapid_upload: bool) -> <span class="kw-2">&mut </span><span class="self">Self </span>{
+ <span class="self">self</span>.config.rapid_upload = rapid_upload;
+
+ <span class="self">self
+ </span>}
+
+ <span class="doccomment">/// Specify the http client that used by this service.
+ ///
+ /// # Notes
+ ///
+ /// This API is part of OpenDAL's Raw API. `HttpClient` could be changed
+ /// during minor updates.
+ </span><span class="kw">pub fn </span>http_client(<span class="kw-2">&mut </span><span class="self">self</span>, client: HttpClient) -> <span class="kw-2">&mut </span><span class="self">Self </span>{
+ <span class="self">self</span>.http_client = <span class="prelude-val">Some</span>(client);
+ <span class="self">self
+ </span>}
+}
+
+<span class="kw">impl </span>Builder <span class="kw">for </span>AliyunDriveBuilder {
+ <span class="kw">const </span>SCHEME: Scheme = Scheme::AliyunDrive;
+
+ <span class="kw">type </span>Accessor = AliyunDriveBackend;
+
+ <span class="kw">fn </span>from_map(map: std::collections::HashMap<String, String>) -> <span class="self">Self </span>{
+ <span class="kw">let </span>config = AliyunDriveConfig::deserialize(ConfigDeserializer::new(map))
+ .expect(<span class="string">"config deserialize must succeed"</span>);
+ AliyunDriveBuilder {
+ config,
+
+ http_client: <span class="prelude-val">None</span>,
+ }
+ }
+
+ <span class="kw">fn </span>build(<span class="kw-2">&mut </span><span class="self">self</span>) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Accessor> {
+ <span class="macro">debug!</span>(<span class="string">"backend build started: {:?}"</span>, <span class="kw-2">&</span><span class="self">self</span>);
+
+ <span class="kw">let </span>root = normalize_root(<span class="kw-2">&</span><span class="self">self</span>.config.root.clone().unwrap_or_default());
+ <span class="macro">debug!</span>(<span class="string">"backend use root {}"</span>, <span class="kw-2">&</span>root);
+
+ <span class="kw">let </span>client = <span class="kw">if let </span><span class="prelude-val">Some</span>(client) = <span class="self">self</span>.http_client.take() {
+ client
+ } <span class="kw">else </span>{
+ HttpClient::new().map_err(|err| {
+ err.with_operation(<span class="string">"Builder::build"</span>)
+ .with_context(<span class="string">"service"</span>, Scheme::AliyunDrive)
+ })<span class="question-mark">?
+ </span>};
+
+ <span class="kw">let </span>client_id = <span class="self">self</span>.config.client_id.clone();
+ <span class="kw">if </span>client_id.is_empty() {
+ <span class="kw">return </span><span class="prelude-val">Err</span>(
+ Error::new(ErrorKind::ConfigInvalid, <span class="string">"client_id is missing."</span>)
+ .with_operation(<span class="string">"Builder::build"</span>)
+ .with_context(<span class="string">"service"</span>, Scheme::AliyunDrive),
+ );
+ }
+
+ <span class="kw">let </span>client_secret = <span class="self">self</span>.config.client_secret.clone();
+ <span class="kw">if </span>client_secret.is_empty() {
+ <span class="kw">return </span><span class="prelude-val">Err</span>(
+ Error::new(ErrorKind::ConfigInvalid, <span class="string">"client_secret is missing."</span>)
+ .with_operation(<span class="string">"Builder::build"</span>)
+ .with_context(<span class="string">"service"</span>, Scheme::AliyunDrive),
+ );
+ }
+
+ <span class="kw">let </span>refresh_token = <span class="self">self</span>.config.refresh_token.clone();
+ <span class="kw">if </span>refresh_token.is_empty() {
+ <span class="kw">return </span><span class="prelude-val">Err</span>(
+ Error::new(ErrorKind::ConfigInvalid, <span class="string">"refresh_token is missing."</span>)
+ .with_operation(<span class="string">"Builder::build"</span>)
+ .with_context(<span class="string">"service"</span>, Scheme::AliyunDrive),
+ );
+ }
+
+ <span class="kw">let </span>drive_type = <span class="kw">match </span><span class="self">self</span>.config.drive_type.as_str() {
+ <span class="string">"" </span>| <span class="string">"default" </span>=> DriveType::Default,
+ <span class="string">"resource" </span>=> DriveType::Resource,
+ <span class="string">"backup" </span>=> DriveType::Backup,
+ <span class="kw">_ </span>=> {
+ <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+ ErrorKind::ConfigInvalid,
+ <span class="string">"drive_type is invalid."</span>,
+ ))
+ }
+ };
+ <span class="macro">debug!</span>(<span class="string">"backend use drive_type {:?}"</span>, drive_type);
+
+ <span class="kw">let </span>rapid_upload = <span class="self">self</span>.config.rapid_upload;
+ <span class="macro">debug!</span>(<span class="string">"backend use rapid_upload {}"</span>, rapid_upload);
+
+ <span class="prelude-val">Ok</span>(AliyunDriveBackend {
+ core: Arc::new(AliyunDriveCore {
+ endpoint: <span class="string">"https://openapi.alipan.com"</span>.to_string(),
+ root,
+ client_id,
+ client_secret,
+ drive_type,
+ rapid_upload,
+ signer: Arc::new(Mutex::new(AliyunDriveSigner {
+ drive_id: <span class="prelude-val">None</span>,
+ access_token: <span class="prelude-val">None</span>,
+ refresh_token,
+ expire_at: <span class="number">0</span>,
+ })),
+ client,
+ }),
+ })
+ }
+}
+
+<span class="attr">#[derive(Clone, Debug)]
+</span><span class="kw">pub struct </span>AliyunDriveBackend {
+ core: Arc<AliyunDriveCore>,
+}
+
+<span class="kw">impl </span>Access <span class="kw">for </span>AliyunDriveBackend {
+ <span class="kw">type </span>Reader = AliyunDriveReader;
+ <span class="kw">type </span>Writer = AliyunDriveWriters;
+ <span class="kw">type </span>Lister = oio::PageLister<AliyunDriveLister>;
+ <span class="kw">type </span>BlockingReader = ();
+ <span class="kw">type </span>BlockingWriter = ();
+ <span class="kw">type </span>BlockingLister = ();
+
+ <span class="kw">fn </span>info(<span class="kw-2">&</span><span class="self">self</span>) -> AccessorInfo {
+ <span class="kw">let </span><span class="kw-2">mut </span>am = AccessorInfo::default();
+ am.set_scheme(Scheme::AliyunDrive)
+ .set_root(<span class="kw-2">&</span><span class="self">self</span>.core.root)
+ .set_native_capability(Capability {
+ stat: <span class="bool-val">true</span>,
+ create_dir: <span class="bool-val">true</span>,
+ read: <span class="bool-val">true</span>,
+ write: <span class="bool-val">true</span>,
+ write_can_multi: <span class="bool-val">true</span>,
+ <span class="comment">// The min multipart size of AliyunDrive is 100 KiB.
+ </span>write_multi_min_size: <span class="prelude-val">Some</span>(<span class="number">100 </span>* <span class="number">1024</span>),
+ <span class="comment">// The max multipart size of AliyunDrive is 5 GiB.
+ </span>write_multi_max_size: <span class="prelude-val">Some</span>(<span class="number">5 </span>* <span class="number">1024 </span>* <span class="number">1024 </span>* <span class="number">1024</span>),
+ delete: <span class="bool-val">true</span>,
+ copy: <span class="bool-val">true</span>,
+ rename: <span class="bool-val">true</span>,
+ list: <span class="bool-val">true</span>,
+ list_with_limit: <span class="bool-val">true</span>,
+
+ ..Default::default()
+ });
+ am
+ }
+
+ <span class="kw">async fn </span>create_dir(<span class="kw-2">&</span><span class="self">self</span>, path: <span class="kw-2">&</span>str, _args: OpCreateDir) -> <span class="prelude-ty">Result</span><RpCreateDir> {
+ <span class="self">self</span>.core.ensure_dir_exists(path).<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="prelude-val">Ok</span>(RpCreateDir::default())
+ }
+
+ <span class="kw">async fn </span>rename(<span class="kw-2">&</span><span class="self">self</span>, from: <span class="kw-2">&</span>str, to: <span class="kw-2">&</span>str, _args: OpRename) -> <span class="prelude-ty">Result</span><RpRename> {
+ <span class="kw">if </span>from == to {
+ <span class="kw">return </span><span class="prelude-val">Ok</span>(RpRename::default());
+ }
+ <span class="kw">let </span>res = <span class="self">self</span>.core.get_by_path(from).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>file: AliyunDriveFile =
+ serde_json::from_reader(res.reader()).map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="comment">// rename can overwrite.
+ </span><span class="kw">match </span><span class="self">self</span>.core.get_by_path(to).<span class="kw">await </span>{
+ <span class="prelude-val">Err</span>(err) <span class="kw">if </span>err.kind() == ErrorKind::NotFound => {}
+ <span class="prelude-val">Err</span>(err) => <span class="kw">return </span><span class="prelude-val">Err</span>(err),
+ <span class="prelude-val">Ok</span>(res) => {
+ <span class="kw">let </span>file: AliyunDriveFile =
+ serde_json::from_reader(res.reader()).map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.core.delete_path(<span class="kw-2">&</span>file.file_id).<span class="kw">await</span><span class="question-mark">?</span>;
+ }
+ };
+
+ <span class="kw">let </span>parent_file_id = <span class="self">self</span>.core.ensure_dir_exists(get_parent(to)).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="self">self</span>.core.move_path(<span class="kw-2">&</span>file.file_id, <span class="kw-2">&</span>parent_file_id).<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="kw">let </span>from_name = get_basename(from);
+ <span class="kw">let </span>to_name = get_basename(to);
+
+ <span class="kw">if </span>from_name != to_name {
+ <span class="self">self</span>.core.update_path(<span class="kw-2">&</span>file.file_id, to_name).<span class="kw">await</span><span class="question-mark">?</span>;
+ }
+
+ <span class="prelude-val">Ok</span>(RpRename::default())
+ }
+
+ <span class="kw">async fn </span>copy(<span class="kw-2">&</span><span class="self">self</span>, from: <span class="kw-2">&</span>str, to: <span class="kw-2">&</span>str, _args: OpCopy) -> <span class="prelude-ty">Result</span><RpCopy> {
+ <span class="kw">if </span>from == to {
+ <span class="kw">return </span><span class="prelude-val">Ok</span>(RpCopy::default());
+ }
+ <span class="kw">let </span>res = <span class="self">self</span>.core.get_by_path(from).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>file: AliyunDriveFile =
+ serde_json::from_reader(res.reader()).map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="comment">// copy can overwrite.
+ </span><span class="kw">match </span><span class="self">self</span>.core.get_by_path(to).<span class="kw">await </span>{
+ <span class="prelude-val">Err</span>(err) <span class="kw">if </span>err.kind() == ErrorKind::NotFound => {}
+ <span class="prelude-val">Err</span>(err) => <span class="kw">return </span><span class="prelude-val">Err</span>(err),
+ <span class="prelude-val">Ok</span>(res) => {
+ <span class="kw">let </span>file: AliyunDriveFile =
+ serde_json::from_reader(res.reader()).map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.core.delete_path(<span class="kw-2">&</span>file.file_id).<span class="kw">await</span><span class="question-mark">?</span>;
+ }
+ };
+ <span class="comment">// there is no direct copy in AliyunDrive.
+ // so we need to copy the path first and then rename it.
+ </span><span class="kw">let </span>parent_path = get_parent(to);
+ <span class="kw">let </span>parent_file_id = <span class="self">self</span>.core.ensure_dir_exists(parent_path).<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="comment">// if from and to are going to be placed in the same folder
+ // copy_path will fail as we cannot change name during this action.
+ // it has to be auto renamed.
+ </span><span class="kw">let </span>auto_rename = file.parent_file_id == parent_file_id;
+ <span class="kw">let </span>res = <span class="self">self
+ </span>.core
+ .copy_path(<span class="kw-2">&</span>file.file_id, <span class="kw-2">&</span>parent_file_id, auto_rename)
+ .<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>file: CopyResponse =
+ serde_json::from_reader(res.reader()).map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>file_id = file.file_id;
+
+ <span class="kw">let </span>from_name = get_basename(from);
+ <span class="kw">let </span>to_name = get_basename(to);
+
+ <span class="kw">if </span>from_name != to_name {
+ <span class="self">self</span>.core.update_path(<span class="kw-2">&</span>file_id, to_name).<span class="kw">await</span><span class="question-mark">?</span>;
+ }
+
+ <span class="prelude-val">Ok</span>(RpCopy::default())
+ }
+
+ <span class="kw">async fn </span>stat(<span class="kw-2">&</span><span class="self">self</span>, path: <span class="kw-2">&</span>str, _args: OpStat) -> <span class="prelude-ty">Result</span><RpStat> {
+ <span class="kw">let </span>res = <span class="self">self</span>.core.get_by_path(path).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>file: AliyunDriveFile =
+ serde_json::from_reader(res.reader()).map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+
+ <span class="kw">if </span>file.path_type == <span class="string">"folder" </span>{
+ <span class="kw">let </span>meta = Metadata::new(EntryMode::DIR).with_last_modified(
+ file.updated_at
+ .parse::<chrono::DateTime<Utc>>()
+ .map_err(|e| {
+ Error::new(ErrorKind::Unexpected, <span class="string">"parse last modified time"</span>).set_source(e)
+ })<span class="question-mark">?</span>,
+ );
+
+ <span class="kw">return </span><span class="prelude-val">Ok</span>(RpStat::new(meta));
+ }
+
+ <span class="kw">let </span><span class="kw-2">mut </span>meta = Metadata::new(EntryMode::FILE).with_last_modified(
+ file.updated_at
+ .parse::<chrono::DateTime<Utc>>()
+ .map_err(|e| {
+ Error::new(ErrorKind::Unexpected, <span class="string">"parse last modified time"</span>).set_source(e)
+ })<span class="question-mark">?</span>,
+ );
+ <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = file.size {
+ meta = meta.with_content_length(v);
+ }
+ <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = file.content_type {
+ meta = meta.with_content_type(v);
+ }
+
+ <span class="prelude-val">Ok</span>(RpStat::new(meta))
+ }
+
+ <span class="kw">async fn </span>read(<span class="kw-2">&</span><span class="self">self</span>, path: <span class="kw-2">&</span>str, args: OpRead) -> <span class="prelude-ty">Result</span><(RpRead, <span class="self">Self</span>::Reader)> {
+ <span class="kw">let </span>res = <span class="self">self</span>.core.get_by_path(path).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>file: AliyunDriveFile =
+ serde_json::from_reader(res.reader()).map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+
+ <span class="kw">let </span><span class="prelude-val">Some</span>(size) = file.size <span class="kw">else </span>{
+ <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(ErrorKind::Unexpected, <span class="string">"cannot get file size"</span>));
+ };
+
+ <span class="kw">let </span>download_url = <span class="self">self</span>.core.get_download_url(<span class="kw-2">&</span>file.file_id).<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="prelude-val">Ok</span>((
+ RpRead::default(),
+ AliyunDriveReader::new(<span class="self">self</span>.core.clone(), <span class="kw-2">&</span>download_url, size, args),
+ ))
+ }
+
+ <span class="kw">async fn </span>delete(<span class="kw-2">&</span><span class="self">self</span>, path: <span class="kw-2">&</span>str, _args: OpDelete) -> <span class="prelude-ty">Result</span><RpDelete> {
+ <span class="kw">let </span>res = <span class="kw">match </span><span class="self">self</span>.core.get_by_path(path).<span class="kw">await </span>{
+ <span class="prelude-val">Ok</span>(output) => <span class="prelude-val">Some</span>(output),
+ <span class="prelude-val">Err</span>(err) <span class="kw">if </span>err.kind() == ErrorKind::NotFound => <span class="prelude-val">None</span>,
+ <span class="prelude-val">Err</span>(err) => <span class="kw">return </span><span class="prelude-val">Err</span>(err),
+ };
+ <span class="kw">if let </span><span class="prelude-val">Some</span>(res) = res {
+ <span class="kw">let </span>file: AliyunDriveFile =
+ serde_json::from_reader(res.reader()).map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.core.delete_path(<span class="kw-2">&</span>file.file_id).<span class="kw">await</span><span class="question-mark">?</span>;
+ }
+ <span class="prelude-val">Ok</span>(RpDelete::default())
+ }
+
+ <span class="kw">async fn </span>list(<span class="kw-2">&</span><span class="self">self</span>, path: <span class="kw-2">&</span>str, args: OpList) -> <span class="prelude-ty">Result</span><(RpList, <span class="self">Self</span>::Lister)> {
+ <span class="kw">let </span>parent = <span class="kw">match </span><span class="self">self</span>.core.get_by_path(path).<span class="kw">await </span>{
+ <span class="prelude-val">Err</span>(err) <span class="kw">if </span>err.kind() == ErrorKind::NotFound => <span class="prelude-val">None</span>,
+ <span class="prelude-val">Err</span>(err) => <span class="kw">return </span><span class="prelude-val">Err</span>(err),
+ <span class="prelude-val">Ok</span>(res) => {
+ <span class="kw">let </span>file: AliyunDriveFile =
+ serde_json::from_reader(res.reader()).map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="prelude-val">Some</span>(AliyunDriveParent {
+ parent_path: path.to_string(),
+ parent_file_id: file.file_id,
+ })
+ }
+ };
+
+ <span class="kw">let </span>l = AliyunDriveLister::new(<span class="self">self</span>.core.clone(), parent, args.limit());
+
+ <span class="prelude-val">Ok</span>((RpList::default(), oio::PageLister::new(l)))
+ }
+
+ <span class="kw">async fn </span>write(<span class="kw-2">&</span><span class="self">self</span>, path: <span class="kw-2">&</span>str, args: OpWrite) -> <span class="prelude-ty">Result</span><(RpWrite, <span class="self">Self</span>::Writer)> {
+ <span class="kw">let </span>parent_path = get_parent(path);
+ <span class="kw">let </span>parent_file_id = <span class="self">self</span>.core.ensure_dir_exists(parent_path).<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="kw">let </span>writer =
+ AliyunDriveWriter::new(<span class="self">self</span>.core.clone(), <span class="kw-2">&</span>parent_file_id, get_basename(path), args);
+
+ <span class="kw">let </span>w = oio::MultipartWriter::new(writer, <span class="number">1</span>);
+
+ <span class="prelude-val">Ok</span>((RpWrite::default(), w))
+ }
+}
+</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/aliyun_drive/core.rs.html b/docs/rust/src/opendal/services/aliyun_drive/core.rs.html
new file mode 100644
index 0000000000..00b90331b2
--- /dev/null
+++ b/docs/rust/src/opendal/services/aliyun_drive/core.rs.html
@@ -0,0 +1,1193 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `src/services/aliyun_drive/core.rs`."><title>core.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
+<a href="#136" id="136">136</a>
+<a href="#137" id="137">137</a>
+<a href="#138" id="138">138</a>
+<a href="#139" id="139">139</a>
+<a href="#140" id="140">140</a>
+<a href="#141" id="141">141</a>
+<a href="#142" id="142">142</a>
+<a href="#143" id="143">143</a>
+<a href="#144" id="144">144</a>
+<a href="#145" id="145">145</a>
+<a href="#146" id="146">146</a>
+<a href="#147" id="147">147</a>
+<a href="#148" id="148">148</a>
+<a href="#149" id="149">149</a>
+<a href="#150" id="150">150</a>
+<a href="#151" id="151">151</a>
+<a href="#152" id="152">152</a>
+<a href="#153" id="153">153</a>
+<a href="#154" id="154">154</a>
+<a href="#155" id="155">155</a>
+<a href="#156" id="156">156</a>
+<a href="#157" id="157">157</a>
+<a href="#158" id="158">158</a>
+<a href="#159" id="159">159</a>
+<a href="#160" id="160">160</a>
+<a href="#161" id="161">161</a>
+<a href="#162" id="162">162</a>
+<a href="#163" id="163">163</a>
+<a href="#164" id="164">164</a>
+<a href="#165" id="165">165</a>
+<a href="#166" id="166">166</a>
+<a href="#167" id="167">167</a>
+<a href="#168" id="168">168</a>
+<a href="#169" id="169">169</a>
+<a href="#170" id="170">170</a>
+<a href="#171" id="171">171</a>
+<a href="#172" id="172">172</a>
+<a href="#173" id="173">173</a>
+<a href="#174" id="174">174</a>
+<a href="#175" id="175">175</a>
+<a href="#176" id="176">176</a>
+<a href="#177" id="177">177</a>
+<a href="#178" id="178">178</a>
+<a href="#179" id="179">179</a>
+<a href="#180" id="180">180</a>
+<a href="#181" id="181">181</a>
+<a href="#182" id="182">182</a>
+<a href="#183" id="183">183</a>
+<a href="#184" id="184">184</a>
+<a href="#185" id="185">185</a>
+<a href="#186" id="186">186</a>
+<a href="#187" id="187">187</a>
+<a href="#188" id="188">188</a>
+<a href="#189" id="189">189</a>
+<a href="#190" id="190">190</a>
+<a href="#191" id="191">191</a>
+<a href="#192" id="192">192</a>
+<a href="#193" id="193">193</a>
+<a href="#194" id="194">194</a>
+<a href="#195" id="195">195</a>
+<a href="#196" id="196">196</a>
+<a href="#197" id="197">197</a>
+<a href="#198" id="198">198</a>
+<a href="#199" id="199">199</a>
+<a href="#200" id="200">200</a>
+<a href="#201" id="201">201</a>
+<a href="#202" id="202">202</a>
+<a href="#203" id="203">203</a>
+<a href="#204" id="204">204</a>
+<a href="#205" id="205">205</a>
+<a href="#206" id="206">206</a>
+<a href="#207" id="207">207</a>
+<a href="#208" id="208">208</a>
+<a href="#209" id="209">209</a>
+<a href="#210" id="210">210</a>
+<a href="#211" id="211">211</a>
+<a href="#212" id="212">212</a>
+<a href="#213" id="213">213</a>
+<a href="#214" id="214">214</a>
+<a href="#215" id="215">215</a>
+<a href="#216" id="216">216</a>
+<a href="#217" id="217">217</a>
+<a href="#218" id="218">218</a>
+<a href="#219" id="219">219</a>
+<a href="#220" id="220">220</a>
+<a href="#221" id="221">221</a>
+<a href="#222" id="222">222</a>
+<a href="#223" id="223">223</a>
+<a href="#224" id="224">224</a>
+<a href="#225" id="225">225</a>
+<a href="#226" id="226">226</a>
+<a href="#227" id="227">227</a>
+<a href="#228" id="228">228</a>
+<a href="#229" id="229">229</a>
+<a href="#230" id="230">230</a>
+<a href="#231" id="231">231</a>
+<a href="#232" id="232">232</a>
+<a href="#233" id="233">233</a>
+<a href="#234" id="234">234</a>
+<a href="#235" id="235">235</a>
+<a href="#236" id="236">236</a>
+<a href="#237" id="237">237</a>
+<a href="#238" id="238">238</a>
+<a href="#239" id="239">239</a>
+<a href="#240" id="240">240</a>
+<a href="#241" id="241">241</a>
+<a href="#242" id="242">242</a>
+<a href="#243" id="243">243</a>
+<a href="#244" id="244">244</a>
+<a href="#245" id="245">245</a>
+<a href="#246" id="246">246</a>
+<a href="#247" id="247">247</a>
+<a href="#248" id="248">248</a>
+<a href="#249" id="249">249</a>
+<a href="#250" id="250">250</a>
+<a href="#251" id="251">251</a>
+<a href="#252" id="252">252</a>
+<a href="#253" id="253">253</a>
+<a href="#254" id="254">254</a>
+<a href="#255" id="255">255</a>
+<a href="#256" id="256">256</a>
+<a href="#257" id="257">257</a>
+<a href="#258" id="258">258</a>
+<a href="#259" id="259">259</a>
+<a href="#260" id="260">260</a>
+<a href="#261" id="261">261</a>
+<a href="#262" id="262">262</a>
+<a href="#263" id="263">263</a>
+<a href="#264" id="264">264</a>
+<a href="#265" id="265">265</a>
+<a href="#266" id="266">266</a>
+<a href="#267" id="267">267</a>
+<a href="#268" id="268">268</a>
+<a href="#269" id="269">269</a>
+<a href="#270" id="270">270</a>
+<a href="#271" id="271">271</a>
+<a href="#272" id="272">272</a>
+<a href="#273" id="273">273</a>
+<a href="#274" id="274">274</a>
+<a href="#275" id="275">275</a>
+<a href="#276" id="276">276</a>
+<a href="#277" id="277">277</a>
+<a href="#278" id="278">278</a>
+<a href="#279" id="279">279</a>
+<a href="#280" id="280">280</a>
+<a href="#281" id="281">281</a>
+<a href="#282" id="282">282</a>
+<a href="#283" id="283">283</a>
+<a href="#284" id="284">284</a>
+<a href="#285" id="285">285</a>
+<a href="#286" id="286">286</a>
+<a href="#287" id="287">287</a>
+<a href="#288" id="288">288</a>
+<a href="#289" id="289">289</a>
+<a href="#290" id="290">290</a>
+<a href="#291" id="291">291</a>
+<a href="#292" id="292">292</a>
+<a href="#293" id="293">293</a>
+<a href="#294" id="294">294</a>
+<a href="#295" id="295">295</a>
+<a href="#296" id="296">296</a>
+<a href="#297" id="297">297</a>
+<a href="#298" id="298">298</a>
+<a href="#299" id="299">299</a>
+<a href="#300" id="300">300</a>
+<a href="#301" id="301">301</a>
+<a href="#302" id="302">302</a>
+<a href="#303" id="303">303</a>
+<a href="#304" id="304">304</a>
+<a href="#305" id="305">305</a>
+<a href="#306" id="306">306</a>
+<a href="#307" id="307">307</a>
+<a href="#308" id="308">308</a>
+<a href="#309" id="309">309</a>
+<a href="#310" id="310">310</a>
+<a href="#311" id="311">311</a>
+<a href="#312" id="312">312</a>
+<a href="#313" id="313">313</a>
+<a href="#314" id="314">314</a>
+<a href="#315" id="315">315</a>
+<a href="#316" id="316">316</a>
+<a href="#317" id="317">317</a>
+<a href="#318" id="318">318</a>
+<a href="#319" id="319">319</a>
+<a href="#320" id="320">320</a>
+<a href="#321" id="321">321</a>
+<a href="#322" id="322">322</a>
+<a href="#323" id="323">323</a>
+<a href="#324" id="324">324</a>
+<a href="#325" id="325">325</a>
+<a href="#326" id="326">326</a>
+<a href="#327" id="327">327</a>
+<a href="#328" id="328">328</a>
+<a href="#329" id="329">329</a>
+<a href="#330" id="330">330</a>
+<a href="#331" id="331">331</a>
+<a href="#332" id="332">332</a>
+<a href="#333" id="333">333</a>
+<a href="#334" id="334">334</a>
+<a href="#335" id="335">335</a>
+<a href="#336" id="336">336</a>
+<a href="#337" id="337">337</a>
+<a href="#338" id="338">338</a>
+<a href="#339" id="339">339</a>
+<a href="#340" id="340">340</a>
+<a href="#341" id="341">341</a>
+<a href="#342" id="342">342</a>
+<a href="#343" id="343">343</a>
+<a href="#344" id="344">344</a>
+<a href="#345" id="345">345</a>
+<a href="#346" id="346">346</a>
+<a href="#347" id="347">347</a>
+<a href="#348" id="348">348</a>
+<a href="#349" id="349">349</a>
+<a href="#350" id="350">350</a>
+<a href="#351" id="351">351</a>
+<a href="#352" id="352">352</a>
+<a href="#353" id="353">353</a>
+<a href="#354" id="354">354</a>
+<a href="#355" id="355">355</a>
+<a href="#356" id="356">356</a>
+<a href="#357" id="357">357</a>
+<a href="#358" id="358">358</a>
+<a href="#359" id="359">359</a>
+<a href="#360" id="360">360</a>
+<a href="#361" id="361">361</a>
+<a href="#362" id="362">362</a>
+<a href="#363" id="363">363</a>
+<a href="#364" id="364">364</a>
+<a href="#365" id="365">365</a>
+<a href="#366" id="366">366</a>
+<a href="#367" id="367">367</a>
+<a href="#368" id="368">368</a>
+<a href="#369" id="369">369</a>
+<a href="#370" id="370">370</a>
+<a href="#371" id="371">371</a>
+<a href="#372" id="372">372</a>
+<a href="#373" id="373">373</a>
+<a href="#374" id="374">374</a>
+<a href="#375" id="375">375</a>
+<a href="#376" id="376">376</a>
+<a href="#377" id="377">377</a>
+<a href="#378" id="378">378</a>
+<a href="#379" id="379">379</a>
+<a href="#380" id="380">380</a>
+<a href="#381" id="381">381</a>
+<a href="#382" id="382">382</a>
+<a href="#383" id="383">383</a>
+<a href="#384" id="384">384</a>
+<a href="#385" id="385">385</a>
+<a href="#386" id="386">386</a>
+<a href="#387" id="387">387</a>
+<a href="#388" id="388">388</a>
+<a href="#389" id="389">389</a>
+<a href="#390" id="390">390</a>
+<a href="#391" id="391">391</a>
+<a href="#392" id="392">392</a>
+<a href="#393" id="393">393</a>
+<a href="#394" id="394">394</a>
+<a href="#395" id="395">395</a>
+<a href="#396" id="396">396</a>
+<a href="#397" id="397">397</a>
+<a href="#398" id="398">398</a>
+<a href="#399" id="399">399</a>
+<a href="#400" id="400">400</a>
+<a href="#401" id="401">401</a>
+<a href="#402" id="402">402</a>
+<a href="#403" id="403">403</a>
+<a href="#404" id="404">404</a>
+<a href="#405" id="405">405</a>
+<a href="#406" id="406">406</a>
+<a href="#407" id="407">407</a>
+<a href="#408" id="408">408</a>
+<a href="#409" id="409">409</a>
+<a href="#410" id="410">410</a>
+<a href="#411" id="411">411</a>
+<a href="#412" id="412">412</a>
+<a href="#413" id="413">413</a>
+<a href="#414" id="414">414</a>
+<a href="#415" id="415">415</a>
+<a href="#416" id="416">416</a>
+<a href="#417" id="417">417</a>
+<a href="#418" id="418">418</a>
+<a href="#419" id="419">419</a>
+<a href="#420" id="420">420</a>
+<a href="#421" id="421">421</a>
+<a href="#422" id="422">422</a>
+<a href="#423" id="423">423</a>
+<a href="#424" id="424">424</a>
+<a href="#425" id="425">425</a>
+<a href="#426" id="426">426</a>
+<a href="#427" id="427">427</a>
+<a href="#428" id="428">428</a>
+<a href="#429" id="429">429</a>
+<a href="#430" id="430">430</a>
+<a href="#431" id="431">431</a>
+<a href="#432" id="432">432</a>
+<a href="#433" id="433">433</a>
+<a href="#434" id="434">434</a>
+<a href="#435" id="435">435</a>
+<a href="#436" id="436">436</a>
+<a href="#437" id="437">437</a>
+<a href="#438" id="438">438</a>
+<a href="#439" id="439">439</a>
+<a href="#440" id="440">440</a>
+<a href="#441" id="441">441</a>
+<a href="#442" id="442">442</a>
+<a href="#443" id="443">443</a>
+<a href="#444" id="444">444</a>
+<a href="#445" id="445">445</a>
+<a href="#446" id="446">446</a>
+<a href="#447" id="447">447</a>
+<a href="#448" id="448">448</a>
+<a href="#449" id="449">449</a>
+<a href="#450" id="450">450</a>
+<a href="#451" id="451">451</a>
+<a href="#452" id="452">452</a>
+<a href="#453" id="453">453</a>
+<a href="#454" id="454">454</a>
+<a href="#455" id="455">455</a>
+<a href="#456" id="456">456</a>
+<a href="#457" id="457">457</a>
+<a href="#458" id="458">458</a>
+<a href="#459" id="459">459</a>
+<a href="#460" id="460">460</a>
+<a href="#461" id="461">461</a>
+<a href="#462" id="462">462</a>
+<a href="#463" id="463">463</a>
+<a href="#464" id="464">464</a>
+<a href="#465" id="465">465</a>
+<a href="#466" id="466">466</a>
+<a href="#467" id="467">467</a>
+<a href="#468" id="468">468</a>
+<a href="#469" id="469">469</a>
+<a href="#470" id="470">470</a>
+<a href="#471" id="471">471</a>
+<a href="#472" id="472">472</a>
+<a href="#473" id="473">473</a>
+<a href="#474" id="474">474</a>
+<a href="#475" id="475">475</a>
+<a href="#476" id="476">476</a>
+<a href="#477" id="477">477</a>
+<a href="#478" id="478">478</a>
+<a href="#479" id="479">479</a>
+<a href="#480" id="480">480</a>
+<a href="#481" id="481">481</a>
+<a href="#482" id="482">482</a>
+<a href="#483" id="483">483</a>
+<a href="#484" id="484">484</a>
+<a href="#485" id="485">485</a>
+<a href="#486" id="486">486</a>
+<a href="#487" id="487">487</a>
+<a href="#488" id="488">488</a>
+<a href="#489" id="489">489</a>
+<a href="#490" id="490">490</a>
+<a href="#491" id="491">491</a>
+<a href="#492" id="492">492</a>
+<a href="#493" id="493">493</a>
+<a href="#494" id="494">494</a>
+<a href="#495" id="495">495</a>
+<a href="#496" id="496">496</a>
+<a href="#497" id="497">497</a>
+<a href="#498" id="498">498</a>
+<a href="#499" id="499">499</a>
+<a href="#500" id="500">500</a>
+<a href="#501" id="501">501</a>
+<a href="#502" id="502">502</a>
+<a href="#503" id="503">503</a>
+<a href="#504" id="504">504</a>
+<a href="#505" id="505">505</a>
+<a href="#506" id="506">506</a>
+<a href="#507" id="507">507</a>
+<a href="#508" id="508">508</a>
+<a href="#509" id="509">509</a>
+<a href="#510" id="510">510</a>
+<a href="#511" id="511">511</a>
+<a href="#512" id="512">512</a>
+<a href="#513" id="513">513</a>
+<a href="#514" id="514">514</a>
+<a href="#515" id="515">515</a>
+<a href="#516" id="516">516</a>
+<a href="#517" id="517">517</a>
+<a href="#518" id="518">518</a>
+<a href="#519" id="519">519</a>
+<a href="#520" id="520">520</a>
+<a href="#521" id="521">521</a>
+<a href="#522" id="522">522</a>
+<a href="#523" id="523">523</a>
+<a href="#524" id="524">524</a>
+<a href="#525" id="525">525</a>
+<a href="#526" id="526">526</a>
+<a href="#527" id="527">527</a>
+<a href="#528" id="528">528</a>
+<a href="#529" id="529">529</a>
+<a href="#530" id="530">530</a>
+<a href="#531" id="531">531</a>
+<a href="#532" id="532">532</a>
+<a href="#533" id="533">533</a>
+<a href="#534" id="534">534</a>
+<a href="#535" id="535">535</a>
+<a href="#536" id="536">536</a>
+<a href="#537" id="537">537</a>
+<a href="#538" id="538">538</a>
+<a href="#539" id="539">539</a>
+<a href="#540" id="540">540</a>
+<a href="#541" id="541">541</a>
+<a href="#542" id="542">542</a>
+<a href="#543" id="543">543</a>
+<a href="#544" id="544">544</a>
+<a href="#545" id="545">545</a>
+<a href="#546" id="546">546</a>
+<a href="#547" id="547">547</a>
+<a href="#548" id="548">548</a>
+<a href="#549" id="549">549</a>
+<a href="#550" id="550">550</a>
+<a href="#551" id="551">551</a>
+<a href="#552" id="552">552</a>
+<a href="#553" id="553">553</a>
+<a href="#554" id="554">554</a>
+<a href="#555" id="555">555</a>
+<a href="#556" id="556">556</a>
+<a href="#557" id="557">557</a>
+<a href="#558" id="558">558</a>
+<a href="#559" id="559">559</a>
+<a href="#560" id="560">560</a>
+<a href="#561" id="561">561</a>
+<a href="#562" id="562">562</a>
+<a href="#563" id="563">563</a>
+<a href="#564" id="564">564</a>
+<a href="#565" id="565">565</a>
+<a href="#566" id="566">566</a>
+<a href="#567" id="567">567</a>
+<a href="#568" id="568">568</a>
+<a href="#569" id="569">569</a>
+<a href="#570" id="570">570</a>
+<a href="#571" id="571">571</a>
+<a href="#572" id="572">572</a>
+<a href="#573" id="573">573</a>
+<a href="#574" id="574">574</a>
+<a href="#575" id="575">575</a>
+<a href="#576" id="576">576</a>
+<a href="#577" id="577">577</a>
+<a href="#578" id="578">578</a>
+<a href="#579" id="579">579</a>
+<a href="#580" id="580">580</a>
+<a href="#581" id="581">581</a>
+<a href="#582" id="582">582</a>
+<a href="#583" id="583">583</a>
+<a href="#584" id="584">584</a>
+<a href="#585" id="585">585</a>
+<a href="#586" id="586">586</a>
+<a href="#587" id="587">587</a>
+<a href="#588" id="588">588</a>
+<a href="#589" id="589">589</a>
+<a href="#590" id="590">590</a>
+<a href="#591" id="591">591</a>
+<a href="#592" id="592">592</a>
+<a href="#593" id="593">593</a>
+<a href="#594" id="594">594</a>
+<a href="#595" id="595">595</a>
+<a href="#596" id="596">596</a>
+</pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+</span><span class="kw">use </span>std::fmt::Debug;
+<span class="kw">use </span>std::sync::Arc;
+
+<span class="kw">use </span>bytes::Buf;
+<span class="kw">use </span>chrono::Utc;
+<span class="kw">use </span>http::header::{<span class="self">self</span>, HeaderValue};
+<span class="kw">use </span>http::{Method, Request};
+<span class="kw">use </span>serde::{Deserialize, Serialize};
+<span class="kw">use </span>tokio::sync::Mutex;
+
+<span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
+<span class="kw">use crate</span>::<span class="kw-2">*</span>;
+
+<span class="kw">use </span><span class="kw">super</span>::error::parse_error;
+
+<span class="doccomment">/// Available Aliyun Drive Type.
+</span><span class="attr">#[derive(Debug, Deserialize, Default, Clone)]
+</span><span class="kw">pub enum </span>DriveType {
+ <span class="doccomment">/// Use the default type of Aliyun Drive.
+ </span><span class="attr">#[default]
+ </span>Default,
+ <span class="doccomment">/// Use the backup type of Aliyun Drive.
+ ///
+ /// fallback to the default type if no backup drive found.
+ </span>Backup,
+ <span class="doccomment">/// Use the resource type of Aliyun Drive.
+ ///
+ /// fallback to the default type if no resource drive found.
+ </span>Resource,
+}
+
+<span class="kw">pub struct </span>AliyunDriveSigner {
+ <span class="kw">pub </span>drive_id: <span class="prelude-ty">Option</span><String>,
+ <span class="kw">pub </span>access_token: <span class="prelude-ty">Option</span><String>,
+ <span class="kw">pub </span>refresh_token: String,
+ <span class="kw">pub </span>expire_at: i64,
+}
+
+<span class="kw">pub struct </span>AliyunDriveCore {
+ <span class="kw">pub </span>endpoint: String,
+ <span class="kw">pub </span>root: String,
+ <span class="kw">pub </span>client_id: String,
+ <span class="kw">pub </span>client_secret: String,
+ <span class="kw">pub </span>drive_type: DriveType,
+ <span class="kw">pub </span>rapid_upload: bool,
+
+ <span class="kw">pub </span>signer: Arc<Mutex<AliyunDriveSigner>>,
+ <span class="kw">pub </span>client: HttpClient,
+}
+
+<span class="kw">impl </span>Debug <span class="kw">for </span>AliyunDriveCore {
+ <span class="kw">fn </span>fmt(<span class="kw-2">&</span><span class="self">self</span>, f: <span class="kw-2">&mut </span>std::fmt::Formatter<<span class="lifetime">'_</span>>) -> std::fmt::Result {
+ f.debug_struct(<span class="string">"AliyunDriveCore"</span>)
+ .field(<span class="string">"root"</span>, <span class="kw-2">&</span><span class="self">self</span>.root)
+ .field(<span class="string">"drive_type"</span>, <span class="kw-2">&</span><span class="self">self</span>.drive_type)
+ .finish_non_exhaustive()
+ }
+}
+
+<span class="kw">impl </span>AliyunDriveCore {
+ <span class="kw">async fn </span>send(<span class="kw-2">&</span><span class="self">self</span>, <span class="kw-2">mut </span>req: Request<Buffer>, token: <span class="prelude-ty">Option</span><<span class="kw-2">&</span>str>) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="kw">if </span>req.method() == Method::POST {
+ req.headers_mut().insert(
+ header::CONTENT_TYPE,
+ HeaderValue::from_static(<span class="string">"application/json;charset=UTF-8"</span>),
+ );
+ }
+ <span class="kw">if let </span><span class="prelude-val">Some</span>(token) = token {
+ req.headers_mut().insert(
+ header::AUTHORIZATION,
+ HeaderValue::from_str(<span class="kw-2">&</span>format_authorization_by_bearer(token)<span class="question-mark">?</span>)
+ .expect(<span class="string">"access token must be valid header value"</span>),
+ );
+ }
+ <span class="kw">let </span>res = <span class="self">self</span>.client.send(req).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">if </span>!res.status().is_success() {
+ <span class="kw">return </span><span class="prelude-val">Err</span>(parse_error(res).<span class="kw">await</span><span class="question-mark">?</span>);
+ }
+ <span class="prelude-val">Ok</span>(res.into_body())
+ }
+
+ <span class="kw">async fn </span>get_access_token(<span class="kw-2">&</span><span class="self">self</span>, refresh_token: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="kw">let </span>body = serde_json::to_vec(<span class="kw-2">&</span>AccessTokenRequest {
+ refresh_token,
+ grant_type: <span class="string">"refresh_token"</span>,
+ client_id: <span class="kw-2">&</span><span class="self">self</span>.client_id,
+ client_secret: <span class="kw-2">&</span><span class="self">self</span>.client_secret,
+ })
+ .map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(<span class="string">"{}/oauth/access_token"</span>, <span class="self">self</span>.endpoint))
+ .body(Buffer::from(body))
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, <span class="prelude-val">None</span>).<span class="kw">await
+ </span>}
+
+ <span class="kw">async fn </span>get_drive_id(<span class="kw-2">&</span><span class="self">self</span>, token: <span class="prelude-ty">Option</span><<span class="kw-2">&</span>str>) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(<span class="string">"{}/adrive/v1.0/user/getDriveInfo"</span>, <span class="self">self</span>.endpoint))
+ .body(Buffer::new())
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, token).<span class="kw">await
+ </span>}
+
+ <span class="kw">pub async fn </span>get_token_and_drive(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Result</span><(<span class="prelude-ty">Option</span><String>, String)> {
+ <span class="kw">let </span><span class="kw-2">mut </span>tokener = <span class="self">self</span>.signer.lock().<span class="kw">await</span>;
+ <span class="kw">if </span>tokener.expire_at < Utc::now().timestamp() || tokener.access_token.is_none() {
+ <span class="kw">let </span>res = <span class="self">self</span>.get_access_token(<span class="kw-2">&</span>tokener.refresh_token).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>output: RefresTokenResponse =
+ serde_json::from_reader(res.reader()).map_err(new_json_deserialize_error)<span class="question-mark">?</span>;
+ tokener.access_token = <span class="prelude-val">Some</span>(output.access_token);
+ tokener.expire_at = output.expires_in + Utc::now().timestamp();
+ tokener.refresh_token = output.refresh_token;
+ }
+ <span class="kw">let </span><span class="prelude-val">Some</span>(drive_id) = <span class="kw-2">&</span>tokener.drive_id <span class="kw">else </span>{
+ <span class="kw">let </span>res = <span class="self">self</span>.get_drive_id(tokener.access_token.as_deref()).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>output: DriveInfoResponse =
+ serde_json::from_reader(res.reader()).map_err(new_json_deserialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>drive_id = <span class="kw">match </span><span class="self">self</span>.drive_type {
+ DriveType::Default => output.default_drive_id,
+ DriveType::Backup => output.backup_drive_id.unwrap_or(output.default_drive_id),
+ DriveType::Resource => output.resource_drive_id.unwrap_or(output.default_drive_id),
+ };
+ tokener.drive_id = <span class="prelude-val">Some</span>(drive_id.clone());
+ <span class="kw">return </span><span class="prelude-val">Ok</span>((tokener.access_token.clone(), drive_id));
+ };
+ <span class="prelude-val">Ok</span>((tokener.access_token.clone(), drive_id.clone()))
+ }
+
+ <span class="kw">pub async fn </span>get_by_path(<span class="kw-2">&</span><span class="self">self</span>, path: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="kw">let </span>file_path = build_rooted_abs_path(<span class="kw-2">&</span><span class="self">self</span>.root, path);
+ <span class="kw">let </span>file_path = file_path.strip_suffix(<span class="string">'/'</span>).unwrap_or(<span class="kw-2">&</span>file_path);
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(
+ <span class="string">"{}/adrive/v1.0/openFile/get_by_path"</span>,
+ <span class="self">self</span>.endpoint
+ ));
+ <span class="kw">let </span>(token, drive_id) = <span class="self">self</span>.get_token_and_drive().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>body = serde_json::to_vec(<span class="kw-2">&</span>GetByPathRequest {
+ drive_id: <span class="kw-2">&</span>drive_id,
+ file_path,
+ })
+ .map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>req = req
+ .body(Buffer::from(body))
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, token.as_deref()).<span class="kw">await
+ </span>}
+
+ <span class="kw">pub async fn </span>ensure_dir_exists(<span class="kw-2">&</span><span class="self">self</span>, path: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><String> {
+ <span class="kw">let </span>file_path = build_abs_path(<span class="kw-2">&</span><span class="self">self</span>.root, path.strip_suffix(<span class="string">'/'</span>).unwrap_or(path));
+ <span class="kw">if </span>file_path == <span class="string">"/" </span>{
+ <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="string">"root"</span>.to_string());
+ }
+ <span class="kw">let </span>file_path = file_path.strip_suffix(<span class="string">'/'</span>).unwrap_or(<span class="kw-2">&</span>file_path);
+ <span class="kw">let </span>paths = file_path.split(<span class="string">'/'</span>).collect::<Vec<<span class="kw-2">&</span>str>>();
+ <span class="kw">let </span><span class="kw-2">mut </span>parent: <span class="prelude-ty">Option</span><String> = <span class="prelude-val">None</span>;
+ <span class="kw">for </span>path <span class="kw">in </span>paths {
+ <span class="kw">let </span>res = <span class="self">self
+ </span>.create(
+ parent.as_deref(),
+ path,
+ CreateType::Folder,
+ CheckNameMode::Refuse,
+ )
+ .<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>output: CreateResponse =
+ serde_json::from_reader(res.reader()).map_err(new_json_deserialize_error)<span class="question-mark">?</span>;
+ parent = <span class="prelude-val">Some</span>(output.file_id);
+ }
+ <span class="prelude-val">Ok</span>(parent.expect(<span class="string">"ensure_dir_exists must succeed"</span>))
+ }
+
+ <span class="kw">pub async fn </span>create_with_rapid_upload(
+ <span class="kw-2">&</span><span class="self">self</span>,
+ parent_file_id: <span class="prelude-ty">Option</span><<span class="kw-2">&</span>str>,
+ name: <span class="kw-2">&</span>str,
+ typ: CreateType,
+ check_name_mode: CheckNameMode,
+ size: <span class="prelude-ty">Option</span><u64>,
+ rapid_upload: <span class="prelude-ty">Option</span><RapidUpload>,
+ ) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="kw">let </span><span class="kw-2">mut </span>content_hash = <span class="prelude-val">None</span>;
+ <span class="kw">let </span><span class="kw-2">mut </span>proof_code = <span class="prelude-val">None</span>;
+ <span class="kw">let </span><span class="kw-2">mut </span>pre_hash = <span class="prelude-val">None</span>;
+ <span class="kw">if let </span><span class="prelude-val">Some</span>(rapid_upload) = rapid_upload {
+ content_hash = rapid_upload.content_hash;
+ proof_code = rapid_upload.proof_code;
+ pre_hash = rapid_upload.pre_hash;
+ }
+
+ <span class="kw">let </span>(token, drive_id) = <span class="self">self</span>.get_token_and_drive().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>body = serde_json::to_vec(<span class="kw-2">&</span>CreateRequest {
+ drive_id: <span class="kw-2">&</span>drive_id,
+ parent_file_id: parent_file_id.unwrap_or(<span class="string">"root"</span>),
+ name,
+ typ,
+ check_name_mode,
+ size,
+ pre_hash: pre_hash.as_deref(),
+ content_hash: content_hash.as_deref(),
+ content_hash_name: content_hash.is_some().then_some(<span class="string">"sha1"</span>),
+ proof_code: proof_code.as_deref(),
+ proof_version: proof_code.is_some().then_some(<span class="string">"v1"</span>),
+ })
+ .map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(<span class="string">"{}/adrive/v1.0/openFile/create"</span>, <span class="self">self</span>.endpoint))
+ .body(Buffer::from(body))
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, token.as_deref()).<span class="kw">await
+ </span>}
+
+ <span class="kw">pub async fn </span>create(
+ <span class="kw-2">&</span><span class="self">self</span>,
+ parent_file_id: <span class="prelude-ty">Option</span><<span class="kw-2">&</span>str>,
+ name: <span class="kw-2">&</span>str,
+ typ: CreateType,
+ check_name_mode: CheckNameMode,
+ ) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="self">self</span>.create_with_rapid_upload(parent_file_id, name, typ, check_name_mode, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>)
+ .<span class="kw">await
+ </span>}
+
+ <span class="kw">pub async fn </span>get_download_url(<span class="kw-2">&</span><span class="self">self</span>, file_id: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><String> {
+ <span class="kw">let </span>(token, drive_id) = <span class="self">self</span>.get_token_and_drive().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>body = serde_json::to_vec(<span class="kw-2">&</span>FileRequest {
+ drive_id: <span class="kw-2">&</span>drive_id,
+ file_id,
+ })
+ .map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(
+ <span class="string">"{}/adrive/v1.0/openFile/getDownloadUrl"</span>,
+ <span class="self">self</span>.endpoint
+ ))
+ .body(Buffer::from(body))
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>res = <span class="self">self</span>.send(req, token.as_deref()).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>output: GetDownloadUrlResponse =
+ serde_json::from_reader(res.reader()).map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="prelude-val">Ok</span>(output.url)
+ }
+
+ <span class="kw">pub async fn </span>move_path(<span class="kw-2">&</span><span class="self">self</span>, file_id: <span class="kw-2">&</span>str, to_parent_file_id: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><()> {
+ <span class="kw">let </span>(token, drive_id) = <span class="self">self</span>.get_token_and_drive().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>body = serde_json::to_vec(<span class="kw-2">&</span>MovePathRequest {
+ drive_id: <span class="kw-2">&</span>drive_id,
+ file_id,
+ to_parent_file_id,
+ check_name_mode: CheckNameMode::AutoRename,
+ })
+ .map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(<span class="string">"{}/adrive/v1.0/openFile/move"</span>, <span class="self">self</span>.endpoint))
+ .body(Buffer::from(body))
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, token.as_deref()).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="prelude-val">Ok</span>(())
+ }
+
+ <span class="kw">pub async fn </span>update_path(<span class="kw-2">&</span><span class="self">self</span>, file_id: <span class="kw-2">&</span>str, name: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><()> {
+ <span class="kw">let </span>(token, drive_id) = <span class="self">self</span>.get_token_and_drive().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>body = serde_json::to_vec(<span class="kw-2">&</span>UpdatePathRequest {
+ drive_id: <span class="kw-2">&</span>drive_id,
+ file_id,
+ name,
+ check_name_mode: CheckNameMode::Refuse,
+ })
+ .map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(<span class="string">"{}/adrive/v1.0/openFile/update"</span>, <span class="self">self</span>.endpoint))
+ .body(Buffer::from(body))
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, token.as_deref()).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="prelude-val">Ok</span>(())
+ }
+
+ <span class="kw">pub async fn </span>copy_path(
+ <span class="kw-2">&</span><span class="self">self</span>,
+ file_id: <span class="kw-2">&</span>str,
+ to_parent_file_id: <span class="kw-2">&</span>str,
+ auto_rename: bool,
+ ) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="kw">let </span>(token, drive_id) = <span class="self">self</span>.get_token_and_drive().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>body = serde_json::to_vec(<span class="kw-2">&</span>CopyPathRequest {
+ drive_id: <span class="kw-2">&</span>drive_id,
+ file_id,
+ to_parent_file_id,
+ auto_rename,
+ })
+ .map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(<span class="string">"{}/adrive/v1.0/openFile/copy"</span>, <span class="self">self</span>.endpoint))
+ .body(Buffer::from(body))
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, token.as_deref()).<span class="kw">await
+ </span>}
+
+ <span class="kw">pub async fn </span>delete_path(<span class="kw-2">&</span><span class="self">self</span>, file_id: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><()> {
+ <span class="kw">let </span>(token, drive_id) = <span class="self">self</span>.get_token_and_drive().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>body = serde_json::to_vec(<span class="kw-2">&</span>FileRequest {
+ drive_id: <span class="kw-2">&</span>drive_id,
+ file_id,
+ })
+ .map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(<span class="string">"{}/adrive/v1.0/openFile/delete"</span>, <span class="self">self</span>.endpoint))
+ .body(Buffer::from(body))
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, token.as_deref()).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="prelude-val">Ok</span>(())
+ }
+
+ <span class="kw">pub async fn </span>list(
+ <span class="kw-2">&</span><span class="self">self</span>,
+ parent_file_id: <span class="kw-2">&</span>str,
+ limit: <span class="prelude-ty">Option</span><usize>,
+ marker: <span class="prelude-ty">Option</span><String>,
+ ) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="kw">let </span>(token, drive_id) = <span class="self">self</span>.get_token_and_drive().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>body = serde_json::to_vec(<span class="kw-2">&</span>ListRequest {
+ drive_id: <span class="kw-2">&</span>drive_id,
+ parent_file_id,
+ limit,
+ marker: marker.as_deref(),
+ })
+ .map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(<span class="string">"{}/adrive/v1.0/openFile/list"</span>, <span class="self">self</span>.endpoint))
+ .body(Buffer::from(body))
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, token.as_deref()).<span class="kw">await
+ </span>}
+
+ <span class="kw">pub async fn </span>get(<span class="kw-2">&</span><span class="self">self</span>, file_id: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="kw">let </span>(token, drive_id) = <span class="self">self</span>.get_token_and_drive().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>body = serde_json::to_vec(<span class="kw-2">&</span>FileRequest {
+ drive_id: <span class="kw-2">&</span>drive_id,
+ file_id,
+ })
+ .map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(<span class="string">"{}/adrive/v1.0/openFile/get"</span>, <span class="self">self</span>.endpoint))
+ .body(Buffer::from(body))
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, token.as_deref()).<span class="kw">await
+ </span>}
+
+ <span class="kw">pub async fn </span>upload(<span class="kw-2">&</span><span class="self">self</span>, upload_url: <span class="kw-2">&</span>str, body: Buffer) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="kw">let </span>req = Request::put(upload_url)
+ .body(body)
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, <span class="prelude-val">None</span>).<span class="kw">await
+ </span>}
+
+ <span class="kw">pub async fn </span>complete(<span class="kw-2">&</span><span class="self">self</span>, file_id: <span class="kw-2">&</span>str, upload_id: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="kw">let </span>(token, drive_id) = <span class="self">self</span>.get_token_and_drive().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>body = serde_json::to_vec(<span class="kw-2">&</span>CompleteRequest {
+ drive_id: <span class="kw-2">&</span>drive_id,
+ file_id,
+ upload_id,
+ })
+ .map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(<span class="string">"{}/adrive/v1.0/openFile/complete"</span>, <span class="self">self</span>.endpoint))
+ .body(Buffer::from(body))
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, token.as_deref()).<span class="kw">await
+ </span>}
+
+ <span class="kw">pub async fn </span>get_upload_url(
+ <span class="kw-2">&</span><span class="self">self</span>,
+ file_id: <span class="kw-2">&</span>str,
+ upload_id: <span class="kw-2">&</span>str,
+ part_number: <span class="prelude-ty">Option</span><usize>,
+ ) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="kw">let </span>(token, drive_id) = <span class="self">self</span>.get_token_and_drive().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>part_info_list = part_number.map(|part_number| {
+ <span class="macro">vec!</span>[PartInfoItem {
+ part_number: <span class="prelude-val">Some</span>(part_number),
+ }]
+ });
+ <span class="kw">let </span>body = serde_json::to_vec(<span class="kw-2">&</span>GetUploadRequest {
+ drive_id: <span class="kw-2">&</span>drive_id,
+ file_id,
+ upload_id,
+ part_info_list,
+ })
+ .map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>req = Request::post(<span class="macro">format!</span>(
+ <span class="string">"{}/adrive/v1.0/openFile/getUploadUrl"</span>,
+ <span class="self">self</span>.endpoint
+ ))
+ .body(Buffer::from(body))
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.send(req, token.as_deref()).<span class="kw">await
+ </span>}
+}
+
+<span class="kw">pub struct </span>RapidUpload {
+ <span class="kw">pub </span>pre_hash: <span class="prelude-ty">Option</span><String>,
+ <span class="kw">pub </span>content_hash: <span class="prelude-ty">Option</span><String>,
+ <span class="kw">pub </span>proof_code: <span class="prelude-ty">Option</span><String>,
+}
+
+<span class="attr">#[derive(Debug, Deserialize)]
+</span><span class="kw">pub struct </span>RefresTokenResponse {
+ <span class="kw">pub </span>access_token: String,
+ <span class="kw">pub </span>expires_in: i64,
+ <span class="kw">pub </span>refresh_token: String,
+}
+
+<span class="attr">#[derive(Debug, Deserialize)]
+</span><span class="kw">pub struct </span>DriveInfoResponse {
+ <span class="kw">pub </span>user_id: String,
+ <span class="kw">pub </span>name: String,
+ <span class="kw">pub </span>avatar: String,
+ <span class="kw">pub </span>default_drive_id: String,
+ <span class="kw">pub </span>resource_drive_id: <span class="prelude-ty">Option</span><String>,
+ <span class="kw">pub </span>backup_drive_id: <span class="prelude-ty">Option</span><String>,
+}
+
+<span class="attr">#[derive(Debug, Serialize)]
+#[serde(rename_all = <span class="string">"snake_case"</span>)]
+</span><span class="kw">pub enum </span>CreateType {
+ File,
+ Folder,
+}
+
+<span class="attr">#[derive(Debug, Serialize)]
+#[serde(rename_all = <span class="string">"snake_case"</span>)]
+</span><span class="kw">pub enum </span>CheckNameMode {
+ Refuse,
+ AutoRename,
+}
+
+<span class="attr">#[derive(Deserialize)]
+</span><span class="kw">pub struct </span>UploadUrlResponse {
+ <span class="kw">pub </span>drive_id: String,
+ <span class="kw">pub </span>file_id: String,
+ <span class="kw">pub </span>upload_id: <span class="prelude-ty">Option</span><String>,
+ <span class="kw">pub </span>part_info_list: <span class="prelude-ty">Option</span><Vec<PartInfo>>,
+}
+
+<span class="attr">#[derive(Deserialize)]
+</span><span class="kw">pub struct </span>CreateResponse {
+ <span class="kw">pub </span>drive_id: String,
+ <span class="kw">pub </span>file_id: String,
+ <span class="kw">pub </span>status: <span class="prelude-ty">Option</span><String>,
+ <span class="kw">pub </span>parent_file_id: String,
+ <span class="kw">pub </span>upload_id: <span class="prelude-ty">Option</span><String>,
+ <span class="kw">pub </span>file_name: String,
+ <span class="kw">pub </span>available: <span class="prelude-ty">Option</span><bool>,
+ <span class="kw">pub </span>exist: <span class="prelude-ty">Option</span><bool>,
+ <span class="kw">pub </span>rapid_upload: <span class="prelude-ty">Option</span><bool>,
+ <span class="kw">pub </span>part_info_list: <span class="prelude-ty">Option</span><Vec<PartInfo>>,
+}
+
+<span class="attr">#[derive(Serialize, Deserialize)]
+</span><span class="kw">pub struct </span>PartInfo {
+ <span class="kw">pub </span>etag: <span class="prelude-ty">Option</span><String>,
+ <span class="kw">pub </span>part_number: usize,
+ <span class="kw">pub </span>part_size: <span class="prelude-ty">Option</span><u64>,
+ <span class="kw">pub </span>upload_url: String,
+ <span class="kw">pub </span>content_type: <span class="prelude-ty">Option</span><String>,
+}
+
+<span class="attr">#[derive(Deserialize)]
+</span><span class="kw">pub struct </span>AliyunDriveFileList {
+ <span class="kw">pub </span>items: Vec<AliyunDriveFile>,
+ <span class="kw">pub </span>next_marker: <span class="prelude-ty">Option</span><String>,
+}
+
+<span class="attr">#[derive(Deserialize)]
+</span><span class="kw">pub struct </span>CopyResponse {
+ <span class="kw">pub </span>drive_id: String,
+ <span class="kw">pub </span>file_id: String,
+}
+
+<span class="attr">#[derive(Deserialize)]
+</span><span class="kw">pub struct </span>AliyunDriveFile {
+ <span class="kw">pub </span>drive_id: String,
+ <span class="kw">pub </span>file_id: String,
+ <span class="kw">pub </span>parent_file_id: String,
+ <span class="kw">pub </span>name: String,
+ <span class="kw">pub </span>size: <span class="prelude-ty">Option</span><u64>,
+ <span class="kw">pub </span>file_extension: <span class="prelude-ty">Option</span><String>,
+ <span class="kw">pub </span>content_hash: <span class="prelude-ty">Option</span><String>,
+ <span class="kw">pub </span>content_type: <span class="prelude-ty">Option</span><String>,
+ <span class="kw">pub </span>category: <span class="prelude-ty">Option</span><String>,
+ <span class="attr">#[serde(rename = <span class="string">"type"</span>)]
+ </span><span class="kw">pub </span>path_type: String,
+ <span class="kw">pub </span>created_at: String,
+ <span class="kw">pub </span>updated_at: String,
+}
+
+<span class="attr">#[derive(Deserialize)]
+</span><span class="kw">pub struct </span>GetDownloadUrlResponse {
+ <span class="kw">pub </span>url: String,
+ <span class="kw">pub </span>expiration: String,
+ <span class="kw">pub </span>method: String,
+}
+
+<span class="attr">#[derive(Serialize)]
+</span><span class="kw">pub struct </span>AccessTokenRequest<<span class="lifetime">'a</span>> {
+ refresh_token: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ grant_type: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ client_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ client_secret: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+}
+
+<span class="attr">#[derive(Serialize)]
+</span><span class="kw">pub struct </span>GetByPathRequest<<span class="lifetime">'a</span>> {
+ drive_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ file_path: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+}
+
+<span class="attr">#[derive(Serialize)]
+</span><span class="kw">pub struct </span>CreateRequest<<span class="lifetime">'a</span>> {
+ drive_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ parent_file_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ name: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ <span class="attr">#[serde(rename = <span class="string">"type"</span>)]
+ </span>typ: CreateType,
+ check_name_mode: CheckNameMode,
+ size: <span class="prelude-ty">Option</span><u64>,
+ pre_hash: <span class="prelude-ty">Option</span><<span class="kw-2">&</span><span class="lifetime">'a </span>str>,
+ content_hash: <span class="prelude-ty">Option</span><<span class="kw-2">&</span><span class="lifetime">'a </span>str>,
+ content_hash_name: <span class="prelude-ty">Option</span><<span class="kw-2">&</span><span class="lifetime">'a </span>str>,
+ proof_code: <span class="prelude-ty">Option</span><<span class="kw-2">&</span><span class="lifetime">'a </span>str>,
+ proof_version: <span class="prelude-ty">Option</span><<span class="kw-2">&</span><span class="lifetime">'a </span>str>,
+}
+
+<span class="attr">#[derive(Serialize)]
+</span><span class="kw">pub struct </span>FileRequest<<span class="lifetime">'a</span>> {
+ drive_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ file_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+}
+
+<span class="attr">#[derive(Serialize)]
+</span><span class="kw">pub struct </span>MovePathRequest<<span class="lifetime">'a</span>> {
+ drive_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ file_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ to_parent_file_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ check_name_mode: CheckNameMode,
+}
+
+<span class="attr">#[derive(Serialize)]
+</span><span class="kw">pub struct </span>UpdatePathRequest<<span class="lifetime">'a</span>> {
+ drive_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ file_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ name: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ check_name_mode: CheckNameMode,
+}
+
+<span class="attr">#[derive(Serialize)]
+</span><span class="kw">pub struct </span>CopyPathRequest<<span class="lifetime">'a</span>> {
+ drive_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ file_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ to_parent_file_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ auto_rename: bool,
+}
+
+<span class="attr">#[derive(Serialize)]
+</span><span class="kw">pub struct </span>ListRequest<<span class="lifetime">'a</span>> {
+ drive_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ parent_file_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ limit: <span class="prelude-ty">Option</span><usize>,
+ marker: <span class="prelude-ty">Option</span><<span class="kw-2">&</span><span class="lifetime">'a </span>str>,
+}
+
+<span class="attr">#[derive(Serialize)]
+</span><span class="kw">pub struct </span>CompleteRequest<<span class="lifetime">'a</span>> {
+ drive_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ file_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ upload_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+}
+
+<span class="attr">#[derive(Serialize)]
+</span><span class="kw">pub struct </span>GetUploadRequest<<span class="lifetime">'a</span>> {
+ drive_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ file_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ upload_id: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
+ part_info_list: <span class="prelude-ty">Option</span><Vec<PartInfoItem>>,
+}
+
+<span class="attr">#[derive(Serialize)]
+</span><span class="kw">pub struct </span>PartInfoItem {
+ part_number: <span class="prelude-ty">Option</span><usize>,
+}
+</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/aliyun_drive/error.rs.html b/docs/rust/src/opendal/services/aliyun_drive/error.rs.html
new file mode 100644
index 0000000000..04995a36c9
--- /dev/null
+++ b/docs/rust/src/opendal/services/aliyun_drive/error.rs.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `src/services/aliyun_drive/error.rs`."><title>error.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medi [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+</pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+</span><span class="kw">use </span>bytes::Buf;
+<span class="kw">use </span>http::Response;
+<span class="kw">use </span>serde::Deserialize;
+
+<span class="kw">use crate</span>::<span class="kw-2">*</span>;
+
+<span class="attr">#[derive(Default, Debug, Deserialize)]
+</span><span class="kw">pub struct </span>AliyunDriveError {
+ code: String,
+ message: String,
+}
+
+<span class="kw">pub async fn </span>parse_error(res: Response<Buffer>) -> <span class="prelude-ty">Result</span><Error> {
+ <span class="kw">let </span>(parts, <span class="kw-2">mut </span>body) = res.into_parts();
+ <span class="kw">let </span>bs = body.copy_to_bytes(body.remaining());
+ <span class="kw">let </span>(code, message) = serde_json::from_reader::<<span class="kw">_</span>, AliyunDriveError>(bs.clone().reader())
+ .map(|err| (<span class="prelude-val">Some</span>(err.code), err.message))
+ .unwrap_or((<span class="prelude-val">None</span>, String::from_utf8_lossy(<span class="kw-2">&</span>bs).into_owned()));
+ <span class="kw">let </span>(kind, retryable) = <span class="kw">match </span>parts.status.as_u16() {
+ <span class="number">403 </span>=> (ErrorKind::PermissionDenied, <span class="bool-val">false</span>),
+ <span class="number">400 </span>=> <span class="kw">match </span>code {
+ <span class="prelude-val">Some</span>(code) <span class="kw">if </span>code == <span class="string">"NotFound.File" </span>=> (ErrorKind::NotFound, <span class="bool-val">false</span>),
+ <span class="prelude-val">Some</span>(code) <span class="kw">if </span>code == <span class="string">"AlreadyExist.File" </span>=> (ErrorKind::AlreadyExists, <span class="bool-val">false</span>),
+ <span class="prelude-val">Some</span>(code) <span class="kw">if </span>code == <span class="string">"PreHashMatched" </span>=> (ErrorKind::IsSameFile, <span class="bool-val">false</span>),
+ <span class="kw">_ </span>=> (ErrorKind::Unexpected, <span class="bool-val">false</span>),
+ },
+ <span class="number">429 </span>=> <span class="kw">match </span>code {
+ <span class="prelude-val">Some</span>(code) <span class="kw">if </span>code == <span class="string">"TooManyRequests" </span>=> (ErrorKind::RateLimited, <span class="bool-val">true</span>),
+ <span class="kw">_ </span>=> (ErrorKind::Unexpected, <span class="bool-val">false</span>),
+ },
+ <span class="kw">_ </span>=> (ErrorKind::Unexpected, <span class="bool-val">false</span>),
+ };
+ <span class="kw">let </span><span class="kw-2">mut </span>err = Error::new(kind, <span class="kw-2">&</span>message);
+ <span class="kw">if </span>retryable {
+ err = err.set_temporary();
+ }
+ <span class="prelude-val">Ok</span>(err)
+}
+</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/aliyun_drive/lister.rs.html b/docs/rust/src/opendal/services/aliyun_drive/lister.rs.html
new file mode 100644
index 0000000000..d8c7ca9349
--- /dev/null
+++ b/docs/rust/src/opendal/services/aliyun_drive/lister.rs.html
@@ -0,0 +1,305 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `src/services/aliyun_drive/lister.rs`."><title>lister.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Me [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
+<a href="#136" id="136">136</a>
+<a href="#137" id="137">137</a>
+<a href="#138" id="138">138</a>
+<a href="#139" id="139">139</a>
+<a href="#140" id="140">140</a>
+<a href="#141" id="141">141</a>
+<a href="#142" id="142">142</a>
+<a href="#143" id="143">143</a>
+<a href="#144" id="144">144</a>
+<a href="#145" id="145">145</a>
+<a href="#146" id="146">146</a>
+<a href="#147" id="147">147</a>
+<a href="#148" id="148">148</a>
+<a href="#149" id="149">149</a>
+<a href="#150" id="150">150</a>
+<a href="#151" id="151">151</a>
+<a href="#152" id="152">152</a>
+</pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+</span><span class="kw">use </span>std::sync::Arc;
+
+<span class="kw">use </span>bytes::Buf;
+<span class="kw">use </span>chrono::Utc;
+
+<span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
+<span class="kw">use </span><span class="kw">crate</span>::EntryMode;
+<span class="kw">use </span><span class="kw">crate</span>::Error;
+<span class="kw">use </span><span class="kw">crate</span>::ErrorKind;
+<span class="kw">use </span><span class="kw">crate</span>::Metadata;
+<span class="kw">use </span><span class="kw">crate</span>::Result;
+
+<span class="kw">use </span><span class="self">self</span>::oio::Entry;
+
+<span class="kw">use </span><span class="kw">super</span>::core::AliyunDriveCore;
+<span class="kw">use </span><span class="kw">super</span>::core::AliyunDriveFile;
+<span class="kw">use </span><span class="kw">super</span>::core::AliyunDriveFileList;
+
+<span class="kw">pub struct </span>AliyunDriveLister {
+ core: Arc<AliyunDriveCore>,
+
+ parent: <span class="prelude-ty">Option</span><AliyunDriveParent>,
+ limit: <span class="prelude-ty">Option</span><usize>,
+}
+
+<span class="kw">pub struct </span>AliyunDriveParent {
+ <span class="kw">pub </span>parent_path: String,
+ <span class="kw">pub </span>parent_file_id: String,
+}
+
+<span class="kw">impl </span>AliyunDriveLister {
+ <span class="kw">pub fn </span>new(
+ core: Arc<AliyunDriveCore>,
+ parent: <span class="prelude-ty">Option</span><AliyunDriveParent>,
+ limit: <span class="prelude-ty">Option</span><usize>,
+ ) -> <span class="self">Self </span>{
+ AliyunDriveLister {
+ core,
+ parent,
+ limit,
+ }
+ }
+}
+
+<span class="kw">impl </span>oio::PageList <span class="kw">for </span>AliyunDriveLister {
+ <span class="kw">async fn </span>next_page(<span class="kw-2">&</span><span class="self">self</span>, ctx: <span class="kw-2">&mut </span>oio::PageContext) -> <span class="prelude-ty">Result</span><()> {
+ <span class="kw">let </span><span class="prelude-val">Some</span>(parent) = <span class="kw-2">&</span><span class="self">self</span>.parent <span class="kw">else </span>{
+ ctx.done = <span class="bool-val">true</span>;
+ <span class="kw">return </span><span class="prelude-val">Ok</span>(());
+ };
+
+ <span class="kw">let </span>offset = <span class="kw">if </span>ctx.token.is_empty() {
+ <span class="prelude-val">None
+ </span>} <span class="kw">else </span>{
+ <span class="prelude-val">Some</span>(ctx.token.clone())
+ };
+
+ <span class="kw">let </span>res = <span class="self">self
+ </span>.core
+ .list(<span class="kw-2">&</span>parent.parent_file_id, <span class="self">self</span>.limit, offset)
+ .<span class="kw">await</span>;
+ <span class="kw">let </span>res = <span class="kw">match </span>res {
+ <span class="prelude-val">Err</span>(err) <span class="kw">if </span>err.kind() == ErrorKind::NotFound => {
+ ctx.done = <span class="bool-val">true</span>;
+ <span class="prelude-val">None
+ </span>}
+ <span class="prelude-val">Err</span>(err) => <span class="kw">return </span><span class="prelude-val">Err</span>(err),
+ <span class="prelude-val">Ok</span>(res) => <span class="prelude-val">Some</span>(res),
+ };
+
+ <span class="kw">let </span><span class="prelude-val">Some</span>(res) = res <span class="kw">else </span>{
+ <span class="kw">return </span><span class="prelude-val">Ok</span>(());
+ };
+
+ <span class="kw">let </span>result: AliyunDriveFileList =
+ serde_json::from_reader(res.reader()).map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+
+ <span class="kw">let </span>n = result.items.len();
+
+ <span class="kw">for </span>item <span class="kw">in </span>result.items {
+ <span class="kw">let </span>res = <span class="self">self</span>.core.get(<span class="kw-2">&</span>item.file_id).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>file: AliyunDriveFile =
+ serde_json::from_reader(res.reader()).map_err(new_json_serialize_error)<span class="question-mark">?</span>;
+
+ <span class="kw">let </span>path = <span class="kw">if </span>parent.parent_path.starts_with(<span class="string">'/'</span>) {
+ build_abs_path(<span class="kw-2">&</span>parent.parent_path, <span class="kw-2">&</span>file.name)
+ } <span class="kw">else </span>{
+ build_abs_path(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"/{}"</span>, <span class="kw-2">&</span>parent.parent_path), <span class="kw-2">&</span>file.name)
+ };
+
+ <span class="kw">let </span>(path, md) = <span class="kw">if </span>file.path_type == <span class="string">"folder" </span>{
+ <span class="kw">let </span>path = <span class="macro">format!</span>(<span class="string">"{}/"</span>, path);
+ <span class="kw">let </span>meta = Metadata::new(EntryMode::DIR).with_last_modified(
+ file.updated_at
+ .parse::<chrono::DateTime<Utc>>()
+ .map_err(|e| {
+ Error::new(ErrorKind::Unexpected, <span class="string">"parse last modified time"</span>)
+ .set_source(e)
+ })<span class="question-mark">?</span>,
+ );
+ (path, meta)
+ } <span class="kw">else </span>{
+ <span class="kw">let </span><span class="kw-2">mut </span>meta = Metadata::new(EntryMode::FILE).with_last_modified(
+ file.updated_at
+ .parse::<chrono::DateTime<Utc>>()
+ .map_err(|e| {
+ Error::new(ErrorKind::Unexpected, <span class="string">"parse last modified time"</span>)
+ .set_source(e)
+ })<span class="question-mark">?</span>,
+ );
+ <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = file.size {
+ meta = meta.with_content_length(v);
+ }
+ <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = file.content_type {
+ meta = meta.with_content_type(v);
+ }
+ (path, meta)
+ };
+
+ ctx.entries.push_back(Entry::new(<span class="kw-2">&</span>path, md));
+ }
+
+ <span class="kw">if </span><span class="self">self</span>.limit.is_some_and(|x| x < n) || result.next_marker.is_none() {
+ ctx.done = <span class="bool-val">true</span>;
+ }
+
+ <span class="kw">if let </span><span class="prelude-val">Some</span>(marker) = result.next_marker {
+ <span class="kw">if </span>marker.is_empty() {
+ ctx.done = <span class="bool-val">true</span>;
+ }
+ ctx.token = marker;
+ }
+ <span class="prelude-val">Ok</span>(())
+ }
+}
+</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/aliyun_drive/mod.rs.html b/docs/rust/src/opendal/services/aliyun_drive/mod.rs.html
new file mode 100644
index 0000000000..56560d5f36
--- /dev/null
+++ b/docs/rust/src/opendal/services/aliyun_drive/mod.rs.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `src/services/aliyun_drive/mod.rs`."><title>mod.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Medium-8 [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+</pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+</span><span class="kw">mod </span>backend;
+<span class="kw">mod </span>error;
+<span class="kw">mod </span>lister;
+<span class="kw">mod </span>reader;
+<span class="kw">mod </span>writer;
+<span class="kw">pub use </span>backend::AliyunDriveBuilder <span class="kw">as </span>AliyunDrive;
+<span class="kw">pub use </span>backend::AliyunDriveConfig;
+
+<span class="kw">mod </span>core;
+</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/aliyun_drive/reader.rs.html b/docs/rust/src/opendal/services/aliyun_drive/reader.rs.html
new file mode 100644
index 0000000000..6cb5e34684
--- /dev/null
+++ b/docs/rust/src/opendal/services/aliyun_drive/reader.rs.html
@@ -0,0 +1,143 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `src/services/aliyun_drive/reader.rs`."><title>reader.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Me [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+</pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+</span><span class="kw">use </span>std::sync::Arc;
+
+<span class="kw">use </span>http::{header, Request, StatusCode};
+
+<span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
+<span class="kw">use crate</span>::<span class="kw-2">*</span>;
+
+<span class="kw">use </span><span class="kw">super</span>::core::AliyunDriveCore;
+<span class="kw">use </span><span class="kw">super</span>::error::parse_error;
+
+<span class="kw">pub struct </span>AliyunDriveReader {
+ core: Arc<AliyunDriveCore>,
+
+ download_url: String,
+ size: u64,
+ _op: OpRead,
+}
+
+<span class="kw">impl </span>AliyunDriveReader {
+ <span class="kw">pub fn </span>new(core: Arc<AliyunDriveCore>, download_url: <span class="kw-2">&</span>str, size: u64, op: OpRead) -> <span class="self">Self </span>{
+ AliyunDriveReader {
+ core,
+ download_url: download_url.to_string(),
+ size,
+ _op: op,
+ }
+ }
+}
+
+<span class="kw">impl </span>oio::Read <span class="kw">for </span>AliyunDriveReader {
+ <span class="kw">async fn </span>read_at(<span class="kw-2">&</span><span class="self">self</span>, offset: u64, limit: usize) -> <span class="prelude-ty">Result</span><Buffer> {
+ <span class="comment">// AliyunDrive responds with status OK even if the range is not statisfiable.
+ // and then the whole file will be read.
+ </span><span class="kw">let </span>limit = <span class="kw">if </span>offset >= <span class="self">self</span>.size {
+ <span class="kw">return </span><span class="prelude-val">Ok</span>(Buffer::new());
+ } <span class="kw">else if </span>offset + (limit <span class="kw">as </span>u64) - <span class="number">1 </span>> <span class="self">self</span>.size {
+ <span class="self">self</span>.size - offset
+ } <span class="kw">else </span>{
+ limit <span class="kw">as </span>u64
+ };
+ <span class="kw">let </span>range = BytesRange::new(offset, <span class="prelude-val">Some</span>(limit));
+ <span class="kw">let </span>req = Request::get(<span class="self">self</span>.download_url.as_str())
+ .header(header::RANGE, range.to_header())
+ .body(Buffer::new())
+ .map_err(new_request_build_error)<span class="question-mark">?</span>;
+ <span class="kw">let </span>res = <span class="self">self</span>.core.client.send(req).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>status = res.status();
+ <span class="kw">match </span>status {
+ StatusCode::OK => <span class="prelude-val">Ok</span>(Buffer::new()),
+ StatusCode::PARTIAL_CONTENT => <span class="prelude-val">Ok</span>(res.into_body()),
+ <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(parse_error(res).<span class="kw">await</span><span class="question-mark">?</span>),
+ }
+ }
+}
+</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/aliyun_drive/writer.rs.html b/docs/rust/src/opendal/services/aliyun_drive/writer.rs.html
new file mode 100644
index 0000000000..6c6300e6ad
--- /dev/null
+++ b/docs/rust/src/opendal/services/aliyun_drive/writer.rs.html
@@ -0,0 +1,545 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `src/services/aliyun_drive/writer.rs`."><title>writer.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-46f98efaafac5295.ttf.woff2,FiraSans-Regular-018c141bf0843ffd.woff2,FiraSans-Me [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
+<a href="#136" id="136">136</a>
+<a href="#137" id="137">137</a>
+<a href="#138" id="138">138</a>
+<a href="#139" id="139">139</a>
+<a href="#140" id="140">140</a>
+<a href="#141" id="141">141</a>
+<a href="#142" id="142">142</a>
+<a href="#143" id="143">143</a>
+<a href="#144" id="144">144</a>
+<a href="#145" id="145">145</a>
+<a href="#146" id="146">146</a>
+<a href="#147" id="147">147</a>
+<a href="#148" id="148">148</a>
+<a href="#149" id="149">149</a>
+<a href="#150" id="150">150</a>
+<a href="#151" id="151">151</a>
+<a href="#152" id="152">152</a>
+<a href="#153" id="153">153</a>
+<a href="#154" id="154">154</a>
+<a href="#155" id="155">155</a>
+<a href="#156" id="156">156</a>
+<a href="#157" id="157">157</a>
+<a href="#158" id="158">158</a>
+<a href="#159" id="159">159</a>
+<a href="#160" id="160">160</a>
+<a href="#161" id="161">161</a>
+<a href="#162" id="162">162</a>
+<a href="#163" id="163">163</a>
+<a href="#164" id="164">164</a>
+<a href="#165" id="165">165</a>
+<a href="#166" id="166">166</a>
+<a href="#167" id="167">167</a>
+<a href="#168" id="168">168</a>
+<a href="#169" id="169">169</a>
+<a href="#170" id="170">170</a>
+<a href="#171" id="171">171</a>
+<a href="#172" id="172">172</a>
+<a href="#173" id="173">173</a>
+<a href="#174" id="174">174</a>
+<a href="#175" id="175">175</a>
+<a href="#176" id="176">176</a>
+<a href="#177" id="177">177</a>
+<a href="#178" id="178">178</a>
+<a href="#179" id="179">179</a>
+<a href="#180" id="180">180</a>
+<a href="#181" id="181">181</a>
+<a href="#182" id="182">182</a>
+<a href="#183" id="183">183</a>
+<a href="#184" id="184">184</a>
+<a href="#185" id="185">185</a>
+<a href="#186" id="186">186</a>
+<a href="#187" id="187">187</a>
+<a href="#188" id="188">188</a>
+<a href="#189" id="189">189</a>
+<a href="#190" id="190">190</a>
+<a href="#191" id="191">191</a>
+<a href="#192" id="192">192</a>
+<a href="#193" id="193">193</a>
+<a href="#194" id="194">194</a>
+<a href="#195" id="195">195</a>
+<a href="#196" id="196">196</a>
+<a href="#197" id="197">197</a>
+<a href="#198" id="198">198</a>
+<a href="#199" id="199">199</a>
+<a href="#200" id="200">200</a>
+<a href="#201" id="201">201</a>
+<a href="#202" id="202">202</a>
+<a href="#203" id="203">203</a>
+<a href="#204" id="204">204</a>
+<a href="#205" id="205">205</a>
+<a href="#206" id="206">206</a>
+<a href="#207" id="207">207</a>
+<a href="#208" id="208">208</a>
+<a href="#209" id="209">209</a>
+<a href="#210" id="210">210</a>
+<a href="#211" id="211">211</a>
+<a href="#212" id="212">212</a>
+<a href="#213" id="213">213</a>
+<a href="#214" id="214">214</a>
+<a href="#215" id="215">215</a>
+<a href="#216" id="216">216</a>
+<a href="#217" id="217">217</a>
+<a href="#218" id="218">218</a>
+<a href="#219" id="219">219</a>
+<a href="#220" id="220">220</a>
+<a href="#221" id="221">221</a>
+<a href="#222" id="222">222</a>
+<a href="#223" id="223">223</a>
+<a href="#224" id="224">224</a>
+<a href="#225" id="225">225</a>
+<a href="#226" id="226">226</a>
+<a href="#227" id="227">227</a>
+<a href="#228" id="228">228</a>
+<a href="#229" id="229">229</a>
+<a href="#230" id="230">230</a>
+<a href="#231" id="231">231</a>
+<a href="#232" id="232">232</a>
+<a href="#233" id="233">233</a>
+<a href="#234" id="234">234</a>
+<a href="#235" id="235">235</a>
+<a href="#236" id="236">236</a>
+<a href="#237" id="237">237</a>
+<a href="#238" id="238">238</a>
+<a href="#239" id="239">239</a>
+<a href="#240" id="240">240</a>
+<a href="#241" id="241">241</a>
+<a href="#242" id="242">242</a>
+<a href="#243" id="243">243</a>
+<a href="#244" id="244">244</a>
+<a href="#245" id="245">245</a>
+<a href="#246" id="246">246</a>
+<a href="#247" id="247">247</a>
+<a href="#248" id="248">248</a>
+<a href="#249" id="249">249</a>
+<a href="#250" id="250">250</a>
+<a href="#251" id="251">251</a>
+<a href="#252" id="252">252</a>
+<a href="#253" id="253">253</a>
+<a href="#254" id="254">254</a>
+<a href="#255" id="255">255</a>
+<a href="#256" id="256">256</a>
+<a href="#257" id="257">257</a>
+<a href="#258" id="258">258</a>
+<a href="#259" id="259">259</a>
+<a href="#260" id="260">260</a>
+<a href="#261" id="261">261</a>
+<a href="#262" id="262">262</a>
+<a href="#263" id="263">263</a>
+<a href="#264" id="264">264</a>
+<a href="#265" id="265">265</a>
+<a href="#266" id="266">266</a>
+<a href="#267" id="267">267</a>
+<a href="#268" id="268">268</a>
+<a href="#269" id="269">269</a>
+<a href="#270" id="270">270</a>
+<a href="#271" id="271">271</a>
+<a href="#272" id="272">272</a>
+</pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+</span><span class="kw">use </span>std::sync::Arc;
+
+<span class="kw">use </span>base64::engine::general_purpose;
+<span class="kw">use </span>base64::Engine;
+<span class="kw">use </span>bytes::Buf;
+
+<span class="kw">use </span>md5::{Digest, Md5};
+<span class="kw">use </span>sha1::Sha1;
+<span class="kw">use </span>tokio::sync::RwLock;
+
+<span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
+<span class="kw">use </span><span class="kw">crate</span>::services::aliyun_drive::core::{CheckNameMode, CreateResponse, CreateType};
+<span class="kw">use crate</span>::<span class="kw-2">*</span>;
+
+<span class="kw">use </span><span class="kw">super</span>::core::{AliyunDriveCore, RapidUpload, UploadUrlResponse};
+
+<span class="kw">pub type </span>AliyunDriveWriters = oio::MultipartWriter<AliyunDriveWriter>;
+
+<span class="kw">pub struct </span>AliyunDriveWriter {
+ core: Arc<AliyunDriveCore>,
+
+ _op: OpWrite,
+ parent_file_id: String,
+ name: String,
+
+ file_id: Arc<RwLock<<span class="prelude-ty">Option</span><String>>>,
+}
+
+<span class="kw">impl </span>AliyunDriveWriter {
+ <span class="kw">pub fn </span>new(core: Arc<AliyunDriveCore>, parent_file_id: <span class="kw-2">&</span>str, name: <span class="kw-2">&</span>str, op: OpWrite) -> <span class="self">Self </span>{
+ AliyunDriveWriter {
+ core,
+ _op: op,
+ parent_file_id: parent_file_id.to_string(),
+ name: name.to_string(),
+ file_id: Arc::new(RwLock::new(<span class="prelude-val">None</span>)),
+ }
+ }
+
+ <span class="kw">async fn </span>write_file_id(<span class="kw-2">&</span><span class="self">self</span>, id: String) {
+ <span class="kw">let </span><span class="kw-2">mut </span>file_id = <span class="self">self</span>.file_id.write().<span class="kw">await</span>;
+
+ <span class="kw-2">*</span>file_id = <span class="prelude-val">Some</span>(id);
+ }
+
+ <span class="kw">async fn </span>read_file_id(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Result</span><String> {
+ <span class="kw">let </span>file_id = <span class="self">self</span>.file_id.read().<span class="kw">await</span>;
+ <span class="kw">let </span><span class="prelude-val">Some</span>(<span class="kw-2">ref </span>file_id) = <span class="kw-2">*</span>file_id <span class="kw">else </span>{
+ <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(ErrorKind::Unexpected, <span class="string">"cannot find file_id"</span>));
+ };
+
+ <span class="prelude-val">Ok</span>(file_id.clone())
+ }
+
+ <span class="kw">async fn </span>get_rapid_upload(
+ <span class="kw-2">&</span><span class="self">self</span>,
+ size: <span class="prelude-ty">Option</span><u64>,
+ body: <span class="prelude-ty">Option</span><<span class="kw">crate</span>::Buffer>,
+ pre_hash: bool,
+ ) -> <span class="prelude-ty">Result</span><<span class="prelude-ty">Option</span><RapidUpload>> {
+ <span class="kw">let </span><span class="prelude-val">Some</span>(size) = size <span class="kw">else </span>{
+ <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+ };
+ <span class="kw">let </span><span class="prelude-val">Some</span>(body) = body <span class="kw">else </span>{
+ <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>);
+ };
+ <span class="kw">if </span>pre_hash && size > <span class="number">1024 </span>* <span class="number">100 </span>{
+ <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(RapidUpload {
+ pre_hash: <span class="prelude-val">Some</span>(<span class="macro">format!</span>(
+ <span class="string">"{:x}"</span>,
+ Sha1::new_with_prefix(body.slice(<span class="number">0</span>..<span class="number">1024</span>).to_vec()).finalize()
+ )),
+ content_hash: <span class="prelude-val">None</span>,
+ proof_code: <span class="prelude-val">None</span>,
+ }));
+ }
+ <span class="kw">let </span>(token, <span class="kw">_</span>) = <span class="self">self</span>.core.get_token_and_drive().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span><span class="prelude-val">Ok</span>(index) = u64::from_str_radix(
+ <span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{:x}"</span>, Md5::new_with_prefix(token.unwrap()).finalize())[<span class="number">0</span>..<span class="number">16</span>],
+ <span class="number">16</span>,
+ ) <span class="kw">else </span>{
+ <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+ ErrorKind::Unexpected,
+ <span class="string">"cannot parse hexadecimal"</span>,
+ ));
+ };
+ <span class="kw">let </span>size = size <span class="kw">as </span>usize;
+ <span class="kw">let </span>index = index <span class="kw">as </span>usize % size;
+ <span class="kw">let </span>(range_start, range_end) = <span class="kw">if </span>index + <span class="number">8 </span>> size {
+ (index, size)
+ } <span class="kw">else </span>{
+ (index, index + <span class="number">8</span>)
+ };
+
+ <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(RapidUpload {
+ pre_hash: <span class="prelude-val">None</span>,
+ content_hash: <span class="prelude-val">Some</span>(<span class="macro">format!</span>(
+ <span class="string">"{:x}"</span>,
+ Sha1::new_with_prefix(body.to_vec()).finalize()
+ )),
+ proof_code: <span class="prelude-val">Some</span>(
+ general_purpose::STANDARD.encode(body.to_bytes().slice(range_start..range_end)),
+ ),
+ }))
+ }
+
+ <span class="kw">async fn </span>write(
+ <span class="kw-2">&</span><span class="self">self</span>,
+ size: <span class="prelude-ty">Option</span><u64>,
+ body: <span class="prelude-ty">Option</span><<span class="kw">crate</span>::Buffer>,
+ pre_hash: bool,
+ upload_url: <span class="prelude-ty">Option</span><<span class="kw-2">&</span>str>,
+ ) -> <span class="prelude-ty">Result</span><(bool, <span class="prelude-ty">Option</span><String>)> {
+ <span class="kw">if let </span><span class="prelude-val">Some</span>(upload_url) = upload_url {
+ <span class="kw">let </span><span class="prelude-val">Some</span>(body) = body <span class="kw">else </span>{
+ <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+ ErrorKind::Unexpected,
+ <span class="string">"cannot upload without body"</span>,
+ ));
+ };
+ <span class="self">self</span>.core.upload(upload_url, body).<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">return </span><span class="prelude-val">Ok</span>((<span class="bool-val">false</span>, <span class="prelude-val">None</span>));
+ }
+
+ <span class="kw">let </span>res = <span class="self">self
+ </span>.core
+ .create_with_rapid_upload(
+ <span class="prelude-val">Some</span>(<span class="kw-2">&</span><span class="self">self</span>.parent_file_id),
+ <span class="kw-2">&</span><span class="self">self</span>.name,
+ CreateType::File,
+ CheckNameMode::Refuse,
+ size,
+ <span class="self">self</span>.get_rapid_upload(size, body.clone(), pre_hash).<span class="kw">await</span><span class="question-mark">?</span>,
+ )
+ .<span class="kw">await</span>;
+
+ <span class="kw">let </span>res = <span class="kw">match </span>res {
+ <span class="prelude-val">Err</span>(err) <span class="kw">if </span>err.kind() == ErrorKind::IsSameFile => {
+ <span class="kw">return </span><span class="prelude-val">Ok</span>((<span class="bool-val">true</span>, <span class="prelude-val">None</span>));
+ }
+ <span class="prelude-val">Err</span>(err) => {
+ <span class="kw">return </span><span class="prelude-val">Err</span>(err);
+ }
+ <span class="prelude-val">Ok</span>(res) => res,
+ };
+
+ <span class="kw">let </span>output: CreateResponse =
+ serde_json::from_reader(res.reader()).map_err(new_json_deserialize_error)<span class="question-mark">?</span>;
+ <span class="self">self</span>.write_file_id(output.file_id).<span class="kw">await</span>;
+
+ <span class="kw">if </span>output.upload_id.is_some() && output.rapid_upload.is_some_and(|x| !x) {
+ <span class="kw">if let </span><span class="prelude-val">Some</span>(body) = body {
+ <span class="kw">let </span><span class="prelude-val">Some</span>(part_info_list) = output.part_info_list <span class="kw">else </span>{
+ <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(ErrorKind::Unexpected, <span class="string">"cannot find upload_url"</span>));
+ };
+ <span class="kw">if </span>part_info_list.is_empty() {
+ <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(ErrorKind::Unexpected, <span class="string">"cannot find upload_url"</span>));
+ }
+ <span class="self">self</span>.core
+ .upload(<span class="kw-2">&</span>part_info_list[<span class="number">0</span>].upload_url, body)
+ .<span class="kw">await</span><span class="question-mark">?</span>;
+ }
+ }
+
+ <span class="prelude-val">Ok</span>((<span class="bool-val">false</span>, output.upload_id))
+ }
+}
+
+<span class="kw">impl </span>oio::MultipartWrite <span class="kw">for </span>AliyunDriveWriter {
+ <span class="kw">async fn </span>write_once(<span class="kw-2">&</span><span class="self">self</span>, size: u64, body: <span class="kw">crate</span>::Buffer) -> <span class="prelude-ty">Result</span><()> {
+ <span class="kw">let </span>upload_id = <span class="kw">if </span><span class="self">self</span>.core.rapid_upload {
+ <span class="kw">let </span>(rapid, <span class="kw-2">mut </span>upload_id) = <span class="self">self
+ </span>.write(<span class="prelude-val">Some</span>(size), <span class="prelude-val">Some</span>(body.clone()), <span class="bool-val">true</span>, <span class="prelude-val">None</span>)
+ .<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="kw">let </span>size = <span class="kw">if </span>rapid { <span class="prelude-val">Some</span>(size) } <span class="kw">else </span>{ <span class="prelude-val">None </span>};
+ <span class="kw">let </span>(<span class="kw">_</span>, new_upload_id) = <span class="self">self</span>.write(size, <span class="prelude-val">Some</span>(body), <span class="bool-val">false</span>, <span class="prelude-val">None</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="kw">if </span>new_upload_id.is_some() {
+ upload_id = new_upload_id;
+ }
+
+ <span class="kw">let </span><span class="prelude-val">Some</span>(upload_id) = upload_id <span class="kw">else </span>{
+ <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(ErrorKind::Unexpected, <span class="string">"cannot find upload_id"</span>));
+ };
+ upload_id
+ } <span class="kw">else </span>{
+ <span class="kw">let </span>upload_id = <span class="self">self</span>.initiate_part().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="self">self</span>.write_part(<span class="kw-2">&</span>upload_id, <span class="number">0</span>, size, body).<span class="kw">await</span><span class="question-mark">?</span>;
+ upload_id
+ };
+ <span class="kw">let </span>file_id = <span class="self">self</span>.read_file_id().<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="self">self</span>.core.complete(<span class="kw-2">&</span>file_id, <span class="kw-2">&</span>upload_id).<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="prelude-val">Ok</span>(())
+ }
+
+ <span class="kw">async fn </span>initiate_part(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Result</span><String> {
+ <span class="kw">let </span>(<span class="kw">_</span>, upload_id) = <span class="self">self</span>.write(<span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="bool-val">false</span>, <span class="prelude-val">None</span>).<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="kw">let </span><span class="prelude-val">Some</span>(upload_id) = upload_id <span class="kw">else </span>{
+ <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(ErrorKind::Unsupported, <span class="string">"cannot find upload_id"</span>));
+ };
+
+ <span class="prelude-val">Ok</span>(upload_id)
+ }
+
+ <span class="kw">async fn </span>write_part(
+ <span class="kw-2">&</span><span class="self">self</span>,
+ upload_id: <span class="kw-2">&</span>str,
+ part_number: usize,
+ _size: u64,
+ body: <span class="kw">crate</span>::Buffer,
+ ) -> <span class="prelude-ty">Result</span><oio::MultipartPart> {
+ <span class="kw">let </span>file_id = <span class="self">self</span>.read_file_id().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>res = <span class="self">self
+ </span>.core
+ .get_upload_url(<span class="kw-2">&</span>file_id, upload_id, <span class="prelude-val">Some</span>(part_number + <span class="number">1</span>))
+ .<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="kw">let </span>output: UploadUrlResponse =
+ serde_json::from_reader(res.reader()).map_err(new_json_deserialize_error)<span class="question-mark">?</span>;
+
+ <span class="kw">let </span><span class="prelude-val">Some</span>(part_info_list) = output.part_info_list <span class="kw">else </span>{
+ <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+ ErrorKind::Unexpected,
+ <span class="string">"cannot find part_info_list"</span>,
+ ));
+ };
+ <span class="kw">if </span>part_info_list.is_empty() {
+ <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(ErrorKind::Unexpected, <span class="string">"cannot find upload_url"</span>));
+ }
+ <span class="self">self</span>.write(<span class="prelude-val">None</span>, <span class="prelude-val">Some</span>(body), <span class="bool-val">false</span>, <span class="prelude-val">Some</span>(<span class="kw-2">&</span>part_info_list[<span class="number">0</span>].upload_url))
+ .<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="prelude-val">Ok</span>(oio::MultipartPart {
+ part_number,
+ etag: part_info_list[<span class="number">0</span>].etag.clone().unwrap_or(<span class="string">""</span>.to_string()),
+ checksum: <span class="prelude-val">None</span>,
+ })
+ }
+
+ <span class="kw">async fn </span>complete_part(<span class="kw-2">&</span><span class="self">self</span>, upload_id: <span class="kw-2">&</span>str, _parts: <span class="kw-2">&</span>[oio::MultipartPart]) -> <span class="prelude-ty">Result</span><()> {
+ <span class="kw">let </span>file_id = <span class="self">self</span>.read_file_id().<span class="kw">await</span><span class="question-mark">?</span>;
+ <span class="self">self</span>.core.complete(<span class="kw-2">&</span>file_id, upload_id).<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="prelude-val">Ok</span>(())
+ }
+
+ <span class="kw">async fn </span>abort_part(<span class="kw-2">&</span><span class="self">self</span>, _upload_id: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><()> {
+ <span class="kw">let </span>file_id = <span class="self">self</span>.read_file_id().<span class="kw">await</span><span class="question-mark">?</span>;
+
+ <span class="self">self</span>.core.delete_path(<span class="kw-2">&</span>file_id).<span class="kw">await
+ </span>}
+}
+</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/mod.rs.html b/docs/rust/src/opendal/services/mod.rs.html
index 88771ba543..ec29ec9f21 100644
--- a/docs/rust/src/opendal/services/mod.rs.html
+++ b/docs/rust/src/opendal/services/mod.rs.html
@@ -411,6 +411,13 @@
<a href="#411" id="411">411</a>
<a href="#412" id="412">412</a>
<a href="#413" id="413">413</a>
+<a href="#414" id="414">414</a>
+<a href="#415" id="415">415</a>
+<a href="#416" id="416">416</a>
+<a href="#417" id="417">417</a>
+<a href="#418" id="418">418</a>
+<a href="#419" id="419">419</a>
+<a href="#420" id="420">420</a>
</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
@@ -432,7 +439,14 @@
//!
//! More ongoing services support is tracked at [opendal#5](https://github.com/apache/opendal/issues/5). Please feel free to submit issues if there are services not covered.
-</span><span class="attr">#[cfg(feature = <span class="string">"services-azblob"</span>)]
+</span><span class="attr">#[cfg(feature = <span class="string">"services-aliyun-drive"</span>)]
+</span><span class="kw">mod </span>aliyun_drive;
+<span class="attr">#[cfg(feature = <span class="string">"services-aliyun-drive"</span>)]
+</span><span class="kw">pub use </span>aliyun_drive::AliyunDrive;
+<span class="attr">#[cfg(feature = <span class="string">"services-aliyun-drive"</span>)]
+</span><span class="kw">pub use </span>aliyun_drive::AliyunDriveConfig;
+
+<span class="attr">#[cfg(feature = <span class="string">"services-azblob"</span>)]
</span><span class="kw">mod </span>azblob;
<span class="attr">#[cfg(feature = <span class="string">"services-azblob"</span>)]
</span><span class="kw">pub use </span>azblob::Azblob;
diff --git a/docs/rust/src/opendal/types/operator/builder.rs.html b/docs/rust/src/opendal/types/operator/builder.rs.html
index e986dab509..604a326e4b 100644
--- a/docs/rust/src/opendal/types/operator/builder.rs.html
+++ b/docs/rust/src/opendal/types/operator/builder.rs.html
@@ -416,6 +416,8 @@
<a href="#416" id="416">416</a>
<a href="#417" id="417">417</a>
<a href="#418" id="418">418</a>
+<a href="#419" id="419">419</a>
+<a href="#420" id="420">420</a>
</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
@@ -568,6 +570,8 @@
</span><span class="attr">#[allow(unused_variables, unreachable_code)]
</span><span class="kw">pub fn </span>via_map(scheme: Scheme, map: HashMap<String, String>) -> <span class="prelude-ty">Result</span><Operator> {
<span class="kw">let </span>op = <span class="kw">match </span>scheme {
+ <span class="attr">#[cfg(feature = <span class="string">"services-aliyun-drive"</span>)]
+ </span>Scheme::AliyunDrive => <span class="self">Self</span>::from_map::<services::AliyunDrive>(map)<span class="question-mark">?</span>.finish(),
<span class="attr">#[cfg(feature = <span class="string">"services-atomicserver"</span>)]
</span>Scheme::Atomicserver => <span class="self">Self</span>::from_map::<services::Atomicserver>(map)<span class="question-mark">?</span>.finish(),
<span class="attr">#[cfg(feature = <span class="string">"services-alluxio"</span>)]
diff --git a/docs/rust/src/opendal/types/scheme.rs.html b/docs/rust/src/opendal/types/scheme.rs.html
index 88753afadf..6e07f6b52d 100644
--- a/docs/rust/src/opendal/types/scheme.rs.html
+++ b/docs/rust/src/opendal/types/scheme.rs.html
@@ -472,6 +472,12 @@
<a href="#472" id="472">472</a>
<a href="#473" id="473">473</a>
<a href="#474" id="474">474</a>
+<a href="#475" id="475">475</a>
+<a href="#476" id="476">476</a>
+<a href="#477" id="477">477</a>
+<a href="#478" id="478">478</a>
+<a href="#479" id="479">479</a>
+<a href="#480" id="480">480</a>
</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
@@ -506,6 +512,8 @@
</span><span class="attr">#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
</span><span class="kw">pub enum </span>Scheme {
+ <span class="doccomment">/// [aliyun_drive][crate::services::AliyunDrive]: Aliyun Drive services.
+ </span>AliyunDrive,
<span class="doccomment">/// [atomicserver][crate::services::Atomicserver]: Atomicserver services.
</span>Atomicserver,
<span class="doccomment">/// [azblob][crate::services::Azblob]: Azure Storage Blob services.
@@ -665,6 +673,8 @@
/// ```
</span><span class="kw">pub fn </span>enabled() -> HashSet<Scheme> {
HashSet::from([
+ <span class="attr">#[cfg(feature = <span class="string">"services-aliyun-drive"</span>)]
+ </span>Scheme::AliyunDrive,
<span class="attr">#[cfg(feature = <span class="string">"services-atomicserver"</span>)]
</span>Scheme::Atomicserver,
<span class="attr">#[cfg(feature = <span class="string">"services-alluxio"</span>)]
@@ -799,6 +809,7 @@
<span class="kw">fn </span>from_str(s: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, <span class="self">Self</span>::Err> {
<span class="kw">let </span>s = s.to_lowercase();
<span class="kw">match </span>s.as_str() {
+ <span class="string">"aliyun_drive" </span>=> <span class="prelude-val">Ok</span>(Scheme::AliyunDrive),
<span class="string">"atomicserver" </span>=> <span class="prelude-val">Ok</span>(Scheme::Atomicserver),
<span class="string">"azblob" </span>=> <span class="prelude-val">Ok</span>(Scheme::Azblob),
<span class="string">"alluxio" </span>=> <span class="prelude-val">Ok</span>(Scheme::Alluxio),
@@ -873,6 +884,7 @@
<span class="kw">impl </span>From<Scheme> <span class="kw">for </span><span class="kw-2">&</span><span class="lifetime">'static </span>str {
<span class="kw">fn </span>from(v: Scheme) -> <span class="self">Self </span>{
<span class="kw">match </span>v {
+ Scheme::AliyunDrive => <span class="string">"aliyun_drive"</span>,
Scheme::Atomicserver => <span class="string">"atomicserver"</span>,
Scheme::Azblob => <span class="string">"azblob"</span>,
Scheme::Azdls => <span class="string">"azdls"</span>,
diff --git a/docs/rust/trait.impl/core/default/trait.Default.js b/docs/rust/trait.impl/core/default/trait.Default.js
index 2c3485844d..12bbf7666a 100644
--- a/docs/rust/trait.impl/core/default/trait.Default.js
+++ b/docs/rust/trait.impl/core/default/trait.Default.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"enum\" href=\"opendal/enum.Scheme.html\" title=\"enum [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"enum\" href=\"opendal/enum.Scheme.html\" title=\"enum [...]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/trait.impl/core/fmt/trait.Debug.js b/docs/rust/trait.impl/core/fmt/trait.Debug.js
index 9b59c19058..628c03aac5 100644
--- a/docs/rust/trait.impl/core/fmt/trait.Debug.js
+++ b/docs/rust/trait.impl/core/fmt/trait.Debug.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"enum\" href=\"opendal/enum.ErrorKind.html\" title=\"enum opendal::ErrorKind\">Err [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"enum\" href=\"opendal/enum.ErrorKind.html\" title=\"enum opendal::ErrorKind\">Err [...]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/trait.impl/core/marker/trait.Freeze.js b/docs/rust/trait.impl/core/marker/trait.Freeze.js
index 4e2dedf409..2300a3ff6c 100644
--- a/docs/rust/trait.impl/core/marker/trait.Freeze.js
+++ b/docs/rust/trait.impl/core/marker/trait.Freeze.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"opendal":[["impl !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html\" title=\"trait core::marker::Freeze\">Freeze</a> for <a class=\"struct\" href=\"opendal/operator_functions/struct.FunctionWrite.html\" title=\"struct opendal::operator_functions::FunctionWrite\">FunctionWrite</a>",1,["opendal::types::operator::operator_functions::FunctionWrite"]],["impl !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html\" t [...]
+"opendal":[["impl !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html\" title=\"trait core::marker::Freeze\">Freeze</a> for <a class=\"struct\" href=\"opendal/operator_functions/struct.FunctionWrite.html\" title=\"struct opendal::operator_functions::FunctionWrite\">FunctionWrite</a>",1,["opendal::types::operator::operator_functions::FunctionWrite"]],["impl !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html\" t [...]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/trait.impl/core/marker/trait.Send.js b/docs/rust/trait.impl/core/marker/trait.Send.js
index 2e62ff4270..5df526b622 100644
--- a/docs/rust/trait.impl/core/marker/trait.Send.js
+++ b/docs/rust/trait.impl/core/marker/trait.Send.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/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/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"enum\" href=\"opendal/enum.ErrorKind. [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/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/nightly/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"enum\" href=\"opendal/enum.ErrorKind. [...]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/trait.impl/core/marker/trait.Sync.js b/docs/rust/trait.impl/core/marker/trait.Sync.js
index ea559a6603..28a48414db 100644
--- a/docs/rust/trait.impl/core/marker/trait.Sync.js
+++ b/docs/rust/trait.impl/core/marker/trait.Sync.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"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/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"enum\" href=\"opendal/enum.ErrorKind. [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"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/nightly/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"enum\" href=\"opendal/enum.ErrorKind. [...]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/trait.impl/core/marker/trait.Unpin.js b/docs/rust/trait.impl/core/marker/trait.Unpin.js
index 0a6fb17979..81730042df 100644
--- a/docs/rust/trait.impl/core/marker/trait.Unpin.js
+++ b/docs/rust/trait.impl/core/marker/trait.Unpin.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"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/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"enum\" href=\"opendal/enum.Erro [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"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/nightly/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"enum\" href=\"opendal/enum.Erro [...]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js b/docs/rust/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js
index cf51f17c64..8359c0e8bc 100644
--- a/docs/rust/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js
+++ b/docs/rust/trait.impl/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/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html\" title=\"trait core::panic::unwind_safe::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"struct\" href=\"opendal/layers/struct.BlockingLayer.html\" title=\"struct opendal::layers::BlockingLayer\">BlockingLayer</a>",1,["opendal::layers::blocking::BlockingLayer"]],["impl !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.Ref [...]
+"opendal":[["impl !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html\" title=\"trait core::panic::unwind_safe::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"struct\" href=\"opendal/layers/struct.BlockingLayer.html\" title=\"struct opendal::layers::BlockingLayer\">BlockingLayer</a>",1,["opendal::layers::blocking::BlockingLayer"]],["impl !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.Ref [...]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js b/docs/rust/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js
index f7f1373392..8de027b3e1 100644
--- a/docs/rust/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js
+++ b/docs/rust/trait.impl/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/nightly/core/panic/unwind_safe/trait.UnwindSafe.html\" title=\"trait core::panic::unwind_safe::UnwindSafe\">UnwindSafe</a> for <a class=\"struct\" href=\"opendal/layers/struct.BlockingLayer.html\" title=\"struct opendal::layers::BlockingLayer\">BlockingLayer</a>",1,["opendal::layers::blocking::BlockingLayer"]],["impl !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.h [...]
+"opendal":[["impl !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html\" title=\"trait core::panic::unwind_safe::UnwindSafe\">UnwindSafe</a> for <a class=\"struct\" href=\"opendal/layers/struct.BlockingLayer.html\" title=\"struct opendal::layers::BlockingLayer\">BlockingLayer</a>",1,["opendal::layers::blocking::BlockingLayer"]],["impl !<a class=\"trait\" href=\"https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.h [...]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/trait.impl/serde/de/trait.Deserialize.js b/docs/rust/trait.impl/serde/de/trait.Deserialize.js
index dea294dbcf..508793b69d 100644
--- a/docs/rust/trait.impl/serde/de/trait.Deserialize.js
+++ b/docs/rust/trait.impl/serde/de/trait.Deserialize.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"opendal":[["impl<'de> <a class=\"trait\" href=\"https://docs.rs/serde/1.0.198/serde/de/trait.Deserialize.html\" title=\"trait serde::de::Deserialize\">Deserialize</a><'de> for <a class=\"struct\" href=\"opendal/raw/struct.BytesContentRange.html\" title=\"struct opendal::raw::BytesContentRange\">BytesContentRange</a>"],["impl<'de> <a class=\"trait\" href=\"https://docs.rs/serde/1.0.198/serde/de/trait.Deserialize.html\" title=\"trait serde::de::Deserialize\">Deserialize< [...]
+"opendal":[["impl<'de> <a class=\"trait\" href=\"https://docs.rs/serde/1.0.198/serde/de/trait.Deserialize.html\" title=\"trait serde::de::Deserialize\">Deserialize</a><'de> for <a class=\"struct\" href=\"opendal/raw/struct.BytesContentRange.html\" title=\"struct opendal::raw::BytesContentRange\">BytesContentRange</a>"],["impl<'de> <a class=\"trait\" href=\"https://docs.rs/serde/1.0.198/serde/de/trait.Deserialize.html\" title=\"trait serde::de::Deserialize\">Deserialize< [...]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/services/atomicserver/index.html b/docs/services/atomicserver/index.html
index 4da4b9aa7f..f7d3a8cf0e 100644
--- a/docs/services/atomicserver/index.html
+++ b/docs/services/atomicserver/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">AtomicServer | 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/atomicserver"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><m [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/azblob/index.html b/docs/services/azblob/index.html
index f6aa845121..4cb0826451 100644
--- a/docs/services/azblob/index.html
+++ b/docs/services/azblob/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/azdls/index.html b/docs/services/azdls/index.html
index 32a7ad5139..f9df2adf80 100644
--- a/docs/services/azdls/index.html
+++ b/docs/services/azdls/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Azdls | 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/azdls"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="t [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/cacache/index.html b/docs/services/cacache/index.html
index 307246a14b..ff21626300 100644
--- a/docs/services/cacache/index.html
+++ b/docs/services/cacache/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Cacache | 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/cacache"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-r [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/cos/index.html b/docs/services/cos/index.html
index 61610f8f52..ccbf2d9f35 100644
--- a/docs/services/cos/index.html
+++ b/docs/services/cos/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/d1/index.html b/docs/services/d1/index.html
index 3d7002fddb..a32815843e 100644
--- a/docs/services/d1/index.html
+++ b/docs/services/d1/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">D1 | 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/d1"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" n [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/dashmap/index.html b/docs/services/dashmap/index.html
index a63a5838c9..c5093de1d9 100644
--- a/docs/services/dashmap/index.html
+++ b/docs/services/dashmap/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-r [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/dropbox/index.html b/docs/services/dropbox/index.html
index f85c617405..cb3ad31c12 100644
--- a/docs/services/dropbox/index.html
+++ b/docs/services/dropbox/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Dropbox | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/services/dropbox"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-r [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/etcd/index.html b/docs/services/etcd/index.html
index ce7a959bf2..9c03e872e3 100644
--- a/docs/services/etcd/index.html
+++ b/docs/services/etcd/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Etcd | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/services/etcd"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="tru [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/foundationdb/index.html b/docs/services/foundationdb/index.html
index 6675827297..616f936282 100644
--- a/docs/services/foundationdb/index.html
+++ b/docs/services/foundationdb/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">FoundationDB | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/services/foundationdb"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><m [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/fs/index.html b/docs/services/fs/index.html
index 5727e67651..6a9f9e25e4 100644
--- a/docs/services/fs/index.html
+++ b/docs/services/fs/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" n [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/ftp/index.html b/docs/services/ftp/index.html
index 0929b11881..16396d8fc7 100644
--- a/docs/services/ftp/index.html
+++ b/docs/services/ftp/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/gcs/index.html b/docs/services/gcs/index.html
index 8594717c6b..187fb57a85 100644
--- a/docs/services/gcs/index.html
+++ b/docs/services/gcs/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Gcs | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/services/gcs"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/gdrive/index.html b/docs/services/gdrive/index.html
index 592936cb55..dfb30d0dff 100644
--- a/docs/services/gdrive/index.html
+++ b/docs/services/gdrive/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Gdrive | 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/gdrive"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/ghac/index.html b/docs/services/ghac/index.html
index 60e328b32a..28b93e8b8b 100644
--- a/docs/services/ghac/index.html
+++ b/docs/services/ghac/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">GHAC | 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/ghac"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="tru [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/gridfs/index.html b/docs/services/gridfs/index.html
index c950ea810c..0730b31a91 100644
--- a/docs/services/gridfs/index.html
+++ b/docs/services/gridfs/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Gridfs | 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/gridfs"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/hdfs/index.html b/docs/services/hdfs/index.html
index 8f2aef9e29..21c66c482c 100644
--- a/docs/services/hdfs/index.html
+++ b/docs/services/hdfs/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="tru [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/http/index.html b/docs/services/http/index.html
index 50225eb194..2176fccdf6 100644
--- a/docs/services/http/index.html
+++ b/docs/services/http/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">HTTP | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/services/http"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="tru [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/huggingface/index.html b/docs/services/huggingface/index.html
index 76ff81962b..0377de5e85 100644
--- a/docs/services/huggingface/index.html
+++ b/docs/services/huggingface/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Hugging Face | 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/huggingface"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><me [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/ipfs/index.html b/docs/services/ipfs/index.html
index a85835b697..be11a7fd06 100644
--- a/docs/services/ipfs/index.html
+++ b/docs/services/ipfs/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="tru [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/ipmfs/index.html b/docs/services/ipmfs/index.html
index 0388f32c4e..5eddcb15bc 100644
--- a/docs/services/ipmfs/index.html
+++ b/docs/services/ipmfs/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="t [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/libsql/index.html b/docs/services/libsql/index.html
index 2bc18f5f72..e9be4d7da2 100644
--- a/docs/services/libsql/index.html
+++ b/docs/services/libsql/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">LibSQL | 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/libsql"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/memcached/index.html b/docs/services/memcached/index.html
index 1cd695cb58..1b391bb3c2 100644
--- a/docs/services/memcached/index.html
+++ b/docs/services/memcached/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Memcached | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/services/memcached"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta da [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/memory/index.html b/docs/services/memory/index.html
index b740c000a9..75128277af 100644
--- a/docs/services/memory/index.html
+++ b/docs/services/memory/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/moka/index.html b/docs/services/moka/index.html
index 93871d8d6e..7ad12ed610 100644
--- a/docs/services/moka/index.html
+++ b/docs/services/moka/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Moka | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/services/moka"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="tru [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/mongodb/index.html b/docs/services/mongodb/index.html
index b6f92620b8..2b04676abe 100644
--- a/docs/services/mongodb/index.html
+++ b/docs/services/mongodb/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">MongoDB | 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/mongodb"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-r [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/mysql/index.html b/docs/services/mysql/index.html
index efa9504602..b3eb3ee9d4 100644
--- a/docs/services/mysql/index.html
+++ b/docs/services/mysql/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">MySQL | 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/mysql"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="t [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/obs/index.html b/docs/services/obs/index.html
index b8b9fe1dfe..3c7275aefc 100644
--- a/docs/services/obs/index.html
+++ b/docs/services/obs/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Obs | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/services/obs"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/onedrive/index.html b/docs/services/onedrive/index.html
index c964b38d89..d83ed50f22 100644
--- a/docs/services/onedrive/index.html
+++ b/docs/services/onedrive/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">OneDrive | 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/onedrive"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/oss/index.html b/docs/services/oss/index.html
index 1ee908c028..617c3b62bc 100644
--- a/docs/services/oss/index.html
+++ b/docs/services/oss/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/persy/index.html b/docs/services/persy/index.html
index 8c186d92ae..670be477c2 100644
--- a/docs/services/persy/index.html
+++ b/docs/services/persy/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Persy | 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/persy"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="t [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/postgresql/index.html b/docs/services/postgresql/index.html
index 7d0050fef6..4d5ee2c9de 100644
--- a/docs/services/postgresql/index.html
+++ b/docs/services/postgresql/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">PostgreSQL | 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/postgresql"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/redb/index.html b/docs/services/redb/index.html
index 988ab49673..c6fcbefcf9 100644
--- a/docs/services/redb/index.html
+++ b/docs/services/redb/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Redb | 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/redb"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="tru [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/redis/index.html b/docs/services/redis/index.html
index 017854c71f..fc3f743479 100644
--- a/docs/services/redis/index.html
+++ b/docs/services/redis/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="t [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/rocksdb/index.html b/docs/services/rocksdb/index.html
index de2068ebc4..dc31b40196 100644
--- a/docs/services/rocksdb/index.html
+++ b/docs/services/rocksdb/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-r [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/s3/index.html b/docs/services/s3/index.html
index 71f1117e16..aadbe2fd23 100644
--- a/docs/services/s3/index.html
+++ b/docs/services/s3/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" n [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/sftp/index.html b/docs/services/sftp/index.html
index a48d696ea9..25ae0c5d93 100644
--- a/docs/services/sftp/index.html
+++ b/docs/services/sftp/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="tru [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/sled/index.html b/docs/services/sled/index.html
index 479b7f9508..f96127dd1a 100644
--- a/docs/services/sled/index.html
+++ b/docs/services/sled/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="tru [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/sqlite/index.html b/docs/services/sqlite/index.html
index a2e70a3e34..f5d6238d56 100644
--- a/docs/services/sqlite/index.html
+++ b/docs/services/sqlite/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Sqlite | 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/sqlite"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/supabase/index.html b/docs/services/supabase/index.html
index 1a45e3f8e4..269e28f2fd 100644
--- a/docs/services/supabase/index.html
+++ b/docs/services/supabase/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Supabase | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/services/supabase"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/swift/index.html b/docs/services/swift/index.html
index 3659fc9f2d..c23a43acd5 100644
--- a/docs/services/swift/index.html
+++ b/docs/services/swift/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Swift | 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/swift"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="t [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/tikv/index.html b/docs/services/tikv/index.html
index 289f06e168..24a2739968 100644
--- a/docs/services/tikv/index.html
+++ b/docs/services/tikv/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">TiKV | 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/tikv"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="tru [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/vercel_artifacts/index.html b/docs/services/vercel_artifacts/index.html
index e743ae633c..4ccb005aef 100644
--- a/docs/services/vercel_artifacts/index.html
+++ b/docs/services/vercel_artifacts/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Vercel Artifacts | 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/vercel_artifacts"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/webdav/index.html b/docs/services/webdav/index.html
index c8a64c1d76..b79a146b9f 100644
--- a/docs/services/webdav/index.html
+++ b/docs/services/webdav/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">WebDAV | Apache OpenDAL™</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/services/webdav"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/services/webhdfs/index.html b/docs/services/webhdfs/index.html
index dd431e06d7..a7a10decdb 100644
--- a/docs/services/webhdfs/index.html
+++ b/docs/services/webhdfs/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-r [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/download/index.html b/download/index.html
index 33d63c0439..c135aa8dde 100644
--- a/download/index.html
+++ b/download/index.html
@@ -6,7 +6,7 @@
<title data-rh="true">Apache OpenDAL™ Downloads | 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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/index.html b/index.html
index d50aca29fa..a7bfbb7275 100644
--- a/index.html
+++ b/index.html
@@ -6,7 +6,7 @@
<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" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusauru [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL™ Atom Feed"><link rel="stylesheet" href="/assets/css/styles.b669fb25.css">
<script src="/assets/js/runtime~main.f4fb68ef.js" defer="defer"></script>
-<script src="/assets/js/main.29d7c87a.js" defer="defer"></script>
+<script src="/assets/js/main.0984b5d4.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/lunr-index-1715950394456.json b/lunr-index-1715950394456.json
deleted file mode 100644
index d3edc1c1d0..0000000000
--- a/lunr-index-1715950394456.json
+++ /dev/null
@@ -1 +0,0 @@
-{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,219.994,1,123.451,2,387.285,3,376.601,4,413.055,5,255.539,6,413.055]],["content/0",[0,2.558,1,2.856,2,8.154,3,7.929,4,7.662,5,4.74,6,8.697,7,2.659,8,2.858,9,3.362,10,1.199,11,3.147,12,4.504,13,4.99,14,6.974,15,9.942,16,2.751,17,3.362,18,4.99,19,3.362,20,2.579,21,2.082,22,0.541,23,1.427,24,2.155,25,3.689,26,3.362,27,4.99,28,7.662,29,2.751,30,3.147,31,1.762,32,5.449,33,2.986,34,3.368,35,3.321,36,3.362, [...]
\ No newline at end of file
diff --git a/lunr-index-1715954882439.json b/lunr-index-1715954882439.json
new file mode 100644
index 0000000000..3b466512c1
--- /dev/null
+++ b/lunr-index-1715954882439.json
@@ -0,0 +1 @@
+{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,219.994,1,123.451,2,387.285,3,376.601,4,413.055,5,255.539,6,413.055]],["content/0",[0,2.558,1,2.856,2,8.154,3,7.929,4,7.662,5,4.74,6,8.697,7,2.659,8,2.858,9,3.362,10,1.199,11,3.147,12,4.504,13,4.99,14,6.974,15,9.942,16,2.751,17,3.362,18,4.99,19,3.362,20,2.579,21,2.082,22,0.541,23,1.427,24,2.155,25,3.689,26,3.362,27,4.99,28,7.662,29,2.751,30,3.147,31,1.762,32,5.449,33,2.986,34,3.368,35,3.321,36,3.362, [...]
\ No newline at end of file
diff --git a/lunr-index.json b/lunr-index.json
index d3edc1c1d0..3b466512c1 100644
--- a/lunr-index.json
+++ b/lunr-index.json
@@ -1 +1 @@
-{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,219.994,1,123.451,2,387.285,3,376.601,4,413.055,5,255.539,6,413.055]],["content/0",[0,2.558,1,2.856,2,8.154,3,7.929,4,7.662,5,4.74,6,8.697,7,2.659,8,2.858,9,3.362,10,1.199,11,3.147,12,4.504,13,4.99,14,6.974,15,9.942,16,2.751,17,3.362,18,4.99,19,3.362,20,2.579,21,2.082,22,0.541,23,1.427,24,2.155,25,3.689,26,3.362,27,4.99,28,7.662,29,2.751,30,3.147,31,1.762,32,5.449,33,2.986,34,3.368,35,3.321,36,3.362, [...]
\ No newline at end of file
+{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,219.994,1,123.451,2,387.285,3,376.601,4,413.055,5,255.539,6,413.055]],["content/0",[0,2.558,1,2.856,2,8.154,3,7.929,4,7.662,5,4.74,6,8.697,7,2.659,8,2.858,9,3.362,10,1.199,11,3.147,12,4.504,13,4.99,14,6.974,15,9.942,16,2.751,17,3.362,18,4.99,19,3.362,20,2.579,21,2.082,22,0.541,23,1.427,24,2.155,25,3.689,26,3.362,27,4.99,28,7.662,29,2.751,30,3.147,31,1.762,32,5.449,33,2.986,34,3.368,35,3.321,36,3.362, [...]
\ No newline at end of file
diff --git a/search-doc-1715950394456.json b/search-doc-1715950394456.json
deleted file mode 100644
index b39b83c08b..0000000000
--- a/search-doc-1715950394456.json
+++ /dev/null
@@ -1 +0,0 @@
-{"searchDocs":[{"title":"Apache OpenDAL™ participates in Google Summer of Code 2024","type":0,"sectionRef":"#","url":"/blog/apache-opendal-participates-in-gsoc-2024","content":"Hello, everyone! We're writing this blog post to announce that the Apache OpenDAL™ Project will be participating in Google Summer of Code (GSoC) 2024. If you're not eligible or interested in participating in GSoC, then most of this post likely isn't relevant to you; if you are, this should contain some useful info [...]
\ No newline at end of file
diff --git a/search-doc-1715954882439.json b/search-doc-1715954882439.json
new file mode 100644
index 0000000000..a177a8e3e3
--- /dev/null
+++ b/search-doc-1715954882439.json
@@ -0,0 +1 @@
+{"searchDocs":[{"title":"Apache OpenDAL™ participates in Google Summer of Code 2024","type":0,"sectionRef":"#","url":"/blog/apache-opendal-participates-in-gsoc-2024","content":"Hello, everyone! We're writing this blog post to announce that the Apache OpenDAL™ Project will be participating in Google Summer of Code (GSoC) 2024. If you're not eligible or interested in participating in GSoC, then most of this post likely isn't relevant to you; if you are, this should contain some useful info [...]
\ No newline at end of file
diff --git a/search-doc.json b/search-doc.json
index b39b83c08b..a177a8e3e3 100644
--- a/search-doc.json
+++ b/search-doc.json
@@ -1 +1 @@
-{"searchDocs":[{"title":"Apache OpenDAL™ participates in Google Summer of Code 2024","type":0,"sectionRef":"#","url":"/blog/apache-opendal-participates-in-gsoc-2024","content":"Hello, everyone! We're writing this blog post to announce that the Apache OpenDAL™ Project will be participating in Google Summer of Code (GSoC) 2024. If you're not eligible or interested in participating in GSoC, then most of this post likely isn't relevant to you; if you are, this should contain some useful info [...]
\ No newline at end of file
+{"searchDocs":[{"title":"Apache OpenDAL™ participates in Google Summer of Code 2024","type":0,"sectionRef":"#","url":"/blog/apache-opendal-participates-in-gsoc-2024","content":"Hello, everyone! We're writing this blog post to announce that the Apache OpenDAL™ Project will be participating in Google Summer of Code (GSoC) 2024. If you're not eligible or interested in participating in GSoC, then most of this post likely isn't relevant to you; if you are, this should contain some useful info [...]
\ No newline at end of file