in src/desktop/utils/promise_from_event.ts [37:65]
export function promiseFromEvent<T, U = T>(
event: Event<T>,
adapter: PromiseAdapter<T, U> = passthrough as PromiseAdapter<T, U>,
): { promise: Promise<U>; cancel: EventEmitter<void> } {
let subscription: Disposable;
const cancel = new EventEmitter<void>();
return {
promise: new Promise<U>((resolve, reject) => {
cancel.event(() => reject(new Error('Cancelled')));
subscription = event((value: T) => {
try {
Promise.resolve(adapter(value, resolve, reject)).catch(reject);
} catch (error) {
reject(error);
}
});
}).then(
(result: U) => {
subscription.dispose();
return result;
},
(error: unknown) => {
subscription.dispose();
throw error;
},
),
cancel,
};
}