#
tokens: 49966/50000 57/1362 files (page 1/74)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 1 of 74. Use http://codebase.md/apache/opendal?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .asf.yaml
├── .config
│   └── nextest.toml
├── .devcontainer
│   ├── devcontainer.json
│   └── post_create.sh
├── .editorconfig
├── .env.example
├── .gitattributes
├── .github
│   ├── actions
│   │   ├── fuzz_test
│   │   │   └── action.yaml
│   │   ├── setup
│   │   │   └── action.yaml
│   │   ├── setup-hadoop
│   │   │   └── action.yaml
│   │   ├── setup-ocaml
│   │   │   └── action.yaml
│   │   ├── test_behavior_binding_c
│   │   │   └── action.yaml
│   │   ├── test_behavior_binding_cpp
│   │   │   └── action.yaml
│   │   ├── test_behavior_binding_go
│   │   │   └── action.yaml
│   │   ├── test_behavior_binding_java
│   │   │   └── action.yaml
│   │   ├── test_behavior_binding_nodejs
│   │   │   └── action.yaml
│   │   ├── test_behavior_binding_python
│   │   │   └── action.yaml
│   │   ├── test_behavior_core
│   │   │   └── action.yaml
│   │   └── test_behavior_integration_object_store
│   │       └── action.yml
│   ├── CODEOWNERS
│   ├── dependabot.yml
│   ├── ISSUE_TEMPLATE
│   │   ├── 1-bug-report.yml
│   │   ├── 2-feature-request.yml
│   │   ├── 3-new-release.md
│   │   └── config.yml
│   ├── pull_request_template.md
│   ├── release.yml
│   ├── scripts
│   │   ├── test_behavior
│   │   │   ├── __init__.py
│   │   │   ├── plan.py
│   │   │   └── test_plan.py
│   │   ├── test_go_binding
│   │   │   ├── generate_test_scheme.py
│   │   │   └── matrix.yaml
│   │   └── weekly_update
│   │       ├── .gitignore
│   │       ├── .python-version
│   │       ├── main.py
│   │       ├── pyproject.toml
│   │       ├── README.md
│   │       └── uv.lock
│   ├── services
│   │   ├── aliyun_drive
│   │   │   └── aliyun_drive
│   │   │       └── disable_action.yml
│   │   ├── alluxio
│   │   │   └── alluxio
│   │   │       └── action.yml
│   │   ├── azblob
│   │   │   ├── azure_azblob
│   │   │   │   └── action.yml
│   │   │   └── azurite_azblob
│   │   │       └── action.yml
│   │   ├── azdls
│   │   │   └── azdls
│   │   │       └── action.yml
│   │   ├── azfile
│   │   │   └── azfile
│   │   │       └── action.yml
│   │   ├── b2
│   │   │   └── b2
│   │   │       └── action.yml
│   │   ├── cacache
│   │   │   └── cacache
│   │   │       └── action.yml
│   │   ├── compfs
│   │   │   └── compfs
│   │   │       └── action.yml
│   │   ├── cos
│   │   │   └── cos
│   │   │       └── action.yml
│   │   ├── dashmap
│   │   │   └── dashmap
│   │   │       └── action.yml
│   │   ├── dropbox
│   │   │   └── dropbox
│   │   │       └── disable_action.yml
│   │   ├── etcd
│   │   │   ├── etcd
│   │   │   │   └── action.yml
│   │   │   ├── etcd-cluster
│   │   │   │   └── action.yml
│   │   │   └── etcd-tls
│   │   │       └── action.yml
│   │   ├── fs
│   │   │   └── local_fs
│   │   │       └── action.yml
│   │   ├── ftp
│   │   │   └── vsftpd
│   │   │       └── disable_action.yml
│   │   ├── gcs
│   │   │   ├── gcs
│   │   │   │   └── action.yml
│   │   │   └── gcs_with_default_storage_class
│   │   │       └── action.yml
│   │   ├── gdrive
│   │   │   └── gdrive
│   │   │       └── action.yml
│   │   ├── gridfs
│   │   │   ├── gridfs
│   │   │   │   └── action.yml
│   │   │   └── gridfs_with_basic_auth
│   │   │       └── action.yml
│   │   ├── hdfs
│   │   │   ├── hdfs_cluster
│   │   │   │   └── action.yml
│   │   │   ├── hdfs_cluster_with_atomic_write_dir
│   │   │   │   └── action.yml
│   │   │   ├── hdfs_default
│   │   │   │   └── action.yml
│   │   │   ├── hdfs_default_gcs
│   │   │   │   └── action.yml
│   │   │   ├── hdfs_default_on_azurite_azblob
│   │   │   │   └── action.yml
│   │   │   ├── hdfs_default_on_minio_s3
│   │   │   │   └── action.yml
│   │   │   └── hdfs_default_with_atomic_write_dir
│   │   │       └── action.yml
│   │   ├── hdfs_native
│   │   │   └── hdfs_native_cluster
│   │   │       └── action.yml
│   │   ├── http
│   │   │   ├── caddy
│   │   │   │   └── action.yml
│   │   │   └── nginx
│   │   │       └── action.yml
│   │   ├── huggingface
│   │   │   └── huggingface
│   │   │       └── action.yml
│   │   ├── koofr
│   │   │   └── koofr
│   │   │       └── disable_action.yml
│   │   ├── memcached
│   │   │   ├── memcached
│   │   │   │   └── action.yml
│   │   │   └── memcached_with_auth
│   │   │       └── action.yml
│   │   ├── memory
│   │   │   └── memory
│   │   │       └── action.yml
│   │   ├── mini_moka
│   │   │   └── mini_moka
│   │   │       └── action.yml
│   │   ├── moka
│   │   │   └── moka
│   │   │       └── action.yml
│   │   ├── mongodb
│   │   │   ├── mongodb_with_basic_auth
│   │   │   │   └── action.yml
│   │   │   └── mongodb_with_no_auth
│   │   │       └── action.yml
│   │   ├── monoiofs
│   │   │   └── monoiofs
│   │   │       └── action.yml
│   │   ├── mysql
│   │   │   └── mysql
│   │   │       └── action.yml
│   │   ├── oss
│   │   │   ├── oss
│   │   │   │   └── action.yml
│   │   │   └── oss_with_versioning
│   │   │       └── action.yml
│   │   ├── persy
│   │   │   └── persy
│   │   │       └── action.yml
│   │   ├── postgresql
│   │   │   └── postgresql
│   │   │       └── action.yml
│   │   ├── redb
│   │   │   └── redb
│   │   │       └── action.yml
│   │   ├── redis
│   │   │   ├── dragonfly
│   │   │   │   └── action.yml
│   │   │   ├── kvrocks
│   │   │   │   └── action.yml
│   │   │   ├── redis
│   │   │   │   └── action.yml
│   │   │   ├── redis_tls
│   │   │   │   └── action.yml
│   │   │   ├── redis_with_cluster
│   │   │   │   └── action.yml
│   │   │   └── redis_with_cluster_tls
│   │   │       └── action.yml
│   │   ├── rocksdb
│   │   │   └── rocksdb
│   │   │       └── action.yml
│   │   ├── s3
│   │   │   ├── 0_minio_s3
│   │   │   │   └── action.yml
│   │   │   ├── aws_s3
│   │   │   │   └── action.yml
│   │   │   ├── aws_s3_with_list_objects_v1
│   │   │   │   └── action.yml
│   │   │   ├── aws_s3_with_sse_c
│   │   │   │   └── action.yml
│   │   │   ├── aws_s3_with_versioning
│   │   │   │   └── action.yml
│   │   │   ├── aws_s3_with_virtual_host
│   │   │   │   └── action.yml
│   │   │   ├── ceph_radios_s3_with_versioning
│   │   │   │   └── disable_action.yml
│   │   │   ├── ceph_rados_s3
│   │   │   │   └── disable_action.yml
│   │   │   ├── minio_s3_with_anonymous
│   │   │   │   └── action.yml
│   │   │   ├── minio_s3_with_list_objects_v1
│   │   │   │   └── action.yml
│   │   │   ├── minio_s3_with_versioning
│   │   │   │   └── action.yml
│   │   │   └── r2
│   │   │       └── disabled_action.yml
│   │   ├── seafile
│   │   │   └── seafile
│   │   │       └── action.yml
│   │   ├── sftp
│   │   │   ├── sftp
│   │   │   │   └── action.yml
│   │   │   └── sftp_with_default_root
│   │   │       └── action.yml
│   │   ├── sled
│   │   │   ├── sled
│   │   │   │   └── action.yml
│   │   │   └── sled_with_tree
│   │   │       └── action.yml
│   │   ├── sqlite
│   │   │   └── sqlite
│   │   │       └── action.yml
│   │   ├── swift
│   │   │   ├── ceph_rados_swift
│   │   │   │   └── action.yml
│   │   │   └── swift
│   │   │       └── action.yml
│   │   ├── tikv
│   │   │   └── tikv
│   │   │       └── disable_action.yml
│   │   ├── webdav
│   │   │   ├── 0_nginx
│   │   │   │   └── action.yml
│   │   │   ├── jfrog
│   │   │   │   └── disabled_action.yml
│   │   │   ├── nextcloud
│   │   │   │   └── action.yml
│   │   │   ├── nginx_with_empty_password
│   │   │   │   └── action.yml
│   │   │   ├── nginx_with_password
│   │   │   │   └── action.yml
│   │   │   ├── nginx_with_redirect
│   │   │   │   └── action.yml
│   │   │   └── owncloud
│   │   │       └── action.yml
│   │   └── webhdfs
│   │       ├── webhdfs
│   │       │   └── action.yml
│   │       ├── webhdfs_with_list_batch_disabled
│   │       │   └── action.yml
│   │       └── webhdfs_with_user_name
│   │           └── action.yml
│   └── workflows
│       ├── ci_bindings_c.yml
│       ├── ci_bindings_cpp.yml
│       ├── ci_bindings_d.yml
│       ├── ci_bindings_dart.yml
│       ├── ci_bindings_dotnet.yml
│       ├── ci_bindings_go.yml
│       ├── ci_bindings_haskell.yml
│       ├── ci_bindings_java.yml
│       ├── ci_bindings_lua.yml
│       ├── ci_bindings_nodejs.yml
│       ├── ci_bindings_ocaml.yml
│       ├── ci_bindings_php.yml
│       ├── ci_bindings_python.yml
│       ├── ci_bindings_ruby.yml
│       ├── ci_bindings_swift.yml
│       ├── ci_bindings_zig.yml
│       ├── ci_check.yml
│       ├── ci_core.yml
│       ├── ci_integration_dav_server.yml
│       ├── ci_integration_object_store.yml
│       ├── ci_integration_parquet.yml
│       ├── ci_integration_spring.yml
│       ├── ci_integration_unftp_sbe.yml
│       ├── ci_odev.yml
│       ├── ci_weekly_update.yml
│       ├── discussion-thread-link.yml
│       ├── docs.yml
│       ├── full-ci-promote.yml
│       ├── release_dart.yml
│       ├── release_java.yml
│       ├── release_nodejs.yml
│       ├── release_python.yml
│       ├── release_ruby.yml
│       ├── release_rust.yml
│       ├── service_test_ghac.yml
│       ├── test_behavior_binding_c.yml
│       ├── test_behavior_binding_cpp.yml
│       ├── test_behavior_binding_go.yml
│       ├── test_behavior_binding_java.yml
│       ├── test_behavior_binding_nodejs.yml
│       ├── test_behavior_binding_python.yml
│       ├── test_behavior_core.yml
│       ├── test_behavior_integration_object_store.yml
│       ├── test_behavior.yml
│       ├── test_edge.yml
│       └── test_fuzz.yml
├── .gitignore
├── .taplo.toml
├── .typos.toml
├── .vscode
│   └── settings.json
├── .yamlfmt
├── AGENTS.md
├── bindings
│   ├── java
│   │   ├── .cargo
│   │   │   └── config.toml
│   │   ├── .gitignore
│   │   ├── .mvn
│   │   │   └── wrapper
│   │   │       └── maven-wrapper.properties
│   │   ├── Cargo.toml
│   │   ├── DEPENDENCIES.md
│   │   ├── DEPENDENCIES.rust.tsv
│   │   ├── mvnw
│   │   ├── mvnw.cmd
│   │   ├── pom.xml
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── async_operator.rs
│   │   │   ├── convert.rs
│   │   │   ├── error.rs
│   │   │   ├── executor.rs
│   │   │   ├── layer.rs
│   │   │   ├── lib.rs
│   │   │   ├── main
│   │   │   │   ├── java
│   │   │   │   │   └── org
│   │   │   │   │       └── apache
│   │   │   │   │           └── opendal
│   │   │   │   │               ├── AsyncExecutor.java
│   │   │   │   │               ├── AsyncOperator.java
│   │   │   │   │               ├── Capability.java
│   │   │   │   │               ├── Entry.java
│   │   │   │   │               ├── Environment.java
│   │   │   │   │               ├── layer
│   │   │   │   │               │   ├── ConcurrentLimitLayer.java
│   │   │   │   │               │   ├── package-info.java
│   │   │   │   │               │   └── RetryLayer.java
│   │   │   │   │               ├── Layer.java
│   │   │   │   │               ├── ListOptions.java
│   │   │   │   │               ├── Metadata.java
│   │   │   │   │               ├── NativeLibrary.java
│   │   │   │   │               ├── NativeObject.java
│   │   │   │   │               ├── OpenDAL.java
│   │   │   │   │               ├── OpenDALException.java
│   │   │   │   │               ├── Operator.java
│   │   │   │   │               ├── OperatorInfo.java
│   │   │   │   │               ├── OperatorInputStream.java
│   │   │   │   │               ├── OperatorOutputStream.java
│   │   │   │   │               ├── package-info.java
│   │   │   │   │               ├── PresignedRequest.java
│   │   │   │   │               ├── ReadOptions.java
│   │   │   │   │               ├── ServiceConfig.java
│   │   │   │   │               ├── StatOptions.java
│   │   │   │   │               └── WriteOptions.java
│   │   │   │   └── resources
│   │   │   │       ├── bindings.properties
│   │   │   │       └── META-INF
│   │   │   │           └── NOTICE
│   │   │   ├── operator_input_stream.rs
│   │   │   ├── operator_output_stream.rs
│   │   │   ├── operator.rs
│   │   │   ├── test
│   │   │   │   └── java
│   │   │   │       └── org
│   │   │   │           └── apache
│   │   │   │               └── opendal
│   │   │   │                   └── test
│   │   │   │                       ├── AsyncExecutorTest.java
│   │   │   │                       ├── behavior
│   │   │   │                       │   ├── AsyncCopyTest.java
│   │   │   │                       │   ├── AsyncCreateDirTest.java
│   │   │   │                       │   ├── AsyncListTest.java
│   │   │   │                       │   ├── AsyncPresignTest.java
│   │   │   │                       │   ├── AsyncReadOnlyTest.java
│   │   │   │                       │   ├── AsyncRenameTest.java
│   │   │   │                       │   ├── AsyncStatOptionsTest.java
│   │   │   │                       │   ├── AsyncWriteOptionsTest.java
│   │   │   │                       │   ├── AsyncWriteTest.java
│   │   │   │                       │   ├── BehaviorExtension.java
│   │   │   │                       │   ├── BehaviorTestBase.java
│   │   │   │                       │   ├── BlockingCopyTest.java
│   │   │   │                       │   ├── BlockingCreateDirTest.java
│   │   │   │                       │   ├── BlockingListTest.java
│   │   │   │                       │   ├── BlockingReadOnlyTest.java
│   │   │   │                       │   ├── BlockingRenameTest.java
│   │   │   │                       │   ├── BlockingStatOptionsTest.java
│   │   │   │                       │   ├── BlockingWriteOptionTest.java
│   │   │   │                       │   ├── BlockingWriteTest.java
│   │   │   │                       │   └── RegressionTest.java
│   │   │   │                       ├── condition
│   │   │   │                       │   └── OpenDALExceptionCondition.java
│   │   │   │                       ├── LayerTest.java
│   │   │   │                       ├── MetadataTest.java
│   │   │   │                       ├── OperatorDuplicateTest.java
│   │   │   │                       ├── OperatorInfoTest.java
│   │   │   │                       ├── OperatorInputOutputStreamTest.java
│   │   │   │                       ├── OperatorUtf8DecodeTest.java
│   │   │   │                       └── UtilityTest.java
│   │   │   └── utility.rs
│   │   ├── tools
│   │   │   └── build.py
│   │   ├── upgrade.md
│   │   └── users.md
│   ├── nodejs
│   │   ├── .cargo
│   │   │   └── config.toml
│   │   ├── .gitignore
│   │   ├── .node-version
│   │   ├── .npmignore
│   │   ├── .npmrc
│   │   ├── .prettierignore
│   │   ├── benchmark
│   │   │   ├── deno.ts
│   │   │   ├── node.js
│   │   │   └── README.md
│   │   ├── build.rs
│   │   ├── Cargo.toml
│   │   ├── CONTRIBUTING.md
│   │   ├── DEPENDENCIES.md
│   │   ├── DEPENDENCIES.rust.tsv
│   │   ├── devbox.json
│   │   ├── devbox.lock
│   │   ├── generated.d.ts
│   │   ├── generated.js
│   │   ├── index.cjs
│   │   ├── index.d.ts
│   │   ├── index.mjs
│   │   ├── npm
│   │   │   ├── darwin-arm64
│   │   │   │   ├── package.json
│   │   │   │   └── README.md
│   │   │   ├── darwin-x64
│   │   │   │   ├── package.json
│   │   │   │   └── README.md
│   │   │   ├── linux-arm64-gnu
│   │   │   │   ├── package.json
│   │   │   │   └── README.md
│   │   │   ├── linux-arm64-musl
│   │   │   │   ├── package.json
│   │   │   │   └── README.md
│   │   │   ├── linux-x64-gnu
│   │   │   │   ├── package.json
│   │   │   │   └── README.md
│   │   │   ├── linux-x64-musl
│   │   │   │   ├── package.json
│   │   │   │   └── README.md
│   │   │   ├── win32-arm64-msvc
│   │   │   │   ├── package.json
│   │   │   │   └── README.md
│   │   │   └── win32-x64-msvc
│   │   │       ├── package.json
│   │   │       └── README.md
│   │   ├── package.json
│   │   ├── pnpm-lock.yaml
│   │   ├── README.md
│   │   ├── scripts
│   │   │   └── header.mjs
│   │   ├── src
│   │   │   ├── capability.rs
│   │   │   ├── layer.rs
│   │   │   ├── lib.rs
│   │   │   └── options.rs
│   │   ├── tests
│   │   │   ├── service.test.mjs
│   │   │   ├── suites
│   │   │   │   ├── async.suite.mjs
│   │   │   │   ├── asyncDeleteOptions.suite.mjs
│   │   │   │   ├── asyncLister.suite.mjs
│   │   │   │   ├── asyncListOptions.suite.mjs
│   │   │   │   ├── asyncReadOptions.suite.mjs
│   │   │   │   ├── asyncStatOptions.suite.mjs
│   │   │   │   ├── asyncWriteOptions.suite.mjs
│   │   │   │   ├── index.mjs
│   │   │   │   ├── layer.suite.mjs
│   │   │   │   ├── services.suite.mjs
│   │   │   │   ├── sync.suite.mjs
│   │   │   │   ├── syncDeleteOptions.suite.mjs
│   │   │   │   ├── syncLister.suite.mjs
│   │   │   │   ├── syncListOptions.suite.mjs
│   │   │   │   ├── syncReadOptions.suite.mjs
│   │   │   │   ├── syncStatOptions.suite.mjs
│   │   │   │   └── syncWriteOptions.suite.mjs
│   │   │   └── utils.mjs
│   │   ├── theme
│   │   │   ├── index.tsx
│   │   │   └── package.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.theme.json
│   │   ├── typedoc.json
│   │   ├── upgrade.md
│   │   └── vitest.config.mjs
│   ├── python
│   │   ├── .gitignore
│   │   ├── benchmark
│   │   │   ├── async_opendal_benchmark.py
│   │   │   ├── async_origin_s3_benchmark_with_gevent.py
│   │   │   └── README.md
│   │   ├── Cargo.toml
│   │   ├── CONTRIBUTING.md
│   │   ├── DEPENDENCIES.md
│   │   ├── DEPENDENCIES.rust.tsv
│   │   ├── docs
│   │   │   ├── api
│   │   │   │   ├── async_file.md
│   │   │   │   ├── async_operator.md
│   │   │   │   ├── capability.md
│   │   │   │   ├── exceptions.md
│   │   │   │   ├── file.md
│   │   │   │   ├── layers.md
│   │   │   │   ├── operator.md
│   │   │   │   └── types.md
│   │   │   └── index.md
│   │   ├── justfile
│   │   ├── mkdocs.yml
│   │   ├── pyproject.toml
│   │   ├── pyrightconfig.json
│   │   ├── python
│   │   │   └── opendal
│   │   │       ├── __init__.py
│   │   │       ├── capability.pyi
│   │   │       ├── exceptions.pyi
│   │   │       ├── file.pyi
│   │   │       ├── layers.pyi
│   │   │       ├── operator.pyi
│   │   │       ├── py.typed
│   │   │       ├── services.pyi
│   │   │       └── types.pyi
│   │   ├── README.md
│   │   ├── ruff.toml
│   │   ├── src
│   │   │   ├── capability.rs
│   │   │   ├── errors.rs
│   │   │   ├── file.rs
│   │   │   ├── layers.rs
│   │   │   ├── lib.rs
│   │   │   ├── lister.rs
│   │   │   ├── metadata.rs
│   │   │   ├── operator.rs
│   │   │   ├── options.rs
│   │   │   ├── services.rs
│   │   │   └── utils.rs
│   │   ├── template
│   │   │   └── module.html.jinja2
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_async_check.py
│   │   │   ├── test_async_copy.py
│   │   │   ├── test_async_delete.py
│   │   │   ├── test_async_exists.py
│   │   │   ├── test_async_list.py
│   │   │   ├── test_async_pickle_types.py
│   │   │   ├── test_async_rename.py
│   │   │   ├── test_capability.py
│   │   │   ├── test_exceptions.py
│   │   │   ├── test_pickle_rw.py
│   │   │   ├── test_read.py
│   │   │   ├── test_sync_check.py
│   │   │   ├── test_sync_copy.py
│   │   │   ├── test_sync_delete.py
│   │   │   ├── test_sync_exists.py
│   │   │   ├── test_sync_list.py
│   │   │   ├── test_sync_pickle_types.py
│   │   │   ├── test_sync_rename.py
│   │   │   └── test_write.py
│   │   ├── upgrade.md
│   │   ├── users.md
│   │   └── uv.lock
│   └── README.md
├── CHANGELOG.md
├── CITATION.cff
├── CLAUDE.md
├── CONTRIBUTING.md
├── core
│   ├── benches
│   │   ├── ops
│   │   │   ├── main.rs
│   │   │   ├── read.rs
│   │   │   ├── README.md
│   │   │   ├── utils.rs
│   │   │   └── write.rs
│   │   ├── README.md
│   │   ├── types
│   │   │   ├── buffer.rs
│   │   │   ├── main.rs
│   │   │   ├── README.md
│   │   │   └── tasks.rs
│   │   ├── vs_fs
│   │   │   ├── Cargo.toml
│   │   │   ├── README.md
│   │   │   └── src
│   │   │       └── main.rs
│   │   └── vs_s3
│   │       ├── Cargo.toml
│   │       ├── README.md
│   │       └── src
│   │           └── main.rs
│   ├── Cargo.lock
│   ├── Cargo.toml
│   ├── CHANGELOG.md
│   ├── CONTRIBUTING.md
│   ├── core
│   │   ├── Cargo.toml
│   │   └── src
│   │       ├── blocking
│   │       │   ├── delete.rs
│   │       │   ├── list.rs
│   │       │   ├── mod.rs
│   │       │   ├── operator.rs
│   │       │   ├── read
│   │       │   │   ├── buffer_iterator.rs
│   │       │   │   ├── mod.rs
│   │       │   │   ├── reader.rs
│   │       │   │   ├── std_bytes_iterator.rs
│   │       │   │   └── std_reader.rs
│   │       │   └── write
│   │       │       ├── mod.rs
│   │       │       ├── std_writer.rs
│   │       │       └── writer.rs
│   │       ├── docs
│   │       │   ├── comparisons
│   │       │   │   ├── mod.rs
│   │       │   │   └── vs_object_store.md
│   │       │   ├── concepts.rs
│   │       │   ├── internals
│   │       │   │   ├── accessor.rs
│   │       │   │   ├── layer.rs
│   │       │   │   └── mod.rs
│   │       │   ├── mod.rs
│   │       │   ├── performance
│   │       │   │   ├── concurrent_write.md
│   │       │   │   ├── http_optimization.md
│   │       │   │   └── mod.rs
│   │       │   ├── rfcs
│   │       │   │   ├── 0000_example.md
│   │       │   │   ├── 0041_object_native_api.md
│   │       │   │   ├── 0044_error_handle.md
│   │       │   │   ├── 0057_auto_region.md
│   │       │   │   ├── 0069_object_stream.md
│   │       │   │   ├── 0090_limited_reader.md
│   │       │   │   ├── 0112_path_normalization.md
│   │       │   │   ├── 0191_async_streaming_io.md
│   │       │   │   ├── 0203_remove_credential.md
│   │       │   │   ├── 0221_create_dir.md
│   │       │   │   ├── 0247_retryable_error.md
│   │       │   │   ├── 0293_object_id.md
│   │       │   │   ├── 0337_dir_entry.md
│   │       │   │   ├── 0409_accessor_capabilities.md
│   │       │   │   ├── 0413_presign.md
│   │       │   │   ├── 0423_command_line_interface.md
│   │       │   │   ├── 0429_init_from_iter.md
│   │       │   │   ├── 0438_multipart.md
│   │       │   │   ├── 0443_gateway.md
│   │       │   │   ├── 0501_new_builder.md
│   │       │   │   ├── 0554_write_refactor.md
│   │       │   │   ├── 0561_list_metadata_reuse.md
│   │       │   │   ├── 0599_blocking_api.md
│   │       │   │   ├── 0623_redis_service.md
│   │       │   │   ├── 0627_split_capabilities.md
│   │       │   │   ├── 0661_path_in_accessor.md
│   │       │   │   ├── 0793_generic_kv_services.md
│   │       │   │   ├── 0926_object_reader.md
│   │       │   │   ├── 0977_refactor_error.md
│   │       │   │   ├── 1085_object_handler.md
│   │       │   │   ├── 1391_object_metadataer.md
│   │       │   │   ├── 1398_query_based_metadata.md
│   │       │   │   ├── 1420_object_writer.md
│   │       │   │   ├── 1477_remove_object_concept.md
│   │       │   │   ├── 1735_operation_extension.md
│   │       │   │   ├── 2083_writer_sink_api.md
│   │       │   │   ├── 2133_append_api.md
│   │       │   │   ├── 2299_chain_based_operator_api.md
│   │       │   │   ├── 2602_object_versioning.md
│   │       │   │   ├── 2758_merge_append_into_write.md
│   │       │   │   ├── 2774_lister_api.md
│   │       │   │   ├── 2779_list_with_metakey.md
│   │       │   │   ├── 2852_native_capability.md
│   │       │   │   ├── 2884_merge_range_read_into_read.md
│   │       │   │   ├── 3017_remove_write_copy_from.md
│   │       │   │   ├── 3197_config.md
│   │       │   │   ├── 3232_align_list_api.md
│   │       │   │   ├── 3243_list_prefix.md
│   │       │   │   ├── 3356_lazy_reader.md
│   │       │   │   ├── 3526_list_recursive.md
│   │       │   │   ├── 3574_concurrent_stat_in_list.md
│   │       │   │   ├── 3734_buffered_reader.md
│   │       │   │   ├── 3898_concurrent_writer.md
│   │       │   │   ├── 3911_deleter_api.md
│   │       │   │   ├── 4382_range_based_read.md
│   │       │   │   ├── 4638_executor.md
│   │       │   │   ├── 5314_remove_metakey.md
│   │       │   │   ├── 5444_operator_from_uri.md
│   │       │   │   ├── 5479_context.md
│   │       │   │   ├── 5485_conditional_reader.md
│   │       │   │   ├── 5495_list_with_deleted.md
│   │       │   │   ├── 5556_write_returns_metadata.md
│   │       │   │   ├── 5871_read_returns_metadata.md
│   │       │   │   ├── 6189_remove_native_blocking.md
│   │       │   │   ├── 6209_glob_support.md
│   │       │   │   ├── 6213_options_api.md
│   │       │   │   ├── 6370_foyer_integration.md
│   │       │   │   ├── 6678_simulate_layer.md
│   │       │   │   ├── 6707_capability_override_layer.md
│   │       │   │   ├── 6817_checksum.md
│   │       │   │   ├── 6828_core.md
│   │       │   │   ├── 7130_route_layer.md
│   │       │   │   ├── mod.rs
│   │       │   │   └── README.md
│   │       │   └── upgrade.md
│   │       ├── layers
│   │       │   ├── complete.rs
│   │       │   ├── correctness_check.rs
│   │       │   ├── error_context.rs
│   │       │   ├── http_client.rs
│   │       │   ├── mod.rs
│   │       │   ├── simulate.rs
│   │       │   └── type_eraser.rs
│   │       ├── lib.rs
│   │       ├── raw
│   │       │   ├── accessor.rs
│   │       │   ├── atomic_util.rs
│   │       │   ├── enum_utils.rs
│   │       │   ├── futures_util.rs
│   │       │   ├── http_util
│   │       │   │   ├── body.rs
│   │       │   │   ├── bytes_content_range.rs
│   │       │   │   ├── bytes_range.rs
│   │       │   │   ├── client.rs
│   │       │   │   ├── error.rs
│   │       │   │   ├── header.rs
│   │       │   │   ├── mod.rs
│   │       │   │   ├── multipart.rs
│   │       │   │   └── uri.rs
│   │       │   ├── layer.rs
│   │       │   ├── mod.rs
│   │       │   ├── oio
│   │       │   │   ├── buf
│   │       │   │   │   ├── flex_buf.rs
│   │       │   │   │   ├── mod.rs
│   │       │   │   │   ├── pooled_buf.rs
│   │       │   │   │   └── queue_buf.rs
│   │       │   │   ├── delete
│   │       │   │   │   ├── api.rs
│   │       │   │   │   ├── batch_delete.rs
│   │       │   │   │   ├── mod.rs
│   │       │   │   │   └── one_shot_delete.rs
│   │       │   │   ├── entry.rs
│   │       │   │   ├── list
│   │       │   │   │   ├── api.rs
│   │       │   │   │   ├── flat_list.rs
│   │       │   │   │   ├── hierarchy_list.rs
│   │       │   │   │   ├── mod.rs
│   │       │   │   │   ├── page_list.rs
│   │       │   │   │   └── prefix_list.rs
│   │       │   │   ├── mod.rs
│   │       │   │   ├── read
│   │       │   │   │   ├── api.rs
│   │       │   │   │   └── mod.rs
│   │       │   │   └── write
│   │       │   │       ├── api.rs
│   │       │   │       ├── append_write.rs
│   │       │   │       ├── block_write.rs
│   │       │   │       ├── mod.rs
│   │       │   │       ├── multipart_write.rs
│   │       │   │       ├── one_shot_write.rs
│   │       │   │       └── position_write.rs
│   │       │   ├── operation.rs
│   │       │   ├── ops.rs
│   │       │   ├── path_cache.rs
│   │       │   ├── path.rs
│   │       │   ├── rps.rs
│   │       │   ├── serde_util.rs
│   │       │   ├── std_io_util.rs
│   │       │   ├── time.rs
│   │       │   ├── tokio_util.rs
│   │       │   └── version.rs
│   │       ├── services
│   │       │   ├── memory
│   │       │   │   ├── backend.rs
│   │       │   │   ├── config.rs
│   │       │   │   ├── core.rs
│   │       │   │   ├── deleter.rs
│   │       │   │   ├── docs.md
│   │       │   │   ├── lister.rs
│   │       │   │   ├── mod.rs
│   │       │   │   └── writer.rs
│   │       │   └── mod.rs
│   │       └── types
│   │           ├── buffer.rs
│   │           ├── builder.rs
│   │           ├── capability.rs
│   │           ├── context
│   │           │   ├── mod.rs
│   │           │   ├── read.rs
│   │           │   └── write.rs
│   │           ├── delete
│   │           │   ├── deleter.rs
│   │           │   ├── futures_delete_sink.rs
│   │           │   ├── input.rs
│   │           │   └── mod.rs
│   │           ├── entry.rs
│   │           ├── error.rs
│   │           ├── execute
│   │           │   ├── api.rs
│   │           │   ├── executor.rs
│   │           │   ├── executors
│   │           │   │   ├── mod.rs
│   │           │   │   └── tokio_executor.rs
│   │           │   └── mod.rs
│   │           ├── list.rs
│   │           ├── metadata.rs
│   │           ├── mod.rs
│   │           ├── mode.rs
│   │           ├── operator
│   │           │   ├── builder.rs
│   │           │   ├── info.rs
│   │           │   ├── mod.rs
│   │           │   ├── operator_futures.rs
│   │           │   ├── operator.rs
│   │           │   ├── registry.rs
│   │           │   └── uri.rs
│   │           ├── options.rs
│   │           ├── read
│   │           │   ├── buffer_stream.rs
│   │           │   ├── futures_async_reader.rs
│   │           │   ├── futures_bytes_stream.rs
│   │           │   ├── mod.rs
│   │           │   └── reader.rs
│   │           └── write
│   │               ├── buffer_sink.rs
│   │               ├── futures_async_writer.rs
│   │               ├── futures_bytes_sink.rs
│   │               ├── mod.rs
│   │               └── writer.rs
│   ├── DEPENDENCIES.md
│   ├── DEPENDENCIES.rust.tsv
│   ├── edge
│   │   ├── file_write_on_full_disk
│   │   │   ├── Cargo.toml
│   │   │   ├── README.md
│   │   │   └── src
│   │   │       └── main.rs
│   │   ├── README.md
│   │   ├── s3_aws_assume_role_with_web_identity
│   │   │   ├── Cargo.toml
│   │   │   ├── README.md
│   │   │   └── src
│   │   │       └── main.rs
│   │   └── s3_read_on_wasm
│   │       ├── .gitignore
│   │       ├── Cargo.toml
│   │       ├── README.md
│   │       ├── src
│   │       │   └── lib.rs
│   │       └── webdriver.json
│   ├── fuzz
│   │   ├── .gitignore
│   │   ├── Cargo.toml
│   │   ├── fuzz_reader.rs
│   │   ├── fuzz_writer.rs
│   │   └── README.md
│   ├── layers
│   │   ├── async-backtrace
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── await-tree
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── capability-check
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── chaos
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── concurrent-limit
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── dtrace
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── fastmetrics
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── fastrace
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── foyer
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── hotpath
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── immutable-index
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── logging
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── metrics
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── mime-guess
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── observe-metrics-common
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── otelmetrics
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── oteltrace
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── prometheus
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── prometheus-client
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── retry
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── route
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── tail-cut
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── throttle
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── timeout
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   └── tracing
│   │       ├── Cargo.toml
│   │       └── src
│   │           └── lib.rs
│   ├── LICENSE
│   ├── README.md
│   ├── services
│   │   ├── aliyun-drive
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── alluxio
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── azblob
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── azdls
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── azfile
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── azure-common
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       └── lib.rs
│   │   ├── b2
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── cacache
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── cloudflare-kv
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       ├── model.rs
│   │   │       └── writer.rs
│   │   ├── compfs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       ├── reader.rs
│   │   │       └── writer.rs
│   │   ├── cos
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── d1
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── model.rs
│   │   │       └── writer.rs
│   │   ├── dashmap
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── dbfs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── dropbox
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── builder.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── etcd
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── foundationdb
│   │   │   ├── build.rs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── fs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       ├── reader.rs
│   │   │       └── writer.rs
│   │   ├── ftp
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── err.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       ├── reader.rs
│   │   │       └── writer.rs
│   │   ├── gcs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       ├── uri.rs
│   │   │       └── writer.rs
│   │   ├── gdrive
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── builder.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── ghac
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── github
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       ├── mod.rs
│   │   │       └── writer.rs
│   │   ├── gridfs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── hdfs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       ├── reader.rs
│   │   │       └── writer.rs
│   │   ├── hdfs-native
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       ├── reader.rs
│   │   │       └── writer.rs
│   │   ├── http
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       └── lib.rs
│   │   ├── huggingface
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       └── lister.rs
│   │   ├── ipfs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── ipld.rs
│   │   │       └── lib.rs
│   │   ├── ipmfs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── builder.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── koofr
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── lakefs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── memcached
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── binary.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── mini_moka
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── moka
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── mongodb
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── monoiofs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       ├── reader.rs
│   │   │       └── writer.rs
│   │   ├── mysql
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── obs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── onedrive
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── builder.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── graph_model.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── opfs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       └── utils.rs
│   │   ├── oss
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── pcloud
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── persy
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── postgresql
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── redb
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── redis
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── delete.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── rocksdb
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── s3
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── compatible_services.md
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       ├── mod.rs
│   │   │       └── writer.rs
│   │   ├── seafile
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── sftp
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       ├── reader.rs
│   │   │       ├── utils.rs
│   │   │       └── writer.rs
│   │   ├── sled
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── sqlite
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── surrealdb
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── swift
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── compatible_services.md
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── tikv
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── upyun
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── vercel-artifacts
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── builder.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       └── writer.rs
│   │   ├── vercel-blob
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── webdav
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       └── writer.rs
│   │   ├── webhdfs
│   │   │   ├── Cargo.toml
│   │   │   └── src
│   │   │       ├── backend.rs
│   │   │       ├── config.rs
│   │   │       ├── core.rs
│   │   │       ├── deleter.rs
│   │   │       ├── docs.md
│   │   │       ├── error.rs
│   │   │       ├── lib.rs
│   │   │       ├── lister.rs
│   │   │       ├── message.rs
│   │   │       └── writer.rs
│   │   └── yandex-disk
│   │       ├── Cargo.toml
│   │       └── src
│   │           ├── backend.rs
│   │           ├── config.rs
│   │           ├── core.rs
│   │           ├── deleter.rs
│   │           ├── docs.md
│   │           ├── error.rs
│   │           ├── lib.rs
│   │           ├── lister.rs
│   │           └── writer.rs
│   ├── src
│   │   └── lib.rs
│   ├── testkit
│   │   ├── Cargo.toml
│   │   └── src
│   │       ├── lib.rs
│   │       ├── read.rs
│   │       ├── utils.rs
│   │       └── write.rs
│   ├── tests
│   │   ├── behavior
│   │   │   ├── async_copy.rs
│   │   │   ├── async_create_dir.rs
│   │   │   ├── async_delete.rs
│   │   │   ├── async_list.rs
│   │   │   ├── async_presign.rs
│   │   │   ├── async_read.rs
│   │   │   ├── async_rename.rs
│   │   │   ├── async_stat.rs
│   │   │   ├── async_write.rs
│   │   │   ├── main.rs
│   │   │   ├── README.md
│   │   │   └── utils.rs
│   │   └── data
│   │       ├── normal_dir
│   │       │   └── .gitkeep
│   │       ├── normal_file.txt
│   │       ├── special_dir  !@#$%^&()_+-=;',
│   │       │   └── .gitkeep
│   │       └── special_file  !@#$%^&()_+-=;',.txt
│   ├── upgrade.md
│   └── users.md
├── deny.toml
├── DEPENDENCIES.md
├── dev
│   ├── Cargo.lock
│   ├── Cargo.toml
│   ├── README.md
│   └── src
│       ├── generate
│       │   ├── java.j2
│       │   ├── java.rs
│       │   ├── mod.rs
│       │   ├── parser.rs
│       │   ├── python.j2
│       │   └── python.rs
│       ├── main.rs
│       └── release
│           ├── mod.rs
│           └── package.rs
├── doap.rdf
├── fixtures
│   ├── alluxio
│   │   └── docker-compose-alluxio.yml
│   ├── azblob
│   │   └── docker-compose-azurite.yml
│   ├── data
│   │   ├── normal_dir
│   │   │   └── .gitkeep
│   │   ├── normal_file.txt
│   │   ├── special_dir  !@#$%^&()_+-=;',
│   │   │   └── .gitkeep
│   │   └── special_file  !@#$%^&()_+-=;',.txt
│   ├── etcd
│   │   ├── ca-key.pem
│   │   ├── ca.pem
│   │   ├── client-key.pem
│   │   ├── client.pem
│   │   ├── docker-compose-cluster.yml
│   │   ├── docker-compose-standalone-tls.yml
│   │   ├── docker-compose-standalone.yml
│   │   ├── server-key.pem
│   │   └── server.pem
│   ├── ftp
│   │   └── docker-compose-vsftpd.yml
│   ├── hdfs
│   │   ├── azurite-azblob-core-site.xml
│   │   ├── docker-compose-hdfs-cluster.yml
│   │   ├── gcs-core-site.xml
│   │   ├── hdfs-site.xml
│   │   └── minio-s3-core-site.xml
│   ├── http
│   │   ├── Caddyfile
│   │   ├── docker-compose-caddy.yml
│   │   ├── docker-compose-nginx.yml
│   │   └── nginx.conf
│   ├── libsql
│   │   ├── docker-compose-auth.yml
│   │   └── docker-compose.yml
│   ├── memcached
│   │   ├── docker-compose-memcached-with-auth.yml
│   │   └── docker-compose-memcached.yml
│   ├── mongodb
│   │   ├── docker-compose-basic-auth.yml
│   │   └── docker-compose-no-auth.yml
│   ├── mysql
│   │   ├── docker-compose.yml
│   │   └── init.sql
│   ├── postgresql
│   │   ├── docker-compose.yml
│   │   └── init.sql
│   ├── redis
│   │   ├── docker-compose-dragonfly.yml
│   │   ├── docker-compose-kvrocks.yml
│   │   ├── docker-compose-redis-cluster-tls.yml
│   │   ├── docker-compose-redis-cluster.yml
│   │   ├── docker-compose-redis-tls.yml
│   │   ├── docker-compose-redis.yml
│   │   └── ssl
│   │       ├── .gitignore
│   │       ├── ca.crt
│   │       ├── ca.key
│   │       ├── ca.srl
│   │       ├── README.md
│   │       ├── redis.crt
│   │       ├── redis.key
│   │       └── req.conf
│   ├── s3
│   │   ├── docker-compose-ceph-rados.yml
│   │   └── docker-compose-minio.yml
│   ├── seafile
│   │   └── docker-compose-seafile.yml
│   ├── sftp
│   │   ├── change_root_dir.sh
│   │   ├── docker-compose-sftp-with-default-root.yml
│   │   ├── docker-compose-sftp.yml
│   │   ├── health-check.sh
│   │   ├── test_ssh_key
│   │   └── test_ssh_key.pub
│   ├── sqlite
│   │   └── data.sql
│   ├── swift
│   │   ├── docker-compose-ceph-rados.yml
│   │   └── docker-compose-swift.yml
│   ├── tikv
│   │   ├── gen_cert.sh
│   │   ├── pd-tls.toml
│   │   ├── pd.toml
│   │   ├── ssl
│   │   │   ├── ca-key.pem
│   │   │   ├── ca.pem
│   │   │   ├── client-key.pem
│   │   │   ├── client.pem
│   │   │   ├── pd-server-key.pem
│   │   │   ├── pd-server.pem
│   │   │   ├── tikv-server-key.pem
│   │   │   └── tikv-server.pem
│   │   ├── tikv-tls.toml
│   │   └── tikv.toml
│   ├── webdav
│   │   ├── config
│   │   │   └── nginx
│   │   │       └── http.conf
│   │   ├── docker-compose-webdav-jfrog.yml
│   │   ├── docker-compose-webdav-nextcloud.yml
│   │   ├── docker-compose-webdav-owncloud.yml
│   │   ├── docker-compose-webdav-with-auth.yml
│   │   ├── docker-compose-webdav-with-empty-passwd.yml
│   │   ├── docker-compose-webdav.yml
│   │   └── health-check-nextcloud.sh
│   └── webhdfs
│       └── docker-compose-webhdfs.yml
├── justfile
├── LICENSE
├── licenserc.toml
├── NOTICE
├── README.md
├── rust-toolchain.toml
├── rustfmt.toml
└── scripts
    ├── constants.py
    ├── dependencies.py
    ├── merge_local_staging.py
    ├── README.md
    ├── verify.py
    └── workspace.py
