2024-06-28 02:39:03 -04:00
|
|
|
export class LockManager {
|
2024-10-19 05:25:26 -06:00
|
|
|
private locks: { [key: string]: Promise<any> }
|
2024-04-26 02:10:37 -04:00
|
|
|
|
2024-06-28 02:39:03 -04:00
|
|
|
constructor() {
|
2024-10-19 05:25:26 -06:00
|
|
|
this.locks = {}
|
2024-06-28 02:39:03 -04:00
|
|
|
}
|
2024-04-26 02:10:37 -04:00
|
|
|
|
2024-06-28 02:39:03 -04:00
|
|
|
async acquireLock<T>(key: string, task: () => Promise<T>): Promise<T> {
|
|
|
|
if (!this.locks[key]) {
|
|
|
|
this.locks[key] = new Promise<T>(async (resolve, reject) => {
|
|
|
|
try {
|
2024-10-19 05:25:26 -06:00
|
|
|
const result = await task()
|
|
|
|
resolve(result)
|
2024-06-28 02:39:03 -04:00
|
|
|
} catch (error) {
|
2024-10-19 05:25:26 -06:00
|
|
|
reject(error)
|
2024-06-28 02:39:03 -04:00
|
|
|
} finally {
|
2024-10-19 05:25:26 -06:00
|
|
|
delete this.locks[key]
|
2024-04-26 02:10:37 -04:00
|
|
|
}
|
2024-10-19 05:25:26 -06:00
|
|
|
})
|
2024-04-26 02:10:37 -04:00
|
|
|
}
|
2024-10-19 05:25:26 -06:00
|
|
|
return await this.locks[key]
|
2024-04-26 21:57:30 -04:00
|
|
|
}
|
2024-11-16 21:35:06 -05:00
|
|
|
}
|