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