Class: PromptSanitizer::Vault
- Inherits:
-
Object
- Object
- PromptSanitizer::Vault
- 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
-
#add(original, replacement) ⇒ Object
Store an original → replacement mapping.
-
#clear ⇒ Object
── Lifecycle ───────────────────────────────────────────────────────────.
- #empty? ⇒ Boolean
- #include?(original) ⇒ Boolean
-
#initialize ⇒ Vault
constructor
A new instance of Vault.
- #inspect ⇒ Object
- #original_for(replacement) ⇒ Object
-
#replacement_for(original) ⇒ Object
── Read ────────────────────────────────────────────────────────────────.
-
#restore(text) ⇒ Object
Replace all known replacement tokens in
textwith their originals. -
#size ⇒ Object
(also: #length)
── Introspection ────────────────────────────────────────────────────────.
-
#snapshot ⇒ Object
Returns a frozen copy of the forward mapping (original → replacement).
Constructor Details
#initialize ⇒ Vault
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 |
#clear ⇒ Object
── 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
74 |
# File 'lib/prompt_sanitizer/vault.rb', line 74 def empty? = @forward.empty? |
#include?(original) ⇒ Boolean
76 |
# File 'lib/prompt_sanitizer/vault.rb', line 76 def include?(original) = @forward.key?(original) |
#inspect ⇒ Object
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 |
#size ⇒ Object Also known as: length
── Introspection ────────────────────────────────────────────────────────
71 |
# File 'lib/prompt_sanitizer/vault.rb', line 71 def size = @forward.size |
#snapshot ⇒ Object
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 |