/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/* auto-generated by NAPI-RS */
/* eslint-disable */

export declare class ExternalObject<T> {
  readonly '': {
    readonly '': unique symbol
    [K: symbol]: T
  }
}
/**
 * BlockingLister is designed to list entries at a given path in a blocking
 * manner.
 */
export declare class BlockingLister {
  next(): Entry | null
}

/**
 * BlockingReader is designed to read data from a given path in a blocking
 * manner.
 */
export declare class BlockingReader {
  read(buf: Buffer): bigint
}

/**
 * BlockingWriter is designed to write data into a given path in a blocking
 * manner.
 */
export declare class BlockingWriter {
  /**
   * # Safety
   *
   * > &mut self in async napi methods should be marked as unsafe
   *
   * Write bytes into this writer.
   *
   * ### Example
   * ```javascript
   * const writer = await op.writer("path/to/file");
   * await writer.write(Buffer.from("hello world"));
   * await writer.close();
   * ```
   */
  write(content: Buffer | string): void
  /**
   * # Safety
   *
   * > &mut self in async napi methods should be marked as unsafe
   *
   * Close this writer.
   *
   * ### Example
   *
   * ```javascript
   * const writer = op.writerSync("path/to/file");
   * writer.write(Buffer.from("hello world"));
   * writer.close();
   * ```
   */
  close(): void
}

/**
 * Capability is used to describe what operations are supported
 *  by the current Operator.
 *
 * Via capability, we can know:
 *
 * - Whether current Operator supports `read` or not.
 * - Whether current Operator supports `read` with if match or not.
 * - What's current Operator max supports batch operations count.
 *
 * Add fields of Capabilities to be public and can be accessed directly.
 */
export declare class Capability {
  /** If operator supports stat. */
  get stat(): boolean
  /** If operator supports stat with if matched. */
  get statWithIfMatch(): boolean
  /** If operator supports stat with if not match. */
  get statWithIfNoneMatch(): boolean
  /** If operator supports stat with if modified since. */
  get statWithIfModifiedSince(): boolean
  /** If operator supports stat with if unmodified since. */
  get statWithIfUnmodifiedSince(): boolean
  /** If operator supports stat with versions. */
  get statWithVersion(): boolean
  /** If operator supports stat with override content type. */
  get statWithOverrideContentType(): boolean
  /** If operator supports stat with override cache control. */
  get statWithOverrideCacheControl(): boolean
  /** If operator supports stat with override content disposition. */
  get statWithOverrideContentDisposition(): boolean
  /** If operator supports read. */
  get read(): boolean
  /** If operator supports read with version. */
  get readWithVersion(): boolean
  /** If operator supports read with range. */
  get readWithIfModifiedSince(): boolean
  /** If operator supports read with if unmodified since. */
  get readWithIfUnmodifiedSince(): boolean
  /** If operator supports read with if matched. */
  get readWithIfMatch(): boolean
  /** If operator supports read with if not match. */
  get readWithIfNoneMatch(): boolean
  /** if operator supports read with override cache control. */
  get readWithOverrideCacheControl(): boolean
  /** if operator supports `read` with override content disposition. */
  get readWithOverrideContentDisposition(): boolean
  /** if operator supports read with override content type. */
  get readWithOverrideContentType(): boolean
  /** If operator supports write. */
  get write(): boolean
  /** If operator supports write can be called in multi times. */
  get writeCanMulti(): boolean
  /** If operator supports write with empty content. */
  get writeCanEmpty(): boolean
  /** If operator supports write by append. */
  get writeCanAppend(): boolean
  /** If operator supports write with content type. */
  get writeWithContentType(): boolean
  /** If operator supports write with content disposition. */
  get writeWithContentDisposition(): boolean
  /** If operator supports write with cache control. */
  get writeWithCacheControl(): boolean
  /** If operator supports write with content encoding. */
  get writeWithContentEncoding(): boolean
  /** If operator supports write with user metadata. */
  get writeWithUserMetadata(): boolean
  /** If operator supports write with if match. */
  get writeWithIfMatch(): boolean
  /** If operator supports write with if none match. */
  get writeWithIfNoneMatch(): boolean
  /** If operator supports write with if not exists. */
  get writeWithIfNotExists(): boolean
  /**
   * write_multi_max_size is the max size that services support in write_multi.
   *
   * For example, AWS S3 supports 5GiB as max in write_multi.
   */
  get writeMultiMaxSize(): bigint | null
  /**
   * write_multi_min_size is the min size that services support in write_multi.
   *
   * For example, AWS S3 requires at least 5MiB in write_multi expect the last one.
   */
  get writeMultiMinSize(): bigint | null
  /**
   * write_total_max_size is the max size that services support in write_total.
   *
   * For example, Cloudflare D1 supports 1MB as max in write_total.
   */
  get writeTotalMaxSize(): bigint | null
  /** If operator supports create dir. */
  get createDir(): boolean
  /** If operator supports delete. */
  get delete(): boolean
  /** If operator supports delete by version. */
  get deleteWithVersion(): boolean
  /** If operator supports copy. */
  get copy(): boolean
  /** If operator supports rename. */
  get rename(): boolean
  /** If operator supports list. */
  get list(): boolean
  /** If backend supports list with limit. */
  get listWithLimit(): boolean
  /** If backend supports list with start after. */
  get listWithStartAfter(): boolean
  /** If backend supports list with recursive. */
  get listWithRecursive(): boolean
  /** If backend supports list with versions. */
  get listWithVersions(): boolean
  /** If backend supports list with deleted. */
  get listWithDeleted(): boolean
  /** If operator supports presign. */
  get presign(): boolean
  /** If operator supports presign read. */
  get presignRead(): boolean
  /** If operator supports presign stat. */
  get presignStat(): boolean
  /** If operator supports presign write. */
  get presignWrite(): boolean
  /** If operator supports shared. */
  get shared(): boolean
}

