Skip to main content

Error types

ErrorWhen
TokenParseErrorToken is malformed or signature is invalid
TokenExpiredErrorToken expires_at is in the past
HttpErrorServer returned a non-2xx status
NetworkErrorFetch failed (DNS, timeout, no connection)
CodecErrormsgpack decode or schema validation failed
TransportErrorWebSocket error

Handling errors

All errors are Data.TaggedError from Effect, matchable with Effect.catchTag:
import { Effect } from "effect";
import { MeridianClient } from "meridian-sdk";

await Effect.runPromise(
  MeridianClient.create(config).pipe(
    Effect.catchTag("TokenExpiredError", (e) =>
      Effect.die(`Token expired at ${new Date(e.expiredAt).toISOString()}`)
    ),
    Effect.catchTag("TokenParseError", () =>
      Effect.die("Invalid token — check MERIDIAN_TOKEN")
    ),
    Effect.flatMap((client) =>
      client.http.getCrdt("my-room", "gc:views").pipe(
        Effect.catchTag("HttpError", (e) =>
          Effect.succeed(`Server error ${e.status}: ${e.body.message}`)
        ),
        Effect.catchTag("NetworkError", (e) =>
          Effect.succeed(`Network error: ${e.message}`)
        ),
      )
    ),
  )
);

Error fields

TokenParseError   → { message: string }
TokenExpiredError → { expiredAt: number }  // ms timestamp
HttpError         → { status: number; body: { message: string } }
NetworkError      → { message: string; cause?: unknown }
CodecError        → { message: string; raw: Uint8Array }
TransportError    → { message: string; cause?: unknown }