Telegram Web K with changes to work inside I2P https://web.telegram.i2p/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

96 lines
2.8 KiB

/*
* https://github.com/morethanwords/tweb
* Copyright (C) 2019-2021 Eduard Kuzmenko
* https://github.com/morethanwords/tweb/blob/master/LICENSE
*
* Originally from:
* https://github.com/zhukov/webogram
* Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>
* https://github.com/zhukov/webogram/blob/master/LICENSE
*/
import sessionStorage from '../sessionStorage';
import { longFromInts } from './bin_utils';
import { nextRandomUint } from '../../helpers/random';
import { MOUNT_CLASS_TO } from '../../config/debug';
import { WorkerTaskVoidTemplate } from '../../types';
import { notifySomeone } from '../../helpers/context';
/*
let lol: any = {};
for(var i = 0; i < 100; i++) {
timeManager.generateId();
}
*/
export interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {
type: 'applyServerTimeOffset',
payload: TimeManager['timeOffset']
};
export class TimeManager {
private lastMessageId: [number, number] = [0, 0];
private timeOffset: number = 0;
constructor() {
sessionStorage.get('server_time_offset').then((to) => {
if(to) {
this.timeOffset = to;
}
});
}
public generateId(): string {
const timeTicks = Date.now(),
timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,
timeMSec = timeTicks % 1000,
random = nextRandomUint(16);
let messageId: TimeManager['lastMessageId'] = [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;
const ret = longFromInts(messageId[0], messageId[1]);
// if(lol[ret]) {
// console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);
// }
// lol[ret] = true;
// console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);
return ret
}
public applyServerTime(serverTime: number, localTime?: number) {
localTime = (localTime || Date.now()) / 1000 | 0;
const newTimeOffset = serverTime - localTime;
const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;
sessionStorage.set({
server_time_offset: newTimeOffset
});
this.lastMessageId = [0, 0];
this.timeOffset = newTimeOffset;
//console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);
/// #if MTPROTO_WORKER
const task: ApplyServerTimeOffsetTask = {
type: 'applyServerTimeOffset',
payload: newTimeOffset
};
notifySomeone(task);
/// #endif
return changed;
}
}
const timeManager = new TimeManager();
MOUNT_CLASS_TO.timeManager = timeManager;
export default timeManager;