Spaces:
Paused
Paused
| import { collections } from "$lib/server/database"; | |
| import { ObjectId } from "mongodb"; | |
| /** | |
| * Returns the lock id if the lock was acquired, false otherwise | |
| */ | |
| export async function acquireLock(key: string): Promise<ObjectId | false> { | |
| try { | |
| const id = new ObjectId(); | |
| const insert = await collections.semaphores.insertOne({ | |
| _id: id, | |
| key, | |
| createdAt: new Date(), | |
| updatedAt: new Date(), | |
| }); | |
| 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: string, lockId: ObjectId) { | |
| await collections.semaphores.deleteOne({ | |
| _id: lockId, | |
| key, | |
| }); | |
| } | |
| export async function isDBLocked(key: string): Promise<boolean> { | |
| const res = await collections.semaphores.countDocuments({ | |
| key, | |
| }); | |
| return res > 0; | |
| } | |
| export async function refreshLock(key: string, lockId: ObjectId): Promise<boolean> { | |
| const result = await collections.semaphores.updateOne( | |
| { | |
| _id: lockId, | |
| key, | |
| }, | |
| { | |
| $set: { | |
| updatedAt: new Date(), | |
| }, | |
| } | |
| ); | |
| return result.matchedCount > 0; | |
| } | |