/**
 * Concurrent limit layer
 *
 * Add concurrent request limit.
 *
 * # Notes
 *
 * Users can control how many concurrent connections could be established
 * between OpenDAL and underlying storage services.
 *
 * All operators wrapped by this layer will share a common semaphore.
 *
 * # Examples
 *
 * ```javascript
 * const op = new Operator("fs", { root: "/tmp" })
 *
 * // Create a concurrent limit layer with 1024 permits
 * const limit = new ConcurrentLimitLayer(1024);
 * op.layer(limit.build());
 * ```
 *
 * With HTTP concurrent limit:
 *
 * ```javascript
 * const limit = new ConcurrentLimitLayer(1024);
 * limit.httpPermits = 512;
 * op.layer(limit.build());
 * ```
 */
export declare class ConcurrentLimitLayer {
  /**
   * Create a new ConcurrentLimitLayer with specified permits.
   *
   * This permits will be applied to all operations.
   *
   * # Arguments
   *
   * * `permits` - The maximum number of concurrent operations allowed.
   */
  constructor(permits: number)
  /**
   * Set a concurrent limit for HTTP requests.
   *
   * This will limit the number of concurrent HTTP requests made by the operator.
   *
   * # Arguments
   *
   * * `v` - The maximum number of concurrent HTTP requests allowed.
   */
  set httpPermits(v: number)
  /**
   * Build the layer.
   *
   * Returns an `External<Layer>` that can be used with `Operator.layer()`.
   */
  build(): ExternalObject<Layer>
}

/** Entry returned by Lister or BlockingLister to represent a path, and it's a relative metadata. */
export declare class Entry {
  /** Return the path of this entry. */
  path(): string
  /** Return the metadata of this entry. */
  metadata(): Metadata
}

/** A public layer wrapper */
export declare class Layer {

}

/**
 * Lister is designed to list entries at a given path in an asynchronous
 * manner.
 */
export declare class Lister {
  /**
   * # Safety
   *
   * > &mut self in async napi methods should be marked as unsafe
   *
   * napi will make sure the function is safe, and we didn't do unsafe
   * things internally.
   */
  next(): Promise<Entry | null>
}

/**
 * Logging layer
 *
 * Add log for every operation.
 *
 * # Logging
 *
 * - OpenDAL will log in structural way.
 * - Every operation will start with a `started` log entry.
 * - Every operation will finish with the following status:
 *   - `succeeded`: the operation is successful, but might have more to take.
 *   - `finished`: the whole operation is finished.
 *   - `failed`: the operation returns an unexpected error.
 * - The default log level while expected error happened is `Warn`.
 * - The default log level while unexpected failure happened is `Error`.
 *
 * # Examples
 *
 * ```javascript
 * const op = new Operator("fs", { root: "/tmp" })
 *
 * const logging = new LoggingLayer();
 * op.layer(logging.build());
 * ```
 *
 * # Output
 *
 * To enable logging output, set the `RUST_LOG` environment variable:
 *
 * ```shell
 * RUST_LOG=debug node app.js
 * ```
 */
export declare class LoggingLayer {
  constructor()
  build(): ExternalObject<Layer>
}

