API reference › @evolu/common › Result › trySync

Call Signature

function trySync<T>(fn: () => T): Result<T, unknown>;

Defined in: packages/common/src/Result.ts:609

Wraps a synchronous function that may throw, returning a Result.

When provided, mapError converts the caught unknown value into a typed domain error.

Some APIs throw for both recoverable and unrecoverable errors. In that case, convert only the errors the caller can recover from and rethrow the rest. The trySync error mapper propagates rethrown values instead of converting them to Err.

Example

import {
  assertEqual,
  assertErr,
  assertInstanceOf,
  assertOk,
  assertType,
  trySync,
  type Result,
  type Typed,
} from "@evolu/common";

class LegacySeatUnavailableError extends Error {}

const legacyReserveSeat = (seat: string): void => {
  if (seat === "A1") throw new LegacySeatUnavailableError();
  if (seat === "B1") throw new Error("Database error");
};

const reserveSeat = (seat: string): Result<void, SeatUnavailableError> =>
  trySync(
    () => legacyReserveSeat(seat),
    (error) => {
      if (error instanceof LegacySeatUnavailableError) {
        return { type: "SeatUnavailable", seat };
      }
      throw error;
    },
  );

interface SeatUnavailableError extends Typed<"SeatUnavailable"> {
  readonly seat: string;
}

const result = reserveSeat("B2");
assertType<typeof result, Result<void, SeatUnavailableError>>();
assertOk(result, undefined);
assertErr(reserveSeat("A1"), { type: "SeatUnavailable", seat: "A1" });
const databaseError = trySync(() => reserveSeat("B1"));
assertErr(databaseError);
assertInstanceOf(databaseError.error, Error);
assertEqual(databaseError.error.message, "Database error");

Call Signature

function trySync<T, E>(
  fn: () => T,
  mapError: (error: unknown) => E,
): Result<T, E>;

Defined in: packages/common/src/Result.ts:612

Maps caught exceptions to a typed error.