TryMellon

Events & Error handling

Events & Error handling

Events

The SDK emits events so you can show spinners and handle analytics:

client.on('start', (payload) => {
  console.log('Started:', payload.operation)  // 'register' | 'authenticate'
  showSpinner()
})

client.on('success', (payload) => {
  console.log('Success:', payload.operation)
  hideSpinner()
})

client.on('error', (payload) => {
  console.error('Error:', payload.error)
  hideSpinner()
  showError(payload.error.message)
})

// Unsubscribe
const unsubscribe = client.on('start', handler)
unsubscribe()

Events: 'start', 'success', 'error', 'cancelled'.

Error handling

All methods return Result<T, TryMellonError>. Check result.ok and use result.error.code:

import { isTryMellonError } from '@trymellon/js'

const result = await client.authenticate({ externalUserId: 'user_123' })

if (!result.ok) {
  const error = result.error
  switch (error.code) {
    case 'USER_CANCELLED':
      console.log('User cancelled')
      break
    case 'NOT_SUPPORTED':
      await client.fallback.email.start({ userId: 'user_123' })
      break
    case 'PASSKEY_NOT_FOUND':
      await client.register({ externalUserId: 'user_123' })
      break
    case 'NETWORK_FAILURE':
      console.error('Network error:', error.details)
      break
    case 'TIMEOUT':
      console.error('Operation timed out')
      break
    default:
      console.error(error.code, error.message)
  }
  return
}

// result.value has session_token, user, etc.

Error codes

CodeDescription
NOT_SUPPORTEDWebAuthn not available in this environment
USER_CANCELLEDUser cancelled the operation
PASSKEY_NOT_FOUNDNo passkey found for this user
SESSION_EXPIREDSession expired
NETWORK_FAILURENetwork error (SDK retries with backoff)
INVALID_ARGUMENTInvalid argument in config or options
TIMEOUTOperation timed out
ABORTEDOperation aborted via AbortSignal
UNKNOWN_ERRORUnknown error

Cancel with AbortSignal

const controller = new AbortController()
setTimeout(() => controller.abort(), 10000)

const result = await client.register({
  externalUserId: 'user_123',
  signal: controller.signal,
})
if (!result.ok && result.error.code === 'ABORTED') {
  console.log('Cancelled')
}