// addFileWithDedup — дедуп «имя+размер», суффиксы _2/_3, лимиты (over). // Мутирует state. Возвращает true если файл добавлен (или переведён в over), // false если это дедуп (обновлена только дата). export function addFileWithDedup(state, file, cfg) { const size = file.size; const mtime = file.lastModified; let name = file.name; const maxFileBytes = cfg.maxFileBytes; const maxSessionBytes = cfg.maxSessionBytes; if (state.fileMeta.has(name)) { const e = state.fileMeta.get(name); if (e.size === size) { // Тот же файл (имя+размер) — дедуп. Дату не сравниваем: файл могли пересохранить // с тем же содержимым. Оставляем более свежий по дате. if (mtime > e.mtime) { e.mtime = mtime; const idx = state.files.findIndex(f => f.name === name); if (idx >= 0) state.files[idx] = new File([file], name, { lastModified: mtime }); } return false; // дедуп: файл не добавлен (обновлена только дата) } // Имя то же, размер другой — добавить с суффиксом _2, _3... const dot = name.lastIndexOf('.'); const base = dot > 0 ? name.slice(0, dot) : name; const ext = dot > 0 ? name.slice(dot) : ''; let n = 2; while (state.fileMeta.has(base + '_' + n + ext)) n++; name = base + '_' + n + ext; } state.fileMeta.set(name, { size, mtime }); // Определяем, превышает ли файл лимит (по размеру файла или суммарный) — не участвует в обфускации let over = false; if (size > maxFileBytes) over = true; // лимит на один файл const sum = state.files.reduce((s, f) => s + (state.overNames.has(f.name) ? 0 : f.size), 0); if (sum + size > maxSessionBytes) over = true; // суммарный лимит сессии if (over) { state.overNames.add(name); state.files.push(new File([file], name, { lastModified: mtime })); return true; } state.files.push(new File([file], name, { lastModified: mtime })); return true; }