どのように実装すべきなのかわからなかいので質問させていただきます。

下のコードは、現在時刻を垂れ流すwebsocketサーバに接続するコードです。
「関数Xを登録しそれを毎分N秒に実行する。ただし毎時間M分で登録を解除する」といったことをしたい場合どのように実装すべきでしょうか?

一応自分で書いてみたのですが、awaitで処理が完了するのを待てなかったり、コールバック地獄になるようなコードになってしまうので助言をいただきたいと思います。

const ws = new WebSocket('wss://websocketstest.com/service');
ws.onopen = () => {
    ['connected,', 'version,hybi-draft-13', 'echo,test message', 'timer,']
        .forEach(c=>ws.send(c));
};

let events = []
ws.onmessage = (blob) => {
        if (events.length === 0) return;
        const messageDate = new Date(blob.data.split(',')[1]);
        for (const event of events) {
            if (event.func(messageDate) === true) {
                event.valid = false;
            }
        }
        events = events.filter(s => s.valid === true);
}

function register(func) {
    events.push({
        func: func,
        valid: true
    });
}

const N = 30;
const M = 5;
const X = ()=>{console.log("FOFOOOOOO");};
(async () => {
    register(msg => {
        console.log(msg);
        if (msg.getSeconds() % N === 0) {
            X()
        }
        if (msg.getHours() % M === 0) {
            return true; // 終了
        }
    });
    console.log('end');
})();