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.
62 lines
1.8 KiB
62 lines
1.8 KiB
/* |
|
* 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;
|
|
|