// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

export type ExplodePromiseResultType<T> = Readonly<{
  promise: Promise<T>;
  resolve: (value: T) => void;
  reject: (error: unknown) => void;
}>;

export function explodePromise<T>(): ExplodePromiseResultType<T> {
  let resolve: (value: T) => void;
  let reject: (error: unknown) => void;

  const promise = new Promise<T>((innerResolve, innerReject) => {
    resolve = innerResolve;
    reject = innerReject;
  });

  return {
    promise,
    // Typescript thinks that resolve and reject can be undefined here.
    // oxlint-disable-next-line typescript/no-non-null-assertion
    resolve: resolve!,
    // oxlint-disable-next-line typescript/no-non-null-assertion
    reject: reject!,
  };
}
