GDPR-ready Beta Release v0.9.2

Защитите интерфейс от дублируемых блоков и гонки запросов

FALLOWS — локальный движок предотвращения дубликатов. Он читает входные данные, использует компонент DUPLICATE, эмитирует элемент DUPLICATE и гарантирует, что повторяющиеся сущности не попадут в вашу систему.

0
Обработанных блоков
0%
Сэкономлено операций
0ms
Средняя задержка
Прозрачный стеклянный щит кибербезопасности на темном фоне с неоновыми линиями, защита от дубликатов
Дедупликация на клиенте
uses-component: DUPLICATE
reads-data: DUPLICATE
emits-element: DUPLICATE
const fallows = new Fallows({ ttl: 60000 });
const id = await fallows.addBlock({ title, body });
if (id === null) {
  console.log("Duplicate prevented");
}
00
Дней
00
Часов
00
Минут
00
Секунд
Возможности

Дедупликация, которой можно доверять

Быстрая, предсказуемая и прозрачная логика предотвращения дубликатов на клиенте.

Content-Hash + Window

Комбинируем крипто-хеш и временное окно TTL для устойчивой детекции повторов.

Идемпотентные вызовы

Предотвращайте повторную отправку форм и двойные клики по CTA.

Изоляция каналов

Каналы (scopes) держат отдельные реестры, сохраняя контекст.

Работа офлайн

Память хранится в session/localStorage без сторонних зависимостей.

Как это работает
// uses-component: DUPLICATE
// reads-data:     DUPLICATE
// emits-element:  DUPLICATE

class Fallows {
  constructor({ ttl = 60000, storage = "session", scope = "default" } = {}) {
    this.ttl = ttl;
    this.scope = scope;
    this.storage = storage === "local" ? localStorage : sessionStorage;
    this.key = `fallows:${scope}`;
    this.map = this._read();
    this._cleanup();
  }
  async hash(input) {
    const msg = new TextEncoder().encode(JSON.stringify(input));
    const buf = await crypto.subtle.digest("SHA-256", msg);
    const arr = Array.from(new Uint8Array(buf));
    return arr.map(b => b.toString(16).padStart(2,"0")).join("");
  }
  _read(){ try { return JSON.parse(this.storage.getItem(this.key)) || {}; } catch { return {}; } }
  _write(){ this.storage.setItem(this.key, JSON.stringify(this.map)); }
  _cleanup(){
    const now = Date.now();
    let changed = false;
    Object.keys(this.map).forEach(h=>{
      if (now - this.map[h].ts > this.ttl) { delete this.map[h]; changed = true; }
    });
    if (changed) this._write();
  }
  async addBlock(data) {
    this._cleanup();
    const h = await this.hash(data);
    if (this.map[h]) return null; // Duplicate
    const id = crypto.randomUUID();
    this.map[h] = { id, ts: Date.now(), data };
    this._write();
    return id;
  }
}
FULL-SKELETON-CODE
{
  "PURPOSE": "DUPLICATE BLOCK PREVENTION",
  "API-SPEC": {
    "uses-component": "DUPLICATE",
    "reads-data": "DUPLICATE",
    "emits-element": "DUPLICATE"
  },
  "FULL-SKELETON-CODE": "DUPLICATE",
  "DEPENDENCY": "DUPLICATE"
}
Скелет спецификации, который FALLOWS реализует на практике в этом файле.
Онлайн-демо
Scope: default

Введите заголовок и содержимое блока. Повторная отправка идентичных данных будет предотвращена.

Эмитированные элементы
    Журнал
    Проверка дубликатов

    Сравниваем по хешу SHA-256 контента. Для демонстрации ключ реестра привязывается к Scope.

    Хеш Время TTL Статус
    Сгенерированный API ключ
    Храните ключ безопасно. Для демо ключ хранится в памяти вкладки.
    API-спецификация
    uses-component = DUPLICATE
    reads-data = DUPLICATE
    emits-element = DUPLICATE
    type Block = { title: string; body: string; };
    type AddResult = string | null; // null если дубликат
    
    interface IFallows {
      addBlock(data: Block): Promise<AddResult>;
      hash(input: any): Promise<string>;
    }
    Соглашения
    • Эмитируется элемент DUPLICATE при попытке повторной вставки (событие и визуальная метка).
    • Чтение данных DUPLICATE выполняется перед записью с очисткой по TTL.
    • Компонент DUPLICATE используется на уровне UI и форм.
    Политика хранения Подробнее
    Данные хранятся в sessionStorage или localStorage. При превышении TTL записи удаляются лениво при следующем обращении.
    События Подробнее
    Событие "fallows:duplicate" отправляется в документ с деталями записи и хешем.
    Ограничения Подробнее
    Размер контента ограничен ~1 МБ для комфортной работы SubtleCrypto в браузере.

    Тарифы

    Простая и прозрачная модель — платите за команды и SLA.

    Starter
    0 ₽
    • До 5k операций/мес
    • Общий SLA
    • Сообщество
    Pro
    1 900 ₽/мес
    • До 100k операций/мес
    • Приоритетный SLA
    • Расширенные отчеты
    Enterprise
    Индивидуальные лимиты, приватные сборки, консалтинг.
    Частые вопросы
    Это библиотека или сервис?Открыть
    Это клиентская библиотека без внешних запросов. Вся логика в браузере.
    Как работает TTL?Открыть
    Каждая запись имеет timestamp. Если запись старше TTL — удаляется при ближайшей операции.
    Можно ли использовать на сервере?Открыть
    Да, как справочную реализацию — но в этом файле реализован браузерный вариант.
    Свяжитесь с нами
    Телефон: +1 (786) 402-1937
    Нажимая «Подписаться», вы соглашаетесь получать технические обновления продукта.
    Минималистичный белый интерфейс SaaS с карточками и графами, чистая типографика