# with-lock.mjs

## Огляд

Цей файл реалізує механізм захисту від одночасного виконання критичних операцій, забезпечуючи атомарний lock та дедуплікацію даних для інтенсивних команд. Він використовується для запобігання конфліктів при одночасному виконанні операцій, які можуть призвести до пошкодження даних або непередбачуваних результатів. Механізм гарантує, що кожен прогін операцій виконується без повторень та з атомарним lock.

## Поведінка

- `shouldDedup`: Перевіряє, чи можна повторно використати кешований результат, враховуючи код виходу, відбитковий дерева та час завершення.
- `withLock`: Встановлює lock-директорію, запускає вказану функцію, кешує результат та повторно використовує його, якщо можливо, з використанням дедуплікації за відбитком.

## Публічний API

- shouldDedup — Перевіряє, чи можна використовувати попередньо обчислену відповідь для уникнення повторних обчислень.
- withLock — Забезпечує унікальність виконання важкої операції за допомогою блокування та перевірки на основі відбитків.

## Гарантії поведінки

- **Атомарність:** Операції lock та dedup виконуються як атомарні дії.
- **Захист від помилок:** У разі виникнення помилки, функція повертає `false` та `null`.
- **Детектування неактивного PID:** Перевіряється, чи процес, що утримує lock, все ще активний.
- **Дедуплікація з обмеженням часу:** Проводиться дедуплікація за допомогою SHA256 з обмеженням часу (TTL).
- **Кешування:** Результати прогону кешуються для прискорення наступних проходів.
- **Відсутність винятків:** Функції не викликають винятків.
- **Створення директорій:** Використовується `mkdirSync` для створення директорій.
