@tanstack/offline-transactions
Version:
Offline-first transaction capabilities for TanStack DB
73 lines (72 loc) • 1.88 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const LeaderElection = require("./LeaderElection.cjs");
class WebLocksLeader extends LeaderElection.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;
}
}
exports.WebLocksLeader = WebLocksLeader;
//# sourceMappingURL=WebLocksLeader.cjs.map