```

# Files

--------------------------------------------------------------------------------
/core/tests/data/normal_dir/.gitkeep:
--------------------------------------------------------------------------------

```
1 | 
```

--------------------------------------------------------------------------------
/core/tests/data/special_dir  !@#$%^&()_+-=;',/.gitkeep:
--------------------------------------------------------------------------------

```
1 | 
```

--------------------------------------------------------------------------------
/fixtures/data/normal_dir/.gitkeep:
--------------------------------------------------------------------------------

```
1 | 
```

--------------------------------------------------------------------------------
/fixtures/data/special_dir  !@#$%^&()_+-=;',/.gitkeep:
--------------------------------------------------------------------------------

```
1 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/.node-version:
--------------------------------------------------------------------------------

```
1 | 18
2 | 
```

--------------------------------------------------------------------------------
/.github/scripts/weekly_update/.python-version:
--------------------------------------------------------------------------------

```
1 | 3.12
2 | 
```

--------------------------------------------------------------------------------
/fixtures/redis/ssl/.gitignore:
--------------------------------------------------------------------------------

```
1 | redis.csr
```

--------------------------------------------------------------------------------
/bindings/nodejs/.npmrc:
--------------------------------------------------------------------------------

```
1 | shell-emulator=true
2 | 
```

--------------------------------------------------------------------------------
/core/edge/s3_read_on_wasm/.gitignore:
--------------------------------------------------------------------------------

