@atproto/oauth-client
Version:
OAuth client for ATPROTO PDS. This package serves as common base for environment-specific implementations (NodeJS, Browser, React-Native).
34 lines (27 loc) • 833 B
text/typescript
import { RuntimeLock } from './runtime-implementation.js'
const locks = new Map<unknown, Promise<void>>()
function acquireLocalLock(name: unknown): Promise<() => void> {
return new Promise((resolveAcquire) => {
const prev = locks.get(name) ?? Promise.resolve()
const next = prev.then(() => {
return new Promise<void>((resolveRelease) => {
const release = () => {
// Only delete the lock if it is still the current one
if (locks.get(name) === next) locks.delete(name)
resolveRelease()
}
resolveAcquire(release)
})
})
locks.set(name, next)
})
}
export const requestLocalLock: RuntimeLock = (name, fn) => {
return acquireLocalLock(name).then(async (release) => {
try {
return await fn()
} finally {
release()
}
})
}