{"version":3,"sources":["../src/builders.ts","../src/environments.ts","../src/errors.ts","../src/AuthorizationService.ts","../src/types.ts","../src/utils.ts","../src/StorageClient.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n  EvmAddress,\n  GenericAcl,\n  ImmutableAcl,\n  LensAccountAcl,\n  WalletAddressAcl,\n} from './types';\n\n/**\n * This ACL template restricts access to any given Wallet Address.\n *\n * @param address - The Wallet Address that can edit/delete the resource.\n * @param chainId - The Chain ID that the resource is bound to. See supported chains.\n */\nexport function walletOnly(\n  address: EvmAddress,\n  chainId: number,\n): WalletAddressAcl {\n  return { template: 'wallet_address', walletAddress: address, chainId };\n}\n\n/**\n * This ACL template restricts access to any given Lens Account.\n *\n * @param account - The Lens Account that can edit/delete the resource.\n * @param chainId - The Lens Chain ID that the resource is bound to.\n */\nexport function lensAccountOnly(\n  account: EvmAddress,\n  chainId: number,\n): LensAccountAcl {\n  return { template: 'lens_account', chainId, lensAccount: account };\n}\n\n/**\n * This ACL declare the resource as immutable.\n *\n * It requires to specify the chain ID that the resource is bound to.\n */\nexport function immutable(chainId: number): ImmutableAcl {\n  return { template: 'immutable', chainId };\n}\n\n/**\n * This ACL template restricts access to any given address that satisfies the contract call evaluation.\n *\n * @param chainId - The Chain ID that the resource is bound to. See supported chains.\n * @returns A builder to create a Generic ACL template.\n */\nexport function genericAcl(chainId: number): GenericAclTemplateBuilder {\n  return new GenericAclTemplateBuilder(chainId);\n}\n\nclass GenericAclTemplateBuilder {\n  private acl: Partial<GenericAcl> = { template: 'generic_acl' };\n\n  constructor(chainId: number) {\n    this.acl.chainId = chainId;\n  }\n\n  reset(): void {\n    this.acl = { template: 'generic_acl' };\n  }\n\n  withContractAddress(contractAddress: string): this {\n    this.acl.contractAddress = contractAddress;\n    return this;\n  }\n\n  withFunctionSig(functionSig: string): this {\n    this.acl.functionSig = functionSig;\n    return this;\n  }\n\n  withParams(params: string[]): this {\n    this.acl.params = params;\n    return this;\n  }\n\n  build(): GenericAcl {\n    if (!this.isValid(this.acl)) {\n      throw new Error('GenericAclTemplate is missing required fields');\n    }\n    return this.acl as GenericAcl;\n  }\n\n  private isValid(acl: Partial<GenericAcl>): acl is GenericAcl {\n    return !!(\n      acl.template === 'generic_acl' &&\n      acl.contractAddress &&\n      acl.functionSig &&\n      acl.params &&\n      acl.chainId\n    );\n  }\n}\n","/**\n * The environment configuration type.\n */\nexport type EnvironmentConfig = {\n  name: string;\n  backend: string;\n  defaultChainId: number;\n  cachingTimeout: number;\n  propagationTimeout: number;\n  statusPollingInterval: number;\n};\n\n/**\n * The production environment configuration.\n */\nexport const production: EnvironmentConfig = {\n  name: 'production',\n  backend: 'https://api.grove.storage',\n  defaultChainId: 232,\n  cachingTimeout: 5000,\n  propagationTimeout: 10000,\n  statusPollingInterval: 500,\n};\n\n/**\n * @internal\n */\nexport const staging: EnvironmentConfig = {\n  name: 'staging',\n  backend: 'https://api.staging.grove.storage',\n  defaultChainId: 37111,\n  cachingTimeout: 10000,\n  propagationTimeout: 20000,\n  statusPollingInterval: 500,\n};\n\n/**\n * @internal\n */\nexport const local: EnvironmentConfig = {\n  name: 'local',\n  backend: 'http://localhost:30371110',\n  defaultChainId: 37111,\n  cachingTimeout: 0, // no caching\n  propagationTimeout: 30000,\n  statusPollingInterval: 500,\n};\n","class BaseError extends Error {\n  static async fromResponse(response: Response) {\n    try {\n      const { message } = await response.clone().json();\n\n      // biome-ignore lint/complexity/noThisInStatic: need this to create the correct error type\n      return new this(message);\n    } catch (_) {\n      // biome-ignore lint/complexity/noThisInStatic: need this to create the correct error type\n      return new this(await response.text());\n    }\n  }\n\n  static from(args: unknown) {\n    if (args instanceof Error) {\n      const message = BaseError.formatMessage(args);\n      // biome-ignore lint/complexity/noThisInStatic: need this to create the correct error type\n      return new this(message, { cause: args });\n    }\n    // biome-ignore lint/complexity/noThisInStatic: need this to create the correct error type\n    return new this(String(args));\n  }\n\n  private static formatMessage(cause: Error): string {\n    const messages: string[] = [];\n    let currentError: unknown = cause;\n\n    while (currentError instanceof Error) {\n      messages.push(currentError.message);\n      currentError = currentError.cause;\n    }\n\n    return messages.join(' due to ');\n  }\n}\n\nexport class AuthorizationError extends BaseError {\n  name = 'AuthorizationError' as const;\n\n  private constructor(message: string) {\n    super(message);\n  }\n}\n\nexport class StorageClientError extends BaseError {\n  name = 'StorageClientError' as const;\n\n  private constructor(message: string) {\n    super(message);\n  }\n}\n\n/**\n * An error that occurs when a task violates a logical condition that is assumed to be true at all times.\n */\nexport class InvariantError extends Error {\n  name = 'InvariantError' as const;\n}\n","import type { EnvironmentConfig } from './environments';\nimport { AuthorizationError } from './errors';\nimport type { Signer } from './types';\n\nexport type Authorization = {\n  challengeId: string;\n  secret: string;\n};\n\ntype Challenge = {\n  message: string;\n  secret_random: string;\n};\n\ntype SignedChallenge = Challenge & {\n  signature: string;\n};\n\ntype SignedChallengeResponse = {\n  challenge_cid: string;\n};\n\nexport class AuthorizationService {\n  constructor(private readonly env: EnvironmentConfig) {}\n\n  async authorize(\n    action: 'delete' | 'edit',\n    storageKey: string,\n    signer: Signer,\n  ): Promise<Authorization> {\n    const challenge = await this.requestChallenge(action, storageKey);\n\n    const signature = await signer.signMessage({\n      message: challenge.message,\n    });\n\n    const { challenge_cid } = await this.submitSignedChallenge({\n      ...challenge,\n      signature,\n    });\n\n    return {\n      challengeId: challenge_cid,\n      secret: challenge.secret_random,\n    };\n  }\n\n  private async requestChallenge(\n    action: 'delete' | 'edit',\n    storageKey: string,\n  ): Promise<Challenge> {\n    const response = await fetch(`${this.env.backend}/challenge/new`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        storage_key: storageKey,\n        action: action,\n      }),\n    });\n\n    if (!response.ok) {\n      throw await AuthorizationError.fromResponse(response);\n    }\n\n    return response.json();\n  }\n\n  private async submitSignedChallenge(\n    challenge: SignedChallenge,\n  ): Promise<SignedChallengeResponse> {\n    const response = await fetch(`${this.env.backend}/challenge/sign`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify(challenge),\n    });\n\n    if (!response.ok) {\n      throw await AuthorizationError.fromResponse(response);\n    }\n\n    return response.json();\n  }\n}\n","import type { StorageClient } from './StorageClient';\n\nexport type EvmAddress = `0x${string}`;\n\nexport type GenericAcl = {\n  template: 'generic_acl';\n  chainId: number;\n  contractAddress: string;\n  functionSig: string;\n  // biome-ignore lint/suspicious/noExplicitAny: keep it simple\n  params: any[];\n};\n\nexport type ImmutableAcl = {\n  template: 'immutable';\n  chainId: number;\n};\n\nexport type LensAccountAcl = {\n  template: 'lens_account';\n  lensAccount: EvmAddress;\n  chainId: number;\n};\n\nexport type WalletAddressAcl = {\n  template: 'wallet_address';\n  walletAddress: EvmAddress;\n  chainId: number;\n};\n\nexport type AclConfig =\n  | GenericAcl\n  | ImmutableAcl\n  | LensAccountAcl\n  | WalletAddressAcl;\n\n/**\n * The marker used to identify the address of the signer attempting\n * to update or delete a resource.\n */\nexport const RECOVERED_ADDRESS_PARAM_MARKER = '<recovered_address>';\n\nexport interface Signer {\n  signMessage({ message }: { message: string }): Promise<string>;\n}\n\nexport type AccessOptions = {\n  /**\n   * The ACL configuration to use for the resource.\n   */\n  acl: AclConfig;\n};\n\nexport type UploadFileOptions = AccessOptions;\n\nexport type UploadJsonOptions = UploadFileOptions & {\n  /**\n   * The name of the file.\n   *\n   * @defaultValue `data.json`\n   */\n  name?: string;\n};\n\n/**\n * A factory function that, given the list of {@link Resource},\n * creates a JSON serializable object that will be used as the\n * directory index file.\n */\nexport type CreateIndexContent = (files: Resource[]) => unknown;\n\nexport type UploadFolderOptions = AccessOptions & {\n  /**\n   * Whether accession the resource URI should serve an folder indexing response.\n   * - If a {@link CreateIndexContent} function is provided, it will be called with the list of files in the folder. The returned file will be used as the directory index file.\n   * - If a `File` is provided, the file content will be used as the directory index file.\n   * - If `true`, it will server the default directory indexing response.\n   * - If `false`, it will server the folder's manifest file.\n   */\n  index?: CreateIndexContent | File | boolean;\n};\n\nexport type EditFileOptions = AccessOptions;\n\nexport type Resource = {\n  /**\n   * The `lens://…` URI of the resource.\n   */\n  uri: string;\n\n  /**\n   * The storage key of the resource.\n   */\n  storageKey: string;\n\n  /**\n   * The gateway URL of this resource.\n   */\n  gatewayUrl: string;\n};\n\nexport type UploadFolderResponse = {\n  files: Resource[];\n  folder: Resource;\n};\n\nabstract class UploadResponse {\n  constructor(\n    private readonly resource: Resource,\n    private readonly client: StorageClient,\n  ) {}\n  /**\n   * Wait until the resource is fully propagated to the underlying storage infrastructure.\n   *\n   * Edit and delete operations are only allowed after the resource if fully propagated.\n   *\n   * @throws a {@link StorageClientError} if the operation fails or times out.\n   */\n  async waitForPropagation(): Promise<void> {\n    return this.client.waitUntilStatus(\n      this.resource.storageKey,\n      ['done'],\n      this.client.env.propagationTimeout,\n    );\n  }\n}\n\nexport class FileUploadResponse extends UploadResponse {\n  /**\n   * The `lens://…` URI of the file.\n   */\n  public uri: string;\n\n  /**\n   * The storage key of the file.\n   */\n  public storageKey: string;\n\n  /**\n   * The gateway URL of this file.\n   */\n  public gatewayUrl: string;\n\n  constructor(resource: Resource, client: StorageClient) {\n    super(resource, client);\n    this.uri = resource.uri;\n    this.storageKey = resource.storageKey;\n    this.gatewayUrl = resource.gatewayUrl;\n  }\n}\n\nexport type DeleteResponse = {\n  /**\n   * Whether the deletion was successful.\n   */\n  success: boolean;\n};\n\n/**\n * @internal\n */\nexport type Status =\n  | 'available'\n  | 'dirty'\n  | 'done'\n  | 'error_delete'\n  | 'error_edit'\n  | 'error_upload'\n  | 'idle'\n  | 'new'\n  | 'pending'\n  | 'unauthorized';\n\n/**\n * @internal\n */\nexport type StatusResponse = {\n  /**\n   * The storage key of the resource.\n   */\n  storageKey: string;\n  /**\n   * The current status.\n   */\n  status: Status;\n  /**\n   * A percentage value between 0-100 indicating the progress of the resource's persistence.\n   *\n   * This is not linear and may experience jumps.\n   */\n  progress: number;\n};\n","import type { EnvironmentConfig } from './environments';\nimport { InvariantError } from './errors';\nimport type {\n  AclConfig,\n  CreateIndexContent,\n  Resource,\n  Status,\n  StatusResponse,\n} from './types';\n\n/**\n * Asserts that the given condition is truthy\n * @internal\n *\n * @param condition - Either truthy or falsy value\n * @param message - An error message\n */\nexport function invariant(\n  condition: unknown,\n  message: string,\n): asserts condition {\n  if (!condition) {\n    throw new InvariantError(message);\n  }\n}\n\n/**\n * @internal\n */\nexport function never(message = 'Unexpected call to never()'): never {\n  throw new InvariantError(message);\n}\n\n/**\n * @internal\n */\nexport function delay(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * @internal\n */\nexport type MultipartEntry = {\n  name: string;\n  file: File;\n};\n\n/**\n * @internal\n */\nexport type MultipartFormDataStream = {\n  boundary: string;\n  stream: ReadableStream<Uint8Array>;\n};\n\nasync function* multipartStream(\n  entries: readonly MultipartEntry[],\n  boundary: string,\n) {\n  for (const { name, file } of entries) {\n    yield `--${boundary}\\r\\n`;\n\n    yield `Content-Disposition: form-data; name=\"${name}\"; filename=\"${file.name}\"\\r\\n`;\n    yield `Content-Type: ${file.type}\\r\\n\\r\\n`;\n\n    const reader = file.stream().getReader();\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) break;\n      yield value;\n    }\n\n    yield '\\r\\n';\n  }\n\n  yield `--${boundary}--\\r\\n`;\n}\n\nfunction createMultipartStream(\n  entries: readonly MultipartEntry[],\n): MultipartFormDataStream {\n  const boundary = `----WebKitFormBoundary${Math.random().toString(36).substring(2)}`;\n\n  return {\n    stream: new ReadableStream({\n      async start(controller) {\n        for await (const chunk of multipartStream(entries, boundary)) {\n          if (typeof chunk === 'string') {\n            controller.enqueue(new TextEncoder().encode(chunk));\n          } else {\n            controller.enqueue(chunk); // Enqueue Uint8Array chunks directly\n          }\n        }\n        controller.close();\n      },\n    }),\n    boundary,\n  };\n}\n\nasync function detectStreamSupport(): Promise<boolean> {\n  let duplexAccessed = false;\n\n  const testStream = new ReadableStream({\n    start(controller) {\n      controller.enqueue(new Uint8Array([0])); // Minimal stream chunk\n      controller.close();\n    },\n  });\n\n  const request = new Request('data:text/plain;charset=utf-8,42', {\n    body: testStream,\n    method: 'POST',\n    // @ts-ignore\n    get duplex() {\n      duplexAccessed = true;\n      return 'half';\n    },\n  });\n\n  try {\n    const hasContentType = request.headers.has('Content-Type');\n\n    // If fails to handle fetch(Request), it's likely not a native implementation of\n    // Fetch API, so it's not supported.\n    await fetch(request.clone());\n    const body = await request.text();\n\n    return duplexAccessed && !hasContentType && body === '\\x00'; // 0 byte as character\n  } catch (_) {\n    return false;\n  }\n}\n\nfunction createFormData(entries: readonly MultipartEntry[]): FormData {\n  const formData = new FormData();\n\n  for (const { name, file } of entries) {\n    formData.append(name, file, file.name);\n  }\n\n  return formData;\n}\n\nfunction computeMultipartSize(\n  entries: readonly MultipartEntry[],\n  boundary: string,\n): number {\n  let size = 0;\n  const encoder = new TextEncoder();\n\n  for (const { name, file } of entries) {\n    // Each part starts with the boundary\n    size += encoder.encode(`--${boundary}\\r\\n`).length;\n\n    // Content-Disposition header\n    size += encoder.encode(\n      `Content-Disposition: form-data; name=\"${name}\"; filename=\"${file.name}\"\\r\\n`,\n    ).length;\n\n    // Content-Type header\n    size += encoder.encode(`Content-Type: ${file.type}\\r\\n\\r\\n`).length;\n\n    // File content size\n    size += file.size;\n\n    // CRLF after file content\n    size += encoder.encode('\\r\\n').length;\n  }\n\n  // Final boundary\n  size += encoder.encode(`--${boundary}--\\r\\n`).length;\n\n  return size;\n}\n\n/**\n * Creates a multipart/form-data {@link RequestInit} object from a list of entries.\n *\n * @internal\n */\nexport async function createMultipartRequestInit(\n  method: 'POST' | 'PUT',\n  entries: readonly MultipartEntry[],\n): Promise<RequestInit> {\n  if (await detectStreamSupport()) {\n    const { stream, boundary } = createMultipartStream(entries);\n\n    return {\n      method,\n      headers: {\n        'Content-Type': `multipart/form-data; boundary=${boundary}`,\n        'Content-Length': computeMultipartSize(entries, boundary).toString(),\n      },\n      body: stream,\n      // @ts-ignore\n      duplex: 'half', // Required for streaming request body in some browsers\n    };\n  }\n\n  // Fallback to FormData for browsers without ReadableStream support as Fetch body\n  const formData = createFormData(entries);\n\n  return {\n    method,\n    body: formData,\n  };\n}\n\n/**\n * The Lens URI scheme.\n */\nexport const LENS_SCHEME = 'lens';\n\nconst LENS_URI_SUFFIX = `${LENS_SCHEME}://`;\n\n/**\n * @internal\n */\nexport function extractStorageKey(storageKeyOrUri: string): string {\n  if (storageKeyOrUri.startsWith(LENS_URI_SUFFIX)) {\n    return storageKeyOrUri.slice(LENS_URI_SUFFIX.length);\n  }\n  return storageKeyOrUri;\n}\n\n/**\n * @internal\n */\nexport function resourceFrom(\n  storageKey: string,\n  env: EnvironmentConfig,\n): Resource {\n  return {\n    storageKey,\n    gatewayUrl: `${env.backend}/${storageKey}`,\n    uri: `${LENS_SCHEME}://${storageKey}`,\n  };\n}\n\n/**\n * @internal\n */\nexport function statusResponseFrom(\n  data: Record<string, unknown>,\n): StatusResponse {\n  return {\n    status: data.status as Status,\n    storageKey: data.storage_key as string,\n    progress: data.progress as number,\n  };\n}\n\nfunction createAclTemplateContent(acl: AclConfig): Record<string, unknown> {\n  switch (acl.template) {\n    case 'generic_acl':\n      return {\n        template: acl.template,\n        contract_address: acl.contractAddress,\n        chain_id: acl.chainId,\n        network_type: 'evm',\n        function_sig: acl.functionSig,\n        params: acl.params,\n      };\n    case 'lens_account':\n      return {\n        template: acl.template,\n        lens_account: acl.lensAccount,\n        chain_id: acl.chainId,\n      };\n    case 'wallet_address':\n      return {\n        template: acl.template,\n        wallet_address: acl.walletAddress,\n        chain_id: acl.chainId,\n      };\n    case 'immutable':\n      return {\n        template: acl.template,\n        chain_id: acl.chainId,\n      };\n\n    default:\n      never(`Unknown ACL template: ${acl}`);\n  }\n}\n\nfunction createAclEntry(template: AclConfig): MultipartEntry {\n  const name = 'lens-acl.json';\n  const content = createAclTemplateContent(template);\n\n  return {\n    name,\n    file: new File([JSON.stringify(content)], name, {\n      type: 'application/json',\n    }),\n  };\n}\n\nfunction createDefaultIndexContent(\n  files: readonly Resource[],\n): Record<string, unknown> {\n  return {\n    files: files.map((file) => file.storageKey),\n  };\n}\n\nfunction createIndexFile(content: unknown): File {\n  return new File([JSON.stringify(content)], 'index.json', {\n    type: 'application/json',\n  });\n}\n\n/**\n * @internal\n */\nexport class MultipartEntriesBuilder {\n  private idx = 0;\n  private entries: MultipartEntry[] = [];\n\n  private constructor(private readonly allocations: readonly Resource[]) {}\n\n  static from(allocations: readonly Resource[]): MultipartEntriesBuilder {\n    return new MultipartEntriesBuilder(allocations);\n  }\n\n  withFile(file: File): MultipartEntriesBuilder {\n    this.entries.push({\n      name:\n        this.allocations[this.idx++]?.storageKey ??\n        never('Unexpected file, no storage key available'),\n      file,\n    });\n    return this;\n  }\n\n  withFiles(files: readonly File[]): MultipartEntriesBuilder {\n    for (const file of files) {\n      this.withFile(file);\n    }\n    return this;\n  }\n\n  withAclTemplate(template: AclConfig): MultipartEntriesBuilder {\n    this.entries.push(createAclEntry(template));\n    return this;\n  }\n\n  withIndexFile(\n    index: CreateIndexContent | File | true,\n  ): MultipartEntriesBuilder {\n    const file =\n      index instanceof File\n        ? index\n        : createIndexFile(\n            index === true\n              ? createDefaultIndexContent(this.allocations)\n              : index.call(null, this.allocations.slice()), // shallow copy\n          );\n\n    invariant(\n      file.name === 'index.json',\n      \"Index file must be named 'index.json'\",\n    );\n\n    return this.withFile(file);\n  }\n\n  build(): ReadonlyArray<MultipartEntry> {\n    return this.entries;\n  }\n}\n","import {\n  type Authorization,\n  AuthorizationService,\n} from './AuthorizationService';\nimport { immutable } from './builders';\nimport { type EnvironmentConfig, production } from './environments';\nimport { AuthorizationError, StorageClientError } from './errors';\nimport {\n  type AclConfig,\n  type DeleteResponse,\n  type EditFileOptions,\n  FileUploadResponse,\n  type ImmutableAcl,\n  type Resource,\n  type Signer,\n  type Status,\n  type StatusResponse,\n  type UploadFileOptions,\n  type UploadFolderOptions,\n  type UploadFolderResponse,\n  type UploadJsonOptions,\n} from './types';\nimport {\n  createMultipartRequestInit,\n  delay,\n  extractStorageKey,\n  invariant,\n  MultipartEntriesBuilder,\n  type MultipartEntry,\n  never,\n  resourceFrom,\n  statusResponseFrom,\n} from './utils';\n\nexport class StorageClient {\n  private readonly authorization: AuthorizationService;\n\n  private constructor(public readonly env: EnvironmentConfig) {\n    this.authorization = new AuthorizationService(env);\n  }\n\n  /**\n   * Creates a new instance of the `Storage` client.\n   *\n   * @param env - the environment configuration\n   * @returns The `Storage` client instance\n   */\n  static create(env: EnvironmentConfig = production): StorageClient {\n    return new StorageClient(env);\n  }\n\n  /**\n   * Uploads a file to the storage.\n   *\n   * @throws a {@link StorageClientError} if uploading the file fails\n   * @param file - The file to upload\n   * @param options - Any additional options for the upload\n   * @returns The {@link FileUploadResponse} to the uploaded file\n   */\n  async uploadFile(\n    file: File,\n    options: UploadFileOptions,\n  ): Promise<FileUploadResponse>;\n  /**\n   *\n   * @deprecated use `uploadFile(file: File, options: UploadFileOptions): Promise<FileUploadResponse>` instead\n   */\n  async uploadFile(\n    file: File,\n    options?: UploadFileOptions,\n  ): Promise<FileUploadResponse>;\n  async uploadFile(\n    file: File,\n    { acl }: UploadFileOptions = { acl: immutable(this.env.defaultChainId) },\n  ): Promise<FileUploadResponse> {\n    const resource =\n      acl.template === 'immutable'\n        ? await this.uploadImmutableFile(file, acl)\n        : await this.uploadMutableFile(file, acl);\n\n    await this.waitUntilStatus(\n      resource.storageKey,\n      ['done', 'available'],\n      this.env.cachingTimeout,\n    );\n\n    return new FileUploadResponse(resource, this);\n  }\n\n  /**\n   * Uploads a JSON object to the storage.\n   *\n   * This is a convenience method that serializes the JSON object to a string before uploading it. The code is equivalent to:\n   * ```ts\n   * const file = new File([JSON.stringify(json)], 'data.json', { type: 'application/json' });\n   *\n   * const { uri } = await client.uploadFile(file);\n   * ```\n   *\n   * @throws a {@link StorageClientError} if uploading the JSON fails\n   * @param json - The JSON object to upload\n   * @param options - Upload options including the ACL configuration\n   * @returns The {@link FileUploadResponse} to the uploaded JSON\n   */\n  async uploadAsJson(\n    json: unknown,\n    options: UploadJsonOptions,\n  ): Promise<FileUploadResponse>;\n  /**\n   * @deprecated use `uploadAsJson(json: unknown, options: UploadJsonOptions): Promise<FileUploadResponse>` instead\n   */\n  async uploadAsJson(\n    json: unknown,\n    options?: UploadJsonOptions,\n  ): Promise<FileUploadResponse>;\n  async uploadAsJson(\n    json: unknown,\n    options: UploadJsonOptions = { acl: immutable(this.env.defaultChainId) },\n  ): Promise<FileUploadResponse> {\n    const file = new File([JSON.stringify(json)], options.name ?? 'data.json', {\n      type: 'application/json',\n    });\n    return this.uploadFile(file, options);\n  }\n\n  /**\n   * Uploads a folder to the storage.\n   *\n   * @throws a {@link StorageClientError} if uploading the folder fails\n   * @param files - The files to upload\n   * @param options - Upload options including the ACL configuration\n   * @returns The {@link UploadFolderResponse} to the uploaded folder\n   */\n  async uploadFolder(\n    files: FileList | File[],\n    options: UploadFolderOptions,\n  ): Promise<UploadFolderResponse>;\n  /**\n   * @deprecated use `uploadFolder(files: FileList | File[], options: UploadFolderOptions): Promise<UploadFolderResponse>` instead\n   */\n  async uploadFolder(\n    files: FileList | File[],\n    options?: UploadFolderOptions,\n  ): Promise<UploadFolderResponse>;\n  async uploadFolder(\n    files: FileList | File[],\n    options: UploadFolderOptions = { acl: immutable(this.env.defaultChainId) },\n  ): Promise<UploadFolderResponse> {\n    const withIndexFile = 'index' in options && !!options.index;\n    const [folderResource, ...fileResources] = await this.allocateStorage(\n      files.length + (withIndexFile ? 2 : 1),\n    );\n\n    const builder = MultipartEntriesBuilder.from(fileResources).withFiles(\n      Array.from(files),\n    );\n\n    if (options.index) {\n      builder.withIndexFile(options.index);\n    }\n\n    builder.withAclTemplate(options.acl);\n\n    const entries = builder.build();\n    const response = await this.upload(folderResource.storageKey, entries);\n\n    if (!response.ok) {\n      throw await StorageClientError.fromResponse(response);\n    }\n\n    await this.waitUntilStatus(\n      // biome-ignore lint/style/noNonNullAssertion: we know the folder has at least one file\n      withIndexFile ? folderResource.storageKey : fileResources[0]!.storageKey,\n      ['done', 'available'],\n      this.env.cachingTimeout,\n    );\n\n    return {\n      folder: folderResource,\n      files: fileResources,\n    };\n  }\n\n  /**\n   * Given an URI or storage key, resolves it to a URL.\n   *\n   * @param storageKeyOrUri - The `lens://…` URI or storage key\n   * @returns The URL to the resource\n   */\n  resolve(storageKeyOrUri: string): string {\n    const storageKey = extractStorageKey(storageKeyOrUri);\n\n    return `${this.env.backend}/${storageKey}`;\n  }\n\n  /**\n   * Deletes a resource from the storage.\n   *\n   * @throws a {@link AuthorizationError} if not authorized to delete the resource\n   * @param storageKeyOrUri - The `lens://…` URI or storage key\n   * @param signer - The signer to use for the deletion\n   * @returns The deletion result.\n   */\n  async delete(\n    storageKeyOrUri: string,\n    signer: Signer,\n  ): Promise<DeleteResponse> {\n    const storageKey = extractStorageKey(storageKeyOrUri);\n    const authorization = await this.authorization.authorize(\n      'delete',\n      storageKey,\n      signer,\n    );\n\n    const response = await fetch(\n      `${this.env.backend}/${storageKey}?challenge_cid=${authorization.challengeId}&secret_random=${authorization.secret}`,\n      {\n        method: 'DELETE',\n      },\n    );\n    return {\n      success: response.ok,\n    };\n  }\n\n  /**\n   * Updates a JSON object in the storage.\n   *\n   * @throws a {@link StorageClientError} if editing the file fails\n   * @throws a {@link AuthorizationError} if not authorized to edit the file\n   * @param storageKeyOrUri - The `lens://…` URI or storage key\n   * @param json - The JSON object to upload\n   * @param signer - The signer to use for the edit\n   * @param options - Upload options including the ACL configuration\n   * @returns The {@link FileUploadResponse} to the uploaded JSON\n   */\n  async updateJson(\n    storageKeyOrUri: string,\n    json: unknown,\n    signer: Signer,\n    options: UploadJsonOptions,\n  ): Promise<FileUploadResponse> {\n    const file = new File([JSON.stringify(json)], options.name ?? 'data.json', {\n      type: 'application/json',\n    });\n    return this.editFile(storageKeyOrUri, file, signer, options);\n  }\n\n  /**\n   * Edits a file in the storage.\n   *\n   * @throws a {@link StorageClientError} if editing the file fails\n   * @throws a {@link AuthorizationError} if not authorized to edit the file\n   * @param storageKeyOrUri - The `lens://…` URI or storage key\n   * @param newFile - The file to replace the existing file with\n   * @param signer - The signer to use for the edit\n   * @param options - Upload options including the ACL configuration\n   */\n  async editFile(\n    storageKeyOrUri: string,\n    newFile: File,\n    signer: Signer,\n    options: EditFileOptions,\n  ): Promise<FileUploadResponse>;\n  /**\n   * @deprecated use `editFile(storageKeyOrUri: string, newFile: File, signer: Signer, options: EditFileOptions): Promise<FileUploadResponse>` instead.\n   */\n  async editFile(\n    storageKeyOrUri: string,\n    newFile: File,\n    signer: Signer,\n    options?: EditFileOptions,\n  ): Promise<FileUploadResponse>;\n  async editFile(\n    storageKeyOrUri: string,\n    newFile: File,\n    signer: Signer,\n    options: EditFileOptions = { acl: immutable(this.env.defaultChainId) },\n  ): Promise<FileUploadResponse> {\n    const storageKey = extractStorageKey(storageKeyOrUri);\n    const authorization = await this.authorization.authorize(\n      'edit',\n      storageKey,\n      signer,\n    );\n\n    const resource = resourceFrom(storageKey, this.env);\n    const builder = MultipartEntriesBuilder.from([resource])\n      .withFile(newFile)\n      .withAclTemplate(options.acl);\n\n    const entries = builder.build();\n    const response = await this.update(storageKey, authorization, entries);\n\n    if (!response.ok) {\n      throw await StorageClientError.fromResponse(response);\n    }\n\n    return new FileUploadResponse(resource, this);\n  }\n\n  /**\n   * @internal\n   */\n  async status(storageKeyOrUri: string): Promise<StatusResponse> {\n    const storageKey = extractStorageKey(storageKeyOrUri);\n    const response = await fetch(`${this.env.backend}/status/${storageKey}`);\n\n    if (!response.ok) {\n      throw await StorageClientError.fromResponse(response);\n    }\n    try {\n      const data = await response.json();\n      return statusResponseFrom(data);\n    } catch (_) {\n      throw await StorageClientError.fromResponse(response);\n    }\n  }\n\n  /**\n   * @internal\n   */\n  async waitUntilStatus(\n    storageKeyOrUri: string,\n    expectedStatuses: Status[],\n    timeout: number,\n  ): Promise<void> {\n    const startedAt = Date.now();\n\n    while (Date.now() - startedAt < timeout) {\n      const { status } = await this.status(storageKeyOrUri);\n\n      // Handle common error states\n      switch (status) {\n        case 'error_upload':\n        case 'error_edit':\n        case 'error_delete':\n        case 'unauthorized':\n          throw StorageClientError.from(\n            `The resource ${storageKeyOrUri} has returned a '${status}' status.`,\n          );\n      }\n\n      if (expectedStatuses.includes(status)) {\n        return;\n      }\n\n      await delay(this.env.statusPollingInterval);\n    }\n    throw StorageClientError.from(\n      `Timeout waiting for resource ${storageKeyOrUri} to reach status: ${expectedStatuses.join(' or ')}.`,\n    );\n  }\n\n  private async allocateStorage(\n    amount: number,\n  ): Promise<[Resource, ...Resource[]]> {\n    invariant(amount > 0, 'Amount must be greater than 0');\n    const response = await fetch(\n      `${this.env.backend}/link/new?amount=${amount}`,\n      {\n        method: 'POST',\n      },\n    );\n\n    if (!response.ok) {\n      throw await StorageClientError.fromResponse(response);\n    }\n    return this.parseResourceFrom(response);\n  }\n\n  private async uploadMutableFile(\n    file: File,\n    acl: AclConfig,\n  ): Promise<Resource> {\n    const [resource] = await this.allocateStorage(1);\n    const builder = MultipartEntriesBuilder.from([resource])\n      .withFile(file)\n      .withAclTemplate(acl);\n\n    const entries = builder.build();\n\n    const response = await this.upload(resource.storageKey, entries);\n\n    if (!response.ok) {\n      throw await StorageClientError.fromResponse(response);\n    }\n    return resource;\n  }\n\n  private async uploadImmutableFile(\n    file: File,\n    { chainId }: ImmutableAcl,\n  ): Promise<Resource> {\n    const response = await fetch(`${this.env.backend}?chain_id=${chainId}`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': file.type,\n        'Content-Length': file.size.toString(),\n      },\n      body: file,\n    });\n\n    if (!response.ok) {\n      throw await StorageClientError.fromResponse(response);\n    }\n    const [resource] = await this.parseResourceFrom(response);\n    return resource;\n  }\n\n  private async upload(\n    storageKey: string,\n    entries: readonly MultipartEntry[],\n  ): Promise<Response> {\n    return this.multipartRequest(\n      'POST',\n      `${this.env.backend}/${storageKey}`,\n      entries,\n    );\n  }\n\n  private async update(\n    storageKey: string,\n    authorization: Authorization,\n    entries: readonly MultipartEntry[],\n  ): Promise<Response> {\n    const response = await this.multipartRequest(\n      'PUT',\n      `${this.env.backend}/${storageKey}?challenge_cid=${authorization.challengeId}&secret_random=${authorization.secret}`,\n      entries,\n    );\n\n    await this.waitUntilStatus(\n      storageKey,\n      ['done'],\n      this.env.propagationTimeout,\n    );\n\n    return response;\n  }\n\n  private async multipartRequest(\n    method: 'POST' | 'PUT',\n    url: string,\n    entries: readonly MultipartEntry[],\n  ): Promise<Response> {\n    return fetch(url, await createMultipartRequestInit(method, entries));\n  }\n\n  private parseResourceFrom = async (\n    response: Response,\n  ): Promise<[Resource, ...Resource[]]> => {\n    const list = await response.json();\n\n    return list.map((data: Record<string, string>) => {\n      const storageKey =\n        data.storage_key ??\n        never(`Missing 'storage_key' in response: ${JSON.stringify(data)}`);\n      return {\n        storageKey,\n        // TODO use data.gateway_url once fixed by the API\n        // gatewayUrl: data.gateway_url ?? never('Missing gateway URL'),\n        gatewayUrl: this.resolve(storageKey),\n        uri:\n          data.uri ??\n          never(`Missing 'uri' in response: ${JSON.stringify(data)}`),\n      };\n    }) as [Resource, ...Resource[]];\n  };\n}\n"]}