Ошибки
Любой сбой энкодера и декодера это PlaceholderError. Это обычный наследник Error с машиночитаемым code, так что плохой хеш можно отличить от плохого изображения, не разбирая сообщения. Повреждённый хеш никогда не вешает и не роняет декодер: он либо декодируется, либо бросает одну из этих ошибок.
import { PlaceholderError } from 'hazehash'
// или из 'hazehash/encode', который тоже его реэкспортирует
try {
decode(value)
} catch (error) {
if (error instanceof PlaceholderError && error.code === 'InvalidLength') {
// значение не является хешем
}
}Класс и тип его кода экспортируют hazehash, hazehash/decode и hazehash/encode:
type PlaceholderErrorCode =
'InvalidInput' | 'BudgetTooSmall' | 'InvalidLength' | 'InvalidCharacter' | 'UnsupportedVersion'
class PlaceholderError extends Error {
readonly code: PlaceholderErrorCode
}name равно 'PlaceholderError'. В message стоит код, а после двоеточия пояснение, если оно есть, например InvalidInput: expected RGBA data of length 4·width·height.
Ошибки энкодера
InvalidInput
Ввод или опция недопустимы: буфер пикселей не равен 4 · width · height байт, width или height не целое число не меньше 1, budget, analysisSize или вес не конечное число, вес отрицательный, profile не одно из трёх имён или alpha не 'auto' и не булево значение. Хелперы для Node.js бросают её и тогда, когда не установлен sharp.
BudgetTooSmall
budget меньше заголовка хеша: 7 байт или 9, если у изображения есть прозрачность. Ошибка бросается и в случае, когда результат не удалось уложить в бюджет.
Ошибки декодера
InvalidLength
Строка или байты не могут быть хешем: строка base64url, длина которой оставляет один символ в последней группе, либо данные короче заголовка (7 байт или 9, если заголовок говорит, что у хеша есть альфа) либо длиннее 1024 байт.
InvalidCharacter
В строке есть символ вне алфавита base64url (A–Z, a–z, 0–9, -, _). Выравнивание знаком = не входит в формат и тоже отклоняется.
UnsupportedVersion
Первые два бита заголовка называют версию, которую этот релиз не знает. Существует только версия 1, а декодер отклоняет зарезервированные значения, а не гадает.
Обработка плохого хеша на странице
Хеш из базы данных или CMS может оказаться пустым или повреждённым. Проверка перед отрисовкой сохраняет работоспособность страницы:
function safeAverageColor(hash: string | null) {
if (!hash) return null
try {
return getAverageColor(hash)
} catch {
return null
}
}Компонент и composable для Vue делают это за вас: недопустимый хеш оставляет плоский фон и печатает в консоль одно предупреждение. См. Компонент PlaceholderImage.