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.

80 lines
2.1 KiB

3 years ago
/*
* https://github.com/morethanwords/tweb
* Copyright (C) 2019-2021 Eduard Kuzmenko
* https://github.com/morethanwords/tweb/blob/master/LICENSE
*/
2 years ago
import noop from './noop';
3 years ago
export interface CancellablePromise<T> extends Promise<T> {
resolve?: (value: T) => void,
reject?: (...args: any[]) => void,
cancel?: (reason?: any) => void,
3 years ago
notify?: (...args: any[]) => void,
notifyAll?: (...args: any[]) => void,
lastNotify?: any,
listeners?: Array<(...args: any[]) => void>,
addNotifyListener?: (callback: (...args: any[]) => void) => void,
isFulfilled?: boolean,
isRejected?: boolean
}
export default function deferredPromise<T>() {
2 years ago
const deferredHelper: any = {
isFulfilled: false,
3 years ago
isRejected: false,
2 years ago
notify: () => {},
3 years ago
notifyAll: (...args: any[]) => {
deferredHelper.lastNotify = args;
deferredHelper.listeners.forEach((callback: any) => callback(...args));
2 years ago
},
3 years ago
listeners: [],
addNotifyListener: (callback: (...args: any[]) => void) => {
if(deferredHelper.lastNotify) {
callback(...deferredHelper.lastNotify);
}
deferredHelper.listeners.push(callback);
}
};
2 years ago
const deferred: CancellablePromise<T> = new Promise<T>((resolve, reject) => {
3 years ago
deferredHelper.resolve = (value: T) => {
if(deferred.isFulfilled || deferred.isRejected) return;
3 years ago
deferred.isFulfilled = true;
resolve(value);
};
2 years ago
3 years ago
deferredHelper.reject = (...args: any[]) => {
if(deferred.isRejected || deferred.isFulfilled) return;
2 years ago
3 years ago
deferred.isRejected = true;
reject(...args);
};
});
// @ts-ignore
/* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {
const n = deferredPromise<ReturnType<typeof resolve>>();
2 years ago
3 years ago
}; */
deferred.catch(noop).finally(() => {
deferred.notify = deferred.notifyAll = deferred.lastNotify = null;
3 years ago
deferred.listeners.length = 0;
if(deferred.cancel) {
deferred.cancel = noop;
3 years ago
}
});
Object.assign(deferred, deferredHelper);
return deferred;
}