Skip to content

Instantly share code, notes, and snippets.

@mohayonao
Created July 6, 2016 06:09
Show Gist options
  • Select an option

  • Save mohayonao/68fb4dadf6ac714bfd08f18fa83ec991 to your computer and use it in GitHub Desktop.

Select an option

Save mohayonao/68fb4dadf6ac714bfd08f18fa83ec991 to your computer and use it in GitHub Desktop.
"use strict";
const events = require("events");
class SyncDate extends events.EventEmitter {
constructor() {
super();
this.deltaTime = 0;
this.syncTimes = [];
}
listen(socket) {
const syncTime = () => {
const beginTime = Date.now();
socket.emit("sync");
socket.once("sync", (serverCurrentTime) => {
const endTime = Date.now();
const elapsed = endTime - beginTime;
const currentTime = endTime - (elapsed * 0.5);
const serverDeltaTime = serverCurrentTime - currentTime;
this.syncTimes.push(serverDeltaTime);
if (this.syncTimes.length < 8) {
return setTimeout(syncTime, 100);
}
const deltaTime = Math.round(this.computeAverageDeltaTime(this.syncTimes.splice(0)));
if (deltaTime !== this.deltaTime) {
this.deltaTime = deltaTime;
this.emit("deltaTime", this.deltaTime);
setTimeout(syncTime, 10 * 1000);
}
});
};
syncTime();
}
computeAverageDeltaTime(syncTimes) {
return syncTimes.sort(desc).slice(1, -1).reduce(sum, 0) / (syncTimes.length - 2);
}
now() {
return Date.now() + this.deltaTime;
}
}
function desc(a, b) {
return a - b;
}
function sum(a, b) {
return a + b;
}
module.exports = new SyncDate();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment