// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
// This module is browser compatible.

/**
 * An abstract interface which when implemented provides an interface to read bytes into an array buffer asynchronously.
 */
export interface Reader {
  /** Reads up to `p.byteLength` bytes into `p`. It resolves to the number of
   * bytes read (`0` < `n` <= `p.byteLength`) and rejects if any error
   * encountered. Even if `read()` resolves to `n` < `p.byteLength`, it may
   * use all of `p` as scratch space during the call. If some data is
   * available but not `p.byteLength` bytes, `read()` conventionally resolves
   * to what is available instead of waiting for more.
   *
   * When `read()` encounters end-of-file condition, it resolves to EOF
   * (`null`).
   *
   * When `read()` encounters an error, it rejects with an error.
   *
   * Callers should always process the `n` > `0` bytes returned before
   * considering the EOF (`null`). Doing so correctly handles I/O errors that
   * happen after reading some bytes and also both of the allowed EOF
   * behaviors.
   *
   * Implementations should not retain a reference to `p`.
   *
   * Use iterateReader() from https://deno.land/std@$STD_VERSION/streams/iterate_reader.ts to turn a Reader into an
   * AsyncIterator.
   */
  read(p: Uint8Array): Promise<number | null>;
}

/**
 * An abstract interface which when implemented provides an interface to read bytes into an array buffer synchronously.
 */
export interface ReaderSync {
  /** Reads up to `p.byteLength` bytes into `p`. It resolves to the number
   * of bytes read (`0` < `n` <= `p.byteLength`) and rejects if any error
   * encountered. Even if `read()` returns `n` < `p.byteLength`, it may use
   * all of `p` as scratch space during the call. If some data is available
   * but not `p.byteLength` bytes, `read()` conventionally returns what is
   * available instead of waiting for more.
   *
   * When `readSync()` encounters end-of-file condition, it returns EOF
   * (`null`).
   *
   * When `readSync()` encounters an error, it throws with an error.
   *
   * Callers should always process the `n` > `0` bytes returned before
   * considering the EOF (`null`). Doing so correctly handles I/O errors that happen
   * after reading some bytes and also both of the allowed EOF behaviors.
   *
   * Implementations should not retain a reference to `p`.
   *
   * Use iterateReaderSync() from https://deno.land/std@$STD_VERSION/streams/iterate_reader.ts to turn a ReaderSync
   * into an Iterator.
   */
  readSync(p: Uint8Array): number | null;
}

/**
 * An abstract interface which when implemented provides an interface to write bytes from an array buffer to a file/resource asynchronously.
 */
export interface Writer {
  /** Writes `p.byteLength` bytes from `p` to the underlying data stream. It
   * resolves to the number of bytes written from `p` (`0` <= `n` <=
   * `p.byteLength`) or reject with the error encountered that caused the
   * write to stop early. `write()` must reject with a non-null error if
   * would resolve to `n` < `p.byteLength`. `write()` must not modify the
   * slice data, even temporarily.
   *
   * Implementations should not retain a reference to `p`.
   */
  write(p: Uint8Array): Promise<number>;
}
/**
 * An abstract interface which when implemented provides an interface to write bytes from an array buffer to a file/resource synchronously.
 */
export interface WriterSync {
  /** Writes `p.byteLength` bytes from `p` to the underlying data
   * stream. It returns the number of bytes written from `p` (`0` <= `n`
   * <= `p.byteLength`) and any error encountered that caused the write to
   * stop early. `writeSync()` must throw a non-null error if it returns `n` <
   * `p.byteLength`. `writeSync()` must not modify the slice data, even
   * temporarily.
   *
   * Implementations should not retain a reference to `p`.
   */
  writeSync(p: Uint8Array): number;
}

/**
 * An abstract interface which when implemented provides an interface to close files/resources that were previously opened.
 */
export interface Closer {
  /** Closes the resource, "freeing" the backing file/resource. */
  close(): void;
}

// denoCacheMetadata={"headers":{"date":"Sun, 21 Jun 2026 05:15:29 GMT","cache-status":"deno; fwd=uri-miss; stored","cross-origin-embedder-policy":"same-origin","access-control-allow-origin":"*","content-length":"4203","via":"1.1 fa63af50c0e4f34ddecf2b2d0dca224e.cloudfront.net (CloudFront),HTTP/2 ams.vultr.prod.deno-cluster.net","alt-svc":"h3=\":443\"; ma=86400","x-amz-server-side-encryption":"AES256","referrer-policy":"strict-origin-when-cross-origin","x-frame-options":"DENY","x-amz-replication-status":"COMPLETED","etag":"\"64845a999aa1b13c17be1960062012ec\"","x-deno-trace-id":"13d1b1366916edc8552c117657f1d1ab","x-content-type-options":"nosniff","x-amz-version-id":"sW8a70KF_mdqRQs9a7NxABzKEm_.tyBA","x-amz-cf-pop":"AMS58-P5","accept-ranges":"bytes","age":"967961","cache-control":"public, max-age=31536000, immutable","server":"AmazonS3,deployd","x-amz-cf-id":"aSBe-qS9yoUXEdqYhvBjTcbtY6TKdSkPtEZKn7IrsGzOZcYDWmgodQ==","content-type":"application/typescript; charset=utf-8","cross-origin-resource-policy":"same-origin","vary":"Origin","content-security-policy":"default-src 'none'; style-src 'unsafe-inline'; sandbox","last-modified":"Thu, 15 Feb 2024 05:02:28 GMT","x-cache":"Hit from cloudfront","strict-transport-security":"max-age=63072000; includeSubDomains; preload","cross-origin-opener-policy":"same-origin","server-timing":"fetchSource;dur=7"},"url":"https://deno.land/std@0.216.0/io/types.ts","time":1782986889}