【問題】不安定なチャットAPI

今日はバグ修正っぽい問題です。

あるチャットAPIがあります。 このAPIには指定日時以降のメッセージを取得するメソッドがあります。
このメソッドを使って、定期的にメッセージし表示するアプリが作りたいです。

メッセージを取得するAPI仕様

/**
 * 指定日時以降のメッセージを取得する
 * 
 * @param after {number} 日時
 * @return {{message:string, date:number}} after以降のメッセージリスト。
 * ただし、取得に失敗した場合はnullを返す。
 */
getMessages(after)

失敗実装

そこでこんなふうに実装してみました。

const api = new ShakyChatApi();
setInterval(()=>{
  var messages = api.getMessages(Date.now() - 3000);// 3秒前以降のメッセージを取得する
  if(messages !== null) {
    messages.forEach(v => console.log(v.message));
  }
  
}, 3000);

3秒毎にメッセージを取得して表示します。

これの実行結果

メッセージ0
メッセージ1
メッセージ2
メッセージ6
メッセージ7
メッセージ8

あれ!メッセージ4, 5がロストしてる!!

要するに先ほどの実装にはバグがあります。 前置きが長くなりましたが、今日の問題はこのバグ修正です。

下記のバグったプログラムを修正し、3秒毎にメッセージをロストすることなく取得するプログラムを作ってください。

バグってるプログラム全体

<!DOCTYPE html>
<script>
class ShakyChatApi {
  // !! このクラスは変更しちゃダメ !!
  constructor() {
    this.messages = [];
    var count = 0;
    var loop = () => {
      this.messages.push({message:`メッセージ${count++}`, date:Date.now()});
      setTimeout(loop, Math.random() * 3000);
    }
    setTimeout(loop, 100);
  }

  /**
   * 指定日時以降のメッセージを取得する
   * 
   * @param after {number} 日時
   * @return {{message:string, date:number}} after以降のメッセージリスト。ただし、取得に失敗した場合はnullを返す。
   */
  getMessages(after) {
    if(Math.random() >= 0.66) {
      return null;// 不安定
    }
    return this.messages.filter(v => v.date >= after);
  }
}

// ## !!ここより下を修正してください!! ##

const api = new ShakyChatApi();
setInterval(()=>{
  var messages = api.getMessages(Date.now() - 3000);// 3秒前以降のメッセージを取得する
  if(messages !== null) {
    messages.forEach(v => console.log(v.message));
  }
}, 3000);
</script>