All files / json-pack/src/nfs/v4/server/operations OpenOwnerState.ts

100% Statements 7/7
100% Branches 1/1
100% Functions 1/1
100% Lines 7/7

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53            26x           207x             207x               207x             207x               207x             207x      
/**
 * Open-owner state record for NFSv4 OPEN operations.
 * An open-owner represents a single entity (process, thread) on a client
 * that can open files. Tracks all opens made by this owner and manages
 * sequence numbers for serialization.
 */
export class OpenOwnerState {
  constructor(
    /**
     * Client ID that owns this open-owner.
     * Links the owner back to the specific NFS client that created it.
     */
    public readonly clientid: bigint,
 
    /**
     * Opaque owner identifier provided by the client.
     * Typically represents a process or thread ID on the client.
     * Combined with clientid, uniquely identifies this open-owner.
     */
    public readonly owner: Uint8Array,
 
    /**
     * Sequence number for operations from this open-owner.
     * Used to serialize OPEN/CLOSE/OPEN_CONFIRM/OPEN_DOWNGRADE operations.
     * Incremented after each successful stateful operation.
     * Server rejects operations with incorrect sequence numbers to prevent replays.
     */
    public seqid: number,
 
    /**
     * Set of stateid keys for all files currently opened by this owner.
     * Format: stateid keys are `${seqid}:${base64(other)}`.
     * Used to track all active opens and clean them up if the owner goes away.
     */
    public readonly opens: Set<string> = new Set(),
 
    /**
     * Cached response from the last successful operation.
     * Per RFC 7530 ยง9.1.7, when a client retries with the same seqid (replay),
     * the server must return the cached response instead of re-executing the operation.
     * This ensures idempotency for operations like OPEN, OPEN_CONFIRM, OPEN_DOWNGRADE, CLOSE.
     */
    public lastResponse?: any,
 
    /**
     * Signature of the last OPEN request. Used to distinguish true replays
     * (identical requests) from clients that reuse seqids with different
     * parameters, which must be rejected with BAD_SEQID.
     */
    public lastRequestKey?: string,
  ) {}
}