/** Metadata carries all metadata associated with a path. */
export declare class Metadata {
  /** Returns true if the <op.stat> object describes a file system directory. */
  isDirectory(): boolean
  /** Returns true if the <op.stat> object describes a regular file. */
  isFile(): boolean
  /**
   * This function returns `true` if the file represented by this metadata has been marked for
   * deletion or has been permanently deleted.
   */
  isDeleted(): boolean
  /** Cache-Control of this object. */
  get cacheControl(): string | null
  /** Content-Disposition of this object */
  get contentDisposition(): string | null
  /** Content Length of this object */
  get contentLength(): bigint | null
  /** Content Encoding of this object */
  get contentEncoding(): string | null
  /** Content MD5 of this object. */
  get contentMd5(): string | null
  /** Content Type of this object. */
  get contentType(): string | null
  /** User Metadata of this object. */
  get userMetadata(): Record<string, string> | null
  /** ETag of this object. */
  get etag(): string | null
  /**
   * Last Modified of this object.
   *
   * We will output this time in RFC3339 format like `1996-12-19T16:39:57+08:00`.
   */
  get lastModified(): string | null
  /** mode represent this entry's mode. */
  get mode(): EntryMode | null
  /** Retrieves the `version` of the file, if available. */
  get version(): string | null
}

