70 Commits

Author SHA1 Message Date
claude 2218c7c1b7 Merge pull request 'feat(parser): авто-переподключение к SHiP с backoff (1.3.0)' (#12) from dev into main
Release / Release (push) Successful in 9m35s
v1.3.0
2026-06-05 13:01:02 +00:00
coopops 92811c258f feat(parser): авто-переподключение к SHiP через ReconnectSupervisor с backoff
CI / Lint (pull_request) Successful in 9m51s
CI / Integration tests (pull_request) Successful in 9m46s
CI / Build (pull_request) Successful in 9m25s
CI / Typecheck (pull_request) Successful in 9m27s
CI / Unit tests (pull_request) Successful in 9m33s
ReconnectSupervisor был написан, протестирован и экспортнут, но НИГДЕ не
подключён к циклу чтения. Parser.start() имел голый for-await без try/catch:
падение ноды → ShipConnectionError наверх → темп переподключений целиком
зависел от внешнего супервизора процесса. Мёртвая нода = рестарт без пауз =
долбёжка ноды без ограничителей.

Что сделано:
- Цикл чтения вынесен в runStreamLoop (core/streamLoop.ts) с инъекцией
  зависимостей — чтобы покрыть reconnect/resume юнит-тестами на фейках, без
  реального Redis и SHiP.
- runStreamLoop оборачивает (пере)подключение в ReconnectSupervisor:
  backoff 1→2→5→15→60с, после maxAttempts без прогресса — process.exit(1)
  (оркестратор перезапустит штатно).
- Позиция возобновления перечитывается из Redis на КАЖДОМ подключении
  (sync-hash пишется после каждого блока) — продолжаем ровно с последнего
  записанного блока, без потерь и дублей.
- ReconnectSupervisor.run теперь передаёт fn callback resetBackoff: каждый
  обработанный блок сбрасывает счётчик попыток, чтобы долгая стабильная сессия
  после редкого разрыва не копила attempt до выхода.
- Штатная остановка (stop закрывает ws) ловится и не вызывает лишний backoff.
- Parser получил структурный логгер (opts.logger) для onAttempt/onGiveUp.

Тесты: +4 runStreamLoop (reconnect+resume, stop без reconnect, give-up на
мёртвой ноде, resetBackoff на прогрессе), +4 ReconnectSupervisor (resetBackoff).
Всего 229 unit. README: секция «Авто-переподключение к SHiP».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 13:00:11 +00:00
claude 3bf7cf9c7a Merge pull request 'docs(readme): backpressure-окно со схемой + конфиг' (#11) from dev into main
Release / Release (push) Successful in 9m21s
2026-06-04 05:44:26 +00:00
coopops be67debf51 docs(readme): раздел про backpressure-окно со схемой + конфиг в примерах
CI / Typecheck (pull_request) Successful in 9m25s
CI / Integration tests (pull_request) Successful in 9m48s
CI / Build (pull_request) Successful in 9m25s
CI / Lint (pull_request) Successful in 9m51s
CI / Unit tests (pull_request) Successful in 9m32s
Описание окна поглощения writer↔consumer (highWater/lowWater гистерезис, пауза
чтения SHiP по XLEN, антидребезг), ASCII-схема качелей backlog, рекомендация
maxmemory+noeviction. Конфиг backpressure добавлен в оба YAML-примера, строка
Backpr. в арх-диаграмму, актуализированы счётчики тестов (221/54).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 05:43:48 +00:00
claude 3dbd2c9116 Merge pull request 'feat(backpressure): окно поглощения writer↔consumer (защита Redis RAM на репарсинге)' (#10) from dev into main
Release / Release (push) Successful in 9m33s
v1.2.0
2026-06-03 16:08:12 +00:00
coopops 87af7a89d2 feat(backpressure): окно поглощения writer↔consumer — пауза чтения SHiP по backlog стрима
CI / Typecheck (pull_request) Successful in 9m25s
CI / Lint (pull_request) Successful in 9m27s
CI / Unit tests (pull_request) Successful in 9m32s
CI / Build (pull_request) Successful in 9m26s
CI / Integration tests (pull_request) Successful in 13m37s
Проблема: на длинном репарсинге (genesis→head) Parser XADD'ит события в Redis
быстрее, чем consumer (controller) их вычитывает. RAM парсера ограничена
SHiP-окном (max_messages_in_flight), а Redis-стрим — нет → растёт неограниченно
в памяти Redis → OOM. XtrimSupervisor не режет непрочитанное.

Решение: BackpressureGate. Перед обработкой каждого блока Parser проверяет
backlog = XLEN стрима. Если backlog >= highWater — чтение SHiP встаёт на паузу
(блок не ack'ается, SHiP сам тормозит после in-flight окна), ждём пока consumer
сольёт backlog <= lowWater, затем продолжаем. Ничего не теряется — события
остаются в стриме. Нет consumer → стрим дорастает до highWater и writer замирает.

Метрика backlog = XLEN: ровно та память Redis, что бережём; не зависит от числа
групп и версии Redis.

Конфиг backpressure: { enabled (default true), highWater (100k), lowWater (50k),
pollMs (200) }. По умолчанию включено — защита репарсинга из коробки.

Также: добавлен del в IRedisClient (латентный type-error в xtrim-интеграционном
тесте из прошлого коммита — tsc по тестам не гонялся в release-пуше).

Проверено на реальном Redis (integration-тест в CI): пауза при backlog>=highWater,
возобновление после слива. Unit: 221 зелёных, typecheck чистый. parser2 1.1.3→1.2.0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 16:07:45 +00:00
claude 19a905d54b Merge pull request 'fix(xtrim): не триммить un-acked pending + null-гард parseStreamEntries (баг #3)' (#9) from dev into main
Release / Release (push) Successful in 9m34s
v1.1.3
2026-06-03 13:02:49 +00:00
coopops c8b7107c3a fix(xtrim): не триммить un-acked pending + гард null-записей в parseStreamEntries
CI / Typecheck (pull_request) Has been cancelled
CI / Unit tests (pull_request) Has been cancelled
CI / Integration tests (pull_request) Has been cancelled
CI / Build (pull_request) Has been cancelled
CI / Lint (pull_request) Has been cancelled
Баг #3: consumer падал навсегда с TypeError "Cannot read properties of null
(reading 'length')" и переставал читать стрим. Два корня:

1. XtrimSupervisor.trim() брал MINID = lastDeliveredId. Но un-acked pending
   записи старше lastDeliveredId (доставлены, не подтверждены) → XTRIM сносил
   собственные pending группы. Теперь нижняя граница trim — самый старый
   un-acked ID из XPENDING (новый метод RedisStore.xpendingMinId), а сравнение
   stream-ID числовое по <ms>-<seq>, не лексикографическое ('1000' < '999').

2. parseStreamEntries падал на null rawFields: при перечитывании PEL
   (XREADGROUP ... 0) Redis отдаёт [id, null] для обрезанных ID. Добавлен
   гард `if (!rawFields) continue` — обрезанные записи пропускаются.

Триггер: consumer отстаёт от писателя (бутстрап с genesis) → растёт pending →
XtrimSupervisor сносит pending → PEL отдаёт null → краш в бесконечном цикле.

Воспроизведено и проверено на реальном Redis (новый integration-тест
xtrim.integration.test.ts, гоняется в CI): trim сохраняет все un-acked pending,
PEL-перечитка не падает на null. Unit: 211 зелёных.

parser2 1.1.2→1.1.3. ship-reader без изменений.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 13:02:21 +00:00
claude 71f7a22436 Merge pull request 'fix(block-time): on-chain timestamp блока вместо wall-clock' (#8) from dev into main
Release / Release (push) Successful in 9m36s
v1.1.2
2026-06-03 11:57:39 +00:00
coopops 5319209cb2 fix(block-time): брать on-chain timestamp блока из signed_block header, не wall-clock
CI / Typecheck (pull_request) Has been cancelled
CI / Unit tests (pull_request) Has been cancelled
CI / Integration tests (pull_request) Has been cancelled
CI / Build (pull_request) Has been cancelled
CI / Lint (pull_request) Has been cancelled
block_time во всех событиях равнялся времени запуска парсера (new Date()),
одинаковому для всех блоков — point-in-time запросы («был ли ключ активен в
момент T») были невозможны.

ship-reader: decodeBlocksResult теперь декодит r.block (fetch_block:true уже
запрашивал, но байты игнорились) как block_header и берёт timestamp; ShipBlock
получает блок-уровневое поле blockTime; убран new Date()-сид в BlockStream.
parser2: BlockProcessor берёт block.blockTime — общий для всех событий блока,
включая trace-less genesis; фейковый new Date()-фолбэк убран, пустое время
логируется warn'ом.

ship-reader 0.3.0→0.3.1, parser2 1.1.1→1.1.2.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 11:57:14 +00:00
claude 30475c055f Merge pull request 'fix(native-delta): декодировать нативные строки ABI вместо JSON.parse' (#7) from dev into main
Release / Release (push) Successful in 10m3s
v1.1.1
2026-06-03 09:07:56 +00:00
coopops 39eabb737b fix(native-delta): декодировать нативные строки ABI, а не JSON.parse
CI / Typecheck (pull_request) Has been cancelled
CI / Unit tests (pull_request) Has been cancelled
CI / Integration tests (pull_request) Has been cancelled
CI / Lint (pull_request) Has been cancelled
CI / Build (pull_request) Has been cancelled
deserializeNativeDelta делал JSON.parse(rowRaw), но rowRaw нативных таблиц —
это ABI-сериализованные байты state_history, а не JSON. Каждая native-строка
всегда падала на десериализации, а BlockProcessor глотал ошибку в catch {} →
поток native-delta событий был всегда пустой (permission/account/resource_*).

Фикс:
- WharfkitDeserializer.deserializeNativeDelta декодит через Serializer.decode
  с ship-ABI (type = имя таблицы, это variant *_v0) и распаковывает variant
  [typeName, row] → плоскую строку.
- Deserializer/streamNativeDeltas/ShipClient прокидывают ship-ABI до метода
  (ShipClient.abi getter); адаптер parser2 передаёт this.client.abi.
- BlockProcessor больше не глушит ошибку молча — warn с block_num/table/err.
- Тесты native-rows переписаны под ABI-байты + регресс-гард «JSON теперь бросает».

Проверено на live mono-ai-1: 30/30 native-дельт декодятся (было 0/90).
ship-reader 0.2.0→0.3.0 (breaking: +abi в Deserializer/streamNativeDeltas),
parser2 1.1.0→1.1.1 (багфикс, публичный API не менялся).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 09:06:13 +00:00
claude d71a2d696d release: синк release.yml с main (без docker, Gitea API, NPM_TOKEN) (#6) 2026-05-28 11:57:17 +00:00
claude f6360132f0 release: убрать docker job + создавать релиз через Gitea API (#5)
Release / Release (push) Successful in 9m21s
2026-05-28 09:53:20 +00:00
claude 16bd87cca1 release: публикация npm через NODE_AUTH_TOKEN (Gitea не выдаёт OIDC) (#4)
Release / Release (push) Successful in 9m23s
Release / Build & push Docker image (push) Has been skipped
Хотфикс release.yml: NPM auth через NODE_AUTH_TOKEN=NPM_TOKEN, снят provenance и id-token: write — Gitea Actions не выдаёт OIDC id-token, поэтому trusted publishing/provenance работать не могут.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
v1.1.0
2026-05-28 05:56:17 +00:00
ant 677dc35bde Merge pull request 'release: parser2 1.1.0 + ship-reader 0.2.0 (полный SHiP action_trace)' (#3) from dev into main
Release / Release (push) Failing after 5m30s
Release / Build & push Docker image (push) Has been skipped
Reviewed-on: #3
Reviewed-by: Алексей Муравьев <chairman.voskhod@gmail.com>
2026-05-27 06:36:18 +00:00
coopops 05d413b37f ci: запускать только на pull_request, убрать триггер push
CI / Lint (pull_request) Successful in 9m21s
CI / Typecheck (pull_request) Successful in 9m29s
CI / Unit tests (pull_request) Successful in 9m32s
CI / Integration tests (pull_request) Successful in 9m43s
CI / Build (pull_request) Successful in 9m31s
Прогон на push в dev/main дублировал проверку, уже сделанную на PR, и жёг
по ~47 мин на нагруженном раннере. Оставляем только pull_request (main, dev):
ветки в эти ветки попадают через PR, который и валидируется; релиз main
триггерит отдельный release.yml.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 16:17:12 +00:00
claude 37efb4834e ci: корректная интеграция на DinD-раннере (docker cp + сеть jobа + redis по имени) (#2)
CI / Lint (push) Successful in 9m22s
CI / Typecheck (push) Successful in 9m27s
CI / Unit tests (push) Successful in 9m34s
CI / Integration tests (push) Successful in 9m41s
CI / Build (push) Successful in 9m28s
CI / Typecheck (pull_request) Has been cancelled
CI / Unit tests (pull_request) Has been cancelled
CI / Integration tests (pull_request) Has been cancelled
CI / Build (pull_request) Has been cancelled
CI / Lint (pull_request) Has been cancelled
Конфиг ноды через docker cp, нода в сети job-контейнера по IP, Redis по имени сервиса. Полный конвейер зелёный (integration 1 passed против живой ноды + SHiP + Redis).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 15:01:55 +00:00
coopops d575da529b ci: поднимать ноду через docker cp вместо bind-mount (DinD)
CI / Lint (push) Successful in 9m26s
CI / Typecheck (push) Successful in 9m28s
CI / Unit tests (push) Successful in 9m33s
CI / Build (push) Has been skipped
CI / Integration tests (push) Failing after 13m2s
Раннер — docker-in-docker (docker.sock хоста в job-контейнере), поэтому
пути bind-mount (-v) резолвятся на ФС хоста: ни mktemp, ни workspace демону
не видны → монтировался пустой каталог, nodeos падал с 'genesis file does
not exist'. Конфиг теперь кладём в контейнер через docker cp (tar по API,
от путей хоста не зависит), config-dir=/mnt/cfg (docker cp не создаёт
родителей, а /mnt/dev/config в образе нет). Проверено локально: chain API
get_info + SHiP 101 Switching Protocols.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 12:52:02 +00:00
coopops 9f21c61a75 ci: перезапуск прогона на dev — проверка после очистки диска раннера
CI / Lint (push) Successful in 10m48s
CI / Typecheck (push) Successful in 9m32s
CI / Unit tests (push) Successful in 9m46s
CI / Integration tests (push) Failing after 17m48s
CI / Build (push) Has been skipped
Прогон 182 упал на стадии cache-restore/install (инфра, не код):
typecheck локально зелёный, паритет пакетов с dev подтверждён.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 11:56:12 +00:00
claude fce498ce45 feat(events): полный SHiP action_trace в ActionEvent (transaction_id, creator_action_ordinal, receipt.auth_sequence, …) (#1)
CI / Lint (push) Successful in 9m20s
CI / Typecheck (push) Failing after 11m9s
CI / Unit tests (push) Has been skipped
CI / Integration tests (push) Has been skipped
CI / Build (push) Has been skipped
2026-05-26 04:26:33 +00:00
coopops 0c3c3bc002 [549-27][@ant] config: переключить publish обратно на OIDC trusted publishing и синхронизировать URL репозитория coopenomics/parser→coopenomics/parser2 — npm Trusted Publisher теперь настроен на @coopenomics/parser2 через workflow релиза нового имени репо, NPM_TOKEN больше не нужен и sigstore provenance снова включён; bump до 1.0.3 чтобы Lerna опубликовала новую версию и протестировать OIDC-флоу с новой конфигурацией; URL-ы в README/package.json/examples подтянуты под новое имя github-репо parser2 v1.0.3 2026-04-23 16:00:32 +00:00
coopops a1f72d3352 [549-27][@ant] fix(docker): обновить пути packages/parser/→packages/parser2/ — предыдущий sed не покрыл Dockerfile (там слэш после parser а не word-boundary), docker build ломался на COPY packages/parser/package.json не найден; теперь Dockerfile согласован с новым расположением пакета и ENTRYPOINT указывает на parser2/dist/cli/index.js v1.0.2 2026-04-23 15:50:32 +00:00
coopops ecc6a25734 [549-27][@ant] config: временно вернуть NPM_TOKEN и провенанс=false в publish-step — первая публикация @coopenomics/parser2 не может идти через OIDC trusted publishing потому что на стороне npm Trusted Publisher настраивается только для уже существующего пакета, а parser2 ещё не создан в реестре; после первого publish добавим Trusted Publisher на npm и вернёмся на OIDC без токена 2026-04-23 15:41:10 +00:00
coopops a464cdbd2d [549-27][@ant] chore: пустой коммит чтобы триггернуть actions после сбоя первоначального триггера 2026-04-23 14:44:40 +00:00
coopops 167c885a70 [549-27][@ant] refactor: вернуть имя parser2 обратно (полный реверт 549-20) — существующий @coopenomics/parser@2026.x в mono-ai живёт в продакшене (dicoop/cooparser всё ещё деплоится), параллельный publish @coopenomics/parser@1.0.x из этого репо создавал коллизию ожиданий у потребителей; раздельные имена parser2/parser устраняют путаницу. Папка packages/parser→parser2, пакет @coopenomics/parser→@coopenomics/parser2, docker image dicoop/parser→dicoop/parser2, Redis prefix parser:→parser2: (ce:parser:, abi, sub, sync, subs, reparse), метрики parser_*→parser2_*, bin parser2. Версия bumpnута до 1.0.2 для нового публичного пакета @coopenomics/parser2 2026-04-23 14:43:22 +00:00
coopops aff8a2451d [549-23][@ant] feat(parser): bump до 1.0.1 и добавить Docker-секцию в root README — проверить npm trusted publishing через GitHub Actions OIDC (на v1.0.0 lerna скипала No unpublished release found), документировать публичный образ dicoop/parser с docker-compose примером Redis+parser и полным parser.config.yaml шаблоном для пользователей v1.0.1 2026-04-22 15:49:38 +00:00
coopops 2f391db4b4 [549-22][@ant] config: поменять Docker Hub namespace coopenomics→dicoop — реальный owner Docker Hub организации для этого проекта dicoop (coopenomics там не существует), иначе docker push падал с insufficient_scope; image теперь публикуется как docker.io/dicoop/parser:<version> v1.0.0 2026-04-22 15:44:33 +00:00
coopops 94dbcb8400 [549-22][@ant] config: переключить Docker push на Docker Hub и npm publish на trusted publishing (OIDC) — Docker Hub доступнее без префикса реестра чем ghcr (docker pull coopenomics/parser), а OIDC-публикация в npm избавляет от ручного обновления NPM_TOKEN который рано или поздно забудется и сломает релиз; release.yml теперь использует DOCKERHUB_USERNAME/DOCKERHUB_TOKEN для docker login и id-token write permission с NPM_CONFIG_PROVENANCE=true для sigstore-подписанной публикации через настроенный npm Trusted Publisher 2026-04-22 15:36:55 +00:00
coopops 0acfd25a64 [549-21][@ant] chore: пустой коммит для ретригера release workflow — после исправления Dockerfile и удаления тега v1.0.0 нужно заново пройти релизный пайплайн чтобы Docker образ собрался и запушился в ghcr.io 2026-04-22 11:07:09 +00:00
coopops a625b3ae05 [549-21][@ant] fix(docker): обновить пути parser2→parser, убрать несуществующий корневой LICENSE/NOTICE, переключить ENTRYPOINT на ESM index.js — Docker build падал с '/LICENSE: not found' после переименования папки и отсутствия корневой лицензии; теперь используем per-package LICENSE+NOTICE что также правильнее для атрибуции 2026-04-22 11:06:11 +00:00
coopops b023f26a8f [549-21][@ant] config: переименовать root npm-scripts version/publish → release:version/release:publish — имена publish и version зарезервированы как npm lifecycle hooks, Lerna в workspace вызывала сама себя через npm publish трактовав root script как lifecycle handler (@coopenomics/parser@1.0.0 успел, ship-reader упал на рекурсии); ship-reader теперь сможет опубликоваться 2026-04-22 11:03:11 +00:00
coopops fd7ff5fcaa [549-21][@ant] config: убрать id-token permission и явно NPM_CONFIG_PROVENANCE=false — npm автоматически включает provenance когда видит id-token: write + CI=true, а для новых пакетов это блокирует publish с E404; включим обратно после первого успешного релиза 2026-04-22 10:53:04 +00:00
coopops cf988d8c38 [549-21][@ant] config: отключить NPM_CONFIG_PROVENANCE на время первого publish — sigstore attestation требует чтобы пакет уже существовал в реестре, блокирует первоначальную публикацию @coopenomics/coopos-ship-reader; включим обратно после того как пакеты созданы 2026-04-22 10:50:59 +00:00
coopops 42393ff1ef [549-21][@ant] config: добавить publishConfig.access=public в пакеты — npm требует явного access для первой публикации scoped пакетов @coopenomics/* особенно при включённом provenance (Lerna падал с "Can't generate provenance for new or private package") 2026-04-22 10:48:54 +00:00
coopops b5cf922a7b [549-21][@ant] config: интегрировать Lerna для управления пакетами и регенерировать lockfile — упростить multi-package версионирование и публикацию перед первым релизом в npm; lerna.json с independent versioning + pnpm as npmClient + allowBranch=main, npm-скрипты changed/version/publish/release в root package.json для локального интерактивного bump и dry-run проверок, release.yml переключён на lerna publish from-package --yes (smart skip неизменных версий вместо ручного version-check), попутно регенерирован pnpm-lock.yaml который после rename parser2→parser провалил CI на ERR_PNPM_OUTDATED_LOCKFILE 2026-04-22 10:47:38 +00:00
coopops 3bdd240d8a [549-20][@ant] refactor: переименовать parser2→parser, добавить root README и автопубликацию из main — привести репозиторий к релизной форме под публичным именем @coopenomics/parser до первого npm publish; единое имя папки, Redis key prefix (parser2:→parser:), метрик (parser2_*→parser_*) и комментариев устраняет путаницу в CLI, observability и docs; root README описывает монорепу, архитектурную схему, процесс релиза; ci.yml теперь только на push/PR в main и dev, отдельный release.yml на push в main детектит bump версии, публикует пакеты в npm, тегирует, создаёт GitHub Release через changelogithub и пушит Docker-образ в ghcr 2026-04-22 10:40:35 +00:00
coopops e6e986cb86 [549-19][@ant] refactor: отказаться от abieos в пользу wharfkit-only и расширить unit-покрытие до 80%+ — native binding давал только 2-5× на типичной нагрузке с крупными транзакциями, не оправдывая инфраструктурной возни с нативной компиляцией и GLIBCXX-зависимостями; параллельно закрыты пробелы в тестах (ParserClient, XtrimSupervisor, RedisKeys, ShipProtocol, NativeRowStream, ForkDetector edge cases — +86 тестов) чтобы зафиксировать baseline перед будущими оптимизациями wharfkit 2026-04-22 10:16:57 +00:00
coopops 4d6316dc50 cleanup: убрать debug логи после того как integration тест начал проходить 2026-04-22 07:22:10 +00:00
coopops 7ab332efaa fix(ship-reader): конвертировать wharfkit Name объекты в строки — trace.account/name приходили как Name (не string), worker.Serializer.decode пытался синтезировать ABI из Name-класса и падал на abiName 2026-04-22 07:11:54 +00:00
coopops c3f36223e2 debug: dump full stack + ABI + raw hex for eosio.token decode failures 2026-04-22 07:02:41 +00:00
coopops 1414a6509f fix(parser): использовать abi.toJSON() вместо JSON.stringify(abi) — wharfkit ABI-объект сериализуется во внутренний формат вместо канонической схемы, из-за чего worker.Serializer.decode не находил типы 2026-04-22 06:49:03 +00:00
coopops 355e44e92b debug: логировать ошибки десериализации action data для диагностики integration тестов 2026-04-22 06:38:54 +00:00
coopops d8491c588f fix(parser): сериализовать BigInt как string в eventToFields — JSON.stringify не умеет BigInt, action.global_sequence уходил в Redis как ошибка 2026-04-22 06:29:05 +00:00
coopops 6db2eddd81 fix(ship-reader): конвертировать block_id и chain_id в строки — wharfkit ABI decoder возвращает Checksum256 объект, а downstream код ожидает hex-строку (blockId.slice()) 2026-04-22 06:20:20 +00:00
coopops 6166afa279 fix(ship-reader): брать global_sequence из receipt — в action_trace_v1 top-level global_sequence отсутствует, только в action_receipt 2026-04-22 06:11:23 +00:00
coopops 7579bc4cf4 fix(ship-reader): распаковывать action receipt variant-tuple — SHiP может отдавать receipt как [variantName, data], BigInt(undefined) ломал decodeBlocksResult 2026-04-22 06:01:53 +00:00
coopops 83b82c7972 test: увеличить таймаут до 40s, включить info логи, показывать parser errors — нужна диагностика почему событие не доходит до клиента 2026-04-22 05:52:50 +00:00
coopops 4b6fc95eca fix(test): убрать keyPrefix и добавить FLUSHDB — ioredis keyPrefix не применялся к XGROUP CREATE что вызывало NOGROUP между Parser (писатель) и ParserClient (читатель) 2026-04-22 05:44:37 +00:00
coopops aac54b4e5e fix(test): общий keyPrefix для Parser и ParserClient — Date.now() в двух местах давал разные префиксы, клиент не находил consumer group 2026-04-22 05:32:43 +00:00