@jumentix/mutex-service
Adapter privado e reutilizável de mutex para runtimes Jumentix.
Responsabilidade no escopo
- Camada: persistência / coordenação
- Responsável por: locks nomeados sobre um cliente KV
- Usado com: key-value-storage
- Não responsável por: documentos de negócio ou messaging
Contrato
MutexService.compile(keyValueStorageClient, options) cria um singleton por processo apoiado em um
IKeyValueStorageClient. O cliente deve implementar get, set, del, connect e disconnect
assíncronos, retornando IServiceResponse.
lock(resourceName, uuid)retorna{ previouslyLocked, locked }emresult.isLocked(resourceName, uuid)retorna um booleano emresult.unlock(resourceName, uuid)repassa o resultado da remoção no storage.- Falhas são retornadas em
error; elas não são lançadas ao chamador. reset()limpa o singleton, principalmente para testes isolados e recomposição.
O prefixo padrão da chave é mutex; um prefix customizado pode ser fornecido na compilação.
Validação
bun run --filter @jumentix/mutex-service build
bun run --filter @jumentix/mutex-service typecheck
bun run --filter @jumentix/mutex-service lint
bun run --filter @jumentix/mutex-service testExperimente no navegador
Mutex com KV em memória
Proteja uma atualização de Category enquanto dois escritores de Task competem pelo mesmo recurso.
### Mutex com KV em memória
```ts
const keyValue = api.createKeyValueStorage();
const mutex = api.create(keyValue);
const firstWriter = await mutex.lock('category', 'work');
const secondWriter = await mutex.lock('category', 'work');
const lockedBeforeRelease = await mutex.isLocked('category', 'work');
await mutex.unlock('category', 'work');
const lockedAfterRelease = await mutex.isLocked('category', 'work');
return {
firstWriter: firstWriter.result,
secondWriter: secondWriter.result,
lockedBeforeRelease: lockedBeforeRelease.result,
lockedAfterRelease: lockedAfterRelease.result
};
```const keyValue = api.createKeyValueStorage();
const mutex = api.create(keyValue);
const firstWriter = await mutex.lock('category', 'work');
const secondWriter = await mutex.lock('category', 'work');
const lockedBeforeRelease = await mutex.isLocked('category', 'work');
await mutex.unlock('category', 'work');
const lockedAfterRelease = await mutex.isLocked('category', 'work');
return {
firstWriter: firstWriter.result,
secondWriter: secondWriter.result,
lockedBeforeRelease: lockedBeforeRelease.result,
lockedAfterRelease: lockedAfterRelease.result
};Documentação completa
Veja o guia de uso.