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
| Code | Description |
|---|---|
NOT_SUPPORTED | WebAuthn not available in this environment |
USER_CANCELLED | User cancelled the operation |
PASSKEY_NOT_FOUND | No passkey found for this user |
SESSION_EXPIRED | Session expired |
NETWORK_FAILURE | Network error (SDK retries with backoff) |
INVALID_ARGUMENT | Invalid argument in config or options |
TIMEOUT | Operation timed out |
ABORTED | Operation aborted via AbortSignal |
UNKNOWN_ERROR | Unknown 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')
}