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
2.2 KiB

/*
* https://github.com/morethanwords/tweb
* Copyright (C) 2019-2021 Eduard Kuzmenko
* https://github.com/morethanwords/tweb/blob/master/LICENSE
*/
import {CryptoMethods} from './crypto_methods';
import SuperMessagePort from '../mtproto/superMessagePort';
import {Awaited} from '../../types';
import {MOUNT_CLASS_TO} from '../../config/debug';
import {IS_WORKER} from '../../helpers/context';
type CryptoEvent = {
invoke: <T extends keyof CryptoMethods>(payload: {method: T, args: Parameters<CryptoMethods[T]>}) => ReturnType<CryptoMethods[T]>,
port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,
terminate: () => void
};
export class CryptoMessagePort<Master extends boolean = false> extends SuperMessagePort<CryptoEvent, CryptoEvent, Master> {
private lastIndex: number;
constructor() {
super('CRYPTO');
this.lastIndex = -1;
}
public invokeCryptoNew<T extends keyof CryptoMethods>({method, args, transfer}: {
method: T,
args: Parameters<CryptoMethods[T]>,
transfer?: Transferable[]
}): Promise<Awaited<ReturnType<CryptoMethods[T]>>> {
const payload = {method, args};
const listeners = this.listeners['invoke'];
if(listeners?.length) { // already in worker
// try {
// @ts-ignore
let result: any = listeners[0].callback(payload);
if(!IS_WORKER && !(result instanceof Promise)) {
result = Promise.resolve(result);
}
return result;
// } catch(err) {
// return Promise.reject(err);
// }
}
const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?
this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :
0;
// @ts-ignore
return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);
}
public invokeCrypto<T extends keyof CryptoMethods>(method: T, ...args: Parameters<CryptoMethods[T]>): Promise<Awaited<ReturnType<CryptoMethods[T]>>> {
return this.invokeCryptoNew({method, args});
}
}
const cryptoMessagePort = new CryptoMessagePort<false>();
MOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);
export default cryptoMessagePort;