```
1 | pkg/
2 | node_modules/
3 | dist/
4 | 
```

--------------------------------------------------------------------------------
/core/fuzz/.gitignore:
--------------------------------------------------------------------------------

```
1 | target
2 | corpus
3 | artifacts
4 | coverage
5 | tmp
```

--------------------------------------------------------------------------------
/bindings/java/.gitignore:
--------------------------------------------------------------------------------

```
1 | bin/
2 | .mvn/wrapper/maven-wrapper.jar
3 | Cargo.lock
4 | .project
5 | .factorypath
6 | *.log
7 | .settings/
8 | .classpath
9 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/.prettierignore:
--------------------------------------------------------------------------------

```
 1 | target
 2 | generated.js
 3 | generated.d.ts
 4 | .yarn
 5 | pnpm-lock.yaml
 6 | .devbox
 7 | devbox.json
 8 | devbox.lock
 9 | theme/dist/index.js
10 | 
```

--------------------------------------------------------------------------------
/.github/scripts/weekly_update/.gitignore:
--------------------------------------------------------------------------------

```
 1 | # Python-generated files
 2 | __pycache__/
 3 | *.py[oc]
 4 | build/
 5 | dist/
 6 | wheels/
 7 | *.egg-info
 8 | .ruff_cache/
 9 | 
10 | # Virtual environments
11 | .venv
12 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/.npmignore:
--------------------------------------------------------------------------------

```
 1 | .npmrc
 2 | target
 3 | Cargo.lock
 4 | .cargo
 5 | .github
 6 | npm
 7 | .eslintrc
 8 | .prettierignore
 9 | rustfmt.toml
10 | yarn.lock
11 | pnpm-lock.yaml
12 | *.node
13 | .yarn
14 | __test__
15 | renovate.json
16 | 
```

--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------

```
 1 | # IDE and editor
 2 | .idea
 3 | .vscode
 4 | !.vscode/settings.json
 5 | **/target
 6 | **/vendor
 7 | dist/
 8 | 
 9 | # env files for backends
10 | .env
11 | 
12 | # profiling
13 | flamegraph.svg
14 | perf.*
15 | 
16 | **/.DS_Store
17 | 
18 | # Yarn Integrity file
19 | .yarn-integrity
20 | 
21 | # Python cache files
22 | **/__pycache__/
23 | 
```

--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------

```
 1 | website export-ignore
 2 | examples export-ignore
 3 | 
 4 | # We will not export unreleased components.
 5 | # If any of these are released, remove the line.
 6 | bin export-ignore
 7 | integrations export-ignore
 8 | 
 9 | bindings/c export-ignore
10 | bindings/cpp export-ignore
11 | bindings/d export-ignore
12 | bindings/dart export-ignore
13 | bindings/dotnet export-ignore
14 | bindings/go export-ignore
15 | bindings/haskell export-ignore
16 | bindings/lua export-ignore
17 | bindings/ocaml export-ignore
18 | bindings/php export-ignore
19 | bindings/ruby export-ignore
20 | bindings/swift export-ignore
21 | bindings/zig export-ignore
22 | 
```

--------------------------------------------------------------------------------
/bindings/python/.gitignore:
--------------------------------------------------------------------------------

```
 1 | /target
 2 | 
 3 | # Byte-compiled / optimized / DLL files
 4 | __pycache__/
 5 | .pytest_cache/
 6 | *.py[cod]
 7 | 
 8 | # C extensions
 9 | *.so
10 | 
11 | # Distribution / packaging
12 | .Python
13 | .venv/
14 | env/
15 | bin/
16 | build/
17 | develop-eggs/
18 | dist/
19 | eggs/
20 | lib/
21 | lib64/
22 | parts/
23 | sdist/
24 | var/
25 | include/
26 | man/
27 | venv/
28 | *.egg-info/
29 | .installed.cfg
30 | *.egg
31 | 
32 | # Installer logs
33 | pip-log.txt
34 | pip-delete-this-directory.txt
35 | pip-selfcheck.json
36 | 
37 | # Unit test / coverage reports
38 | htmlcov/
39 | .tox/
40 | .coverage
41 | .cache
42 | nosetests.xml
43 | coverage.xml
44 | 
45 | # Translations
46 | *.mo
47 | 
48 | # Mr Developer
49 | .mr.developer.cfg
50 | .project
51 | .pydevproject
52 | 
53 | # Rope
54 | .ropeproject
55 | 
56 | # Django stuff:
57 | *.log
58 | *.pot
59 | 
60 | .DS_Store
61 | 
62 | # Sphinx documentation
63 | build/docs
64 | 
65 | # PyCharm
66 | .idea/
67 | 
68 | # VSCode
69 | .vscode/
70 | 
71 | # Pyenv
72 | .python-version
73 | 
74 | # Generated docs
75 | site/
76 | Cargo.lock
77 | 
```

--------------------------------------------------------------------------------
/.yamlfmt:
--------------------------------------------------------------------------------

```
 1 | # Licensed to the Apache Software Foundation (ASF) under one
 2 | # or more contributor license agreements.  See the NOTICE file
 3 | # distributed with this work for additional information
 4 | # regarding copyright ownership.  The ASF licenses this file
 5 | # to you under the Apache License, Version 2.0 (the
 6 | # "License"); you may not use this file except in compliance
 7 | # with the License.  You may obtain a copy of the License at
 8 | #
 9 | #   http://www.apache.org/licenses/LICENSE-2.0
10 | #
11 | # Unless required by applicable law or agreed to in writing,
12 | # software distributed under the License is distributed on an
13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 | # KIND, either express or implied.  See the License for the
15 | # specific language governing permissions and limitations
16 | # under the License.
17 | 
18 | # Configuration reference: https://github.com/google/yamlfmt/blob/main/docs/config-file.md
19 | 
20 | formatter:
21 |   retain_line_breaks: true
22 |   scan_folded_as_literal: true
23 | 
```

--------------------------------------------------------------------------------
/.typos.toml:
--------------------------------------------------------------------------------

```toml
 1 | # Licensed to the Apache Software Foundation (ASF) under one
 2 | # or more contributor license agreements.  See the NOTICE file
 3 | # distributed with this work for additional information
 4 | # regarding copyright ownership.  The ASF licenses this file
 5 | # to you under the Apache License, Version 2.0 (the
 6 | # "License"); you may not use this file except in compliance
 7 | # with the License.  You may obtain a copy of the License at
 8 | #
 9 | #   http://www.apache.org/licenses/LICENSE-2.0
10 | #
11 | # Unless required by applicable law or agreed to in writing,
12 | # software distributed under the License is distributed on an
13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 | # KIND, either express or implied.  See the License for the
15 | # specific language governing permissions and limitations
16 | # under the License.
17 | 
18 | [default.extend-words]
19 | # Random strings.
20 | "Dum" = "Dum"
21 | "Hel" = "Hel"
22 | "ba" = "ba"
23 | "hellow" = "hellow"
24 | # Showed up in examples.
25 | "thw" = "thw"
26 | # Showed up in test.
27 | "hsa" = "hsa"
28 | # Tech words
29 | "WRONLY" = "WRONLY"
30 | "typ" = "typ"
31 | 
32 | [files]
33 | extend-exclude = [
34 |   # Generated SSH Keys.
35 |   "fixtures/sftp/test_ssh_key",
36 |   "fixtures/sftp/test_ssh_key.pub",
37 |   # Generated pnpm locks.
38 |   "website/pnpm-lock.yaml",
39 |   "CHANGELOG.md",
40 |   # dscanner config
41 |   "bindings/d/dscanner.ini",
42 | ]
43 | 
```

--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------

```
 1 | # Licensed to the Apache Software Foundation (ASF) under one
 2 | # or more contributor license agreements.  See the NOTICE file
 3 | # distributed with this work for additional information
 4 | # regarding copyright ownership.  The ASF licenses this file
 5 | # to you under the Apache License, Version 2.0 (the
 6 | # "License"); you may not use this file except in compliance
 7 | # with the License.  You may obtain a copy of the License at
 8 | #
 9 | #   http://www.apache.org/licenses/LICENSE-2.0
10 | #
11 | # Unless required by applicable law or agreed to in writing,
12 | # software distributed under the License is distributed on an
13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 | # KIND, either express or implied.  See the License for the
15 | # specific language governing permissions and limitations
16 | # under the License.
17 | 
18 | # EditorConfig helps developers define and maintain consistent
19 | # coding styles between different editors and IDEs
20 | # editorconfig.org
21 | 
22 | root = true
23 | 
24 | [*]
25 | end_of_line = lf
26 | charset = utf-8
27 | trim_trailing_whitespace = true
28 | insert_final_newline = true
29 | indent_style = space
30 | indent_size = 4
31 | 
32 | [*.css]
33 | indent_size = 2
34 | 
35 | [*.go]
36 | indent_style = tab
37 | 
38 | [*.html]
39 | indent_size = 2
40 | 
41 | [*.json]
42 | indent_size = 2
43 | 
44 | [*.md]
45 | # double whitespace at end of line
46 | # denotes a line break in Markdown
47 | trim_trailing_whitespace = false
48 | indent_size = 2
49 | 
50 | [*.{mjs,js,jsx}]
51 | indent_size = 2
52 | 
53 | [*.rdf]
54 | indent_size = 2
55 | 
56 | [*.toml]
57 | indent_size = 2
58 | 
59 | [*.{ts,tsx}]
60 | indent_size = 2
61 | 
62 | [*.{yaml,yml}]
63 | indent_size = 2
64 | 
65 | [*.rb]
66 | indent_size = 2
67 | 
```

--------------------------------------------------------------------------------
/.asf.yaml:
--------------------------------------------------------------------------------

```yaml
 1 | # Licensed to the Apache Software Foundation (ASF) under one
 2 | # or more contributor license agreements.  See the NOTICE file
 3 | # distributed with this work for additional information
 4 | # regarding copyright ownership.  The ASF licenses this file
 5 | # to you under the Apache License, Version 2.0 (the
 6 | # "License"); you may not use this file except in compliance
 7 | # with the License.  You may obtain a copy of the License at
 8 | #
 9 | #   http://www.apache.org/licenses/LICENSE-2.0
10 | #
11 | # Unless required by applicable law or agreed to in writing,
12 | # software distributed under the License is distributed on an
13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 | # KIND, either express or implied.  See the License for the
15 | # specific language governing permissions and limitations
16 | # under the License.
17 | 
18 | # All configurations could be found here: https://github.com/apache/infrastructure-asfyaml/
19 | 
20 | github:
21 |   description: "Apache OpenDAL: One Layer, All Storage."
22 |   homepage: https://opendal.apache.org
23 |   labels:
24 |     - rust
25 |     - storage
26 |     - s3
27 |     - gcs
28 |     - azblob
29 |     - redis
30 |     - hacktoberfest
31 |   enabled_merge_buttons:
32 |     squash: true
33 |     merge: false
34 |     rebase: false
35 |   pull_requests:
36 |     allow_auto_merge: true
37 |     allow_update_branch: true
38 |     del_branch_on_merge: true
39 |   protected_branches:
40 |     main:
41 |       required_pull_request_reviews:
42 |         required_approving_review_count: 1
43 |   custom_subjects:
44 |     new_discussion: "{title}"
45 |     edit_discussion: "Re: {title}"
46 |     close_discussion: "Re: {title}"
47 |     close_discussion_with_comment: "Re: {title}"
48 |     reopen_discussion: "Re: {title}"
49 |     new_comment_discussion: "Re: {title}"
50 |     edit_comment_discussion: "Re: {title}"
51 |     delete_comment_discussion: "Re: {title}"
52 | 
53 | notifications:
54 |   commits: [email protected]
55 |   issues: [email protected]
56 |   pullrequests: [email protected]
57 |   discussions: [email protected]
58 | 
59 | staging:
60 |   profile: ~
61 |   autostage: site/*
62 | 
63 | publish:
64 |   whoami: gh-pages
65 | 
```

--------------------------------------------------------------------------------
/.taplo.toml:
--------------------------------------------------------------------------------

