parent
e6333d4c82
commit
aa8a7403a5
@ -0,0 +1,53 @@
|
|||||||
|
import { STORAGE_OP_READ } from './consts';
|
||||||
|
import { STORAGE_ERRORS } from './errors';
|
||||||
|
import type { StorageErrorContext } from './types';
|
||||||
|
|
||||||
|
export interface RegisterStorageDefaultInput {
|
||||||
|
readonly registryKey: string;
|
||||||
|
readonly key: string;
|
||||||
|
readonly fullKey: string;
|
||||||
|
readonly initialDefault: unknown;
|
||||||
|
readonly adapterName: string;
|
||||||
|
report(ctx: Omit<StorageErrorContext, 'adapter'>, adapterName: string): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface StorageDefaultsRegistry {
|
||||||
|
register(input: RegisterStorageDefaultInput): () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createStorageDefaultsRegistry(): StorageDefaultsRegistry {
|
||||||
|
const defaults = new Map<string, { value: unknown; refs: number }>();
|
||||||
|
|
||||||
|
function register(input: RegisterStorageDefaultInput): () => void {
|
||||||
|
const previous = defaults.get(input.registryKey);
|
||||||
|
if (previous !== undefined) {
|
||||||
|
try {
|
||||||
|
if (JSON.stringify(previous.value) !== JSON.stringify(input.initialDefault)) {
|
||||||
|
input.report(
|
||||||
|
{
|
||||||
|
key: input.key,
|
||||||
|
fullKey: input.fullKey,
|
||||||
|
op: STORAGE_OP_READ,
|
||||||
|
error: new Error(STORAGE_ERRORS.ENTRY_DEFAULTS_MISMATCH(input.key))
|
||||||
|
},
|
||||||
|
input.adapterName
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
/* circular default — skip the diagnostic */
|
||||||
|
}
|
||||||
|
previous.refs += 1;
|
||||||
|
} else {
|
||||||
|
defaults.set(input.registryKey, { value: input.initialDefault, refs: 1 });
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
const slot = defaults.get(input.registryKey);
|
||||||
|
if (slot === undefined) return;
|
||||||
|
slot.refs -= 1;
|
||||||
|
if (slot.refs <= 0) defaults.delete(input.registryKey);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return { register };
|
||||||
|
}
|
||||||
Loading…
Reference in new issue