1.0.0 • Published 2 years ago
@esfx/async-lockable v1.0.0
@esfx/async-lockable
A low-level Symbol-based common API for async coordination primitives.
Overview
Installation
npm i @esfx/async-lockable
Usage
import { AsyncLockable, LockHandle } from "@esfx/async-lockable";
import { Cancelable } from "@esfx/cancelable";
import { Disposable } from "@esfx/disposable";
export class MyLockable implements AsyncLockable {
private _currentLock?: LockHandle<MyLockable>;
async lock(cancelable?: Cancelable): Promise<LockHandle<MyLockable>> {
const thisLock = this;
return this._lock({
// LockHandle implementation
get mutex() {
return thisLock;
},
get ownsLock() {
return thisLock._currentLock === lockHandle;
},
async lock(cancelable?: Cancelable) {
return thisLock._lock(lockHandle, cancelable);
},
unlock() {
thisLock._unlock(lockHandle);
},
// AsyncLockable implementation
[AsyncLockable.lock](cancelable?: Cancelable) {
return this.lock(cancelable);
},
[AsyncLockable.unlock]() {
this.unlock();
},
// Disposable implementation
[Disposable.dispose]() {
if (this.ownsLock) {
this.unlock();
}
}
}, cancelable);
}
unlock() {
if (!this._currentLock) throw new Error();
this._unlock(this._currentLock);
}
private async _lock(lockHandle: LockHandle<MyLockable>, cancelable?: Cancelable) {
if (this._currentLock === lockHandle) throw new Error();
// ...perform actions necessary to take the lock...
return this._currentLock = lockHandle;
}
private _unlock(lockHandle: LockHandle<MyLockable>) {
if (this._currentLock !== lockHandle) throw new Error();
// ...perform actions necessary to release lock...
}
// AsyncLockable implementation
[AsyncLockable.lock](cancelable?: Cancelable) {
return this.lock(cancelable);
}
[AsyncLockable.unlock]() {
this.unlock();
}
}
API
You can read more about the API here.
1.1.0-alpha.202307260322
2 years ago
1.1.0-alpha.202302091715
2 years ago
1.1.0-alpha.202306061406
2 years ago
1.1.0-alpha.202306061316
2 years ago
1.1.0-alpha.202306051228
2 years ago
1.1.0-alpha.202306080253
2 years ago
1.1.0-alpha.202302071935
2 years ago
1.1.0-alpha.202305082104
2 years ago
1.1.0-alpha.202211221509
3 years ago
1.1.0-alpha.202210252139
3 years ago
1.0.0
3 years ago
1.0.0-dev.7
3 years ago
1.0.0-pre.42
3 years ago
1.0.0-dev.8
3 years ago
1.0.0-pre.41
3 years ago
1.0.0-dev.5
3 years ago
1.0.0-pre.44
3 years ago
1.0.0-dev.6
3 years ago
1.0.0-pre.43
3 years ago
1.0.0-dev.4
3 years ago
1.0.0-prenative.0
3 years ago
1.0.0-prenative.1
3 years ago
1.0.0-dev.0
3 years ago
1.0.0-pre.40
3 years ago
1.0.0-pre.31
3 years ago
1.0.0-pre.33
3 years ago
1.0.0-pre.35
3 years ago
1.0.0-pre.34
3 years ago
1.0.0-pre.37
3 years ago
1.0.0-pre.36
3 years ago
1.0.0-pre.39
3 years ago
1.0.0-pre.38
3 years ago
1.1.0-alpha.202211291446
3 years ago
1.0.0-pre.30
4 years ago
1.0.0-pre.26
4 years ago
1.0.0-pre.25
4 years ago
1.0.0-pre.28
4 years ago
1.0.0-pre.29
4 years ago
1.0.0-pre.24
4 years ago
1.0.0-pre.23
4 years ago
1.0.0-pre.19
4 years ago
1.0.0-pre.17
4 years ago
1.0.0-pre.16
4 years ago
1.0.0-pre.13
6 years ago
1.0.0-pre.12
6 years ago
1.0.0-pre.11
6 years ago
1.0.0-pre.9
6 years ago
1.0.0-pre.8
6 years ago
1.0.0-pre.6
6 years ago