export function promiseFromEvent()

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,
  };
}