Skip to content

Ошибки ​

Любой сбой энкодера и декодера это PlaceholderError. Это обычный наследник Error с машиночитаемым code, так что плохой хеш можно отличить от плохого изображения, не разбирая сообщения. Повреждённый хеш никогда не вешает и не роняет декодер: он либо декодируется, либо бросает одну из этих ошибок.

ts
import { PlaceholderError } from 'hazehash'
// или из 'hazehash/encode', который тоже его реэкспортирует

try {
  decode(value)
} catch (error) {
  if (error instanceof PlaceholderError && error.code === 'InvalidLength') {
    // значение не является хешем
  }
}

Класс и тип его кода экспортируют hazehash, hazehash/decode и hazehash/encode:

ts
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 может оказаться пустым или повреждённым. Проверка перед отрисовкой сохраняет работоспособность страницы:

ts
function safeAverageColor(hash: string | null) {
  if (!hash) return null
  try {
    return getAverageColor(hash)
  } catch {
    return null
  }
}

Компонент и composable для Vue делают это за вас: недопустимый хеш оставляет плоский фон и печатает в консоль одно предупреждение. См. Компонент PlaceholderImage.