Spaces:
Sleeping
Sleeping
File size: 1,353 Bytes
b488195 1b76365 48059af b488195 1b76365 48059af b488195 1b76365 b488195 1b76365 b488195 48059af b488195 1b76365 b488195 48059af b488195 1b76365 b488195 48059af b488195 48059af 1b76365 b488195 1b76365 b488195 48059af b488195 1b76365 b488195 |
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): 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, lockId: ObjectId) {
await collections.semaphores.deleteOne({
_id: lockId,
key,
});
}
export async function isDBLocked(key: Semaphores): Promise<boolean> {
const res = await collections.semaphores.countDocuments({
key,
});
return res > 0;
}
export async function refreshLock(key: Semaphores, 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;
}
|