```toml
 1 | # Licensed to the Apache Software Foundation (ASF) under one
 2 | # or more contributor license agreements.  See the NOTICE file
 3 | # distributed with this work for additional information
 4 | # regarding copyright ownership.  The ASF licenses this file
 5 | # to you under the Apache License, Version 2.0 (the
 6 | # "License"); you may not use this file except in compliance
 7 | # with the License.  You may obtain a copy of the License at
 8 | #
 9 | #   http://www.apache.org/licenses/LICENSE-2.0
10 | #
11 | # Unless required by applicable law or agreed to in writing,
12 | # software distributed under the License is distributed on an
13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 | # KIND, either express or implied.  See the License for the
15 | # specific language governing permissions and limitations
16 | # under the License.
17 | 
18 | include = ["Cargo.toml", "**/*.toml"]
19 | 
20 | [formatting]
21 | # Align consecutive entries vertically.
22 | align_entries = false
23 | # Append trailing commas for multi-line arrays.
24 | array_trailing_comma = true
25 | # Expand arrays to multiple lines that exceed the maximum column width.
26 | array_auto_expand = true
27 | # Collapse arrays that don't exceed the maximum column width and don't contain comments.
28 | array_auto_collapse = true
29 | # Omit white space padding from single-line arrays
30 | compact_arrays = true
31 | # Omit white space padding from the start and end of inline tables.
32 | compact_inline_tables = false
33 | # Maximum column width in characters, affects array expansion and collapse, this doesn't take whitespace into account.
34 | # Note that this is not set in stone, and works on a best-effort basis.
35 | column_width = 80
36 | # Indent based on tables and arrays of tables and their subtables, subtables out of order are not indented.
37 | indent_tables = false
38 | # The substring that is used for indentation, should be tabs or spaces (but technically can be anything).
39 | indent_string = '  '
40 | # Add trailing newline at the end of the file if not present.
41 | trailing_newline = true
42 | # Alphabetically reorder keys that are not separated by empty lines.
43 | reorder_keys = true
44 | # Maximum amount of allowed consecutive blank lines. This does not affect the whitespace at the end of the document, as it is always stripped.
45 | allowed_blank_lines = 1
46 | # Use CRLF for line endings.
47 | crlf = false
48 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/.gitignore:
--------------------------------------------------------------------------------

```
  1 | # Created by https://www.toptal.com/developers/gitignore/api/node
  2 | # Edit at https://www.toptal.com/developers/gitignore?templates=node
  3 | 
  4 | ### Node ###
  5 | # Logs
  6 | logs
  7 | *.log
  8 | npm-debug.log*
  9 | yarn-debug.log*
 10 | yarn-error.log*
 11 | lerna-debug.log*
 12 | deno.lock
 13 | 
 14 | # Diagnostic reports (https://nodejs.org/api/report.html)
 15 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
 16 | 
 17 | # Runtime data
 18 | pids
 19 | *.pid
 20 | *.seed
 21 | *.pid.lock
 22 | 
 23 | # Directory for instrumented libs generated by jscoverage/JSCover
 24 | lib-cov
 25 | 
 26 | # Coverage directory used by tools like istanbul
 27 | coverage
 28 | *.lcov
 29 | 
 30 | # nyc test coverage
 31 | .nyc_output
 32 | 
 33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
 34 | .grunt
 35 | 
 36 | # Bower dependency directory (https://bower.io/)
 37 | bower_components
 38 | 
 39 | # node-waf configuration
 40 | .lock-wscript
 41 | 
 42 | # Compiled binary addons (https://nodejs.org/api/addons.html)
 43 | build/Release
 44 | 
 45 | # Dependency directories
 46 | node_modules/
 47 | jspm_packages/
 48 | 
 49 | # TypeScript v1 declaration files
 50 | typings/
 51 | 
 52 | # TypeScript cache
 53 | *.tsbuildinfo
 54 | 
 55 | # Optional npm cache directory
 56 | .npm
 57 | 
 58 | # Optional eslint cache
 59 | .eslintcache
 60 | 
 61 | # Microbundle cache
 62 | .rpt2_cache/
 63 | .rts2_cache_cjs/
 64 | .rts2_cache_es/
 65 | .rts2_cache_umd/
 66 | 
 67 | # Optional REPL history
 68 | .node_repl_history
 69 | 
 70 | # Output of 'npm pack'
 71 | *.tgz
 72 | 
 73 | # Yarn Integrity file
 74 | .yarn-integrity
 75 | 
 76 | # dotenv environment variables file
 77 | .env
 78 | .env.test
 79 | 
 80 | # parcel-bundler cache (https://parceljs.org/)
 81 | .cache
 82 | 
 83 | # Next.js build output
 84 | .next
 85 | 
 86 | # Nuxt.js build / generate output
 87 | .nuxt
 88 | dist
 89 | 
 90 | # Gatsby files
 91 | .cache/
 92 | # Comment in the public line in if your project uses Gatsby and not Next.js
 93 | # https://nextjs.org/blog/next-9-1#public-directory-support
 94 | # public
 95 | 
 96 | # vuepress build output
 97 | .vuepress/dist
 98 | 
 99 | # Serverless directories
100 | .serverless/
101 | 
102 | # FuseBox cache
103 | .fusebox/
104 | 
105 | # DynamoDB Local files
106 | .dynamodb/
107 | 
108 | # TernJS port file
109 | .tern-port
110 | 
111 | # Stores VSCode versions used for testing VSCode extensions
112 | .vscode-test
113 | 
114 | # End of https://www.toptal.com/developers/gitignore/api/node
115 | 
116 | # Created by https://www.toptal.com/developers/gitignore/api/macos
117 | # Edit at https://www.toptal.com/developers/gitignore?templates=macos
118 | 
119 | ### macOS ###
120 | # General
121 | .DS_Store
122 | .AppleDouble
123 | .LSOverride
124 | 
125 | # Icon must end with two
126 | Icon
127 | 
128 | 
129 | # Thumbnails
130 | ._*
131 | 
132 | # Files that might appear in the root of a volume
133 | .DocumentRevisions-V100
134 | .fseventsd
135 | .Spotlight-V100
136 | .TemporaryItems
137 | .Trashes
138 | .VolumeIcon.icns
139 | .com.apple.timemachine.donotpresent
140 | 
141 | # Directories potentially created on remote AFP share
142 | .AppleDB
143 | .AppleDesktop
144 | Network Trash Folder
145 | Temporary Items
146 | .apdisk
147 | 
148 | ### macOS Patch ###
149 | # iCloud generated files
150 | *.icloud
151 | 
152 | # End of https://www.toptal.com/developers/gitignore/api/macos
153 | 
154 | # Created by https://www.toptal.com/developers/gitignore/api/windows
155 | # Edit at https://www.toptal.com/developers/gitignore?templates=windows
156 | 
157 | ### Windows ###
158 | # Windows thumbnail cache files
159 | Thumbs.db
160 | Thumbs.db:encryptable
161 | ehthumbs.db
162 | ehthumbs_vista.db
163 | 
164 | # Dump file
165 | *.stackdump
166 | 
167 | # Folder config file
168 | [Dd]esktop.ini
169 | 
170 | # Recycle Bin used on file shares
171 | $RECYCLE.BIN/
172 | 
173 | # Windows Installer files
174 | *.cab
175 | *.msi
176 | *.msix
177 | *.msm
178 | *.msp
179 | 
180 | # Windows shortcuts
181 | *.lnk
182 | 
183 | # End of https://www.toptal.com/developers/gitignore/api/windows
184 | 
185 | #Added by cargo
186 | 
187 | /target
188 | Cargo.lock
189 | 
190 | .pnp.*
191 | .yarn
192 | *.node
193 | docs/
194 | 
```

--------------------------------------------------------------------------------
/.env.example:
--------------------------------------------------------------------------------

```
  1 | # memory
  2 | # fs
  3 | OPENDAL_FS_ROOT=/path/to/dir
  4 | OPENDAL_FS_ATOMIC_WRITE_DIR=/path/to/tempdir
  5 | # cos
  6 | OPENDAL_COS_BUCKET=opendal-testing-1318209832
  7 | OPENDAL_COS_ENDPOINT=https://cos.ap-singapore.myqcloud.com
  8 | OPENDAL_COS_SECRET_ID=<secret_id>
  9 | OPENDAL_COS_SECRET_KEY=<secret_key>
 10 | # s3
 11 | OPENDAL_S3_BUCKET=<bucket>
 12 | OPENDAL_S3_ENDPOINT=<endpoint>
 13 | OPENDAL_S3_REGION=<region>
 14 | OPENDAL_S3_ACCESS_KEY_ID=<access_key_id>
 15 | OPENDAL_S3_SECRET_ACCESS_KEY=<secret_access_key>
 16 | # azblob
 17 | OPENDAL_AZBLOB_ROOT=/path/to/dir
 18 | OPENDAL_AZBLOB_CONTAINER=<container>
 19 | OPENDAL_AZBLOB_ENDPOINT=<endpoint>
 20 | OPENDAL_AZBLOB_ACCOUNT_NAME=<account_name>
 21 | OPENDAL_AZBLOB_ACCOUNT_KEY=<account_key>
 22 | # hdfs
 23 | OPENDAL_HDFS_ROOT=/path/to/dir
 24 | OPENDAL_HDFS_NAME_NODE=<name_node>
 25 | OPENDAL_HDFS_ENABLE_APPEND=true
 26 | # hdfs-native
 27 | OPENDAL_HDFS_NATIVE_ROOT=/path/to/dir
 28 | OPENDAL_HDFS_NATIVE_NAME_NODE=<name_node>
 29 | OPENDAL_HDFS_NATIVE_ENABLE_APPEND=true
 30 | # gcs
 31 | OPENDAL_GCS_ROOT=/path/to/dir
 32 | OPENDAL_GCS_BUCKET=<bucket>
 33 | OPENDAL_GCS_CREDENTIAL=<base64_content>
 34 | # obs
 35 | OPENDAL_OBS_BUCKET=<bucket>
 36 | OPENDAL_OBS_ENDPOINT=<endpoint>
 37 | OPENDAL_OBS_ACCESS_KEY_ID=<access_key_id>
 38 | OPENDAL_OBS_SECRET_ACCESS_KEY=<secret_access_key>
 39 | # oss
 40 | OPENDAL_OSS_BUCKET=<bucket>
 41 | OPENDAL_OSS_ENDPOINT=<endpoint>
 42 | OPENDAL_OSS_ACCESS_KEY_ID=<access_key_id>
 43 | OPENDAL_OSS_ACCESS_KEY_SECRET=<access_key_secret>
 44 | # ipmfs
 45 | OPENDAL_IPMFS_ROOT=/path/to/dir
 46 | OPENDAL_IPMFS_ENDPOINT=http://localhost:5001
 47 | # ftp
 48 | OPENDAL_FTP_ENDPOINT=ftp://<endpoint>
 49 | OPENDAL_FTP_ROOT=/path/to/dir
 50 | OPENDAL_FTP_USER=<user>
 51 | OPENDAL_FTP_PASSWORD=<password>
 52 | # ipfs
 53 | OPENDAL_IPFS_ROOT=/ipfs/Qmxxxxxxxx
 54 | OPENDAL_IPFS_ENDPOINT=http://localhost:8080
 55 | # redis
 56 | OPENDAL_REDIS_ENDPOINT=tcp://127.0.0.1:6379
 57 | # OPENDAL_REDIS_CLUSTER_ENDPOINTS=rediss://127.0.0.1:6380,rediss://127.0.0.1:6381,rediss://127.0.0.1:6382,rediss://127.0.0.1:6383,rediss://127.0.0.1:6384,rediss://127.0.0.1:6385
 58 | OPENDAL_REDIS_ROOT=/
 59 | OPENDAL_REDIS_DB=0
 60 | # rocksdb
 61 | OPENDAL_ROCKSDB_DATADIR=/path/to/database
 62 | OPENDAL_ROCKSDB_ROOT=/path/to/root
 63 | # sftp
 64 | OPENDAL_SFTP_ENDPOINT=ssh://<endpoint>
 65 | OPENDAL_SFTP_ROOT=/path/to/dir
 66 | OPENDAL_SFTP_USER=<user>
 67 | OPENDAL_SFTP_KEY=<key_path>
 68 | OPENDAL_SFTP_KNOWN_HOSTS_STRATEGY=<accept|add|strict>
 69 | # sled
 70 | OPENDAL_SLED_DATADIR=/path/to/database
 71 | OPENDAL_SLED_TREE=sled-tree
 72 | # mini-moka
 73 | # moka
 74 | # ghac
 75 | # memcached
 76 | OPENDAL_MEMCACHED_ENDPOINT=tcp://127.0.0.1:11211
 77 | OPENDAL_MEMCACHED_ROOT=/
 78 | # webdav
 79 | OPENDAL_WEBDAV_ROOT=/tmp/opendal/
 80 | OPENDAL_WEBDAV_ENDPOINT=http://127.0.0.1:8080
 81 | # webhfds
 82 | OPENDAL_WEBHDFS_ROOT=/tmp/opendal/
 83 | OPENDAL_WEBHDFS_ENDPOINT=http://127.0.0.1:9870
 84 | OPENDAL_WEBHDFS_DELEGATION=<delegation>
 85 | OPENDAL_WEBHDFS_ATOMIC_WRITE_DIR=.opendal_tmp/
 86 | OPENDAL_WEBHDFS_DISABLE_LIST_BATCH=false
 87 | # vercel artifacts
 88 | OPENDAL_VERCEL_ARTIFACTS_ACCESS_TOKEN=<token>
 89 | # onedrive
 90 | OPENDAL_ONEDRIVE_ACCESS_TOKEN=<access_token>
 91 | # foundationdb
 92 | OPENDAL_FOUNDATIONDB_ROOT=/path/to/dir
 93 | OPENDAL_FOUNDATIONDB_CONFIG_PATH=/tmp/opendal/foundationdb.conf
 94 | # redb
 95 | OPENDAL_REDB_DATADIR=/tmp/redb
 96 | OPENDAL_REDB_TABLE=redb-table
 97 | # cacache
 98 | OPENDAL_CACACHE_DATADIR=/tmp/opendal/cacache/
 99 | # persy
100 | OPENDAL_PERSY_DATAFILE=/tmp/opendal/test.persy
101 | OPENDAL_PERSY_SEGMENT=data
102 | OPENDAL_PERSY_INDEX=index
103 | #dropbox
104 | OPENDAL_DROPBOX_ROOT=/tmp/opendal/
105 | OPENDAL_DROPBOX_ACCESS_TOKEN=<access_token>
106 | OPENDAL_DROPBOX_REFRESH_TOKEN=<refresh_token>
107 | OPENDAL_DROPBOX_CLIENT_ID=<client_id>
108 | OPENDAL_DROPBOX_CLIENT_SECRET=<client_secret>
109 | # etcd
110 | OPENDAL_ETCD_ENDPOINTS=127.0.0.1:2379
111 | OPENDAL_ETCD_ROOT=/tmp/opendal/
112 | OPENDAL_ETCD_USERNAME=<username>
113 | OPENDAL_ETCD_PASSWORD=<password>
114 | OPENDAL_ETCD_CA_PATH=<ca_path>
115 | OPENDAL_ETCD_CERT_PATH=<cert_path>
116 | OPENDAL_ETCD_KEY_PATH=<key_path>
117 | # google drive
118 | OPENDAL_GDRIVE_ROOT=/tmp/opendal/
119 | OPENDAL_GDRIVE_ACCESS_TOKEN=<access_token>
120 | OPENDAL_GDRIVE_REFRESH_TOKEN=<refresh_token>
121 | OPENDAL_GDRIVE_CLIENT_ID=<client_id>
122 | OPENDAL_GDRIVE_CLIENT_SECRET=<client_secret>
123 | # sqlite
124 | OPENDAL_SQLITE_CONNECTION_STRING=file:///tmp/opendal/test.db
125 | OPENDAL_SQLITE_TABLE=data
126 | OPENDAL_SQLITE_KEY_FIELD=key
127 | OPENDAL_SQLITE_VALUE_FIELD=data
128 | # d1
129 | OPENDAL_D1_TOKEN=<token>
130 | OPENDAL_D1_ACCOUNT_ID=<account_id>
131 | OPENDAL_D1_DATABASE_ID=<database_id>
132 | OPENDAL_D1_TABLE=<table>
133 | OPENDAL_D1_KEY_FIELD=<key_field>
134 | OPENDAL_D1_VALUE_FIELD=<value_field>
135 | # azfile
136 | OPENDAL_AZFILE_ENDPOINT=<endpoint>
137 | OPENDAL_AZFILE_ROOT=/tmp/opendal/
138 | OPENDAL_AZFILE_ACCOUNT_NAME=<account_name>
139 | OPENDAL_AZFILE_ACCOUNT_KEY=<account_key>
140 | OPENDAL_AZFILE_SHARE_NAME=<shared_name>
141 | # openstack swift
142 | OPENDAL_SWIFT_ENDPOINT=<endpoint>
143 | OPENDAL_SWIFT_CONTAINER=<container>
144 | OPENDAL_SWIFT_ROOT=/path/to/dir
145 | OPENDAL_SWIFT_TOKEN=<token>
146 | # gridfs
147 | OPENDAL_GRIDFS_CONNECTION_STRING=mongodb://localhost:27017
148 | OPENDAL_GRIDFS_DATABASE=<database>
149 | OPENDAL_GRIDFS_BUCKET=<fs>
150 | OPENDAL_GRIDFS_CHUNK_SIZE=<chunk_size>
151 | # alluxio
152 | OPENDAL_ALLUXIO_ENDPOINT=<endpoint>
153 | OPENDAL_ALLUXIO_ROOT=/path/to/dor
154 | # b2
155 | OPENDAL_B2_ROOT=/path/to/dir
156 | OPENDAL_B2_BUCKET=<bucket>
157 | OPENDAL_B2_BUCKET_ID=<bucket_id>
158 | OPENDAL_B2_APPLICATION_KEY_ID=<key_id>
159 | OPENDAL_B2_APPLICATION_KEY=<application_key>
160 | # huggingface
161 | OPENDAL_HUGGINGFACE_REPO_TYPE=dataset
162 | OPENDAL_HUGGINGFACE_REPO_ID=opendal/huggingface-testdata
163 | OPENDAL_HUGGINGFACE_REVISION=main
164 | OPENDAL_HUGGINGFACE_ROOT=/testdata/
165 | # seafile
166 | OPENDAL_SEAFILE_ROOT=/path/to/dir
167 | OPENDAL_SEAFILE_ENDPOINT=<endpoint>
168 | OPENDAL_SEAFILE_USERNAME=<usernmae>
169 | OPENDAL_SEAFILE_PASSWORD=<password>
170 | OPENDAL_SEAFILE_REPO_NAME=<repo_name>
171 | # upyun
172 | OPENDAL_UPYUN_ROOT=/path/to/dir
173 | OPENDAL_UPYUN_BUCKET=<bucket>
174 | OPENDAL_UPYUN_OPERATOR=<operator>
175 | OPENDAL_UPYUN_PASSWORD=<password>
176 | # pcloud
177 | OPENDAL_PCLOUD_ROOT=/path/to/dir
178 | OPENDAL_PCLOUD_ENDPOINT=<endpoint>
179 | OPENDAL_PCLOUD_USERNAME=<username>
180 | OPENDAL_PCLOUD_PASSWORD=<password>
181 | # yandex-disk
182 | OPENDAL_YANDEX_DISK_ROOT=/path/to/dir
183 | OPENDAL_YANDEX_DISK_ACCESS_TOKEN=<access_token>
184 | # koofr
185 | OPENDAL_KOOFR_ROOT=/path/to/dir
186 | OPENDAL_KOOFR_ENDPOINT=<endpoint>
187 | OPENDAL_KOOFR_EMAIL=<email>
188 | OPENDAL_KOOFR_PASSWORD=<password>
189 | # vercel blob
190 | OPENDAL_VERCEL_BLOB_ROOT=/path/to/dir
191 | OPENDAL_VERCEL_BLOB_TOKEN=<token>
192 | # aliyun drive
193 | OPENDAL_ALIYUN_DRIVE_ROOT=/path/to/dir
194 | OPENDAL_ALIYUN_DRIVE_REFRESH_TOKEN=<refresh_token>
195 | OPENDAL_ALIYUN_DRIVE_CLIENT_ID=<client_id>
196 | OPENDAL_ALIYUN_DRIVE_CLIENT_SECRET=<client_secret>
197 | # cloudflare
198 | OPENDAL_CLOUDFLARE_KV_ROOT=/path/to/dir
199 | OPENDAL_CLOUDFLARE_KV_API_TOKEN=<api_token>
200 | OPENDAL_CLOUDFLARE_KV_ACCOUNT_ID=<account_id>
201 | OPENDAL_CLOUDFLARE_KV_NAMESPACE_ID=<namespace_id>
202 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/npm/darwin-x64/README.md:
--------------------------------------------------------------------------------

```markdown
1 | # `@opendal/lib-darwin-x64`
2 | 
3 | This is the **x86_64-apple-darwin** binary for `opendal`
4 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/npm/darwin-arm64/README.md:
--------------------------------------------------------------------------------

```markdown
1 | # `@opendal/lib-darwin-arm64`
2 | 
3 | This is the **aarch64-apple-darwin** binary for `opendal`
4 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/npm/win32-x64-msvc/README.md:
--------------------------------------------------------------------------------

```markdown
1 | # `@opendal/lib-win32-x64-msvc`
2 | 
3 | This is the **x86_64-pc-windows-msvc** binary for `opendal`
4 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/npm/linux-x64-gnu/README.md:
--------------------------------------------------------------------------------

```markdown
1 | # `@opendal/lib-linux-x64-gnu`
2 | 
3 | This is the **x86_64-unknown-linux-gnu** binary for `opendal`
4 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/npm/linux-x64-musl/README.md:
--------------------------------------------------------------------------------

