Безопасно ли использовать performance.now () для калибровки времени? - PullRequest
0 голосов
/ 10 июля 2019

Мне интересно, не предвижу ли я что-то, что могло бы быть проблемой с моим подходом.

class RDate {
    constructor(serverIsoDate) {
        this.serverDate = new Date(serverIsoDate);

        this.localDate = new Date();
        this.localTick = performance.now();
    }

    getCompensatedDate() {
        return this.serverDate.getTime() + (performance.now()-this.localTick);
    }
}

Я периодически получаю serverDate, но если пользователь оставляет веб-приложение запущенным в течение длительного времени, яможет гарантировать правильное время, даже если пользователь подделывает свои часы.

Переполняется ли performance.now или приостанавливается, когда вкладка приостанавливается?

Я могу определить, насколько часы сместились или были подделанывычисление разницы между localDate и localTick

_spoofed() {
    return Math.abs(this.localDate.getTime() - this.localTick - (Date.now() - performance.now())) > 1000 * 60 * 60;
}

1 Ответ

0 голосов
/ 10 июля 2019

Документация MDN по API Performance гласит:

Поскольку системные часы платформы подвержены различным перекосам (например, настройкам NTP), интерфейсы поддерживают монотонные часы, то есть часы, которые постоянно увеличиваются.

Кажется, это говорит о том, что часы, используемые для performance.now(), должны быть независимы от системных часов.

Я не думаю, что его часы можно поставить на паузу. Описание performance.now() гласит:

Возвращаемое значение представляет время, прошедшее с момента возникновения.

Время начала не изменяется, когда вкладка приостановлена, поэтому оно должно включать время приостановки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...