Class: PromptSanitizer::Vault

Inherits:
Object
  • Object
show all
Defined in:
lib/prompt_sanitizer/vault.rb

Overview

Thread-safe bidirectional in-memory store for a sanitization session.

Maps original PII values → their replacement tokens and vice-versa. Deterministic within a session: the same original always maps to the same replacement. The vault is never persisted — it lives only in memory.

Safe for use across Puma threads — all reads and writes are guarded by a Mutex.

Instance Method Summary collapse

Constructor Details

#initializeVault

Returns a new instance of Vault.



13
14
15
16
17
# File 'lib/prompt_sanitizer/vault.rb', line 13

def initialize
  @forward = {}  # original  → replacement
  @reverse = {}  # replacement → original
  @mutex   = Mutex.new
end

Instance Method Details

#add(original, replacement) ⇒ Object

Store an original → replacement mapping. If the original is already mapped, the existing replacement is returned (determinism guarantee). Returns the active replacement string.



24
25
26
27
28
29
30
31
32
# File 'lib/prompt_sanitizer/vault.rb', line 24

def add(original, replacement)
  @mutex.synchronize do
    unless @forward.key?(original)
      @forward[original]    = replacement
      @reverse[replacement] = original
    end
    @forward[original]
  end
end

#clearObject

── Lifecycle ───────────────────────────────────────────────────────────



62
63
64
65
66
67
# File 'lib/prompt_sanitizer/vault.rb', line 62

def clear
  @mutex.synchronize do
    @forward.clear
    @reverse.clear
  end
end

#empty?Boolean

Returns:

  • (Boolean)


74
# File 'lib/prompt_sanitizer/vault.rb', line 74

def empty? = @forward.empty?

#include?(original) ⇒ Boolean

Returns:

  • (Boolean)


76
# File 'lib/prompt_sanitizer/vault.rb', line 76

def include?(original) = @forward.key?(original)

#inspectObject



84
85
86
# File 'lib/prompt_sanitizer/vault.rb', line 84

def inspect
  "#<#{self.class.name} size=#{size}>"
end

#original_for(replacement) ⇒ Object



40
41
42
# File 'lib/prompt_sanitizer/vault.rb', line 40

def original_for(replacement)
  @reverse[replacement]
end

#replacement_for(original) ⇒ Object

── Read ────────────────────────────────────────────────────────────────



36
37
38
# File 'lib/prompt_sanitizer/vault.rb', line 36

def replacement_for(original)
  @forward[original]
end

#restore(text) ⇒ Object

Replace all known replacement tokens in text with their originals. Tokens are substituted longest-first to avoid partial matches (e.g. "[EMAIL_1]" before "[EMAIL]").



49
50
51
52
53
54
55
56
57
58
# File 'lib/prompt_sanitizer/vault.rb', line 49

def restore(text)
  @mutex.synchronize do
    result = text.dup
    @reverse
      .keys
      .sort_by { |k| -k.length }
      .each { |token| result.gsub!(token, @reverse[token]) }
    result
  end
end

#sizeObject Also known as: length

── Introspection ────────────────────────────────────────────────────────



71
# File 'lib/prompt_sanitizer/vault.rb', line 71

def size = @forward.size

#snapshotObject

Returns a frozen copy of the forward mapping (original → replacement). Safe to call from any thread.



80
81
82
# File 'lib/prompt_sanitizer/vault.rb', line 80

def snapshot
  @mutex.synchronize { @forward.dup.freeze }
end