export declare class Operator {
  /**
   * @see For the full list of scheme, see https://docs.rs/opendal/latest/opendal/services/index.html
   * And the options,
   * please refer to the documentation of the corresponding service for the corresponding parameters.
   * Note that the current options key is snake_case.
   */
  constructor(scheme: string, options?: Record<string, string> | undefined | null)
  /** Get current operator(service)'s full capability. */
  capability(): Capability
  /**
   * Get current path's metadata **without cache** directly.
   *
   * ### Notes
   * Use stat if you:
   *
   * - Want to detect the outside changes of a path.
   * - Don’t want to read from cached metadata.
   *
   * You may want to use `metadata` if you are working with entries returned by `Lister`. It’s highly possible that metadata you want has already been cached.
   *
   * ### Example
   * ```javascript
   * const meta = await op.stat("test");
   * if (meta.isDir) {
   *   // do something
   * }
   * ```
   */
  stat(path: string, options?: StatOptions | undefined | null): Promise<Metadata>
  /**
   * Get current path's metadata **without cache** directly and synchronously.
   *
   * ### Example
   * ```javascript
   * const meta = op.statSync("test");
   * if (meta.isDir) {
   *   // do something
   * }
   * ```
   */
  statSync(path: string, options?: StatOptions | undefined | null): Metadata
  /**
   * Check if this operator can work correctly.
   *
   * We will send a `list` request to the given path and return any errors we met.
   *
   * ### Example
   * ```javascript
   * await op.check();
   * ```
   */
  check(): Promise<void>
  /**
   * Check the op synchronously.
   *
   * ### Example
   * ```javascript
   * op.checkSync();
   * ```
   */
  checkSync(): void
  /**
   * Check if this path exists or not.
   *
   * ### Example
   * ```javascript
   * await op.isExist("test");
   * ```
   */
  exists(path: string): Promise<boolean>
  /**
   * Check if this path exists or not synchronously.
   *
   * ### Example
   * ```javascript
   * op.isExistSync("test");
   * ```
   */
  existsSync(path: string): boolean
  /**
   * Create dir with a given path.
   *
   * ### Example
   * ```javascript
   * await op.createDir("path/to/dir/");
   * ```
   */
  createDir(path: string): Promise<void>
  /**
   * Create dir with a given path synchronously.
   *
   * ### Example
   * ```javascript
   * op.createDirSync("path/to/dir/");
   * ```
   */
  createDirSync(path: string): void
  /**
   * Read the whole path into a buffer.
   *
   * ### Example
   * ```javascript
   * const buf = await op.read("path/to/file");
   * ```
   */
  read(path: string, options?: ReadOptions | undefined | null): Promise<Buffer>
  /**
   * Create a reader to read the given path.
   *
   * It could be used to read large file in a streaming way.
   */
  reader(path: string, options?: ReaderOptions | undefined | null): Promise<Reader>
  /**
   * Read the whole path into a buffer synchronously.
   *
   * ### Example
   * ```javascript
   * const buf = op.readSync("path/to/file");
   * ```
   */
  readSync(path: string, options?: ReadOptions | undefined | null): Buffer
  /**
   * Create a reader to read the given path synchronously.
   *
   * It could be used to read large file in a streaming way.
   */
  readerSync(path: string, options?: ReaderOptions | undefined | null): BlockingReader
  /**
   * Write bytes into a path.
   *
   * ### Example
   * ```javascript
   * await op.write("path/to/file", Buffer.from("hello world"));
   * // or
   * await op.write("path/to/file", "hello world");
   * // or
   * await op.write("path/to/file", Buffer.from("hello world"), { contentType: "text/plain" });
   * ```
   */
  write(path: string, content: Buffer | string, options?: WriteOptions | undefined | null): Promise<Metadata>
  /**
   * Write multiple bytes into a path.
   *
   * It could be used to write large file in a streaming way.
   */
  writer(path: string, options?: WriteOptions | undefined | null): Promise<Writer>
  /**
   * Write multiple bytes into a path synchronously.
   *
   * It could be used to write large file in a streaming way.
   */
  writerSync(path: string, options?: WriteOptions | undefined | null): BlockingWriter
  /**
   * Write bytes into a path synchronously.
   *
   * ### Example
   * ```javascript
   * op.writeSync("path/to/file", Buffer.from("hello world"));
   * // or
   * op.writeSync("path/to/file", "hello world");
   * // or
   * op.writeSync("path/to/file", Buffer.from("hello world"), { contentType: "text/plain" });
   * ```
   */
  writeSync(path: string, content: Buffer | string, options?: WriteOptions | undefined | null): Metadata
  /**
   * Copy file according to given `from` and `to` path.
   *
   * ### Example
   * ```javascript
   * await op.copy("path/to/file", "path/to/dest");
   * ```
   */
  copy(from: string, to: string): Promise<void>
  /**
   * Copy file according to given `from` and `to` path synchronously.
   *
   * ### Example
   * ```javascript
   * op.copySync("path/to/file", "path/to/dest");
   * ```
   */
  copySync(from: string, to: string): void
  /**
   * Rename file according to given `from` and `to` path.
   *
   * It's similar to `mv` command.
   *
   * ### Example
   * ```javascript
   * await op.rename("path/to/file", "path/to/dest");
   * ```
   */
  rename(from: string, to: string): Promise<void>
  /**
   * Rename file according to given `from` and `to` path synchronously.
   *
   * It's similar to `mv` command.
   *
   * ### Example
   * ```javascript
   * op.renameSync("path/to/file", "path/to/dest");
   * ```
   */
  renameSync(from: string, to: string): void
  /**
   * Delete the given path.
   *
   * ### Notes
   * Delete not existing error won’t return errors.
   *
   * ### Example
   * ```javascript
   * await op.delete("test");
   * ```
   */
  delete(path: string, options?: DeleteOptions | undefined | null): Promise<void>
  /**
   * Delete the given path synchronously.
   *
   * ### Example
   * ```javascript
   * op.deleteSync("test");
   * ```
   */
  deleteSync(path: string, options?: DeleteOptions | undefined | null): void
  /**
   * Remove given paths.
   *
   * ### Notes
   * If underlying services support delete in batch, we will use batch delete instead.
   *
   * ### Examples
   * ```javascript
   * await op.remove(["abc", "def"]);
   * ```
   */
  remove(paths: Array<string>): Promise<void>
  /**
   * Remove given paths.
   *
   * ### Notes
   * If underlying services support delete in batch, we will use batch delete instead.
   *
   * ### Examples
   * ```javascript
   * op.removeSync(["abc", "def"]);
   * ```
   */
  removeSync(paths: Array<string>): void
  /**
   * Remove the path and all nested dirs and files recursively.
   *
   * ### Notes
   * If underlying services support delete in batch, we will use batch delete instead.
   *
   * ### Examples
   * ```javascript
   * await op.removeAll("path/to/dir/");
   * ```
   */
  removeAll(path: string): Promise<void>
  /**
   * Remove the path and all nested dirs and files recursively.
   *
   * ### Notes
   * If underlying services support delete in batch, we will use batch delete instead.
   *
   * ### Examples
   * ```javascript
   * op.removeAllSync("path/to/dir/");
   * ```
   */
  removeAllSync(path: string): void
  /**
   * List the given path.
   *
   * This function will return an array of entries.
   *
   * An error will be returned if given path doesn't end with `/`.
   *
   * ### Example
   *
   * ```javascript
   * const list = await op.list("path/to/dir/");
   * for (let entry of list) {
   *   let meta = await op.stat(entry.path);
   *   if (meta.isFile) {
   *     // do something
   *   }
   * }
   * ```
   *
   * #### List recursively
   *
   * With `recursive` option, you can list recursively.
   *
   * ```javascript
   * const list = await op.list("path/to/dir/", { recursive: true });
   * for (let entry of list) {
   *   let meta = await op.stat(entry.path);
   *   if (meta.isFile) {
   *     // do something
   *   }
   * }
   * ```
   */
  list(path: string, options?: ListOptions | undefined | null): Promise<Array<Entry>>
  /**
   * List the given path synchronously.
   *
   * This function will return an array of entries.
   *
   * An error will be returned if given path doesn't end with `/`.
   *
   * ### Example
   *
   * ```javascript
   * const list = op.listSync("path/to/dir/");
   * for (let entry of list) {
   *   let meta = op.statSync(entry.path);
   *   if (meta.isFile) {
   *     // do something
   *   }
   * }
   * ```
   *
   * #### List recursively
   *
   * With `recursive` option, you can list recursively.
   *
   * ```javascript
   * const list = op.listSync("path/to/dir/", { recursive: true });
   * for (let entry of list) {
   *   let path = entry.path();
   *   let meta = entry.metadata();
   *   if (meta.isFile) {
   *     // do something
   *   }
   * }
   * ```
   */
  listSync(path: string, options?: ListOptions | undefined | null): Array<Entry>
  /**
   * Create a lister to list entries at given path.
   *
   * This function returns a Lister that can be used to iterate over entries
   * in a streaming manner, which is more memory-efficient for large directories.
   *
   * An error will be returned if given path doesn't end with `/`.
   *
   * ### Example
   *
   * ```javascript
   * const lister = await op.lister("path/to/dir/");
   * let entry;
   * while ((entry = await lister.next()) !== null) {
   *   console.log(entry.path());
   * }
   * ```
   *
   * #### List recursively
   *
   * With `recursive` option, you can list recursively.
   *
   * ```javascript
   * const lister = await op.lister("path/to/dir/", { recursive: true });
   * let entry;
   * while ((entry = await lister.next()) !== null) {
   *   console.log(entry.path());
   * }
   * ```
   */
  lister(path: string, options?: ListOptions | undefined | null): Promise<Lister>
  /**
   * Create a lister to list entries at given path synchronously.
   *
   * This function returns a BlockingLister that can be used to iterate over entries
   * in a streaming manner, which is more memory-efficient for large directories.
   *
   * An error will be returned if given path doesn't end with `/`.
   *
   * ### Example
   *
   * ```javascript
   * const lister = op.listerSync("path/to/dir/");
   * let entry;
   * while ((entry = lister.next()) !== null) {
   *   console.log(entry.path());
   * }
   * ```
   *
   * #### List recursively
   *
   * With `recursive` option, you can list recursively.
   *
   * ```javascript
   * const lister = op.listerSync("path/to/dir/", { recursive: true });
   * let entry;
   * while ((entry = lister.next()) !== null) {
   *   console.log(entry.path());
   * }
   * ```
   */
  listerSync(path: string, options?: ListOptions | undefined | null): BlockingLister
  /**
   * Get a presigned request for read.
   *
   * Unit of `expires` is seconds.
   *
   * ### Example
   *
   * ```javascript
   * const req = await op.presignRead(path, parseInt(expires));
   *
   * console.log("method: ", req.method);
   * console.log("url: ", req.url);
   * console.log("headers: ", req.headers);
   * ```
   */
  presignRead(path: string, expires: number): Promise<PresignedRequest>
  /**
   * Get a presigned request for `write`.
   *
   * Unit of `expires` is seconds.
   *
   * ### Example
   *
   * ```javascript
   * const req = await op.presignWrite(path, parseInt(expires));
   *
   * console.log("method: ", req.method);
   * console.log("url: ", req.url);
   * console.log("headers: ", req.headers);
   * ```
   */
  presignWrite(path: string, expires: number): Promise<PresignedRequest>
  /**
   * Get a presigned request for stat.
   *
   * Unit of `expires` is seconds.
   *
   * ### Example
   *
   * ```javascript
   * const req = await op.presignStat(path, parseInt(expires));
   *
   * console.log("method: ", req.method);
   * console.log("url: ", req.url);
   * console.log("headers: ", req.headers);
   * ```
   */
  presignStat(path: string, expires: number): Promise<PresignedRequest>
  /** Add a layer to this operator. */
  layer(layer: ExternalObject<Layer>): Operator
}

