syncguard
Version:
Functional TypeScript library for distributed locking across microservices. Prevents race conditions with Redis, PostgreSQL, Firestore, and custom backends. Features automatic lock management, timeout handling, and extensible architecture.
25 lines (24 loc) • 1.42 kB
TypeScript
import type { CollectionReference, Firestore } from "@google-cloud/firestore";
import { type ExtendResult, type LockOp } from "../../common/backend.js";
import type { FirestoreConfig } from "../types.js";
/**
* Creates Firestore extend operation with atomic transaction and authoritative expiresAtMs.
*
* **Implementation Pattern:**
* - Atomic transaction: Query by lockId → verify ownership → update expiresAtMs
* - TOCTOU protection: All steps within single `runTransaction()` (ADR-003, interface.md)
* - Ownership verification: Explicit `data.lockId === opts.lockId` check (ADR-003)
* - Authoritative time: MUST capture `Date.now()` inside transaction (ADR-010)
* - TTL semantics: Replaces remaining TTL entirely (`nowMs + ttlMs`), not additive
* - AbortSignal: Manual cancellation checks via `checkAbortedForTransaction()` at strategic points
*
* @remarks
* Omits `.limit(1)` to detect duplicate lockIds (ADR-014). Expired duplicates cleaned,
* live duplicates fail safely.
*
* @see docs/specs/interface.md#extend-operation-requirements - Normative TOCTOU, ownership, and expiresAtMs requirements
* @see docs/specs/firestore-backend.md#extend-operation-requirements - Firestore transaction pattern
*/
export declare function createExtendOperation(db: Firestore, locksCollection: CollectionReference, config: FirestoreConfig): (opts: LockOp & {
ttlMs: number;
}) => Promise<ExtendResult>;