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.
110 lines
2.6 KiB
110 lines
2.6 KiB
2 years ago
|
/*
|
||
|
* https://github.com/morethanwords/tweb
|
||
|
* Copyright (C) 2019-2021 Eduard Kuzmenko
|
||
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE
|
||
|
*/
|
||
|
|
||
|
import applyMixins from "../../helpers/applyMixins";
|
||
|
import EventListenerBase from "../../helpers/eventListenerBase";
|
||
|
import { AppManager } from "../appManagers/manager";
|
||
|
|
||
|
export type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';
|
||
|
|
||
|
type PeersStorageKey = `${StatePeerType}_${string | PeerId}` | StatePeerType;
|
||
|
|
||
|
class PeersStorage {
|
||
|
private neededPeers: Map<PeerId, Set<PeersStorageKey>> = new Map();
|
||
|
private singlePeerMap: Map<PeersStorageKey, Set<PeerId>> = new Map();
|
||
|
|
||
|
constructor() {
|
||
|
this._constructor(false);
|
||
|
}
|
||
|
|
||
|
protected after() {
|
||
|
this.rootScope.addEventListener('user_auth', () => {
|
||
|
this.requestPeer(this.appUsersManager.userId.toPeerId(), 'self');
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public requestPeer(peerId: PeerId, key: PeersStorageKey) {
|
||
|
let set = this.neededPeers.get(peerId);
|
||
|
if(set && set.has(key)) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if(!set) {
|
||
|
set = new Set();
|
||
|
this.neededPeers.set(peerId, set);
|
||
|
}
|
||
|
|
||
|
set.add(key);
|
||
|
|
||
|
this.dispatchEvent('peerNeeded', peerId);
|
||
|
}
|
||
|
|
||
|
public releasePeer(peerId: PeerId, key: PeersStorageKey) {
|
||
|
const set = this.neededPeers.get(peerId);
|
||
|
if(!set) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
set.delete(key);
|
||
|
|
||
|
if(!set.size) {
|
||
|
this.neededPeers.delete(peerId);
|
||
|
this.dispatchEvent('peerUnneeded', peerId);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public requestPeersForKey(peerIds: Set<PeerId> | number[], key: PeersStorageKey) {
|
||
|
if(Array.isArray(peerIds)) {
|
||
|
peerIds = new Set(peerIds);
|
||
|
}
|
||
|
|
||
|
let set = this.singlePeerMap.get(key);
|
||
|
if(set) {
|
||
|
for(const peerId of set) {
|
||
|
if(peerIds.has(peerId)) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
this.releasePeer(peerId, key);
|
||
|
set.delete(peerId);
|
||
|
}
|
||
|
|
||
|
if(!set.size && !peerIds.size) {
|
||
|
this.singlePeerMap.delete(key);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(peerIds.size) {
|
||
|
if(!set) {
|
||
|
set = new Set();
|
||
|
this.singlePeerMap.set(key, set);
|
||
|
}
|
||
|
|
||
|
for(const peerId of peerIds) {
|
||
|
if(set.has(peerId)) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
this.requestPeer(peerId, key);
|
||
|
set.add(peerId);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public isPeerNeeded(peerId: PeerId) {
|
||
|
return this.neededPeers.has(peerId);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
interface PeersStorage extends EventListenerBase<{
|
||
|
peerNeeded: (peerId: PeerId) => void,
|
||
|
peerUnneeded: (peerId: PeerId) => void,
|
||
|
}>, AppManager {}
|
||
|
applyMixins(PeersStorage, [EventListenerBase, AppManager]);
|
||
|
|
||
|
export default PeersStorage;
|