1.0.0 • Published 10 months 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
10 months ago
1.1.0-alpha.202302091715
1 year ago
1.1.0-alpha.202306061406
11 months ago
1.1.0-alpha.202306061316
11 months ago
1.1.0-alpha.202306051228
11 months ago
1.1.0-alpha.202306080253
11 months ago
1.1.0-alpha.202302071935
1 year ago
1.1.0-alpha.202305082104
1 year ago
1.1.0-alpha.202211221509
1 year ago
1.1.0-alpha.202210252139
2 years ago
1.0.0
2 years ago
1.0.0-dev.7
2 years ago
1.0.0-pre.42
2 years ago
1.0.0-dev.8
2 years ago
1.0.0-pre.41
2 years ago
1.0.0-dev.5
2 years ago
1.0.0-pre.44
2 years ago
1.0.0-dev.6
2 years ago
1.0.0-pre.43
2 years ago
1.0.0-dev.4
2 years ago
1.0.0-prenative.0
2 years ago
1.0.0-prenative.1
2 years ago
1.0.0-dev.0
2 years ago
1.0.0-pre.40
2 years ago
1.0.0-pre.31
2 years ago
1.0.0-pre.33
2 years ago
1.0.0-pre.35
2 years ago
1.0.0-pre.34
2 years ago
1.0.0-pre.37
2 years ago
1.0.0-pre.36
2 years ago
1.0.0-pre.39
2 years ago
1.0.0-pre.38
2 years ago
1.1.0-alpha.202211291446
1 year ago
1.0.0-pre.30
3 years ago
1.0.0-pre.26
3 years ago
1.0.0-pre.25
3 years ago
1.0.0-pre.28
3 years ago
1.0.0-pre.29
3 years ago
1.0.0-pre.24
3 years ago
1.0.0-pre.23
3 years ago
1.0.0-pre.19
3 years ago
1.0.0-pre.17
3 years ago
1.0.0-pre.16
3 years ago
1.0.0-pre.13
5 years ago
1.0.0-pre.12
5 years ago
1.0.0-pre.11
5 years ago
1.0.0-pre.9
5 years ago
1.0.0-pre.8
5 years ago
1.0.0-pre.6
5 years ago