UNPKG

@tanstack/offline-transactions

Version:

Offline-first transaction capabilities for TanStack DB

73 lines (72 loc) 1.88 kB
"use strict"; 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