xref: /MusicFree/src/utils/asyncLock.ts (revision d704daedc205340e71fa7ca89b414e1505e1bec3)
1*d704daedS猫头猫import {nanoid} from 'nanoid';
2*d704daedS猫头猫
3*d704daedS猫头猫const locks = new Map<string, string>();
4*d704daedS猫头猫
5*d704daedS猫头猫export interface ILock {
6*d704daedS猫头猫    key: string;
7*d704daedS猫头猫    lockId: string;
8*d704daedS猫头猫    valid: () => boolean;
9*d704daedS猫头猫    release: () => void;
10*d704daedS猫头猫}
11*d704daedS猫头猫
12*d704daedS猫头猫function requireLock(key: string): ILock {
13*d704daedS猫头猫    const lockId = nanoid();
14*d704daedS猫头猫    locks.set(key, lockId);
15*d704daedS猫头猫
16*d704daedS猫头猫    return {
17*d704daedS猫头猫        key,
18*d704daedS猫头猫        lockId,
19*d704daedS猫头猫        /** 锁是否有效 */
20*d704daedS猫头猫        valid() {
21*d704daedS猫头猫            const currentLockId = locks.get(key);
22*d704daedS猫头猫            return !currentLockId || currentLockId === lockId;
23*d704daedS猫头猫        },
24*d704daedS猫头猫        /** 释放后赋空 */
25*d704daedS猫头猫        release() {
26*d704daedS猫头猫            const currentLockId = locks.get(key);
27*d704daedS猫头猫            if (currentLockId === lockId) {
28*d704daedS猫头猫                locks.delete(key);
29*d704daedS猫头猫            }
30*d704daedS猫头猫        },
31*d704daedS猫头猫    };
32*d704daedS猫头猫}
33*d704daedS猫头猫
34*d704daedS猫头猫export {requireLock};
35