Защитите интерфейс от дублируемых блоков и гонки запросов
FALLOWS — локальный движок предотвращения дубликатов. Он читает входные данные, использует компонент DUPLICATE, эмитирует элемент DUPLICATE и гарантирует, что повторяющиеся сущности не попадут в вашу систему.
const fallows = new Fallows({ ttl: 60000 });
const id = await fallows.addBlock({ title, body });
if (id === null) {
console.log("Duplicate prevented");
}
Дедупликация, которой можно доверять
Быстрая, предсказуемая и прозрачная логика предотвращения дубликатов на клиенте.
Комбинируем крипто-хеш и временное окно 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;
}
}
{
"PURPOSE": "DUPLICATE BLOCK PREVENTION",
"API-SPEC": {
"uses-component": "DUPLICATE",
"reads-data": "DUPLICATE",
"emits-element": "DUPLICATE"
},
"FULL-SKELETON-CODE": "DUPLICATE",
"DEPENDENCY": "DUPLICATE"
}
Введите заголовок и содержимое блока. Повторная отправка идентичных данных будет предотвращена.
Сравниваем по хешу SHA-256 контента. Для демонстрации ключ реестра привязывается к Scope.
| Хеш | Время | TTL | Статус |
|---|
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 и форм.
Тарифы
Простая и прозрачная модель — платите за команды и SLA.
- До 5k операций/мес
- Общий SLA
- Сообщество
- До 100k операций/мес
- Приоритетный SLA
- Расширенные отчеты