INCY
Назад

Браузерная сборка @incy/link-encoder - генерация crypt1-ссылок без Node

PremiumПриоритетная поддержка
ИдеяГотовоПубличныйДругое
Автор: p************@gmail.com
Создан: 22.08.2026, 23:08:05
Приветствую! 
Спасибо, что выложили link-encoder открыто: благодаря ему crypt1-ссылки можно
собирать у себя, не завися от сторонних сервисов.

Есть одна деталь, которая мешает применить его там, где такие ссылки нужнее
всего - на страницах подписки и в личных кабинетах. Пакет 1.0.1 рассчитан
только на Node: внутри createHash, createCipheriv и randomBytes из node:crypto,
интерфейс синхронный. В браузерной сборке он не работает.

Из-за этого интеграция с Remnawave не состоялась уже дважды:

- https://github.com/remnawave/backend/pull/190 - эндпоинт шифрования в панели, закрыт;
- https://github.com/remnawave/subscription-page/pull/52 - то же на странице подписки,
  закрыт с объяснением мейнтейнера:
  «Библиотека от Incy не позволяет ее использовать напрямую в фронтенд-приложениях,
  так как она опирается на node:crypto, который в браузере недоступен»
  (https://github.com/remnawave/subscription-page/pull/52#issuecomment-4996761919);
- https://github.com/remnawave/subscription-page/pull/53 — открыт с июля: автор
  обошёл ограничение форком библиотеки, и из-за зависимости на форк PR не принимают.

Просьба: добавить второй вход на Web Crypto, сохранив нынешний нодовый. В том же
ответе мейнтейнер Remnawave приводит свой пакет для аналогичных ссылок Happ как
пример такого устройства - https://github.com/kastov/cryptohapp, там два входа с
одинаковым внешним интерфейсом.

Дополнительных секретов это не раскрывает: ключ и так поставляется в клиентах и в
опубликованном пакете, о чём вы прямо пишете в README.

Если сочтёте нужным, я готов собрать и прислать PR.

Заранее благодарю за любой ответ. 
Комментарии (6)
Команда INCYadmin122.08.2026, 23:36:26
Добрый день, взяли в работу.
p************@gmail.com22.08.2026, 23:37:29
Приятно это видеть =) спасибо, буду ждать! 
Команда INCYadmin123.08.2026, 00:14:52
Интеграция успешно проведена по вашему запросу:
https://github.com/INCY-DEV/incy-link-encoder
p************@gmail.com123.08.2026, 14:46:28
Спасибо за 1.2.0, браузерный вход работает, я уже выкатил его у себя в трёх местах.

Появилась смежная просьба, уже не только от меня. Мейнтейнер Remnawave добавил ключ `INCY_CRYPT1_LINK` в свои Template Variables (`@remnawave/subscription-page-types` 0.5.1), чтобы страница подписки умела отдавать crypt1 из коробки. Но встроить туда `/web` вход мешает одна деталь: подстановка переменных на странице подписки синхронная, а WebCrypto асинхронный. Сделать её асинхронной нельзя: на iOS и в Safari переход по своей схеме после await теряет «свежесть нажатия», и ссылка просто не открывается.

У Happ это решено так: во фронтовой сборке шифрование сделано на чистом JS (`jsencrypt`), без WebCrypto, и потому синхронное. Поэтому их ключи подставляются одной строкой, а ваш нет.

Просьба: добавить в `@incy/link-encoder` синхронный вход на чистом JS. Тот же формат crypt1, тот же ключ, просто AES-256-GCM без обращения к `crypto.subtle`, например отдельной точкой `@incy/link-encoder/sync`. Тогда `INCY_CRYPT1_LINK` встанет в Remnawave ровно так же, как ключи Happ.

Если удобно, могу прислать PR сам, скажите только, принимаете ли вы их в репозиторий. Реализацию вижу на `@noble/ciphers` (MIT, без зависимостей, аудированная, AES-GCM синхронный): новая точка входа рядом с существующими, тот же keymat, и прогон против вашего же кросс-платформенного тест-вектора, чтобы байты сходились с node и web входами. Ничего в текущем API при этом не меняется.

Обсуждение на стороне Remnawave: https://github.com/remnawave/subscription-page/pull/53
Команда INCYadminРешение23.08.2026, 21:52:23
Добавили
Команда INCYadmin23.08.2026, 00:32:33
Мы были бы благодарны за вашу помощь с PR в Remnawave
Добавить комментарий