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.
109 lines
2.5 KiB
109 lines
2.5 KiB
/* |
|
* 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.appPeersManager.peerId, '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;
|
|
|