UNPKG

@tanstack/offline-transactions

Version:

Offline-first transaction capabilities for TanStack DB

73 lines (72 loc) 1.76 kB
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