javascript / expert
Snippet
Symbol-basierte private Zustandskapselung mit WeakMap-Speicher in Angular-Services
Die Kombination von JavaScript-Symbol-Datentypen mit WeakMap-Speicherstrukturen ermöglicht eine echte private Kapselung in Angular-Services. Im Gegensatz zu TypeScript private-Modifikatoren, die nach der Transpilierung verschwinden, verhindern WeakMap-Einträge Speicherlecks und unterbinden die Laufzeit-Introspektion von außen.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import { Injectable } from '@angular/core';const SECRET_KEY = Symbol('InternalVaultKey');const vaultStorage = new WeakMap<object, Map<symbol, unknown>>();@Injectable({ providedIn: 'root' })export class SecureVaultService {constructor() {vaultStorage.set(this, new Map());}setPrivateSecret(secret: string): void {const internalStore = vaultStorage.get(this);if (internalStore) {internalStore.set(SECRET_KEY, Object.freeze({ token: secret, timestamp: Date.now() }));}}getPrivateSecret(): { token: string; timestamp: number } | null {const internalStore = vaultStorage.get(this);const data = internalStore?.get(SECRET_KEY);return data ? (data as { token: string; timestamp: number }) : null;}}
angular
Erklärung
1
const SECRET_KEY = Symbol('InternalVaultKey');
Erzeugt ein eindeutiges, nicht aufzählbares Symbol als Schlüssel für sensible Service-Metadaten.
2
const vaultStorage = new WeakMap<object, Map<symbol, unknown>>();
Erstellt eine WeakMap mit schwachen Objektreferenzen auf Service-Instanzen zur Vermeidung von Speicherlecks.
3
internalStore.set(SECRET_KEY, Object.freeze({ token: secret, timestamp: Date.now() }));
Speichert einen unveränderlichen Datensatz unter dem eindeutigen Symbol-Schlüssel im privaten Container.
4
return data ? (data as { token: string; timestamp: number }) : null;
Liest den privaten Zustands-Datensatz sicher aus, ohne interne Speicherstrukturen offenzulegen.