Лицензия, редактор, пульт и сборка

- Main: license service, IPC, router; закрытие окон; yauzl закрытие zip (EMFILE), zipRead тест
- Editor: стабильный projectState без мигания, логотип и меню, строки UI, LayoutShell overlay
- Control: ластик для всех типов эффектов, затухание/нарастание музыки при смене сцены
- Сборка: vite, build/dev scripts, obfuscate-main и build-env скрипты с тестами; package.json

Made-with: Cursor
This commit is contained in:
Ivan Fontosh
2026-04-19 20:11:24 +08:00
parent 5e7dc5ea19
commit 2fa20da94d
40 changed files with 2629 additions and 211 deletions
+33
View File
@@ -0,0 +1,33 @@
/** Полезная нагрузка лицензии v1 (подписывается Ed25519 на сервере). */
export type LicensePayloadV1 = {
v: 1;
/** Стабильный id лицензии (для отзыва и учёта). */
sub: string;
/** Идентификатор продукта. */
pid: string;
/** Unix-время выдачи (сек). */
iat: number;
/** Unix-время окончания (сек). */
exp: number;
/** Не раньше этого времени (сек), опционально. */
nbf?: number;
/** Привязка к устройству: null — любое устройство. */
did: string | null;
};
export function isLicensePayloadV1(x: unknown): x is LicensePayloadV1 {
if (!x || typeof x !== 'object') return false;
const o = x as Record<string, unknown>;
return (
o.v === 1 &&
typeof o.sub === 'string' &&
o.sub.length > 0 &&
typeof o.pid === 'string' &&
o.pid.length > 0 &&
typeof o.iat === 'number' &&
Number.isFinite(o.iat) &&
typeof o.exp === 'number' &&
Number.isFinite(o.exp) &&
(o.did === null || typeof o.did === 'string')
);
}