/**
 * Reader is designed to read data from a given path in an asynchronous
 * manner.
 */
export declare class Reader {
  /**
   * # Safety
   *
   * > &mut self in async napi methods should be marked as unsafe
   *
   * Read bytes from this reader into given buffer.
   */
  read(buf: Buffer): Promise<bigint>
}

/**
 * Retry layer
 *
 * Add retry for temporary failed operations.
 *
 * # Notes
 *
 * This layer will retry failed operations when [`Error::is_temporary`]
 * returns true.
 * If the operation still failed, this layer will set error to
 * `Persistent` which means error has been retried.
 *
 * `write` and `blocking_write` don't support retry so far,
 * visit [this issue](https://github.com/apache/opendal/issues/1223) for more details.
 *
 * # Examples
 *
 * ```javascript
 * const op = new Operator("fs", { root: "/tmp" })
 *
 * const retry = new RetryLayer();
 * retry.max_times = 3;
 * retry.jitter = true;
 *
 * op.layer(retry.build());
 * ```
 */
export declare class RetryLayer {
  constructor()
  /**
   * Set jitter of current backoff.
   *
   * If jitter is enabled, ExponentialBackoff will add a random jitter in `[0, min_delay)`
   * to current delay.
   */
  set jitter(v: boolean)
  /**
   * Set max_times of current backoff.
   *
   * Backoff will return `None` if max times are reached.
   */
  set maxTimes(v: number)
  /**
   * Set factor of current backoff.
   *
   * # Panics
   *
   * This function will panic if the input factor is smaller than `1.0`.
   */
  set factor(v: number)
  /**
   * Set max_delay of current backoff.
   *
   * Delay will not increase if the current delay is larger than max_delay.
   *
   * # Notes
   *
   * - The unit of max_delay is millisecond.
   */
  set maxDelay(v: number)
  /**
   * Set min_delay of current backoff.
   *
   * # Notes
   *
   * - The unit of min_delay is millisecond.
   */
  set minDelay(v: number)
  build(): ExternalObject<Layer>
}

