IPFS: Helia и жизненный цикл клиента
В старых материалах JavaScript-клиент IPFS часто создаётся через ipfs-core. Для нового проекта изучим Helia — модульную реализацию, где жизненный цикл, хранение и способы обмена задаются явно. В уроке подготовим минимальный маршрут работы с байтами манифеста, учитывая изменения API поколения 7.
Мы не устанавливаем пакеты, не запускаем клиент и не подключаемся к публичным участникам. Профиль урока относится к API Helia 7 по официальному руководству миграции, изученному 12 октября 2026 года. Конкретный lockfile зависимостей ещё не создан и не выдаётся за проверенный.
Создание не означает запуск
В Helia 7 createHelia возвращает объект в остановленном состоянии. Для начала работы выполняется явный start. Это отличается от старых примеров, где асинхронная фабрика сразу возвращала запущенный клиент. Поэтому простое копирование старого листинга может скрыть важную стадию.
Фрагмент жизненного цикла для будущего проекта:
import { createHelia } from 'helia';
import { unixfs } from '@helia/unixfs';
const node = createHelia();
try {
await node.start();
const files = unixfs(node);
const bytes = new TextEncoder().encode(
'{"courseId":"17","edition":"1"}'
);
const cid = await files.addBytes(bytes);
console.log(cid.toString());
} finally {
await node.stop();
}
Это исходник, который не исполнялся. Строка представляет небольшой самостоятельный учебный документ, а не окончательный манифест выпуска. Профиль импорта полного каталога задаётся отдельно. Результатом будущего выполнения станет вычисленный CID, а не заранее подставленное значение.
Локальное добавление и распространение
Добавление байтов создаёт соответствующие блоки в доступном клиенту хранилище. Оно не является обещанием, что независимый хранитель уже получил копию. Публичная сеть не превращается в автоматический бесконечный архив после одного вызова функции.
Фабрика и модули могут использовать транспортные настройки, которые позволяют сетевое взаимодействие. Поэтому «программа на моём компьютере» не означает изолированную лабораторию. Перед будущим запуском выбирается явная конфигурация без нежелательного внешнего обмена либо отдельное разрешение на него.
Для нашей текущей работы безопасный результат — сохранённый исходник и описание профиля. Мы не нажимаем кнопку запуска ради получения красивой строки. Когда исполнение будет разрешено, сначала фиксируются сеть, хранилище и способы обнаружения, затем выполняется импорт контрольных байтов.
Модули выполняют разные роли
@helia/unixfs помогает работать с файлами поверх блокового клиента. Сам Helia организует доступ к блокам и жизненный цикл. Отдельные модули могут предоставлять HTTP-получение, libp2p-обмен, IPNS или иные возможности. Поддержка одного модуля не означает включение всех остальных.
В поколении 7 изменились способы добавления HTTP и libp2p-конфигурации. Если проект использует соответствующие маршруты, он следует руководству миграции и не передаёт старый объект параметров вслепую. Здесь мы не приводим непроверенную полную сетевую конфигурацию; следующий учебный результат касается выбора устойчивого хранения.
| Часть | Вопрос проекта |
|---|---|
| Жизненный цикл | Когда объект создаётся, запускается и останавливается? |
| Blockstore | Где находятся байты блоков? |
| Datastore | Где находятся необходимые служебные данные? |
| Обмен | Откуда клиент получает и куда предоставляет данные? |
Такая таблица полезнее одного слова «клиент». Она позволяет выяснить, почему после перезапуска исчезла копия или почему объект доступен локально, но не найден другим участником.
Завершение и ошибки
Остановка должна происходить и после исключения, поэтому в листинге используется finally. Ошибка импорта не превращает частично подготовленный выпуск в опубликованный. Если создана часть блоков, состояние отражается как незавершённое, а дальнейший процесс определяет уборку или повтор по выбранному профилю.
Тайм-аут получения отличается от неправильного CID. В первом случае неизвестна доступность за выделенный срок, во втором вход может быть структурно недопустимым. Для пользовательского интерфейса полезны разные причины и возможность повторить только подходящую операцию.
Большой файл следует обрабатывать потоково, если API и задача это поддерживают. Сбор всех байтов в память удобен для крошечного манифеста, но не является универсальной инструкцией для видеолекций. Пределы размера задаются приложением до начала затратной работы.
Создание ещё не означает запуск
В профиле Helia 7 сначала создаётся остановленный объект, после чего приложение явно запускает его. Для библиотеки это важная граница подготовки: можно сформировать конфигурацию, определить хранилище и необходимые модули до сетевого жизненного цикла. Старый пример, где ожидание createHelia воспринимается как автоматический запуск, нельзя переносить в новый профиль без изменения смысла. Ключевое действие — вызов старта, а не наличие слова await перед созданием объекта.
Разберём отказ по стадиям. Если конфигурация неприемлема ещё при создании, выпуск не импортирован. Если ошибка произошла при старте, ресурсы могли пройти часть своего жизненного цикла; приложение завершает их по правилам выбранных модулей и сохраняет причину. Если ошибка появилась при добавлении файла, часть блоков уже может существовать, но финальный выпуск не объявлен. Одна общая надпись «IPFS готов» скрывает эти различия и мешает правильному повтору.
Для нашего будущего процесса полезен собственный статус задания: конфигурация подготовлена, клиент запущен, импорт завершён, сохранение подтверждено, клиент остановлен. Это прикладные состояния, не выдуманные внутренние методы Helia. Они связывают действия редакции с жизненным циклом и позволяют не сообщать об опубликованном материале после частичного успеха.
Остановка тоже не является удалением данных. Постоянный blockstore остаётся отдельным ресурсом; временные данные памяти исчезают согласно его природе. Если программа должна продолжить импорт после сбоя, ей нужны сохранённые исходники, профиль и сведения о завершённом корне. Нельзя восстанавливать результат по случайной строке из незавершённого журнала. В этом уроке все стадии остаются проектируемыми: ни клиент, ни сеть не запущены. Именно такое описание позволяет позднее исполнить осмысленную лабораторию, не принимая создание объекта за доказательство доступности выпуска.
Исходник и воспроизводимый профиль
Перед будущим исполнением потребуется закрепить версии совместимых пакетов, окружение Node и выбранные параметры импорта. Официальный пример API даёт отправную точку, но не доказывает готовность всего проекта. Мы сохраняем эти недостающие стадии явно, не объявляя установки выполненными.
Ожидаемый критерий локального разбора: после явного старта маленький документ добавляется, затем читается обратно в точные байты, а остановка закрывает ресурсы. Чтобы проверить сохранение между процессами, нужен постоянный blockstore. Именно это вводится следующим уроком.
Текущее изменение жизненного цикла описано в миграции Helia 6 → 7, а файловые операции — в официальном модуле UnixFS. Старый рассказ о замене js-IPFS помогает понять мотивацию, но не заменяет актуальную документацию API.