File size: 1,389 Bytes
2dae031 dae4e82 31daf3d 2dae031 dae4e82 ab8b948 2dae031 dae4e82 2dae031 dae4e82 2dae031 31daf3d 2dae031 dae4e82 2dae031 ab8b948 2dae031 dae4e82 2dae031 ab8b948 2dae031 ab8b948 dae4e82 2dae031 dae4e82 2dae031 31daf3d 2dae031 dae4e82 2dae031 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
import { collections } from "$lib/server/database";
import { ObjectId } from "mongodb";
import type { Semaphores } from "$lib/types/Semaphore";
/**
* Returns the lock id if the lock was acquired, false otherwise
*/
export async function acquireLock(key: Semaphores | string): Promise<ObjectId | false> {
try {
const id = new ObjectId();
const insert = await collections.semaphores.insertOne({
_id: id,
key,
createdAt: new Date(),
updatedAt: new Date(),
deleteAt: new Date(Date.now() + 1000 * 60 * 3), // 3 minutes
});
return insert.acknowledged ? id : false; // true if the document was inserted
} catch (e) {
// unique index violation, so there must already be a lock
return false;
}
}
export async function releaseLock(key: Semaphores | string, lockId: ObjectId) {
await collections.semaphores.deleteOne({
_id: lockId,
key,
});
}
export async function isDBLocked(key: Semaphores | string): Promise<boolean> {
const res = await collections.semaphores.countDocuments({
key,
});
return res > 0;
}
export async function refreshLock(key: Semaphores | string, lockId: ObjectId): Promise<boolean> {
const result = await collections.semaphores.updateOne(
{
_id: lockId,
key,
},
{
$set: {
updatedAt: new Date(),
deleteAt: new Date(Date.now() + 1000 * 60 * 3), // 3 minutes
},
}
);
return result.matchedCount > 0;
}
|