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.
63 lines
1.8 KiB
63 lines
1.8 KiB
2 years ago
|
/*
|
||
|
* https://github.com/morethanwords/tweb
|
||
|
* Copyright (C) 2019-2021 Eduard Kuzmenko
|
||
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE
|
||
|
*/
|
||
|
|
||
|
import { MOUNT_CLASS_TO } from "../../config/debug";
|
||
|
import indexOfAndSplice from "../../helpers/array/indexOfAndSplice";
|
||
|
import deferredPromise, { CancellablePromise } from "../../helpers/cancellablePromise";
|
||
|
import noop from "../../helpers/noop";
|
||
|
import { DcId } from "../../types";
|
||
|
|
||
|
export class NetworkStats {
|
||
|
public sent: number;
|
||
|
public received: number;
|
||
|
public awaitingChunks: Map<DcId, {length: number, deferred: CancellablePromise<void>}[]>;
|
||
|
|
||
|
constructor() {
|
||
|
this.sent = this.received = 0;
|
||
|
this.awaitingChunks = new Map();
|
||
|
}
|
||
|
|
||
|
public addSent(dcId: DcId, length: number) {
|
||
|
this.sent += length;
|
||
|
}
|
||
|
|
||
|
public addReceived(dcId: DcId, length: number) {
|
||
|
this.received += length;
|
||
|
|
||
|
const awaitingChunks = this.awaitingChunks.get(dcId);
|
||
|
const awaitingLength = awaitingChunks?.length;
|
||
|
if(awaitingLength) {
|
||
|
for(let i = 0; i < awaitingLength; ++i) {
|
||
|
const awaiting = awaitingChunks[i];
|
||
|
if(length >= awaiting.length) {
|
||
|
awaiting.deferred.resolve();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public waitForChunk(dcId: DcId, length: number) {
|
||
|
const deferred = deferredPromise<void>();
|
||
|
let awaitingChunks = this.awaitingChunks.get(dcId);
|
||
|
if(!awaitingChunks) {
|
||
|
this.awaitingChunks.set(dcId, awaitingChunks = []);
|
||
|
}
|
||
|
|
||
|
const awaiting = {length, deferred};
|
||
|
deferred.catch(noop).finally(() => {
|
||
|
indexOfAndSplice(awaitingChunks, awaiting);
|
||
|
});
|
||
|
|
||
|
awaitingChunks.push(awaiting);
|
||
|
return deferred;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const networkStats = new NetworkStats();
|
||
|
MOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkStats = networkStats);
|
||
|
export default networkStats;
|