@tanstack/offline-transactions
Version:
Offline-first transaction capabilities for TanStack DB
73 lines (72 loc) • 1.76 kB
JavaScript
import { BaseLeaderElection } from "./LeaderElection.js";
class WebLocksLeader extends BaseLeaderElection {
constructor(lockName = `offline-executor-leader`) {
super();
this.releaseLock = null;
this.lockName = lockName;
}
async requestLeadership() {
if (!this.isWebLocksSupported()) {
return false;
}
if (this.isLeaderState) {
return true;
}
try {
const available = await navigator.locks.request(
this.lockName,
{
mode: `exclusive`,
ifAvailable: true
},
(lock) => {
return lock !== null;
}
);
if (!available) {
return false;
}
this.isLeaderState = true;
navigator.locks.request(
this.lockName,
{
mode: `exclusive`
},
async (lock) => {
if (lock) {
this.notifyLeadershipChange(true);
return new Promise((resolve) => {
this.releaseLock = () => {
this.notifyLeadershipChange(false);
resolve();
};
});
}
}
);
return true;
} catch (error) {
if (error instanceof Error && error.name === `AbortError`) {
return false;
}
console.warn(`Web Locks leadership request failed:`, error);
return false;
}
}
releaseLeadership() {
if (this.releaseLock) {
this.releaseLock();
this.releaseLock = null;
}
}
isWebLocksSupported() {
return typeof navigator !== `undefined` && `locks` in navigator;
}
static isSupported() {
return typeof navigator !== `undefined` && `locks` in navigator;
}
}
export {
WebLocksLeader
};
//# sourceMappingURL=WebLocksLeader.js.map