/**
 * Throttle layer
 *
 * Add a bandwidth rate limiter to the underlying services.
 *
 * # Throttle
 *
 * There are several algorithms when it come to rate limiting techniques.
 * This throttle layer uses Generic Cell Rate Algorithm (GCRA) provided by Governor.
 * By setting the `bandwidth` and `burst`, we can control the byte flow rate of underlying services.
 *
 * # Note
 *
 * When setting the ThrottleLayer, always consider the largest possible operation size as the burst size,
 * as **the burst size should be larger than any possible byte length to allow it to pass through**.
 *
 * # Examples
 *
 * This example limits bandwidth to 10 KiB/s and burst size to 10 MiB.
 *
 * ```javascript
 * const op = new Operator("fs", { root: "/tmp" })
 *
 * const throttle = new ThrottleLayer(10 * 1024, 10000 * 1024);
 * op.layer(throttle.build());
 * ```
 */
export declare class ThrottleLayer {
  /**
   * Create a new `ThrottleLayer` with given bandwidth and burst.
   *
   * # Arguments
   *
   * - `bandwidth`: the maximum number of bytes allowed to pass through per second.
   * - `burst`: the maximum number of bytes allowed to pass through at once.
   *
   * # Notes
   *
   * Validation (bandwidth and burst must be greater than 0) is handled by the Rust core layer.
   */
  constructor(bandwidth: number, burst: number)
  build(): ExternalObject<Layer>
}

/**
 * Timeout layer
 *
 * Add timeout for every operation to avoid slow or unexpected hang operations.
 *
 * # Notes
 *
 * `TimeoutLayer` treats all operations in two kinds:
 *
 * - Non IO Operation like `stat`, `delete` they operate on a single file. We control
 *   them by setting `timeout`.
 * - IO Operation like `read`, `Reader::read` and `Writer::write`, they operate on data directly, we
 *   control them by setting `io_timeout`.
 *
 * # Default
 *
 * - timeout: 60 seconds
 * - io_timeout: 10 seconds
 *
 * # Examples
 *
 * ```javascript
 * const op = new Operator("fs", { root: "/tmp" })
 *
 * const timeout = new TimeoutLayer();
 * timeout.timeout = 10000;      // 10 seconds for non-IO ops (in milliseconds)
 * timeout.ioTimeout = 3000;     // 3 seconds for IO ops (in milliseconds)
 *
 * op.layer(timeout.build());
 * ```
 */
export declare class TimeoutLayer {
  constructor()
  /**
   * Set timeout for non-IO operations (stat, delete, etc.)
   *
   * # Notes
   *
   * - The unit is millisecond.
   * - Default is 60000ms (60 seconds).
   */
  set timeout(v: number)
  /**
   * Set timeout for IO operations (read, write, etc.)
   *
   * # Notes
   *
   * - The unit is millisecond.
   * - Default is 10000ms (10 seconds).
   */
  set ioTimeout(v: number)
  build(): ExternalObject<Layer>
}

/**
 * Writer is designed to write data into a given path in an asynchronous
 * manner.
 */
export declare class Writer {
  /**
   * # Safety
   *
   * > &mut self in async napi methods should be marked as unsafe
   *
   * Write bytes into this writer.
   *
   * ### Example
   * ```javascript
   * const writer = await op.writer("path/to/file");
   * await writer.write(Buffer.from("hello world"));
   * await writer.close();
   * ```
   */
  write(content: Buffer | string): Promise<void>
  /**
   * # Safety
   *
   * > &mut self in async napi methods should be marked as unsafe
   *
   * Close this writer.
   *
   * ### Example
   * ```javascript
   * const writer = await op.writer("path/to/file");
   * await writer.write(Buffer.from("hello world"));
   * await writer.close();
   * ```
   */
  close(): Promise<void>
}

export interface DeleteOptions {
  version?: string
  /** Whether to delete recursively. */
  recursive?: boolean
}

export declare const enum EntryMode {
  /** FILE means the path has data to read. */
  FILE = 0,
  /** DIR means the path can be listed. */
  DIR = 1,
  /** Unknown means we don't know what we can do on this path. */
  Unknown = 2
}

