この解答例はChatGPTによって生成されています,正しいかは自己判断で。

BFE.devでのAI解答例 - JavaScript コーディング問題
169. LRU - Chrome storage自動消去

以下は、LRUStorageの実装です。

class LRUStorage {
  capacity: number;
  data: Map<string, OriginData>;
  timestamp: () => number;

  constructor(capacity: number, timestamp: () => number = Date.now) {
    this.capacity = capacity;
    this.data = new Map();
    this.timestamp = timestamp;
  }

  private evict(): void {
    let oldestTime = Infinity;
    let oldestOrigin = '';

    for (const [origin, data] of this.data.entries()) {
      if (data.persistent) {
        continue;
      }
      if (data.lastUsed < oldestTime) {
        oldestTime = data.lastUsed;
        oldestOrigin = origin;
      }
    }

    if (oldestOrigin) {
      this.data.delete(oldestOrigin);
    }
  }

  private touchData(origin: string): OriginData | undefined {
    const data = this.data.get(origin);
    if (!data) {
      return data;
    }
    data.lastUsed = this.timestamp();
    return data;
  }

  getData(origin: string): OriginData | undefined {
    return this.touchData(origin);
  }

  setData(origin: string, size: number): boolean {
    this.touchData(origin);
    const oldData = this.data.get(origin);

    if (oldData) {
      this.data.set(origin, {
        ...oldData,
        size,
        lastUsed: this.timestamp()
      });
      return true;
    } else {
      if (this.capacity < size) {
        return false;
      }
      while (this.capacity - size < this.totalSize()) {
        this.evict();
      }
      this.data.set(origin, {
        origin,
        size,
        lastUsed: this.timestamp(),
        persistent: false
      });
      return true;
    }
  }

  clearData(origin: string): void {
    this.data.delete(origin);
  }

  makePersistent(origin: string): void {
    const data = this.touchData(origin);
    if (data) {
      data.persistent = true;
    }
  }

  totalSize(): number {
    let total = 0;
    for (const data of this.data.values()) {
      total += data.size;
    }
    return total;
  }
}

基本的には、Mapを使用し、データを格納します。そして、データに制限がかかった場合には、LRU (Least Recently Used) アルゴリズムを使用して、オリジンデータのスペースを開けます。

さらに、 getDatasetData の呼び出し時にも、オリジンデータを最新のものにし、 getData では、オリジンデータが存在しない場合 undefined を返すようにしています。

最後に、 makePersistent メソッドでは、データを永続にします。 永続的なデータは、特別にマークされ、LRUアルゴリズムによって削除されることはありません。

あなたのタイムスタンプ関数は、デフォルトで Date.now を使用していますが、コンストラクタの二番目の引数として渡すことができます。この機能を使用することで、テスト中にタイムスタンプを固定することも可能です。