import AppStorage from '../storage'; import { nextRandomInt, longFromInts } from '../bin_utils'; export class TimeManager { private lastMessageID = [0, 0]; private timeOffset = 0; constructor() { AppStorage.get('server_time_offset').then((to: any) => { if(to) { this.timeOffset = to; } }); } public generateID(): string { var timeTicks = Date.now(), timeSec = Math.floor(timeTicks / 1000) + this.timeOffset, timeMSec = timeTicks % 1000, random = nextRandomInt(0xFFFF); var messageID = [timeSec, (timeMSec << 21) | (random << 3) | 4]; if(this.lastMessageID[0] > messageID[0] || this.lastMessageID[0] == messageID[0] && this.lastMessageID[1] >= messageID[1]) { messageID = [this.lastMessageID[0], this.lastMessageID[1] + 4]; } this.lastMessageID = messageID; // console.log('generated msg id', messageID, timeOffset) return longFromInts(messageID[0], messageID[1]); } public applyServerTime(serverTime: number, localTime?: number) { var newTimeOffset = serverTime - Math.floor((localTime || Date.now()) / 1000); var changed = Math.abs(this.timeOffset - newTimeOffset) > 10; AppStorage.set({ server_time_offset: newTimeOffset }); this.lastMessageID = [0, 0]; this.timeOffset = newTimeOffset; //console.log(dT(), 'Apply server time', serverTime, localTime, newTimeOffset, changed); return changed; } } export default new TimeManager();