UNPKG

@daiso-tech/core

Version:

The library offers flexible, framework-agnostic solutions for modern web applications, built on adaptable components that integrate seamlessly with popular frameworks like Next Js.

79 lines 2.61 kB
/** * @module Lock */ import {} from "../../../../execution-context/contracts/_module.js"; import {} from "../../../../lock/contracts/_module.js"; import {} from "../../../../time-span/implementations/_module.js"; /** * @internal */ export class DatabaseLockAdapter { adapter; constructor(adapter) { this.adapter = adapter; } async acquire(context, key, lockId, ttl) { const expiration = ttl?.toEndDate() ?? null; return await this.adapter.transaction(context, async (trx) => { const lockData = await trx.find(context, key); if (lockData === null) { await trx.upsert(context, key, lockId, expiration); return true; } if (lockData.owner === lockId) { return true; } if (lockData.expiration === null) { return false; } if (lockData.expiration <= new Date()) { await trx.upsert(context, key, lockId, expiration); return true; } return lockData.expiration <= new Date(); }); } async release(context, key, lockId) { const lockData = await this.adapter.removeIfOwner(context, key, lockId); if (lockData === null) { return false; } const { expiration } = lockData; const hasNoExpiration = expiration === null; if (hasNoExpiration) { return true; } const { owner } = lockData; const isNotExpired = expiration > new Date(); const isCurrentOwner = lockId === owner; return isNotExpired && isCurrentOwner; } async forceRelease(context, key) { const lockData = await this.adapter.remove(context, key); if (lockData === null) { return false; } if (lockData.expiration === null) { return true; } return lockData.expiration > new Date(); } async refresh(context, key, lockId, ttl) { const updateCount = await this.adapter.updateExpiration(context, key, lockId, ttl.toEndDate()); return Number(updateCount) > 0; } async getState(context, key) { const lockData = await this.adapter.find(context, key); if (lockData === null) { return null; } if (lockData.expiration === null) { return lockData; } if (lockData.expiration <= new Date()) { return null; } return lockData; } } //# sourceMappingURL=database-lock-adapter.js.map