```markdown
1 | # `@opendal/lib-linux-x64-musl`
2 | 
3 | This is the **x86_64-unknown-linux-musl** binary for `opendal`
4 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/npm/win32-arm64-msvc/README.md:
--------------------------------------------------------------------------------

```markdown
1 | # `@opendal/lib-win32-arm64-msvc`
2 | 
3 | This is the **aarch64-pc-windows-msvc** binary for `opendal`
4 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/npm/linux-arm64-gnu/README.md:
--------------------------------------------------------------------------------

```markdown
1 | # `@opendal/lib-linux-arm64-gnu`
2 | 
3 | This is the **aarch64-unknown-linux-gnu** binary for `opendal`
4 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/npm/linux-arm64-musl/README.md:
--------------------------------------------------------------------------------

```markdown
1 | # `@opendal/lib-linux-arm64-musl`
2 | 
3 | This is the **aarch64-unknown-linux-musl** binary for `opendal`
4 | 
```

--------------------------------------------------------------------------------
/core/edge/README.md:
--------------------------------------------------------------------------------

```markdown
1 | # OpenDAL Edge Tests
2 | 
3 | OpenDAL edge tests served as edge tests for the OpenDAL project. They will have pre-set data and will test the functionality of the OpenDAL project.
4 | 
```

--------------------------------------------------------------------------------
/.github/scripts/weekly_update/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | ## OpenDAL Weekly Update
 2 | 
 3 | ```shell
 4 | uv run -s main.py apache/opendal --output weekly_update.md
 5 | ```
 6 | 
 7 | Available options:
 8 | 
 9 | - `GITHUB_TOKEN`
10 | - `OPENAI_API_KEY`
11 | - `OPENAI_API_BASE`
12 | - `OPENAI_MODEL`
13 | 
```

--------------------------------------------------------------------------------
/core/benches/types/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Types Benchmark Tests
 2 | 
 3 | This benchmark contains performance testing of critical data structures in opendal types, currently including performance testing of Buffer.
 4 | 
 5 | ## Run
 6 | 
 7 | ```shell
 8 | cargo bench types --features tests
 9 | ```
10 | 
```

--------------------------------------------------------------------------------
/dev/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Apache OpenDAL™ Dev
 2 | 
 3 | This project is designed to provide dev tools for the entire opendal project.
 4 | 
 5 | ## Usage
 6 | 
 7 | List all available recipes:
 8 | 
 9 | ```bash
10 | just --list
11 | ```
12 | 
13 | ## Recipes
14 | 
15 | ### Generate
16 | 
17 | Generate code for OpenDAL services.
18 | 
19 | ```bash
20 | just generate python
21 | ```
22 | 
```

