/** * Frontend modal performance marks. * * Records only bounded domain/event names and timing data. Never include * payment credentials, order contents, identity evidence, or user payloads. * * @package AKSRT */ (function (window) { 'use strict'; var allowedKinds = { identity: true, badges: true, orders: true, vip: true, }; var allowedEvents = { click: true, shell: true, 'first-content': true, ready: true, 'action-start': true, 'action-end': true, unauthorized: true, error: true, }; var sessions = Object.create(null); var sequence = 0; var maxSessions = 100; function normalize(value, fallback) { var normalized = String(value || fallback || '').toLowerCase().replace(/[^a-z0-9-]/g, ''); return normalized || fallback; } function now() { return window.performance && typeof window.performance.now === 'function' ? window.performance.now() : 0; } function markName(session, event) { return 'aksrt-modal-' + session.kind + '-' + session.id + '-' + event; } function emit(session, event) { if (!window.performance || typeof window.performance.mark !== 'function') return; var name = markName(session, event); window.performance.mark(name); session.marks[event] = name; if (typeof window.performance.measure === 'function' && session.marks.click && event !== 'click') { try { window.performance.measure( 'aksrt-modal-' + session.kind + '-' + session.id + '-click-to-' + event, session.marks.click, name ); } catch (error) { // A missing mark must never affect the modal interaction. } } } function start(kind) { var safeKind = normalize(kind, 'unknown'); if (!allowedKinds[safeKind]) safeKind = 'unknown'; sequence += 1; var id = String(sequence); var session = { id: id, kind: safeKind, startedAt: now(), marks: Object.create(null), }; sessions[id] = session; emit(session, 'click'); var ids = Object.keys(sessions); while (ids.length > maxSessions) { delete sessions[ids.shift()]; } return id; } function mark(id, event) { var session = sessions[String(id || '')]; var safeEvent = normalize(event, 'error'); if (!session || !allowedEvents[safeEvent]) return; emit(session, safeEvent); } function finish(id) { mark(id, 'ready'); } function fail(id) { mark(id, 'error'); } window.AksrtModalTelemetry = { start: start, mark: mark, finish: finish, error: fail, }; })(window);