0 Tage Serie
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.