async_utils.ts 1.0 KB

1234567891011121314151617181920212223242526272829303132
  1. export async function tryDo<TResult>(promise: Promise<TResult>) : Promise<Option<{result: TResult}, {error: unknown}>> {
  2. try {
  3. return {ok: true, result: await promise};
  4. } catch(err) {
  5. return {ok: false, error: err};
  6. }
  7. }
  8. export async function assertOk<T>(promise: Promise<T>): Promise<T> {
  9. try {
  10. return await promise;
  11. } catch (err) {
  12. if (hasStackTrace(err)) {
  13. const trace: {stack?: string} = {};
  14. Error.captureStackTrace(trace);
  15. err.stack = `${err.stack}\nCaused by: ${trace.stack}`;
  16. }
  17. throw err;
  18. }
  19. }
  20. export function hasStackTrace(reason: any): reason is {stack: unknown} {
  21. return reason && Object.prototype.hasOwnProperty.call(reason, "stack");
  22. }
  23. export function isHttpError<T>(err: any): err is T {
  24. return err && Object.prototype.hasOwnProperty.call(err, "response");
  25. }
  26. export type Ok<T> = T & { ok: true };
  27. export type Error<T> = T & { ok: false };
  28. export type Option<T, U = unknown> = Ok<T> | Error<U>;