--------------------------------------------------------------------------------
/core/edge/file_write_on_full_disk/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # File Write on Fill Disk
 2 | 
 3 | Reported by [The `FsBackend` only writes partial bytes and doesn't raise any errors](https://github.com/apache/opendal/issues/3052).
 4 | 
 5 | Setup:
 6 | 
 7 | ```shell
 8 | fallocate -l 512K disk.img 
 9 | mkfs disk.img 
10 | mkdir ./td
11 | sudo mount -o loop td.img ./td
12 | chmod a+wr ./td
13 | ```
14 | 
15 | 
```

--------------------------------------------------------------------------------
/core/benches/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # OpenDAL Benchmarks
 2 | 
 3 | Running benchmark
 4 | 
 5 | ```shell
 6 | OPENDAL_TEST=memory cargo bench
 7 | ```
 8 | 
 9 | Build flamegraph:
10 | 
11 | ```shell
12 | cargo flamegraph --bench io -- seek --bench
13 | ```
14 | 
15 | - `--bench io` pick the `io` target.
16 | - `-- seek --bench`: chose the benches with `seek` and `--bench` is required by `criterion`
17 | 
18 | After `flamegraph.svg` has been generated, use browser to visit it.
19 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/benchmark/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # OpenDAL Node.js Bindings Benchmark
 2 | 
 3 | This benchmark is test against the opendal and aws js sdk.
 4 | 
 5 | To run the benchmark, please make sure the following env have been set correctly.
 6 | 
 7 | - AWS_S3_ENDPOINT: the endpoint of the s3 service
 8 | - AWS_S3_REGION: the region of the s3 service
 9 | - AWS_ACCESS_KEY_ID: the access key of the s3 service
10 | - AWS_SECRET_ACCESS_KEY: the secret key of the s3 service
11 | - AWS_BUCKET: the bucket name of the s3 service
12 | 
13 | To run the benchmark:
14 | 
15 | ```shell
16 | pnpm bench
17 | ```
18 | 
```

--------------------------------------------------------------------------------
/core/edge/s3_aws_assume_role_with_web_identity/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # S3 AWS Assume Role With Web Identity
 2 | 
 3 | This edge test case is for AWS s3 services that authed by `Assume Role With Web Identity`.
 4 | 
 5 | For setup, please configure bucket and OIDC correctly, for example:
 6 | 
 7 | ```yaml
 8 | - uses: actions/github-script@v7
 9 |   id: id-token
10 |   with:
11 |     script: return await core.getIDToken("sts.amazonaws.com")
12 |     result-encoding: string
13 | - name: Write ID token to file
14 |   run: echo "${{ steps.id-token.outputs.result }}" > core/tests/data/web_identity_token
15 | ```
16 | 
17 | And configure `AWS_WEB_IDENTITY_TOKEN_FILE` and `AWS_ROLE_ARN`.
18 | 
19 | 
```

--------------------------------------------------------------------------------
/core/benches/ops/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Ops Benchmark Tests
 2 | 
 3 | Ops Benchmark Tests measure every operation's performance on the target platform.
 4 | 
 5 | To support benching different backends simultaneously, we use `environment value` to carry the backend config.
 6 | 
 7 | ## Setup
 8 | 
 9 | Please copy `.env.example` to `.env` and change the values on need.
10 | 
11 | Take `fs` for example, we add config on `fs` on `/tmp`.
12 | 
13 | ```dotenv
14 | OPENDAL_FS_ROOT=/tmp
15 | ```
16 | 
17 | Notice: The default will skip benches if the env is not set.
18 | 
19 | ## Run
20 | 
21 | Test specific backend, take s3 for example, first set the corresponding environment variables of s3, then:
22 | 
23 | ```shell
24 | OPENDAL_TEST=s3
25 | cargo bench ops --features tests
26 | ```
27 | 
```

--------------------------------------------------------------------------------
/core/edge/s3_read_on_wasm/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # S3 Read on WASM
 2 | 
 3 | This test is used to ensure opendal can run on WASM target.
 4 | 
 5 | ## Setup
 6 | 
 7 | Start the S3 server at `http://127.0.0.1:9900`
 8 | 
 9 | We are using the following config values, please feel free to change based on your own needs.
10 | 
11 | ```rust
12 | let mut cfg = S3::default();
13 | cfg.endpoint("http://127.0.0.1:9900");
14 | cfg.access_key_id("minioadmin");
15 | cfg.secret_access_key("minioadmin");
16 | cfg.bucket("opendal");
17 | cfg.region("us-east-1");
18 | ```
19 | 
20 | ## Install
21 | 
22 | ```shell
23 | cargo install wasm-pack
24 | ```
25 | 
26 | ## Build
27 | 
28 | ```shell
29 | wasm-pack build
30 | ```
31 | 
32 | ## Test
33 | 
34 | NOTE: 
35 | 
36 | - You need to have Chrome installed.
37 | - We can't run on node.js yet.
38 | - We can't run on headless chrome yet.
39 | 
40 | ```shell
41 | wasm-pack test --chrome
42 | ```
43 | 
```

--------------------------------------------------------------------------------
/bindings/python/benchmark/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # OpenDAL Python Bindings Benchmark
 2 | 
 3 | This benchmark is test against the opendal and aws python sdk.
 4 | 
 5 | To run the benchmark, please make sure the following env have been set correctly.
 6 | 
 7 | - AWS_REGION: the region of the s3 service
 8 | - AWS_ENDPOINT: the endpoint of the s3 service
 9 | - AWS_ACCESS_KEY_ID: the access key of the s3 service
10 | - AWS_SECRET_ACCESS_KEY: the secret key of the s3 service
11 | - AWS_S3_BUCKET: the bucket name of the s3 service
12 | 
13 | To run the benchmark:
14 | 
15 | ```shell
16 | maturin develop -r -E=benchmark
17 | 
18 | export AWS_ENDPOINT=http://127.0.0.1:9000
19 | export AWS_REGION=us-east-1
20 | export AWS_ACCESS_KEY_ID=minioadmin
21 | export AWS_SECRET_ACCESS_KEY=minioadmin
22 | export AWS_S3_BUCKET=opendal
23 | 
24 | uv run async_opendal_benchmark.py
25 | uv run async_origin_s3_benchmark_with_gevent.py
26 | ```
27 | 
```

--------------------------------------------------------------------------------
/fixtures/redis/ssl/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Key Maintenance
 2 | 
 3 | ## Check Cert
 4 | 
 5 | ```shell
 6 | openssl x509 -in ca.crt -text -noout
 7 | ```
 8 | 
 9 | ## Generate a new CA Cert
10 | 
11 | ```shell
12 | # Generate a new CA key
13 | openssl genrsa -out ca.key 2048
14 | 
15 | # Generate a new CA cert which valid for 100 years
16 | openssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.crt -subj "/C=US/O=Apache OpenDAL Service Test Redis/CN=redis.test.service.opendal.apache.org"
17 | 
18 | # Check the cert
19 | openssl x509 -in ca.crt -text -noout
20 | ```
21 | 
22 | ## Generate a new Peer Cert
23 | 
24 | ```shell
25 | # Generate a new perr key
26 | openssl genrsa -out redis.key 2048
27 | 
28 | # Generate a new CSR
29 | openssl req -new -key redis.key -out redis.csr -config req.conf
30 | 
31 | # Use CA Cert to sign the CSR
32 | openssl x509 -req -in redis.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out redis.crt -days 36500 -sha256 -extfile req.conf -extensions v3_ca
33 | 
34 | # Check the cert
35 | openssl x509 -in redis.crt -text -noout
36 | ```
37 | 
```

--------------------------------------------------------------------------------
/core/benches/vs_fs/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # OpenDAL Benchmark VS Fs
 2 | 
 3 | This benchmark compares the performance of OpenDAL with the performance of the `std::fs`.
 4 | 
 5 | ## Goal
 6 | 
 7 | We expect OpenDAL to match `std::fs` in speed: the throughput of OpenDAL should be within a `5%` range of `std::fs`.
 8 | 
 9 | ## Usage
10 | 
11 | For test: `cargo run`
12 | 
13 | ```shell
14 | Testing vs_fs/std_fs_read
15 | Success
16 | Testing vs_fs/opendal_fs_read
17 | Success
18 | Testing vs_fs/opendal_fs_read_with_range
19 | Success
20 | ```
21 | 
22 | For bench: `cargo run --release -- --bench`
23 | 
24 | ```shell
25 | read/std_fs       time:   [749.57 µs 762.69 µs 777.07 µs]
26 |                   thrpt:  [20.108 GiB/s 20.487 GiB/s 20.845 GiB/s]
27 |                         
28 | read/opendal_fs   time:   [750.90 µs 755.39 µs 760.49 µs]
29 |                   thrpt:  [20.546 GiB/s 20.685 GiB/s 20.808 GiB/s]
30 |                         
31 | read/opendal_fs_with_range
32 |                   time:   [684.02 µs 690.77 µs 697.99 µs]
33 |                   thrpt:  [22.386 GiB/s 22.620 GiB/s 22.843 GiB/s]
34 | 
35 | ```
36 | 
```

--------------------------------------------------------------------------------
/scripts/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # OpenDAL Scripts
 2 | 
 3 | This module provides scripts to make maintainers lives easier.
 4 | OpenDAL users don't need to care about this folder.
 5 | 
 6 | NOTES: all scripts must be running at root folder of OpenDAL project.
 7 | 
 8 | ## Release
 9 | 
10 | ```shell
11 | just release
12 | ```
13 | 
14 | > Before running release, please make sure you have bump all versions.
15 | 
16 | ### Preparations
17 | 
18 | Import gpg key
19 | 
20 | ```shell
21 | curl https://downloads.apache.org/opendal/KEYS > KEYS # Download KEYS
22 | gpg --import KEYS # Import KEYS to local
23 | ```
24 | 
25 | Trust the public key
26 | 
27 | ```shell
28 | $ gpg --edit-key xxxxxxxxxx #KEY user used in this version
29 | gpg (GnuPG) 2.2.21; Copyright (C) 2020 Free Software Foundation, Inc.
30 | This is free software: you are free to change and redistribute it.
31 | There is NO WARRANTY, to the extent permitted by law.
32 | 
33 | Secret key is available.
34 | gpg> trust #trust
35 | Please decide how far you trust this user to correctly verify other users' keys
36 | (by looking at passports, checking fingerprints from different sources, etc.)
37 | 
38 |   1 = I don't know or won't say
39 |   2 = I do NOT trust
40 |   3 = I trust marginally
41 |   4 = I trust fully
42 |   5 = I trust ultimately
43 |   m = back to the main menu
44 | 
45 | Your decision? 5 #choose 5
46 | Do you really want to set this key to ultimate trust? (y/N) y  #choose y
47 | ```
48 | 
49 | ## Verify
50 | 
51 | ```shell
52 | ./scripts/verify.py
53 | ```
54 | 
```

--------------------------------------------------------------------------------
/core/fuzz/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Fuzz Test for OpenDAL
 2 | 
 3 | fuzz test are used to test the robustness of the code. 
 4 | 
 5 | ## Setup
 6 | 
 7 | 
 8 | 
 9 | To run the fuzz tests, please copy the `.env.example`, which is at project root, to `.env` and change the values on need.
10 | 
11 | Take `fs` for example, we need to change to enable fuzz test on `fs` on `/tmp`.
12 | 
13 | ```dotenv
14 | OPENDAL_TEST=fs
15 | OPENDAL_FS_ROOT=/path/to/dir/
16 | ```
17 | 
18 | into
19 | 
20 | ```dotenv
21 | OPENDAL_TEST=fs
22 | OPENDAL_FS_ROOT=/tmp/
23 | ```
24 | 
25 | 
26 | ## Run
27 | 
28 | List all fuzz targets.
29 | 
30 | ```bash
31 | cargo +nightly fuzz list
32 | ```
33 | 
34 | Build fuzz targets.
35 | 
36 | ```bash
37 | cargo +nightly fuzz build
38 | ```
39 | 
40 | Run a fuzz target(such as `reader`).
41 | 
42 | ```bash
43 | cargo +nightly fuzz run fuzz_reader
44 | ```
45 | 
46 | ## Crash Reproduction
47 | 
48 | If you want to reproduce a crash, you first need to obtain the Base64 encoded code, which usually appears at the end of a crash report, and store it in a file.
49 | 
50 | Alternatively, if you already have the crash file, you can skip this step.
51 | 
52 | ```bash
53 | echo "Base64" > .crash
54 | ```
55 | 
56 | Print the `std::fmt::Debug` output for an input.
57 | 
58 | ```bash
59 | cargo +nightly fuzz fmt fuzz_target .crash
60 | ```
61 | 
62 | Rerun the fuzz test with the input.
63 | 
64 | ```bash
65 | cargo +nightly fuzz run fuzz_target .crash
66 | ```
67 | 
68 | For more details, please visit [cargo fuzz](https://rust-fuzz.github.io/book/cargo-fuzz/tutorial.html) or run the command cargo fuzz --help.
69 | 
```

--------------------------------------------------------------------------------
/core/benches/vs_s3/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # OpenDAL Benchmark VS AWS SDK S3
 2 | 
 3 | This benchmark compares the performance of OpenDAL with the performance of the `aws_sdk_s3`.
 4 | 
 5 | ## Goal
 6 | 
 7 | We expect OpenDAL to match `aws_sdk_s3` in speed: the throughput of OpenDAL should be within a `5%` range of `aws_sdk_s3`.
 8 | 
 9 | ## Notes
10 | 
11 | Please run bench case separately, otherwise the result will be affected by each other since we are sharing the same runtime.
12 | 
13 | ## Usage
14 | 
15 | For test: `cargo run`
16 | 
17 | ```shell
18 | > cargo run
19 | Testing read/opendal_s3_reader
20 | Success
21 | Testing read/aws_s3_sdk_into_async_read
22 | Success
23 | Testing read/opendal_s3_reader_with_capacity
24 | Success
25 | Testing read/aws_s3_sdk_into_async_read_with_capacity
26 | Success
27 | ```
28 | 
29 | For bench case: `cargo run --release -- opendal_s3_reader --bench`
30 | 
31 | ```shell
32 | > cargo run --release -- opendal_s3_reader --bench
33 | read/opendal_s3_reader  time:   [12.773 ms 13.004 ms 13.232 ms]
34 |                         thrpt:  [1.1809 GiB/s 1.2016 GiB/s 1.2232 GiB/s]
35 | ```
36 | 
37 | For bench: `cargo run --release -- --bench`
38 | 
39 | ```shell
40 | > cargo run --release -- --bench
41 | read/opendal_s3_reader  time:   [12.773 ms 13.004 ms 13.232 ms]
42 |                         thrpt:  [1.1809 GiB/s 1.2016 GiB/s 1.2232 GiB/s]
43 | 
44 | read/aws_s3_sdk_into_async_read
45 |                         time:   [12.527 ms 12.842 ms 13.158 ms]
46 |                         thrpt:  [1.1875 GiB/s 1.2168 GiB/s 1.2473 GiB/s]
47 | 
48 | read/opendal_s3_reader_with_capacity
49 |                         time:   [9.6098 ms 9.8133 ms 10.017 ms]
50 |                         thrpt:  [1.5599 GiB/s 1.5922 GiB/s 1.6259 GiB/s]
51 | 
52 | read/aws_s3_sdk_into_async_read_with_capacity
53 |                         time:   [9.8970 ms 10.113 ms 10.329 ms]
54 |                         thrpt:  [1.5128 GiB/s 1.5451 GiB/s 1.5788 GiB/s]
55 | ```
56 | 
```

--------------------------------------------------------------------------------
/bindings/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # OpenDAL Bindings
 2 | 
 3 | This folder contains the bindings for OpenDAL. Currently, we support the following bindings:
 4 | 
 5 | ### Released Bindings
 6 | 
 7 | * [Java](java/README.md)
 8 | * [Node.js](nodejs/README.md)
 9 | * [Python](python/README.md)
10 | 
11 | ### Unreleased Bindings
12 | 
13 | * [C](c/README.md)
14 | * [C++](cpp/README.md)
15 | * [C#](dotnet/README.md)
16 | * [D](d/README.md)
17 | * [Dart](dart/README.md)
18 | * [.NET](dotnet/README.md)
19 | * [Go](go/README.md)
20 | * [Haskell](haskell/README.md)
21 | * [Lua](lua/README.md)
22 | * [OCaml](ocaml/README.md)
23 | * [PHP](php/README.md)
24 | * [Ruby](ruby/README.md)
25 | * [Swift](swift/README.md)
26 | * [Zig](zig/README.md)
27 | 
28 | ## Versioning
29 | 
30 | **Important**: Each binding has its own independent version number, which may differ from the Rust core version. This allows bindings to be released and versioned independently based on their own release cycles and compatibility requirements.
31 | 
32 | For example, while the Rust core might be at version `0.55.0`, a binding might be at version `0.47.0` or `0.49.2`. When checking for updates or compatibility, always refer to the specific binding's version rather than the core version.
33 | 
34 | ## Getting Started
35 | 
36 | Every binding should provide a `README.md` file to help users get started.
37 | The `README.md` file should contain the following sections:
38 | 
39 | * **Installation**: how to install the binding.
40 | * **Usage**: how to use the binding.
41 | * **Development**: how to develop the binding.
42 | * **Testing**: how to test the binding.
43 | 
44 | You can find the `README.md` file for each binding in the corresponding folder.
45 | 
46 | Please refer to the bindings listed above or which are already released for more details.
47 | 
48 | ## Contributing
49 | 
50 | We welcome contributions to OpenDAL. Please refer to [CONTRIBUTING.md](../CONTRIBUTING.md) for the contributing guidelines.
51 | 
```

--------------------------------------------------------------------------------
/core/tests/behavior/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Behavior Test for OpenDAL
 2 | 
 3 | Behavior tests are used to make sure every service works correctly.
 4 | 
 5 | To support different testing backends simultaneously, we use `environment value` to carry the backend config.
 6 | 
 7 | ## Setup
 8 | 
 9 | ### Install Docker
10 | 
11 | Currently, opendal uses Docker to set up environment for behaviour tests. If you are a MacOS user, The docker does not work properly by default(Docker Desktop) in the MacOS environment. It is strongly recommended to use **OrbStack** instead of Docker Desktop. You can install orbstack using Homebrew.
12 | 
13 | ```shell
14 | brew install orbstack
15 | ```
16 | 
17 | ### Prepare Env
18 | 
19 | To run the behavior tests, please copy the `.env.example`, which is at project root, to `.env` and change the values on need.
20 | 
21 | Take `fs` for example, we need to change to enable behavior test on `fs` on `/tmp`.
22 | 
23 | ```dotenv
24 | OPENDAL_FS_ROOT=/path/to/dir/
25 | ```
26 | 
27 | into
28 | 
29 | ```doten
30 | OPENDAL_FS_ROOT=/tmp/
31 | ```
32 | 
33 | Notice: If the env variables are not set, all behavior tests will be skipped by default.
34 | 
35 | ## Run
36 | 
37 | Use `OPENDAL_TEST` to control which service to test:
38 | 
39 | ```shell
40 | OPENDAL_TEST=fs cargo test behavior --features tests
41 | ```
42 | 
43 | To run certain types of tests(such as `write`), we use `behavior::test_write`.
44 | 
45 | ```shell
46 | OPENDAL_TEST=fs cargo test behavior::test_write --features tests
47 | ```
48 | 
49 | You can also run specific test(such as `test_stat_dir`) for specific backend.
50 | 
51 | ```shell
52 | OPENDAL_TEST=fs cargo test behavior::test_stat_dir --features tests
53 | ```
54 | 
55 | ## Debug
56 | 
57 | To debug a behavior test, you can:
58 | 
59 | - Add env `RUST_LOG=debug` to enable logging
60 | - Add env `RUST_BACKTRACE=full` to enable the full backtrace
61 | - Add `--show-output` to show the whole output even when test succeeded.
62 | 
63 | Take `memory` service as an example, the full command will be:
64 | 
65 | ```shell
66 | RUST_LOG=debug RUST_BACKTRACE=full OPENDAL_TEST=memory cargo test behavior --features tests -- --show-output
67 | ```
68 | 
69 | You use `export` to avoid set env every time:
70 | 
71 | ```shell
72 | export RUST_LOG=debug 
73 | export RUST_BACKTRACE=full 
74 | OPENDAL_TEST=memory cargo test behavior --features tests -- --show-output
75 | ```
76 | 
77 | For more details, please visit [cargo test](https://doc.rust-lang.org/cargo/commands/cargo-test.html) or run the command `cargo test --help`.
78 | 
```

--------------------------------------------------------------------------------
/bindings/python/README.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Apache OpenDAL™ Python Binding
  2 | 
  3 | [![Status](https://img.shields.io/badge/status-released-blue)](https://pypi.org/project/opendal/)
  4 | [![PyPI](https://img.shields.io/pypi/v/opendal.svg?logo=PyPI)](https://pypi.org/project/opendal/)
  5 | [![Website](https://img.shields.io/badge/opendal-OpenDAL_Website-red?logo=Apache&logoColor=red)](https://opendal.apache.org/docs/python/)
  6 | 
  7 | This package provides a native Python binding for **Apache OpenDAL™**, a data access
  8 | layer that allows you to access various storage services in a unified way.
  9 | 
 10 | ![OpenDAL Python Usage Demo](https://github.com/apache/opendal/assets/5351546/87bbf6e5-f19e-449a-b368-3e283016c887)
 11 | 
 12 | > **Note**: This binding has its own independent version number, which may differ from the Rust core version. When checking for updates or compatibility, always refer to this binding's version rather than the core version.
 13 | 
 14 | ## Useful Links
 15 | 
 16 | - [Documentation](https://opendal.apache.org/docs/python/)
 17 | - [Examples](./docs/examples)
 18 | - [Upgrade Guide](./upgrade.md)
 19 | 
 20 | ---
 21 | 
 22 | ## Features
 23 | 
 24 | - **Unified API**: Access S3, GCS, Azure Blob, HDFS, FTP, and more with the same set of
 25 |   commands.
 26 | - **Native Performance**: Built in Rust for high performance and safety.
 27 | - **Async Support**: First-class `async` API for modern Python applications.
 28 | - **Easy to Use**: Simple and intuitive API design.
 29 | 
 30 | ---
 31 | 
 32 | ## Installation
 33 | 
 34 | Install the package directly from PyPI:
 35 | 
 36 | ```bash
 37 | pip install opendal
 38 | ```
 39 | 
 40 | ---
 41 | 
 42 | ## Usage
 43 | 
 44 | Here are a few examples of how to use OpenDAL with different storage backends.
 45 | 
 46 | ### Local Filesystem (`fs`)
 47 | 
 48 | ```python
 49 | import opendal
 50 | 
 51 | # Initialize the operator for the local filesystem
 52 | op = opendal.Operator("fs", root="/tmp")
 53 | 
 54 | # Write data to a file
 55 | op.write("test.txt", b"Hello World")
 56 | 
 57 | # Read data from the file
 58 | content = op.read("test.txt")
 59 | print(op.read("test.txt"))
 60 | 
 61 | # Get metadata
 62 | metadata = op.stat("test.txt")
 63 | print(f"Content length: {metadata.content_length}") # Output: 11
 64 | ```
 65 | 
 66 | ### Amazon S3
 67 | 
 68 | The API remains the same—just change the scheme and credentials.
 69 | 
 70 | ```python
 71 | import opendal
 72 | 
 73 | # Initialize the operator for S3
 74 | op = opendal.Operator(
 75 |     "s3",
 76 |     bucket="your_bucket_name",
 77 |     region="your_region",
 78 |     root="/path/to/root"
 79 | )
 80 | 
 81 | op.write("test.txt", b"Hello World")
 82 | print(op.read("test.txt"))
 83 | print(op.stat("test.txt").content_length)
 84 | ```
 85 | 
 86 | ### Async Usage (`s3`)
 87 | 
 88 | OpenDAL also provides a fully asynchronous API.
 89 | 
 90 | ```python
 91 | import asyncio
 92 | import opendal
 93 | 
 94 | async def main():
 95 |     # Use AsyncOperator for async operations
 96 |     op = opendal.AsyncOperator("s3", root="/tmp", bucket="your_bucket_name", region="your_region")
 97 | 
 98 |     await op.write("test.txt", b"Hello World")
 99 |     print(await op.read("test.txt"))
100 | 
101 | asyncio.run(main())
102 | ```
103 | 
104 | ---
105 | 
106 | ## Development
107 | 
108 | This project uses [`just`](https://github.com/casey/just) as a command runner to
109 | simplify the development workflow.
110 | 
111 | 1. **Clone the repository and set up the environment:**
112 | 
113 |    ```shell
114 |    # This will create a virtual environment and install all dependencies
115 |    just setup
116 |    ```
117 | 
118 | 2. **Run tests:**
119 | 
120 |    ```shell
121 |    # Example: Run tests for the 'fs' operator
122 |    OPENDAL_TEST=fs OPENDAL_FS_ROOT=/tmp just test
123 |    ```
124 | 
125 | For a complete guide on building, testing, and contributing, please see our
126 | **[CONTRIBUTING.md](./CONTRIBUTING.md)** file.
127 | 
128 | ---
129 | 
130 | ## Used By
131 | 
132 | Check out the [users list](./users.md) for more details on who is using OpenDAL.
133 | 
134 | ## License and Trademarks
135 | 
136 | Licensed under the Apache License, Version 2.0:
137 | http://www.apache.org/licenses/LICENSE-2.0
138 | 
139 | Apache OpenDAL, OpenDAL, and Apache are either registered trademarks or trademarks of
140 | the Apache Software Foundation.
141 | 
```

--------------------------------------------------------------------------------
/core/core/src/docs/rfcs/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # RFCs - OpenDAL Active RFC List
 2 | 
 3 | RFCs power OpenDAL's development.
 4 | 
 5 | The "RFC" (request for comments) process is intended to provide a consistent and controlled path for changes to OpenDAL (such as new features) so that all stakeholders can be confident about the direction of the project.
 6 | 
 7 | Many changes, including bug fixes and documentation improvements, can be implemented and reviewed via the normal GitHub pull request workflow.
 8 | 
 9 | Some changes, though, are "substantial" and we ask that these be put through a bit of a design process and produce a consensus among the OpenDAL community.
10 | 
11 | ### Which kinds of changes require an RFC?
12 | 
13 | Any substantial change or addition to the project that would require a significant amount of work to implement should generally be an RFC. 
14 | 
15 | Some examples include:
16 | 
17 | - A new feature that creates a new public API or raw API. 
18 | - The removal of features that already shipped as part of the release.
19 | - A big refactor of existing code or reorganization of code into new modules.
20 | 
21 | Those are just a few examples. Ultimately, the judgment call of what constitutes a big enough change to warrant an RFC is left to the project maintainers.
22 | 
23 | If you submit a pull request to implement a new feature without going through the RFC process, it may be closed with a polite request to submit an RFC first.
24 | 
25 | ## Before creating the RFC
26 | 
27 | Preparing in advance before submitting an RFC hastily can increase its chances of being accepted. If you have proposals to make, it is advisable to engage in some preliminary groundwork to facilitate a smoother process.
28 | 
29 | It is great to seek feedback from other project developers first, as this can help validate the viability of the RFC. To ensure a sustained impact on the project, it is important to work together and reach a consensus.
30 | 
31 | Common preparatory steps include presenting your idea on platforms such as GitHub [issues](https://github.com/apache/opendal/issues/) or [discussions](https://github.com/apache/opendal/discussions/categories/ideas), or engaging in discussions through our [email list](https://opendal.apache.org/community/#mailing-list) or [Discord server](https://opendal.apache.org/discord). 
32 | 
33 | ## The RFC process
34 | 
35 | - Fork the [OpenDAL repo](https://github.com/apache/opendal) and create your branch from `main`.
36 | - Copy [`0000_example.md`] to `0000-my-feature.md` (where "my-feature" is descriptive). Don't assign an RFC number yet; This is going to be the PR number, and we'll rename the file accordingly if the RFC is accepted.
37 | - Submit a pull request. As a pull request, the RFC will receive design feedback from the larger community, and the author should be prepared to revise it in response.
38 | - Now that your RFC has an open pull request, use the issue number of this PR to update your `0000-` prefix to that number.
39 | - Build consensus and integrate feedback. RFCs that have broad support are much more likely to make progress than those that don't receive any comments. Feel free to reach OpenDAL maintainers for help.
40 | - RFCs rarely go through this process unchanged, especially as alternatives and drawbacks are shown. You can make edits, big and small, to the RFC to clarify or change the design, but make changes as new commits to the pull request, and leave a comment on the pull request explaining your changes. Specifically, do not squash or rebase commits after they are visible on the pull request.
41 | - The RFC pull request lasts for three days after the last update. After that, the RFC will be accepted or declined based on the consensus reached in the discussion.
42 | - For the accepting of an RFC, we will require approval from at least three maintainers.
43 | - Once the RFC is accepted, please create a tracking issue and update links in RFC. And then the PR will be merged and the RFC will become 'active' status.
44 | 
45 | ## Implementing an RFC
46 | 
47 | An active RFC does not indicate the priority assigned to its implementation,
48 | nor does it imply that a developer has been specifically assigned the task of implementing the feature.
49 | 
50 | The RFC author is encouraged to submit an implementation after the RFC has been accepted.
51 | Nevertheless, it is not obligatory for them to do so.
52 | 
53 | Accepted RFCs may represent features that can wait until a developer chooses to work on them.
54 | Each accepted RFC is associated with an issue in the OpenDAL repository, which tracks its implementation.
55 | 
56 | If you are interested in implementing an RFC but are unsure if someone else is already working on it,
57 | feel free to inquire by leaving a comment on the associated issue.
58 | 
59 | ## Some useful tips
60 | 
61 | - The author of an RFC may not be the same one as the implementer. Therefore, when submitting an RFC, it is advisable to include sufficient information.
62 | - If modifications are needed for an accepted RFC, please submit a new pull request or create a new RFC to propose changes.
63 | 
```

--------------------------------------------------------------------------------
/bindings/java/README.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Apache OpenDAL™ Java Bindings
  2 | 
  3 | [![](https://img.shields.io/badge/status-released-blue)](https://central.sonatype.com/search?q=opendal&smo=true)
  4 | [![Maven Central](https://img.shields.io/maven-central/v/org.apache.opendal/opendal.svg?logo=Apache+Maven&logoColor=blue)](https://central.sonatype.com/search?q=opendal&smo=true)
  5 | [![Website](https://img.shields.io/badge/opendal-OpenDAL_Website-red?logo=Apache&logoColor=red)](https://opendal.apache.org/docs/java/)
  6 | 
  7 | ![](https://github.com/apache/opendal/assets/5351546/87bbf6e5-f19e-449a-b368-3e283016c887)
  8 | 
  9 | > **Note**: This binding has its own independent version number, which may differ from the Rust core version. When checking for updates or compatibility, always refer to this binding's version rather than the core version.
 10 | 
 11 | ## Useful Links
 12 | 
 13 | - [Documentation](https://opendal.apache.org/docs/java/)
 14 | - [Upgrade Guide](./upgrade.md)
 15 | 
 16 | ## Example
 17 | 
 18 | ```java
 19 | import java.util.HashMap;
 20 | import java.util.Map;
 21 | import org.apache.opendal.AsyncOperator;
 22 | import org.apache.opendal.Operator;
 23 | 
 24 | public class Main {
 25 |   public static void main(String[] args) {
 26 |     final Map<String, String> conf = new HashMap<>();
 27 |     conf.put("root", "/tmp");
 28 | 
 29 |     try (AsyncOperator op = AsyncOperator.of("fs", conf)) {
 30 |       op.write("/path/to/data", "Hello world").join();
 31 |       System.out.println(new String(op.read("/path/to/data").join()));
 32 |     }
 33 |   }
 34 | }
 35 | ```
 36 | 
 37 | ## Getting Started
 38 | 
 39 | This project is built upon the native OpenDAL lib. And it is released for multiple platforms that you can use a classifier to specify the platform you are building the application on.
 40 | 
 41 | ### Maven
 42 | 
 43 | Generally, you can first add the `os-maven-plugin` for automatically detect the classifier based on your platform:
 44 | 
 45 | ```xml
 46 | <build>
 47 | <extensions>
 48 |   <extension>
 49 |     <groupId>kr.motd.maven</groupId>
 50 |     <artifactId>os-maven-plugin</artifactId>
 51 |     <version>1.7.0</version>
 52 |   </extension>
 53 | </extensions>
 54 | </build>
 55 | ```
 56 | 
 57 | Then add the dependency to `opendal` as following:
 58 | 
 59 | ```xml
 60 | <dependencies>
 61 |   <dependency>
 62 |     <groupId>org.apache.opendal</groupId>
 63 |     <artifactId>opendal</artifactId>
 64 |     <version>${opendal.version}</version>
 65 |   </dependency>
 66 |   <dependency>
 67 |     <groupId>org.apache.opendal</groupId>
 68 |     <artifactId>opendal</artifactId>
 69 |     <version>${opendal.version}</version>
 70 |     <classifier>${os.detected.classifier}</classifier>
 71 |   </dependency>
 72 | </dependencies>
 73 | ```
 74 | 
 75 | ### Gradle
 76 | 
 77 | For Gradle, you can first add the `com.google.osdetector` for automatically detect the classifier based on your platform:
 78 | 
 79 | ```groovy
 80 | plugins {
 81 |     id "com.google.osdetector" version "1.7.3"
 82 | }
 83 | ```
 84 | 
 85 | Then add the dependency to `opendal as following:
 86 | 
 87 | ```groovy
 88 | dependencies {
 89 |     implementation "org.apache.opendal:opendal:$opendalVersion"
 90 |     implementation "org.apache.opendal:opendal:$opendalVersion:$osdetector.classifier"
 91 | }
 92 | ```
 93 | 
 94 | ### Classified library
 95 | 
 96 | Note that the dependency without classifier ships all classes and resources except the "opendal_java" shared library. And those with classifier bundle only the shared library.
 97 | 
 98 | For downstream usage, it's recommended:
 99 | 
100 | * Depend on the one without classifier to write code;
101 | * Depend on the classified ones with "test" for testing.
102 | 
103 | To load the shared library correctly, you can choose one of the following approaches:
104 | 
105 | * Append the classified JARs to the classpath at the runtime;
106 | * Depend on the classified JARs and build a fat JAR (You may need to depend on all the provided classified JARs for running on multiple platforms);
107 | * Build your own "opendal_java" shared library and specify "-Djava.library.path" to the folder containing that shared library.
108 | 
109 | ## Build
110 | 
111 | This project provides OpenDAL Java bindings with artifact name `opendal`. It depends on JDK 8 or later.
112 | 
113 | You can use Maven to build both Rust dynamic lib and JAR files with one command now:
114 | 
115 | ```shell
116 | ./mvnw clean package -DskipTests=true
117 | ```
118 | 
119 | ## Run tests
120 | 
121 | Currently, all tests are written in Java.
122 | 
123 | You can run the base tests with the following command:
124 | 
125 | ```shell
126 | ./mvnw clean verify
127 | ```
128 | 
129 | ## Code style
130 | 
131 | This project uses [spotless](https://github.com/diffplug/spotless) for code formatting so that all developers share a consistent code style without bikeshedding on it.
132 | 
133 | You can apply the code style with the following command::
134 | 
135 | ```shell
136 | ./mvnw spotless:apply
137 | ```
138 | 
139 | ## Run behavior tests
140 | 
141 | Services behavior tests read necessary configs from env vars or the `.env` file.
142 | 
143 | You can copy [.env.example](/.env.example) to `${project.rootdir}/.env` and change the values on need, or directly set env vars with `export KEY=VALUE`.
144 | 
145 | Take `fs` for example, we need to enable bench on `fs` on `/tmp/`:
146 | 
147 | ```properties
148 | OPENDAL_TEST=fs
149 | OPENDAL_FS_ROOT=/tmp/
150 | ```
151 | 
152 | You can run service behavior tests of enabled with the following command:
153 | 
154 | ```shell
155 | ./mvnw test -Dtest="behavior.*Test"
156 | ```
157 | 
158 | Remember to enable the necessary features via `-Dcargo-build.features=services-xxx` when running specific service test:
159 | 
160 | ```shell
161 | export OPENDAL_TEST=redis
162 | export OPENDAL_REDIS_ENDPOINT=tcp://127.0.0.1:6379
163 | export OPENDAL_REDIS_ROOT=/
164 | export OPENDAL_REDIS_DB=0
165 | ./mvnw test -Dtest="behavior.*Test" -Dcargo-build.features=services-redis
166 | ```
167 | 
168 | ## Used by
169 | 
170 | Check out the [users](./users.md) list for more details on who is using OpenDAL.
171 | 
172 | ## License and Trademarks
173 | 
174 | Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0
175 | 
176 | Apache OpenDAL, OpenDAL, and Apache are either registered trademarks or trademarks of the Apache Software Foundation.
177 | 
```

--------------------------------------------------------------------------------
/bindings/nodejs/README.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Apache OpenDAL™ Node.js Binding
  2 | 
  3 | [![](https://img.shields.io/badge/status-released-blue)](https://www.npmjs.com/package/opendal)
  4 | [![npm](https://img.shields.io/npm/v/opendal.svg?logo=npm)](https://www.npmjs.com/package/opendal)
  5 | [![Website](https://img.shields.io/badge/opendal-OpenDAL_Website-red?logo=Apache&logoColor=red)](https://opendal.apache.org/docs/nodejs/)
  6 | 
  7 | ![](https://github.com/apache/opendal/assets/5351546/87bbf6e5-f19e-449a-b368-3e283016c887)
  8 | 
  9 | > **Note**: This binding has its own independent version number, which may differ from the Rust core version. When checking for updates or compatibility, always refer to this binding's version rather than the core version.
 10 | 
 11 | ## Useful Links
 12 | 
 13 | - [Documentation](https://opendal.apache.org/docs/nodejs/)
 14 | - [Upgrade Guide](./upgrade.md)
 15 | 
 16 | ## Installation
 17 | 
 18 | ```shell
 19 | npm install opendal
 20 | ```
 21 | 
 22 | ## Docs
 23 | 
 24 | To build the docs locally, please run the following commands:
 25 | 
 26 | ```shell
 27 | # Only need to run once unless you want to update the docs theme
 28 | pnpm run build:theme
 29 | 
 30 | # Build the docs
 31 | pnpm run docs
 32 | ```
 33 | 
 34 | ## Tests
 35 | 
 36 | Services behavior tests read necessary configs from env vars or the `.env` file.
 37 | 
 38 | You can copy [.env.example](/.env.example) to `$(pwd)/.env` and change the values on need, or directly set env vars with `export KEY=VALUE`.
 39 | 
 40 | Take `fs` for example, we need to enable bench on `fs` on `/tmp`:
 41 | 
 42 | ```properties
 43 | OPENDAL_TEST=fs
 44 | OPENDAL_FS_ROOT=/tmp
 45 | ```
 46 | 
 47 | You can run service behavior tests of enabled with the following command:
 48 | 
 49 | ```shell
 50 | pnpm build && pnpm test
 51 | ```
 52 | 
 53 | ## Usage
 54 | 
 55 | ```javascript
 56 | import { Operator } from "opendal";
 57 | 
 58 | async function main() {
 59 |   const op = new Operator("fs", { root: "/tmp" });
 60 |   await op.write("test", "Hello, World!");
 61 |   const bs = await op.read("test");
 62 |   console.log(new TextDecoder().decode(bs));
 63 |   const meta = await op.stat("test");
 64 |   console.log(`contentLength: ${meta.contentLength}`);
 65 | }
 66 | 
 67 | main();
 68 | ```
 69 | 
 70 | ## Layers
 71 | 
 72 | OpenDAL provides layers to add additional functionality to operators. You can chain multiple layers together to build powerful data access pipelines.
 73 | 
 74 | ### Available Layers
 75 | 
 76 | - **RetryLayer** - Retry failed operations automatically
 77 | - **ConcurrentLimitLayer** - Limit concurrent requests
 78 | - **TimeoutLayer** - Add timeout for operations
 79 | - **LoggingLayer** - Log all operations
 80 | - **ThrottleLayer** - Limit bandwidth usage
 81 | 
 82 | ### TimeoutLayer
 83 | 
 84 | Prevents operations from hanging indefinitely:
 85 | 
 86 | ```javascript
 87 | import { Operator, TimeoutLayer } from "opendal";
 88 | 
 89 | const op = new Operator("fs", { root: "/tmp" });
 90 | 
 91 | const timeout = new TimeoutLayer();
 92 | timeout.timeout = 10000; // 10 seconds for non-IO operations (ms)
 93 | timeout.ioTimeout = 3000; // 3 seconds for IO operations (ms)
 94 | op.layer(timeout.build());
 95 | ```
 96 | 
 97 | **Default values:** timeout: 60s, ioTimeout: 10s
 98 | 
 99 | ### LoggingLayer
100 | 
101 | Add structured logging for debugging and monitoring:
102 | 
103 | ```javascript
104 | import { Operator, LoggingLayer } from "opendal";
105 | 
106 | const op = new Operator("fs", { root: "/tmp" });
107 | 
108 | const logging = new LoggingLayer();
109 | op.layer(logging.build());
110 | 
111 | // All operations will be logged
112 | await op.write("test.txt", "Hello World");
113 | ```
114 | 
115 | Enable logging output:
116 | 
117 | ```bash
118 | # Show debug logs
119 | RUST_LOG=debug node app.js
120 | 
121 | # Show only OpenDAL logs
122 | RUST_LOG=opendal::services=debug node app.js
123 | ```
124 | 
125 | ### ThrottleLayer
126 | 
127 | Control bandwidth usage with rate limiting:
128 | 
129 | ```javascript
130 | import { Operator, ThrottleLayer } from "opendal";
131 | 
132 | const op = new Operator("s3", {
133 |   bucket: "my-bucket",
134 |   region: "us-east-1",
135 | });
136 | 
137 | // Limit to 10 KiB/s with 10 MiB burst
138 | const throttle = new ThrottleLayer(10 * 1024, 10 * 1024 * 1024);
139 | op.layer(throttle.build());
140 | ```
141 | 
142 | **Parameters:**
143 | 
144 | - `bandwidth`: Maximum bytes per second
145 | - `burst`: Maximum burst size (must be larger than any operation size)
146 | 
147 | ### RetryLayer
148 | 
149 | Automatically retry temporary failed operations:
150 | 
151 | ```javascript
152 | import { Operator, RetryLayer } from "opendal";
153 | 
154 | const op = new Operator("s3", {
155 |   bucket: "my-bucket",
156 |   region: "us-east-1",
157 | });
158 | 
159 | const retry = new RetryLayer();
160 | retry.maxTimes = 3;
161 | retry.jitter = true;
162 | op.layer(retry.build());
163 | ```
164 | 
165 | ### ConcurrentLimitLayer
166 | 
167 | Limit concurrent requests to storage services:
168 | 
169 | ```javascript
170 | import { Operator, ConcurrentLimitLayer } from "opendal";
171 | 
172 | const op = new Operator("s3", {
173 |   bucket: "my-bucket",
174 |   region: "us-east-1",
175 | });
176 | 
177 | // Allow max 1024 concurrent operations
178 | const limit = new ConcurrentLimitLayer(1024);
179 | limit.httpPermits = 512; // Limit HTTP requests separately
180 | op.layer(limit.build());
181 | ```
182 | 
183 | ### Combining Multiple Layers
184 | 
185 | Stack multiple layers for comprehensive control:
186 | 
187 | ```javascript
188 | import {
189 |   Operator,
190 |   LoggingLayer,
191 |   TimeoutLayer,
192 |   RetryLayer,
193 |   ThrottleLayer,
194 | } from "opendal";
195 | 
196 | const op = new Operator("s3", {
197 |   bucket: "my-bucket",
198 |   region: "us-east-1",
199 | });
200 | 
201 | // Layer 1: Logging for observability
202 | const logging = new LoggingLayer();
203 | op.layer(logging.build());
204 | 
205 | // Layer 2: Timeout protection
206 | const timeout = new TimeoutLayer();
207 | timeout.timeout = 30000;
208 | timeout.ioTimeout = 10000;
209 | op.layer(timeout.build());
210 | 
211 | // Layer 3: Retry on failures
212 | const retry = new RetryLayer();
213 | retry.maxTimes = 3;
214 | retry.jitter = true;
215 | op.layer(retry.build());
216 | 
217 | // Layer 4: Bandwidth throttling
218 | const throttle = new ThrottleLayer(100 * 1024, 10 * 1024 * 1024);
219 | op.layer(throttle.build());
220 | 
221 | // Now the operator has full production-ready protection
222 | await op.write("data.json", JSON.stringify(data));
223 | ```
224 | 
225 | ## Usage with Next.js
226 | 
227 | Config automatically be bundled by [Next.js](https://nextjs.org/docs/app/api-reference/config/next-config-js/serverExternalPackages).
228 | 
229 | ```javascript
230 | /** @type {import('next').NextConfig} */
231 | const nextConfig = {
232 |   serverExternalPackages: ["opendal"],
233 | };
234 | 
235 | module.exports = nextConfig;
236 | ```
237 | 
238 | ## Contributing
239 | 
240 | - Start with [Contributing Guide](CONTRIBUTING.md).
241 | - Submit [Issues](https://github.com/apache/opendal/issues/new) for bug report or feature requests.
242 | - Asking questions in the [Discussions](https://github.com/apache/opendal/discussions/new?category=q-a).
243 |   - Talk to community at [Discord](https://opendal.apache.org/discord).
244 | 
245 | ## License and Trademarks
246 | 
247 | Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0
248 | 
249 | Apache OpenDAL, OpenDAL, and Apache are either registered trademarks or trademarks of the Apache Software Foundation.
250 | 
```

--------------------------------------------------------------------------------
/core/README.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Apache OpenDAL™ Rust Core: One Layer, All Storage.
  2 | 
  3 | [![Build Status]][actions] [![Latest Version]][crates.io] [![Crate Downloads]][crates.io] [![chat]][discord]
  4 | 
  5 | [build status]: https://img.shields.io/github/actions/workflow/status/apache/opendal/ci_core.yml?branch=main
  6 | [actions]: https://github.com/apache/opendal/actions?query=branch%3Amain
  7 | [latest version]: https://img.shields.io/crates/v/opendal.svg
  8 | [crates.io]: https://crates.io/crates/opendal
  9 | [crate downloads]: https://img.shields.io/crates/d/opendal.svg
 10 | [chat]: https://img.shields.io/discord/1081052318650339399
 11 | [discord]: https://opendal.apache.org/discord
 12 | 
 13 | Apache OpenDAL™ is an Open Data Access Layer that enables seamless interaction with diverse storage services.
 14 | 
 15 | <img src="https://opendal.apache.org/img/architectural.png" alt="OpenDAL Architectural" width="61.8%" />
 16 | 
 17 | ## Useful Links
 18 | 
 19 | - Documentation: [release](https://docs.rs/opendal/) | [dev](https://opendal.apache.org/docs/rust/opendal/)
 20 | - [Examples](./examples)
 21 | - [Release Notes](https://docs.rs/opendal/latest/opendal/docs/changelog/index.html)
 22 | - [Upgrade Guide](https://docs.rs/opendal/latest/opendal/docs/upgrade/index.html)
 23 | - [RFC List](https://docs.rs/opendal/latest/opendal/docs/rfcs/index.html)
 24 | 
 25 | ## Services
 26 | 
 27 | OpenDAL supports the following storage [services](https://docs.rs/opendal/latest/opendal/services/index.html):
 28 | 
 29 | | Type                           | Services                                                                                                                                 | 
 30 | |--------------------------------|------------------------------------------------------------------------------------------------------------------------------------------| 
 31 | | Standard Storage Protocols     | ftp http [sftp] [webdav]                                                                                                                 |
 32 | | Object Storage Services        | [azblob] [cos] [gcs] [obs] [oss] [s3] <br> [b2] [openstack_swift] [upyun] [vercel-blob]                                                  |
 33 | | File Storage Services          | fs [alluxio] [azdls] [azfile] [compfs] <br> [dbfs] [gridfs] [hdfs] [hdfs-native] [ipfs] [webhdfs]                                        |
 34 | | Consumer Cloud Storage Service | [aliyun-drive] [gdrive] [onedrive] [dropbox] [koofr] <br> [pcloud] [seafile] [yandex-disk]                                      |
 35 | | Key-Value Storage Services     | [cacache] [cloudflare-kv] [dashmap] memory [etcd] <br> [foundationdb] [persy] [redis] [rocksdb] [sled] <br> [redb] [tikv] |
 36 | | Database Storage Services      | [d1] [mongodb] [mysql] [postgresql] [sqlite] [surrealdb]                                                                                 |
 37 | | Cache Storage Services         | [ghac] [memcached] [mini-moka] [moka] [vercel-artifacts]                                                                                 |
 38 | | Git Based Storage Services     | [huggingface]                                                                                                                            |
 39 | 
 40 | [sftp]: https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-02
 41 | [webdav]: https://datatracker.ietf.org/doc/html/rfc4918
 42 | 
 43 | [azblob]: https://azure.microsoft.com/en-us/services/storage/blobs/
 44 | [cos]: https://www.tencentcloud.com/products/cos
 45 | [gcs]: https://cloud.google.com/storage
 46 | [obs]: https://www.huaweicloud.com/intl/en-us/product/obs.html
 47 | [oss]: https://www.aliyun.com/product/oss
 48 | [s3]: https://aws.amazon.com/s3/
 49 | [b2]: https://www.backblaze.com/
 50 | [openstack_swift]: https://docs.openstack.org/swift/latest/
 51 | [upyun]: https://www.upyun.com/
 52 | [vercel-blob]: https://vercel.com/docs/storage/vercel-blob
 53 | 
 54 | [alluxio]: https://docs.alluxio.io/os/user/stable/en/api/REST-API.html
 55 | [azdls]: https://azure.microsoft.com/en-us/products/storage/data-lake-storage/
 56 | [azfile]: https://learn.microsoft.com/en-us/rest/api/storageservices/file-service-rest-api
 57 | [compfs]: https://github.com/compio-rs/compio/
 58 | [dbfs]: https://docs.databricks.com/en/dbfs/index.html
 59 | [gridfs]: https://www.mongodb.com/docs/manual/core/gridfs/
 60 | [hdfs]: https://hadoop.apache.org/docs/r3.3.4/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
 61 | [hdfs-native]: https://github.com/Kimahriman/hdfs-native
 62 | [ipfs]: https://ipfs.tech/
 63 | [webhdfs]: https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/WebHDFS.html
 64 | 
 65 | [aliyun-drive]: https://www.aliyundrive.com/
 66 | [gdrive]: https://www.google.com/drive/
 67 | [onedrive]: https://www.microsoft.com/en-us/microsoft-365/onedrive/online-cloud-storage
 68 | [dropbox]: https://www.dropbox.com/
 69 | [koofr]: https://koofr.eu/
 70 | [pcloud]: https://www.pcloud.com/
 71 | [seafile]: https://www.seafile.com/
 72 | [yandex-disk]: https://360.yandex.com/disk/
 73 | 
 74 | [cacache]: https://crates.io/crates/cacache
 75 | [cloudflare-kv]: https://developers.cloudflare.com/kv/
 76 | [dashmap]: https://github.com/xacrimon/dashmap
 77 | [etcd]: https://etcd.io/
 78 | [foundationdb]: https://www.foundationdb.org/
 79 | [persy]: https://crates.io/crates/persy
 80 | [redis]: https://redis.io/
 81 | [rocksdb]: http://rocksdb.org/
 82 | [sled]: https://crates.io/crates/sled
 83 | [redb]: https://crates.io/crates/redb
 84 | [tikv]: https://tikv.org/
 85 | 
 86 | [d1]: https://developers.cloudflare.com/d1/
 87 | [mongodb]: https://www.mongodb.com/
 88 | [mysql]: https://www.mysql.com/
 89 | [postgresql]: https://www.postgresql.org/
 90 | [sqlite]: https://www.sqlite.org/
 91 | [surrealdb]: https://surrealdb.com/
 92 | 
 93 | [ghac]: https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows
 94 | [memcached]: https://memcached.org/
 95 | [mini-moka]: https://github.com/moka-rs/mini-moka
 96 | [moka]: https://github.com/moka-rs/moka
 97 | [vercel-artifacts]: https://vercel.com/docs/concepts/monorepos/remote-caching
 98 | 
 99 | [huggingface]: https://huggingface.co/
100 | 
101 | ## Layers
102 | 
103 | OpenDAL supports the following storage [layers](https://docs.rs/opendal/latest/opendal/layers/index.html) to extend the behavior:
104 | 
105 | | Name                      | Depends                  | Description                                                                           |
106 | |---------------------------|--------------------------|---------------------------------------------------------------------------------------|
107 | | [`AsyncBacktraceLayer`]   | [async-backtrace]        | Add Efficient, logical 'stack' traces of async functions for the underlying services. |
108 | | [`AwaitTreeLayer`]        | [await-tree]             | Add a Instrument await-tree for actor-based applications to the underlying services.  |
109 | | [`BlockingLayer`]         | [tokio]                  | Add blocking API support for non-blocking services.                                   |
110 | | [`ChaosLayer`]            | [rand]                   | Inject chaos into underlying services for robustness test.                            |
111 | | [`ConcurrentLimitLayer`]  | [tokio]                  | Add concurrent request limit.                                                         |
112 | | [`DtraceLayer`]           | [probe]                  | Support User Statically-Defined Tracing(aka USDT) on Linux                            |
113 | | [`LoggingLayer`]          | [log]                    | Add log for every operations.                                                         |
114 | | [`MetricsLayer`]          | [metrics]                | Add metrics for every operations.                                                     |
115 | | [`MimeGuessLayer`]        | [mime_guess]             | Add `Content-Type` automatically based on the file extension in the operation path.   |
116 | | [`FastraceLayer`]         | [fastrace]               | Add fastrace for every operations.                                                    |
117 | | [`OtelMetricsLayer`]      | [opentelemetry::metrics] | Add opentelemetry::metrics for every operations.                                      |
118 | | [`OtelTraceLayer`]        | [opentelemetry::trace]   | Add opentelemetry::trace for every operations.                                        |
119 | | [`PrometheusClientLayer`] | [prometheus_client]      | Add prometheus metrics for every operations.                                          |
120 | | [`PrometheusLayer`]       | [prometheus]             | Add prometheus metrics for every operations.                                          | 
121 | | [`RetryLayer`]            | [backon]                 | Add retry for temporary failed operations.                                            |
122 | | [`ThrottleLayer`]         | [governor]               | Add a bandwidth rate limiter to the underlying services.                              |
123 | | [`TimeoutLayer`]          | [tokio]                  | Add timeout for every operations to avoid slow or unexpected hang operations.         |
124 | | [`TracingLayer`]          | [tracing]                | Add tracing for every operations.                                                     |
125 | 
126 | [`AsyncBacktraceLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.AsyncBacktraceLayer.html
127 | [async-backtrace]: https://github.com/tokio-rs/async-backtrace
128 | [`AwaitTreeLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.AwaitTreeLayer.html
129 | [await-tree]: https://github.com/risingwavelabs/await-tree
130 | [`BlockingLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.BlockingLayer.html
131 | [tokio]: https://github.com/tokio-rs/tokio
132 | [`ChaosLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.ChaosLayer.html
133 | [rand]: https://github.com/rust-random/rand
134 | [`ConcurrentLimitLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.ConcurrentLimitLayer.html
135 | [`DtraceLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.DtraceLayer.html
136 | [probe]: https://github.com/cuviper/probe-rs
137 | [`LoggingLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.LoggingLayer.html
138 | [log]: https://github.com/rust-lang/log
139 | [`MetricsLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.MetricsLayer.html
140 | [metrics]: https://github.com/metrics-rs/metrics
141 | [`MimeGuessLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.MimeGuessLayer.html
142 | [mime_guess]: https://github.com/abonander/mime_guess
143 | [`FastraceLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.FastraceLayer.html
144 | [fastrace]: https://github.com/fastracelabs/fastrace
145 | [`OtelMetricsLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.OtelMetricsLayer.html
146 | [`OtelTraceLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.OtelTraceLayer.html
147 | [opentelemetry::trace]: https://docs.rs/opentelemetry/latest/opentelemetry/trace/index.html
148 | [`PrometheusClientLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.PrometheusClientLayer.html
149 | [prometheus_client]: https://github.com/prometheus/client_rust
150 | [`PrometheusLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.PrometheusLayer.html
151 | [prometheus]: https://github.com/tikv/rust-prometheus
152 | [`RetryLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.RetryLayer.html
153 | [backon]: https://github.com/Xuanwo/backon
154 | [`ThrottleLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.ThrottleLayer.html
155 | [governor]: https://github.com/boinkor-net/governor
156 | [`TimeoutLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.TimeoutLayer.html
157 | [`TracingLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.TracingLayer.html
158 | [tracing]: https://github.com/tokio-rs/tracing
159 | 
160 | ## Quickstart
161 | 
162 | ```rust
163 | use opendal::Result;
164 | use opendal::layers::LoggingLayer;
165 | use opendal::services;
166 | use opendal::Operator;
167 | 
168 | #[tokio::main]
169 | async fn main() -> Result<()> {
170 |     // Pick a builder and configure it.
171 |     let mut builder = services::S3::default();
172 |     builder.bucket("test");
173 | 
174 |     // Init an operator
175 |     let op = Operator::new(builder)?
176 |         // Init with logging layer enabled.
177 |         .layer(LoggingLayer::default())
178 |         .finish();
179 | 
180 |     // Write data
181 |     op.write("hello.txt", "Hello, World!").await?;
182 | 
183 |     // Read data
184 |     let bs = op.read("hello.txt").await?;
185 | 
186 |     // Fetch metadata
187 |     let meta = op.stat("hello.txt").await?;
188 |     let mode = meta.mode();
189 |     let length = meta.content_length();
190 | 
191 |     // Delete
192 |     op.delete("hello.txt").await?;
193 | 
194 |     Ok(())
195 | }
196 | ```
197 | 
198 | ## Examples
199 | 
200 | | Name                | Description                                                   |
201 | |---------------------|---------------------------------------------------------------|
202 | | [Basic]             | Show how to use opendal to operate storage service.           |
203 | | [Concurrent Upload] | Show how to perform upload concurrently to a storage service. |
204 | | [Multipart Upload]  | Show how to perform a multipart upload to a storage service.  |
205 | 
206 | [Basic]: ./examples/basic
207 | [Concurrent Upload]: ./examples/concurrent-upload
208 | [Multipart Upload]: ./examples/multipart-upload
209 | 
210 | ## Contributing
211 | 
212 | Check out the [CONTRIBUTING](./CONTRIBUTING.md) guide for more details on getting started with contributing to this project.
213 | 
214 | ## Used by
215 | 
216 | Check out the [users](./users.md) list for more details on who is using OpenDAL.
217 | 
218 | ## Branding
219 | 
220 | The first and most prominent mentions must use the full form: **Apache OpenDAL™** of the name for any individual usage (webpage, handout, slides, etc.) Depending on the context and writing style, you should use the full form of the name sufficiently often to ensure that readers clearly understand the association of both the OpenDAL project and the OpenDAL software product to the ASF as the parent organization.
221 | 
222 | For more details, see the [Apache Product Name Usage Guide](https://www.apache.org/foundation/marks/guide).
223 | 
224 | ## License and Trademarks
225 | 
226 | Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0
227 | 
228 | Apache OpenDAL, OpenDAL, and Apache are either registered trademarks or trademarks of the Apache Software Foundation.
229 | 
```

--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Apache OpenDAL™: *One Layer, All Storage.*
  2 | 
  3 | [![](https://img.shields.io/github/discussions/apache/opendal)](https://github.com/apache/opendal/discussions)
  4 | [![](https://img.shields.io/discord/1081052318650339399?logo=discord&label=discord)](https://opendal.apache.org/discord)
  5 | [![](https://deepwiki.com/badge.svg)](https://deepwiki.com/apache/opendal)
  6 | 
  7 | OpenDAL (`/ˈoʊ.pən.dæl/`, pronounced "OH-puhn-dal") is an Open Data Access Layer that enables seamless interaction with diverse storage services.
  8 | 
  9 | OpenDAL's development is guided by its vision of **One Layer, All Storage** and its core principles: **Open Community**, **Solid Foundation**, **Fast Access**, **Object Storage First**, and **Extensible Architecture**. Read the explained vision at [OpenDAL Vision](https://opendal.apache.org/vision).
 10 | 
 11 | <img src="https://opendal.apache.org/img/architectural.png" alt="OpenDAL Architectural" width="61.8%" />
 12 | 
 13 | ## For *ANY* languages
 14 | 
 15 | > **Note**: Each binding has its own independent version number, which may differ from the Rust core version. When checking for updates or compatibility, always refer to the specific binding's version rather than the core version.
 16 | 
 17 | | Name              | Release                                          | Docs                                                                              | Used By |
 18 | | ----------------- | ------------------------------------------------ | --------------------------------------------------------------------------------- | ----------------------------------- |
 19 | | [Rust Core]       | [![Rust Core Image]][Rust Core Link]             | [![Docs Release]][Rust Core Release Docs] [![Docs Dev]][Rust Core Dev Docs]       | [![Rust Core Users Image]][Rust Core Users]            |
 20 | | [C Binding]       | -                                                | [![Docs Dev]][C Binding Dev Docs]                                                 | [![C Binding Users Image]][C Binding Users]            |
 21 | | [Cpp Binding]     | -                                                | [![Docs Dev]][Cpp Binding Dev Docs]                                               | - |
 22 | | [D Binding]       | -                                                | -                                                                                 | - |
 23 | | [Dart Binding]    | -                                                | -                                                                                 | - |
 24 | | [Dotnet Binding]  | -                                                | -                                                                                 | - |
 25 | | [Go Binding]      | [![Go Binding Image]][Go Binding Link]           | [![Docs Release]][Go Release Docs]                                                | - |
 26 | | [Haskell Binding] | -                                                | -                                                                                 | - |
 27 | | [Java Binding]    | [![Java Binding Image]][Java Binding Link]       | [![Docs Release]][Java Binding Release Docs] [![Docs Dev]][Java Binding Dev Docs] | [![Java Binding Users Image]][Java Binding Users]   |
 28 | | [Lua Binding]     | -                                                | -                                                                                 | - |
 29 | | [Node.js Binding] | [![Node.js Binding Image]][Node.js Binding Link] | [![Docs Dev]][Node.js Binding Dev Docs]                                           | - |
 30 | | [OCaml Binding]   | -                                                | -                                                                                 | - |
 31 | | [PHP Binding]     | -                                                | -                                                                                 | - |
 32 | | [Python Binding]  | [![Python Binding Image]][Python Binding Link]   | [![Docs Dev]][Python Binding Dev Docs]                                            | [![Python Binding Users Image]][Python Binding Users] |
 33 | | [Ruby Binding]    | -                                                | -                                                                                 | - |
 34 | | [Swift Binding]   | -                                                | -                                                                                 | - |
 35 | | [Zig Binding]     | -                                                | -                                                                                 | - |
 36 | 
 37 | [Docs Release]: https://img.shields.io/badge/docs-release-blue
 38 | [Docs Dev]: https://img.shields.io/badge/docs-dev-blue
 39 | [Rust Core]: core/README.md
 40 | [Rust Core Image]: https://img.shields.io/crates/v/opendal.svg
 41 | [Rust Core Link]: https://crates.io/crates/opendal
 42 | [Rust Core Release Docs]: https://docs.rs/opendal
 43 | [Rust Core Dev Docs]: https://opendal.apache.org/docs/rust/opendal/
 44 | [Rust Core Users Image]: https://github.com/user-attachments/assets/2726c336-8509-491d-92d8-1be2040d5136
 45 | [Rust Core Users]: core/users.md
 46 | 
 47 | [C Binding]: bindings/c/README.md
 48 | [C Binding Dev Docs]: https://opendal.apache.org/docs/c/
 49 | [C Binding Users Image]: https://github.com/user-attachments/assets/b1cf4d79-8478-4eac-ae04-0bbe0d6a993d
 50 | [C Binding Users]: bindings/c/users.md
 51 | [Cpp Binding]: bindings/cpp/README.md
 52 | [Cpp Binding Dev Docs]: https://opendal.apache.org/docs/cpp/
 53 | [D Binding]: bindings/d/README.md
 54 | [Dart Binding]: bindings/dart/README.md
 55 | [Dotnet Binding]: bindings/dotnet/README.md
 56 | [Go Binding]: bindings/go/README.md
 57 | [Go Binding Image]: https://badge.fury.io/go/github.com%2Fapache%2Fopendal%2Fbindings%2Fgo.svg
 58 | [Go Binding Link]: https://pkg.go.dev/github.com/apache/opendal/bindings/go
 59 | [Go Release Docs]: https://pkg.go.dev/github.com/apache/opendal/bindings/go
 60 | [Haskell Binding]: bindings/haskell/README.md
 61 | [Java Binding]: bindings/java/README.md
 62 | [Java Binding Image]: https://img.shields.io/maven-central/v/org.apache.opendal/opendal-java
 63 | [Java Binding Link]: https://central.sonatype.com/artifact/org.apache.opendal/opendal-java
 64 | [Java Binding Release Docs]: https://javadoc.io/doc/org.apache.opendal/opendal-java
 65 | [Java Binding Dev Docs]: https://opendal.apache.org/docs/java/
 66 | [Java Binding Users Image]: https://github.com/user-attachments/assets/f20a59a9-8f23-4919-a165-980ed4e6e0d0
 67 | [Java Binding Users]: bindings/java/users.md
 68 | [Lua Binding]: bindings/lua/README.md
 69 | [Node.js Binding]: bindings/nodejs/README.md
 70 | [Node.js Binding Image]: https://img.shields.io/npm/v/opendal
 71 | [Node.js Binding Link]: https://www.npmjs.com/package/opendal
 72 | [Node.js Binding Dev Docs]: https://opendal.apache.org/docs/nodejs/
 73 | [OCaml Binding]: bindings/ocaml/README.md
 74 | [PHP Binding]: bindings/php/README.md
 75 | [Python Binding]: bindings/python/README.md
 76 | [Python Binding Image]: https://img.shields.io/pypi/v/opendal
 77 | [Python Binding Link]: https://pypi.org/project/opendal/
 78 | [Python Binding Dev Docs]: https://opendal.apache.org/docs/python/
 79 | [Python Binding Users Image]: https://github.com/user-attachments/assets/6bba7e5b-cada-4cf2-81e3-09d4e4535dcb 
 80 | [Python Binding Users]: bindings/python/users.md
 81 | [Ruby Binding]: bindings/ruby/README.md
 82 | [Swift Binding]: bindings/swift/README.md
 83 | [Zig Binding]: bindings/zig/README.md
 84 | 
 85 | ## For *ANY* methods
 86 | 
 87 | | Name  | Description                                                        | Release                   |
 88 | | ----- | ------------------------------------------------------------------ | ------------------------- |
 89 | | [oli] | Access data via Command Line (alternative to s3cmd, s3cli, azcopy) | [![oli image]][oli crate] |
 90 | | [ofs] | Access data via POSIX file system API (alternative to s3fs)        | [![ofs image]][ofs crate] |
 91 | 
 92 | [oli]: https://github.com/apache/opendal-oli
 93 | [oli image]: https://img.shields.io/crates/v/oli.svg
 94 | [oli crate]: https://crates.io/crates/oli
 95 | [ofs]: https://github.com/apache/opendal-ofs
 96 | [ofs image]: https://img.shields.io/crates/v/ofs.svg
 97 | [ofs crate]: https://crates.io/crates/ofs
 98 | 
 99 | ## For *ANY* integrations
100 | 
101 | | Name                   | Description                                                                   | Release                                     | Docs                                                                              |
102 | | ---------------------- | ----------------------------------------------------------------------------- | ------------------------------------------- | --------------------------------------------------------------------------------- |
103 | | [dav-server-opendalfs] | a [dav-server-rs] implementation using opendal.                               | [![dav-server image]][dav-server crate]     | [![Docs Release]][dav-server release docs] [![Docs Dev]][dav-server dev docs]     |
104 | | [object_store_opendal] | an [object_store] implementation using opendal.                               | [![object_store image]][object_store crate] | [![Docs Release]][object_store release docs] [![Docs Dev]][object_store dev docs] |
105 | | [unftp-sbe-opendal]    | an [unftp] storage backend implementation using opendal.                      | [![unftp-sbe image]][unftp-sbe crate]       | [![Docs Release]][unftp-sbe release docs] [![Docs Dev]][unftp-sbe dev docs]       |
106 | | [parquet_opendal]      | Provides [`parquet`](https://crates.io/crates/parquet) efficient IO utilities | [![parquet image]][parquet crate]           | [![Docs Release]][parquet release docs] [![Docs Dev]][parquet dev docs]           |
107 | 
108 | [dav-server-opendalfs]: integrations/dav-server/README.md
109 | [dav-server-rs]: https://github.com/messense/dav-server-rs
110 | [dav-server image]: https://img.shields.io/crates/v/dav-server-opendalfs.svg
111 | [dav-server crate]: https://crates.io/crates/dav-server-opendalfs
112 | [dav-server release docs]: https://docs.rs/dav-server-opendalfs/
113 | [dav-server dev docs]: https://opendal.apache.org/docs/dav-server-opendalfs/dav_server_opendalfs/
114 | 
115 | [object_store_opendal]: integrations/object_store/README.md
116 | [object_store]: https://docs.rs/object_store
117 | [object_store image]: https://img.shields.io/crates/v/object_store_opendal.svg
118 | [object_store crate]: https://crates.io/crates/object_store_opendal
119 | [object_store release docs]: https://docs.rs/object_store_opendal/
120 | [object_store dev docs]: https://opendal.apache.org/docs/object-store-opendal/object_store_opendal/
121 | 
122 | 
123 | [unftp-sbe-opendal]: integrations/unftp-sbe/README.md
124 | [unftp]: https://crates.io/crates/unftp
125 | [unftp-sbe image]: https://img.shields.io/crates/v/unftp-sbe-opendal.svg
126 | [unftp-sbe crate]: https://crates.io/crates/unftp-sbe-opendal
127 | [unftp-sbe release docs]: https://docs.rs/unftp-sbe-opendal/
128 | [unftp-sbe dev docs]: https://opendal.apache.org/docs/unftp-sbe-opendal/unftp_sbe_opendal/
129 | 
130 | [parquet_opendal]: integrations/parquet/README.md
131 | [parquet image]: https://img.shields.io/crates/v/parquet-opendal.svg
132 | [parquet crate]: https://crates.io/crates/parquet-opendal
133 | [parquet release docs]: https://docs.rs/parquet-opendal/
134 | [parquet dev docs]: https://opendal.apache.org/docs/parquet-opendal/parquet_opendal/
135 | 
136 | ## For *ANY* services
137 | 
138 | | Type                           | Services                                                                                                                  |
139 | | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------- |
140 | | Standard Storage Protocols     | ftp http [sftp] [webdav]                                                                                                  |
141 | | Object Storage Services        | [azblob] [cos] [gcs] [obs] [oss] [s3] <br> [b2] [openstack_swift] [upyun] [vercel-blob]                                   |
142 | | File Storage Services          | fs [alluxio] [azdls] [azfile] [compfs] <br> [dbfs] [gridfs] [hdfs] [hdfs-native] [ipfs] [webhdfs]                         |
143 | | Consumer Cloud Storage Service | [aliyun-drive] [gdrive] [onedrive] [dropbox] [koofr] <br> [pcloud] [seafile] [yandex-disk]                                |
144 | | Key-Value Storage Services     | [cacache] [cloudflare-kv] [dashmap] memory [etcd] <br> [foundationdb] [persy] [redis] [rocksdb] [sled] <br> [redb] [tikv] |
145 | | Database Storage Services      | [d1] [mongodb] [mysql] [postgresql] [sqlite] [surrealdb]                                                                  |
146 | | Cache Storage Services         | [ghac] [memcached] [mini-moka] [moka] [vercel-artifacts]                                                                  |
147 | | Git Based Storage Services     | [huggingface]                                                                                                             |
148 | 
149 | [sftp]: https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-02
150 | [webdav]: https://datatracker.ietf.org/doc/html/rfc4918
151 | 
152 | [azblob]: https://azure.microsoft.com/en-us/services/storage/blobs/
153 | [cos]: https://www.tencentcloud.com/products/cos
154 | [gcs]: https://cloud.google.com/storage
155 | [obs]: https://www.huaweicloud.com/intl/en-us/product/obs.html
156 | [oss]: https://www.aliyun.com/product/oss
157 | [s3]: https://aws.amazon.com/s3/
158 | [b2]: https://www.backblaze.com/
159 | [openstack_swift]: https://docs.openstack.org/swift/latest/
160 | [upyun]: https://www.upyun.com/
161 | [vercel-blob]: https://vercel.com/docs/storage/vercel-blob
162 | 
163 | [alluxio]: https://docs.alluxio.io/os/user/stable/en/api/REST-API.html
164 | [azdls]: https://azure.microsoft.com/en-us/products/storage/data-lake-storage/
165 | [azfile]: https://learn.microsoft.com/en-us/rest/api/storageservices/file-service-rest-api
166 | [compfs]: https://github.com/compio-rs/compio/
167 | [dbfs]: https://docs.databricks.com/en/dbfs/index.html
168 | [gridfs]: https://www.mongodb.com/docs/manual/core/gridfs/
169 | [hdfs]: https://hadoop.apache.org/docs/r3.3.4/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
170 | [hdfs-native]: https://github.com/Kimahriman/hdfs-native
171 | [ipfs]: https://ipfs.tech/
172 | [webhdfs]: https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/WebHDFS.html
173 | 
174 | [aliyun-drive]: https://www.aliyundrive.com/
175 | [gdrive]: https://www.google.com/drive/
176 | [onedrive]: https://www.microsoft.com/en-us/microsoft-365/onedrive/online-cloud-storage
177 | [dropbox]: https://www.dropbox.com/
178 | [koofr]: https://koofr.eu/
179 | [pcloud]: https://www.pcloud.com/
180 | [seafile]: https://www.seafile.com/
181 | [yandex-disk]: https://360.yandex.com/disk/
182 | 
183 | [cacache]: https://crates.io/crates/cacache
184 | [cloudflare-kv]: https://developers.cloudflare.com/kv/
185 | [dashmap]: https://github.com/xacrimon/dashmap
186 | [etcd]: https://etcd.io/
187 | [foundationdb]: https://www.foundationdb.org/
188 | [persy]: https://crates.io/crates/persy
189 | [redis]: https://redis.io/
190 | [rocksdb]: http://rocksdb.org/
191 | [sled]: https://crates.io/crates/sled
192 | [redb]: https://crates.io/crates/redb
193 | [tikv]: https://tikv.org/
194 | 
195 | [d1]: https://developers.cloudflare.com/d1/
196 | [mongodb]: https://www.mongodb.com/
197 | [mysql]: https://www.mysql.com/
198 | [postgresql]: https://www.postgresql.org/
199 | [sqlite]: https://www.sqlite.org/
200 | [surrealdb]: https://surrealdb.com/
201 | 
202 | [ghac]: https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows
203 | [memcached]: https://memcached.org/
204 | [mini-moka]: https://github.com/moka-rs/mini-moka
205 | [moka]: https://github.com/moka-rs/moka
206 | [vercel-artifacts]: https://vercel.com/docs/concepts/monorepos/remote-caching
207 | 
208 | [huggingface]: https://huggingface.co/
209 | 
210 | ## Examples
211 | 
212 | The examples are available at [here](./examples/).
213 | 
214 | ## Documentation
215 | 
216 | The documentation is available at <https://opendal.apache.org>.
217 | 
218 | ## Contribute
219 | 
220 | OpenDAL is an active open-source project. We are always open to people who want to use it or contribute to it. Here are some ways to go.
221 | 
222 | - Start with [Contributing Guide](CONTRIBUTING.md).
223 | - Submit [Issues](https://github.com/apache/opendal/issues/new) for bug report or feature requests.
224 | - Start [Discussions](https://github.com/apache/opendal/discussions/new?category=q-a) for questions or ideas.
225 | - Talk to community directly at [Discord](https://opendal.apache.org/discord).
226 | - Report security vulnerabilities to [private mailing list](mailto:[email protected])
227 | 
228 | ## Branding
229 | 
230 | The first and most prominent mentions must use the full form: **Apache OpenDAL™** of the name for any individual usage (webpage, handout, slides, etc.) Depending on the context and writing style, you should use the full form of the name sufficiently often to ensure that readers clearly understand the association of both the OpenDAL project and the OpenDAL software product to the ASF as the parent organization.
231 | 
232 | For more details, see the [Apache Product Name Usage Guide](https://www.apache.org/foundation/marks/guide).
233 | 
234 | ## License and Trademarks
235 | 
236 | Licensed under the Apache License, Version 2.0: <http://www.apache.org/licenses/LICENSE-2.0>
237 | 
238 | Apache OpenDAL, OpenDAL, and Apache are either registered trademarks or trademarks of the Apache Software Foundation.
239 | 
```

--------------------------------------------------------------------------------
/CLAUDE.md:
--------------------------------------------------------------------------------

```markdown
1 | AGENTS.md
```
Page 1/74FirstPrevNextLast