koala73/worldmonitor · error · Error

Convex unavailable

Error message

Convex unavailable

What it means

Error thrown by claimProActivationPresentation when the lazily-initialized Convex client or its API module could not be obtained. It is an environment/precondition guard in the browser service: without a working Convex connection the activation claim mutation cannot run, so the call aborts before any server contact.

Solutions

  1. Verify the Convex deployment URL configuration is present in the app environment
  2. Re-initialize or reload so the lazy Convex client can be constructed
  3. Check for network/offline conditions preventing client bootstrap
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at src/services/billing.ts:215 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of koala73/worldmonitor@7d06c8633d (2026-08-21). Data as JSON: /api/errors/4b21cf35649f6604. Report an issue: GitHub.

Appendix: source

Thrown at src/services/billing.ts:220

export type ProActivationClaimOutcome =
  | 'claimed'
  | 'not_eligible'
  | 'already_presented'
  | 'already_claimed';

/**
 * Atomically re-check server-side activation state and reserve one markerless
 * presentation across devices.
 */
export async function claimProActivationPresentation(
  activationKey: string,
  claimNonce: string,
): Promise<ProActivationClaimOutcome> {
  const userId = requireSignedInUserId('claim Pro activation');
  const client = await getConvexClient();
  const api = await getConvexApi();
  if (!client || !api) throw new Error('Convex unavailable');
  await requireCurrentConvexUser(userId, 'claiming Pro activation');
  const result = await settleAccountOperation(
    userId,
    'claiming Pro activation',
    () => client.mutation(
      (api as any).payments.billing.claimProActivationPresentation,
      { activationKey, claimNonce },
    ),
  ) as { status: ProActivationClaimOutcome };
  assertAccountStillCurrent(userId, 'claiming Pro activation');
  return result.status;
}

/** Mark a successful markerless claim as visibly presented. */
export async function confirmProActivationPresentation(
  activationKey: string,
  claimNonce: string,
): Promise<boolean> {

View on GitHub (pinned to 7d06c8633d)