- number-поля теперь рендерятся как text + inputMode=numeric, чтобы браузер не округлял значения через input type=number - пробелы при вставке в number-поля удаляются - бэкенд нормализует значения number-полей в строку перед сохранением - добавлен хелпер normalizeFieldValueForStorage Closes: искажение расчётного счёта и других длинных числовых полей
39 lines
906 B
TypeScript
39 lines
906 B
TypeScript
type CacheEntry<T> = { data: T; expiresAt: number };
|
|
|
|
const store = new Map<string, CacheEntry<any>>();
|
|
const DEFAULT_TTL_MS = 60 * 1000; // 60 seconds
|
|
|
|
export function get<T>(key: string): T | undefined {
|
|
const entry = store.get(key);
|
|
if (!entry) return undefined;
|
|
if (Date.now() > entry.expiresAt) {
|
|
store.delete(key);
|
|
return undefined;
|
|
}
|
|
return entry.data;
|
|
}
|
|
|
|
export function set<T>(key: string, data: T, ttlMs = DEFAULT_TTL_MS): void {
|
|
store.set(key, { data, expiresAt: Date.now() + ttlMs });
|
|
}
|
|
|
|
export function invalidate(keyPattern?: string): void {
|
|
if (!keyPattern) {
|
|
store.clear();
|
|
return;
|
|
}
|
|
for (const key of store.keys()) {
|
|
if (key.includes(keyPattern)) {
|
|
store.delete(key);
|
|
}
|
|
}
|
|
}
|
|
|
|
export function invalidatePrefix(prefix: string): void {
|
|
for (const key of store.keys()) {
|
|
if (key.startsWith(prefix)) {
|
|
store.delete(key);
|
|
}
|
|
}
|
|
}
|