import { isAbsolute } from "node:path";
import { AstroError, AstroErrorData } from "../../../core/errors/index.js";
class CachedFontFetcher {
  #storage;
  #fetch;
  #readFile;
  constructor({
    storage,
    fetch,
    readFile
  }) {
    this.#storage = storage;
    this.#fetch = fetch;
    this.#readFile = readFile;
  }
  async #cache(storage, key, cb) {
    const existing = await storage.getItemRaw(key);
    if (existing) {
      return existing;
    }
    const data = await cb();
    await storage.setItemRaw(key, data);
    return data;
  }
  async fetch({ id, url, init }) {
    return await this.#cache(this.#storage, id, async () => {
      try {
        if (isAbsolute(url)) {
          return await this.#readFile(url);
        }
        const response = await this.#fetch(url, init ?? void 0);
        if (!response.ok) {
          throw new Error(`Response was not successful, received status code ${response.status}`);
        }
        return Buffer.from(await response.arrayBuffer());
      } catch (cause) {
        throw new AstroError(
          {
            ...AstroErrorData.CannotFetchFontFile,
            message: AstroErrorData.CannotFetchFontFile.message(url)
          },
          { cause }
        );
      }
    });
  }
}
export {
  CachedFontFetcher
};