export interface ListOptions {
  /** * The limit passed to underlying service to specify the max results
   * that could return per-request.
   *
   * Users could use this to control the memory usage of list operation.
   */
  limit?: number
  /** * The start_after passed to underlying service to specify the specified key
   * to start listing from.
   */
  startAfter?: string
  /** * The recursive is used to control whether the list operation is recursive.
   *
   * - If `false`, list operation will only list the entries under the given path.
   * - If `true`, list operation will list all entries that starts with given path.
   *
   * Default to `false`.
   */
  recursive?: boolean
  /** * The versions is used to control whether the object versions should be returned.
   *
   * - If `false`, list operation will not return with object versions
   * - If `true`, list operation will return with object versions if object versioning is supported
   *   by the underlying service
   *
   * Default to `false`
   */
  versions?: boolean
  /** * The deleted is used to control whether the deleted objects should be returned.
   *
   * - If `false`, list operation will not return with deleted objects
   * - If `true`, list operation will return with deleted objects if object versioning is supported
   *   by the underlying service
   *
   * Default to `false`
   */
  deleted?: boolean
}

/** PresignedRequest is a presigned request return by `presign`. */
export interface PresignedRequest {
  /** HTTP method of this request. */
  method: string
  /** URL of this request. */
  url: string
  /** HTTP headers of this request. */
  headers: Record<string, string>
}

export interface ReaderOptions {
  /** * Set `version` for this operation.
   *
   * This option can be used to retrieve the data of a specified version of the given path.
   */
  version?: string
  /** * Set `concurrent` for the operation.
   *
   * OpenDAL by default to read file without concurrent. This is not efficient for cases when users
   * read large chunks of data. By setting `concurrent`, opendal will reading files concurrently
   * on support storage services.
   *
   * By setting `concurrent`, opendal will fetch chunks concurrently with
   * the give chunk size.
   */
  concurrent?: number
  /** * Sets the chunk size for this operation.
   *
   * OpenDAL will use services' preferred chunk size by default. Users can set chunk based on their own needs.
   */
  chunk?: number
  /** Controls the number of prefetched bytes ranges that can be buffered in memory
   * during concurrent reading.
   *
   * When performing concurrent reads with `Reader`, this option limits how many
   * completed-but-not-yet-read chunks can be buffered. Once the number of buffered
   * chunks reaches this limit, no new read tasks will be spawned until some of the
   * buffered chunks are consumed.
   *
   * - Default value: 0 (no prefetching, strict back-pressure control)
   * - Set to a higher value to allow more aggressive prefetching at the cost of memory
   *
   * This option helps prevent memory exhaustion when reading large files with high
   * concurrency settings.
   */
  prefetch?: number
  /** * Controls the optimization strategy for range reads in [`Reader::fetch`].
   *
   * When performing range reads, if the gap between two requested ranges is smaller than
   * the configured `gap` size, OpenDAL will merge these ranges into a single read request
   * and discard the unrequested data in between. This helps reduce the number of API calls
   * to remote storage services.
   *
   * This optimization is particularly useful when performing multiple small range reads
   * that are close to each other, as it reduces the overhead of multiple network requests
   * at the cost of transferring some additional data.
   */
  gap?: bigint
  /** * Sets if-match condition for this operation.
   * If file exists and its etag doesn't match, an error will be returned.
   */
  ifMatch?: string
  /** * Sets if-none-match condition for this operation.
   * If file exists and its etag matches, an error will be returned.
   */
  ifNoneMatch?: string
  /** * Sets if-modified-since condition for this operation.
   * If file exists and hasn't been modified since the specified time, an error will be returned.
   * ISO 8601 formatted date string
   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
   */
  ifModifiedSince?: string
  /** * Sets if-unmodified-since condition for this operation.
   * If file exists and has been modified since the specified time, an error will be returned.
   * ISO 8601 formatted date string
   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
   */
  ifUnmodifiedSince?: string
}

export interface ReadOptions {
  /** * Set `version` for this operation.
   *
   * This option can be used to retrieve the data of a specified version of the given path.
   */
  version?: string
  /** * Set `concurrent` for the operation.
   *
   * OpenDAL by default to read file without concurrent. This is not efficient for cases when users
   * read large chunks of data. By setting `concurrent`, opendal will reading files concurrently
   * on support storage services.
   *
   * By setting `concurrent`, opendal will fetch chunks concurrently with
   * the give chunk size.
   */
  concurrent?: number
  /** * Sets the chunk size for this operation.
   *
   * OpenDAL will use services' preferred chunk size by default. Users can set chunk based on their own needs.
   */
  chunk?: number
  /** * Controls the optimization strategy for range reads in [`Reader::fetch`].
   *
   * When performing range reads, if the gap between two requested ranges is smaller than
   * the configured `gap` size, OpenDAL will merge these ranges into a single read request
   * and discard the unrequested data in between. This helps reduce the number of API calls
   * to remote storage services.
   *
   * This optimization is particularly useful when performing multiple small range reads
   * that are close to each other, as it reduces the overhead of multiple network requests
   * at the cost of transferring some additional data.
   */
  gap?: bigint
  /** * Sets the offset (starting position) for range read operations.
   * The read will start from this position in the file.
   */
  offset?: bigint
  /** * Sets the size (length) for range read operations.
   * The read will continue for this many bytes after the offset.
   */
  size?: bigint
  /** * Sets if-match condition for this operation.
   * If file exists and its etag doesn't match, an error will be returned.
   */
  ifMatch?: string
  /** * Sets if-none-match condition for this operation.
   * If file exists and its etag matches, an error will be returned.
   */
  ifNoneMatch?: string
  /** * Sets if-modified-since condition for this operation.
   * If file exists and hasn't been modified since the specified time, an error will be returned.
   * ISO 8601 formatted date string
   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
   */
  ifModifiedSince?: string
  /** * Sets if-unmodified-since condition for this operation.
   * If file exists and has been modified since the specified time, an error will be returned.
   * ISO 8601 formatted date string
   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
   */
  ifUnmodifiedSince?: string
  /** * Specify the `content-type` header that should be sent back by the operation.
   *
   * This option is only meaningful when used along with presign.
   */
  contentType?: string
  /** * Specify the `cache-control` header that should be sent back by the operation.
   *
   * This option is only meaningful when used along with presign.
   */
  cacheControl?: string
  /** * Specify the `content-disposition` header that should be sent back by the operation.
   *
   * This option is only meaningful when used along with presign.
   */
  contentDisposition?: string
}

export interface StatOptions {
  /** * Sets version for this operation.
   * Retrieves data of a specified version of the given path.
   */
  version?: string
  /** * Sets if-match condition for this operation.
   * If file exists and its etag doesn't match, an error will be returned.
   */
  ifMatch?: string
  /** * Sets if-none-match condition for this operation.
   * If file exists and its etag matches, an error will be returned.
   */
  ifNoneMatch?: string
  /** * Sets if-modified-since condition for this operation.
   * If file exists and hasn't been modified since the specified time, an error will be returned.
   * ISO 8601 formatted date string
   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
   */
  ifModifiedSince?: string
  /** * Sets if-unmodified-since condition for this operation.
   * If file exists and has been modified since the specified time, an error will be returned.
   * ISO 8601 formatted date string
   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
   */
  ifUnmodifiedSince?: string
  /** * Specifies the content-type header for presigned operations.
   * Only meaningful when used along with presign.
   */
  overrideContentType?: string
  /** * Specifies the cache-control header for presigned operations.
   * Only meaningful when used along with presign.
   */
  overrideCacheControl?: string
  /** * Specifies the content-disposition header for presigned operations.
   * Only meaningful when used along with presign.
   */
  overrideContentDisposition?: string
}

export interface WriteOptions {
  /**
   * Append bytes into a path.
   *
   * ### Notes
   *
   * - It always appends content to the end of the file.
   * - It will create file if the path does not exist.
   */
  append?: boolean
  /**
   * Set the chunk of op.
   *
   * If chunk is set, the data will be chunked by the underlying writer.
   *
   * ## NOTE
   *
   * A service could have their own minimum chunk size while perform write
   * operations like multipart uploads. So the chunk size may be larger than
   * the given buffer size.
   */
  chunk?: bigint
  /** Set the [Content-Type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type) of op. */
  contentType?: string
  /** Set the [Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) of op. */
  contentDisposition?: string
  /** Set the [Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) of op. */
  cacheControl?: string
  /** Set the [Content-Encoding] https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Encoding of op. */
  contentEncoding?: string
  /**
   * Sets user metadata of op.
   *
   * If chunk is set, the user metadata will be attached to the object during write.
   *
   * ## NOTE
   *
   * - Services may have limitations for user metadata, for example:
   *   - Key length is typically limited (e.g., 1024 bytes)
   *   - Value length is typically limited (e.g., 4096 bytes)
   *   - Total metadata size might be limited
   *   - Some characters might be forbidden in keys
   */
  userMetadata?: Record<string, string>
  /**
   * Sets if-match condition of op.
   *
   * This operation provides conditional write functionality based on ETag matching,
   * helping prevent unintended overwrites in concurrent scenarios.
   */
  ifMatch?: string
  /**
   * Sets if-none-match condition of op.
   *
   * This operation provides conditional write functionality based on ETag non-matching,
   * useful for preventing overwriting existing resources or ensuring unique writes.
   */
  ifNoneMatch?: string
  /**
   * Sets if_not_exists condition of op.
   *
   * This operation provides a way to ensure write operations only create new resources
   * without overwriting existing ones, useful for implementing "create if not exists" logic.
   */
  ifNotExists?: boolean
  /**
   * Sets concurrent of op.
   *
   * - By default, OpenDAL writes files sequentially
   * - When concurrent is set:
   *   - Multiple write operations can execute in parallel
   *   - Write operations return immediately without waiting if tasks space are available
   *   - Close operation ensures all writes complete in order
   *   - Memory usage increases with concurrency level
   */
  concurrent?: number
}
