@offscript/sdk 0.1.2 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +32 -119
  2. package/dist/adapters/nuxt.cjs +3 -3
  3. package/dist/adapters/nuxt.js +2 -2
  4. package/dist/adapters/vanilla.cjs +5 -5
  5. package/dist/adapters/vanilla.d.ts +2 -3
  6. package/dist/adapters/vanilla.js +3 -3
  7. package/dist/adapters/vue.cjs +3 -3
  8. package/dist/adapters/vue.js +2 -2
  9. package/dist/chunk-2MY2FWIA.cjs +20 -0
  10. package/dist/chunk-2MY2FWIA.cjs.map +1 -0
  11. package/dist/{chunk-WUFW7TEL.js → chunk-6ROP37WI.js} +3 -5
  12. package/dist/chunk-6ROP37WI.js.map +1 -0
  13. package/dist/{chunk-KQVK5EJR.cjs → chunk-HPDLEAAL.cjs} +3 -5
  14. package/dist/chunk-HPDLEAAL.cjs.map +1 -0
  15. package/dist/{chunk-HECPMGDC.js → chunk-V2YYWGIA.js} +5 -5
  16. package/dist/chunk-V2YYWGIA.js.map +1 -0
  17. package/dist/{chunk-I6JPZAQA.cjs → chunk-VYCDQLP7.cjs} +449 -1242
  18. package/dist/chunk-VYCDQLP7.cjs.map +1 -0
  19. package/dist/{chunk-IBEPWI7S.js → chunk-XBXFGCUT.js} +446 -1234
  20. package/dist/chunk-XBXFGCUT.js.map +1 -0
  21. package/dist/core/LifecycleManager.d.ts +1 -0
  22. package/dist/core/OffscriptSDK.d.ts +33 -70
  23. package/dist/core/RecordingStore.d.ts +26 -0
  24. package/dist/index.cjs +20 -40
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.js +3 -3
  27. package/dist/playwright/PlaywrightDataContract.d.ts +0 -7
  28. package/dist/playwright.cjs +13 -13
  29. package/dist/playwright.js +1 -1
  30. package/dist/recorders/ActionRecorder.d.ts +1 -1
  31. package/dist/recorders/ContextRecorder.d.ts +2 -8
  32. package/dist/recorders/HTTPRecorder.d.ts +7 -2
  33. package/dist/types/config.d.ts +6 -45
  34. package/dist/types/events.d.ts +2 -23
  35. package/dist/types/recording.d.ts +20 -0
  36. package/dist/ui/RecordingControls.d.ts +6 -4
  37. package/dist/utils/errors.d.ts +1 -18
  38. package/docs/api-contract.md +4 -53
  39. package/docs/architecture.md +5 -34
  40. package/docs/event-contract.md +3 -24
  41. package/docs/playwright-contract.md +3 -37
  42. package/package.json +2 -2
  43. package/dist/chunk-HECPMGDC.js.map +0 -1
  44. package/dist/chunk-I6JPZAQA.cjs.map +0 -1
  45. package/dist/chunk-IBEPWI7S.js.map +0 -1
  46. package/dist/chunk-KQVK5EJR.cjs.map +0 -1
  47. package/dist/chunk-TBPD2LMI.cjs +0 -20
  48. package/dist/chunk-TBPD2LMI.cjs.map +0 -1
  49. package/dist/chunk-WUFW7TEL.js.map +0 -1
  50. package/dist/core/ApiClient.d.ts +0 -24
  51. package/dist/core/SessionManager.d.ts +0 -45
  52. package/dist/transport/EventQueue.d.ts +0 -28
  53. package/dist/transport/EventTransport.d.ts +0 -84
  54. package/dist/transport/PersistentBuffer.d.ts +0 -60
  55. package/dist/transport/RetryManager.d.ts +0 -9
  56. package/dist/types/session.d.ts +0 -77
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types/config.ts","../src/utils/misc.ts","../src/privacy/PrivacyConfig.ts","../src/privacy/DataSanitizer.ts","../src/utils/errors.ts","../src/core/ApiClient.ts","../src/transport/EventQueue.ts","../src/transport/RetryManager.ts","../src/transport/EventTransport.ts","../src/transport/PersistentBuffer.ts","../src/recorders/types.ts","../src/recorders/ActionRecorder.ts","../src/recorders/ContextRecorder.ts","../src/recorders/ErrorRecorder.ts","../src/utils/id.ts","../src/recorders/HTTPRecorder.ts","../src/recorders/IframeRecorder.ts","../src/recorders/RRWebRecorder.ts","../src/core/LifecycleManager.ts","../src/core/SessionManager.ts","../src/core/config.ts","../src/ui/RecordingControls.ts","../src/core/OffscriptSDK.ts"],"names":["SDK_VERSION","SCHEMA_VERSION","SelectorGenerator","ACTION_SCHEMA_VERSION","last","done","buildPlaywrightContract"],"mappings":"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","file":"chunk-I6JPZAQA.cjs","sourcesContent":["export type Priority = \"critical\" | \"normal\" | \"low\";\n\nexport interface RecordingConfig {\n /** Gravação visual (rrweb). */\n rrweb: boolean;\n /** Ações semânticas (clique, input, teclado...). */\n actions: boolean;\n /** Instrumentação de fetch/XMLHttpRequest. */\n http: boolean;\n /** console.* */\n console: boolean;\n /** window.onerror / unhandledrejection */\n errors: boolean;\n /** Metadados de contexto (navegador, viewport...). */\n context: boolean;\n /** Detecção de iframes de terceiros (ex.: seats.io). */\n iframes: boolean;\n /** Eventos de mousemove no Action Recorder (rrweb já captura o movimento visual). */\n mouseMove: boolean;\n /** Níveis de console capturados. */\n consoleLevels: Array<\"log\" | \"info\" | \"warn\" | \"error\">;\n /** Intervalo mínimo entre amostras de mousemove/scroll (ms). */\n throttleMs: number;\n /** Snapshot completo periódico do rrweb (ms). 0 = desligado. */\n rrwebCheckoutEveryMs: number;\n /** Captura de canvas pelo rrweb (custoso). */\n rrwebRecordCanvas: boolean;\n /** Atributos considerados identificadores de teste, em ordem de prioridade. */\n testIdAttributes: string[];\n /** Atributos estáveis adicionais usados na geração de seletores. */\n stableAttributes: string[];\n}\n\nexport interface PrivacyConfig {\n /** Mascara valores de <input>/<textarea>/<select> no replay. Padrão: true. */\n maskSensitiveInputs: boolean;\n /** Mascara todo texto da página no replay. Padrão: false. */\n maskAllText: boolean;\n captureRequestBodies: boolean;\n captureResponseBodies: boolean;\n /**\n * Valores digitados só são gravados nas ações para elementos que casem com estes seletores.\n * Os demais viram uma referência opaca. Senhas nunca são gravadas.\n */\n allowedInputSelectors: string[];\n /** Grava o valor selecionado/estado de select, checkbox e radio. Padrão: true. */\n captureChoiceValues: boolean;\n /** Elementos que não aparecem no replay nem nas ações. */\n blockSelectors: string[];\n /** Elementos cujo texto é mascarado no replay. */\n maskTextSelectors: string[];\n /** Elementos ignorados pelo Action Recorder. */\n ignoreSelectors: string[];\n /** URLs cujas requisições não são capturadas (string = prefixo/substring, RegExp). */\n ignoreUrls: Array<string | RegExp>;\n /** Cabeçalhos adicionais a remover. */\n redactHeaders: string[];\n /** Chaves adicionais (query/body/json) a redigir. */\n redactKeys: string[];\n /**\n * Guarda os valores sensíveis por completo: senha, token, cookie, CPF, cartão.\n * Padrão: false. Quando true, nada vira [REDACTED].\n */\n captureSensitiveValues: boolean;\n /** Tamanho máximo (bytes) de cada body capturado. */\n maxBodyBytes: number;\n /** Content-types capturáveis como texto. */\n textContentTypes: RegExp[];\n /** Descrição da retenção local (ms) dos eventos não enviados no IndexedDB. */\n localRetentionMs: number;\n}\n\nexport interface TransportConfig {\n batchMaxEvents: number;\n batchMaxBytes: number;\n flushIntervalMs: number;\n maxMemoryEvents: number;\n maxBufferBytes: number;\n maxRetries: number;\n retryBaseMs: number;\n retryMaxMs: number;\n /** Compressão gzip (requer suporte do backend: Content-Encoding: gzip). */\n compress: boolean;\n /** Limite para envio com keepalive no encerramento da página (browsers limitam a ~64KB). */\n keepaliveMaxBytes: number;\n /** Persistência em IndexedDB. Se indisponível, cai para memória. */\n persist: boolean;\n requestTimeoutMs: number;\n}\n\nexport interface OffscriptConfig {\n apiUrl: string;\n platformId: string;\n /** Versão/build da aplicação testada. */\n appVersion?: string;\n recording?: Partial<RecordingConfig>;\n privacy?: Partial<PrivacyConfig>;\n transport?: Partial<TransportConfig>;\n /** Janela (ms) para relacionar requisições/erros à ação anterior. */\n correlationWindowMs?: number;\n /** Retoma automaticamente a sessão persistida em init() (após reload/navegação). Padrão: true. */\n autoResume?: boolean;\n /** Intervalo de heartbeat quando o backend não informar. */\n heartbeatIntervalMs?: number;\n /** Prefixo de chaves de storage. */\n storagePrefix?: string;\n debug?: boolean;\n /**\n * Mostra a barra de pausar, retomar, retornar, finalizar e nova sessão durante a gravação.\n * Padrão: true. O overlay não entra no filme nem nas ações.\n */\n controls?: boolean;\n}\n\nexport interface ResolvedConfig {\n apiUrl: string;\n platformId: string;\n appVersion?: string;\n recording: RecordingConfig;\n privacy: PrivacyConfig;\n transport: TransportConfig;\n correlationWindowMs: number;\n autoResume: boolean;\n heartbeatIntervalMs: number;\n storagePrefix: string;\n debug: boolean;\n controls: boolean;\n}\n\nexport const DEFAULT_RECORDING: RecordingConfig = {\n rrweb: true,\n actions: true,\n http: true,\n console: true,\n errors: true,\n context: true,\n iframes: true,\n mouseMove: false,\n consoleLevels: [\"log\", \"info\", \"warn\", \"error\"],\n throttleMs: 100,\n rrwebCheckoutEveryMs: 5 * 60_000,\n rrwebRecordCanvas: false,\n testIdAttributes: [\"data-testid\", \"data-test\", \"data-cy\", \"data-qa\"],\n stableAttributes: [\"name\", \"data-id\", \"aria-label\"],\n};\n\nexport const DEFAULT_PRIVACY: PrivacyConfig = {\n maskSensitiveInputs: false,\n maskAllText: false,\n captureRequestBodies: false,\n captureResponseBodies: false,\n allowedInputSelectors: [\"[data-offscript-allow]\"],\n captureChoiceValues: true,\n blockSelectors: [\"[data-offscript-block]\", \".offscript-block\"],\n maskTextSelectors: [\"[data-offscript-mask]\", \".offscript-mask\"],\n ignoreSelectors: [\"[data-offscript-ignore]\", \".offscript-ignore\"],\n ignoreUrls: [],\n redactHeaders: [],\n redactKeys: [],\n captureSensitiveValues: false,\n maxBodyBytes: 16 * 1024,\n textContentTypes: [/^text\\//i, /json/i, /xml/i, /x-www-form-urlencoded/i, /javascript/i],\n localRetentionMs: 24 * 3600_000,\n};\n\nexport const DEFAULT_TRANSPORT: TransportConfig = {\n batchMaxEvents: 200,\n batchMaxBytes: 512 * 1024,\n flushIntervalMs: 3000,\n maxMemoryEvents: 5000,\n maxBufferBytes: 64 * 1024 * 1024,\n maxRetries: 6,\n retryBaseMs: 500,\n retryMaxMs: 30_000,\n compress: false,\n keepaliveMaxBytes: 60 * 1024,\n persist: true,\n requestTimeoutMs: 15_000,\n};\n","export const now = (): number => Date.now();\n\nexport function safe<T>(fn: () => T, fallback?: T): T | undefined {\n try {\n return fn();\n } catch {\n return fallback;\n }\n}\n\nexport function throttle<A extends unknown[]>(fn: (...a: A) => void, ms: number): ((...a: A) => void) & { cancel(): void } {\n let last = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let pending: A | undefined;\n const run = (a: A) => {\n last = Date.now();\n fn(...a);\n };\n const t = ((...a: A) => {\n const elapsed = Date.now() - last;\n if (elapsed >= ms) run(a);\n else {\n pending = a;\n if (!timer)\n timer = setTimeout(() => {\n timer = undefined;\n if (pending) run(pending);\n pending = undefined;\n }, ms - elapsed);\n }\n }) as ((...a: A) => void) & { cancel(): void };\n t.cancel = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n pending = undefined;\n };\n return t;\n}\n\nexport function debounce<A extends unknown[]>(fn: (...a: A) => void, ms: number): ((...a: A) => void) & { cancel(): void; flush(): void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let args: A | undefined;\n const d = ((...a: A) => {\n args = a;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = undefined;\n const x = args;\n args = undefined;\n if (x) fn(...x);\n }, ms);\n }) as ((...a: A) => void) & { cancel(): void; flush(): void };\n d.cancel = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n args = undefined;\n };\n d.flush = () => {\n if (!timer) return;\n clearTimeout(timer);\n timer = undefined;\n const x = args;\n args = undefined;\n if (x) fn(...x);\n };\n return d;\n}\n\n/** Estimativa barata do tamanho serializado (bytes ≈ chars). */\nexport function approxSize(value: unknown): number {\n try {\n return JSON.stringify(value)?.length ?? 0;\n } catch {\n return 0;\n }\n}\n\nexport function deepMerge<T extends object>(base: T, patch?: Partial<T>): T {\n const out: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n if (!patch) return out as T;\n for (const [k, v] of Object.entries(patch)) if (v !== undefined) out[k] = v;\n return out as T;\n}\n\nexport type Listener = () => void;\n\n/** Registro de listeners com remoção em lote. */\nexport class Disposer {\n private fns: Listener[] = [];\n add(fn: Listener): void {\n this.fns.push(fn);\n }\n listen(target: EventTarget, type: string, handler: (e: any) => void, opts?: boolean | AddEventListenerOptions): void {\n target.addEventListener(type, handler, opts);\n this.fns.push(() => target.removeEventListener(type, handler, opts));\n }\n dispose(): void {\n const fns = this.fns;\n this.fns = [];\n for (const fn of fns.reverse()) safe(fn);\n }\n}\n","import { DEFAULT_PRIVACY, type PrivacyConfig } from \"../types/config\";\nimport { deepMerge } from \"../utils/misc\";\n\nexport function resolvePrivacy(user?: Partial<PrivacyConfig>): PrivacyConfig {\n return deepMerge(DEFAULT_PRIVACY, user);\n}\n\nexport const BASE_SENSITIVE_HEADERS = [\n \"authorization\",\n \"proxy-authorization\",\n \"cookie\",\n \"set-cookie\",\n \"x-api-key\",\n \"x-auth-token\",\n \"x-csrf-token\",\n \"x-xsrf-token\",\n \"x-session-token\",\n];\n\nexport const BASE_SENSITIVE_KEY_PATTERN =\n /pass(word|wd)?|senha|secret|token|auth|bearer|api[-_]?key|apikey|credential|session|cookie|jwt|signature|private|cvv|cvc|card[-_]?(number|num)|cartao|cpf|cnpj|ssn|otp|pin$/i;\n","import type { CapturedBody, SelectorCandidate } from \"../types/events\";\nimport type { PrivacyConfig } from \"../types/config\";\nimport { BASE_SENSITIVE_HEADERS, BASE_SENSITIVE_KEY_PATTERN } from \"./PrivacyConfig\";\n\nexport const REDACTED = \"[REDACTED]\";\n\nconst JWT = /\\beyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]*\\b/g;\nconst BEARER = /\\b(Bearer|Basic)\\s+[A-Za-z0-9._~+/=-]{8,}/gi;\nconst CPF = /\\b\\d{3}\\.\\d{3}\\.\\d{3}-\\d{2}\\b/g;\nconst CNPJ = /\\b\\d{2}\\.\\d{3}\\.\\d{3}\\/\\d{4}-\\d{2}\\b/g;\nconst CARD = /\\b(?:\\d[ -]?){13,19}\\b/g;\n\nfunction luhn(digits: string): boolean {\n let sum = 0;\n let alt = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let n = digits.charCodeAt(i) - 48;\n if (alt) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alt = !alt;\n }\n return sum % 10 === 0;\n}\n\n/**\n * Sanitização feita ANTES de qualquer persistência ou envio.\n * Todas as funções são puras e nunca lançam.\n */\nexport class DataSanitizer {\n private readonly headerSet: Set<string>;\n private readonly extraKeys: Set<string>;\n private readonly open: boolean;\n\n constructor(private readonly cfg: PrivacyConfig) {\n this.headerSet = new Set([...BASE_SENSITIVE_HEADERS, ...cfg.redactHeaders.map((h) => h.toLowerCase())]);\n this.extraKeys = new Set(cfg.redactKeys.map((k) => k.toLowerCase()));\n this.open = cfg.captureSensitiveValues === true;\n }\n\n isSensitiveKey(key: string): boolean {\n if (this.open) return false;\n return BASE_SENSITIVE_KEY_PATTERN.test(key) || this.extraKeys.has(key.toLowerCase());\n }\n\n /** Mascara padrões sensíveis em texto livre (JWT, Bearer, CPF, CNPJ, cartões). */\n scrubString(input: string): string {\n if (this.open || !input) return input;\n let s = input.replace(JWT, REDACTED).replace(BEARER, (_m, scheme: string) => `${scheme} ${REDACTED}`);\n s = s.replace(CNPJ, REDACTED).replace(CPF, REDACTED);\n s = s.replace(CARD, (m) => {\n const digits = m.replace(/[ -]/g, \"\");\n return digits.length >= 13 && digits.length <= 19 && luhn(digits) ? REDACTED : m;\n });\n return s;\n }\n\n sanitizeHeaders(headers: Record<string, string>): Record<string, string> {\n if (this.open) return { ...headers };\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n out[k] = this.headerSet.has(k.toLowerCase()) || this.isSensitiveKey(k) ? REDACTED : this.scrubString(v);\n }\n return out;\n }\n\n /** Redige query params sensíveis e credenciais embutidas (user:pass@). */\n sanitizeUrl(raw: string, base?: string): string {\n if (this.open) return raw;\n try {\n const u = new URL(raw, base ?? (typeof location !== \"undefined\" ? location.href : undefined));\n if (u.username || u.password) {\n u.username = \"\";\n u.password = \"\";\n }\n for (const key of Array.from(new Set(u.searchParams.keys()))) {\n if (this.isSensitiveKey(key)) u.searchParams.set(key, REDACTED);\n else u.searchParams.set(key, this.scrubString(u.searchParams.get(key) ?? \"\"));\n }\n if (u.hash && /(access_token|id_token|token|code)=/i.test(u.hash)) u.hash = `#${REDACTED}`;\n return u.toString();\n } catch {\n return this.scrubString(raw);\n }\n }\n\n /** Redige query/fragmento de um valor de atributo de URL preservando a forma original (relativa ou absoluta). */\n redactUrlAttribute(value: string): string {\n if (this.open || typeof value !== \"string\" || !/[?#@]/.test(value)) return value;\n const hashAt = value.indexOf(\"#\");\n const hash = hashAt >= 0 ? value.slice(hashAt) : \"\";\n const noHash = hashAt >= 0 ? value.slice(0, hashAt) : value;\n const q = noHash.indexOf(\"?\");\n let base = q >= 0 ? noHash.slice(0, q) : noHash;\n base = base.replace(/^([a-z][a-z0-9+.-]*:\\/\\/)[^/@]*@/i, \"$1\");\n let query = \"\";\n if (q >= 0) {\n const params = new URLSearchParams(noHash.slice(q + 1));\n for (const k of Array.from(new Set(params.keys()))) {\n if (this.isSensitiveKey(k)) params.set(k, REDACTED);\n else params.set(k, this.scrubString(params.get(k) ?? \"\"));\n }\n query = `?${params.toString()}`;\n }\n return base + query + (hash && /(access_token|id_token|token|code)=/i.test(hash) ? `#${REDACTED}` : hash);\n }\n\n parseQuery(raw: string): Record<string, string | string[]> | undefined {\n try {\n const u = new URL(raw, typeof location !== \"undefined\" ? location.href : undefined);\n const out: Record<string, string | string[]> = {};\n u.searchParams.forEach((v, k) => {\n const val = this.isSensitiveKey(k) ? REDACTED : this.scrubString(v);\n const prev = out[k];\n out[k] = prev === undefined ? val : Array.isArray(prev) ? [...prev, val] : [prev, val];\n });\n return Object.keys(out).length ? out : undefined;\n } catch {\n return undefined;\n }\n }\n\n /** Redação profunda de objetos (chaves sensíveis + padrões em strings). */\n sanitizeValue(value: unknown, depth = 0): unknown {\n if (depth > 8) return \"[Truncated]\";\n if (typeof value === \"string\") return this.scrubString(value);\n if (value === null || typeof value !== \"object\") return value;\n if (Array.isArray(value)) return value.slice(0, 200).map((v) => this.sanitizeValue(v, depth + 1));\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = this.isSensitiveKey(k) ? REDACTED : this.sanitizeValue(v, depth + 1);\n }\n return out;\n }\n\n /** Converte um corpo textual em CapturedBody sanitizado, respeitando o limite. */\n sanitizeTextBody(text: string, contentType: string, size = text.length): CapturedBody {\n const max = this.cfg.maxBodyBytes;\n const truncated = text.length > max;\n const slice = truncated ? text.slice(0, max) : text;\n if (/json/i.test(contentType) && !truncated) {\n try {\n return { kind: \"json\", value: this.sanitizeValue(JSON.parse(slice)), size };\n } catch {\n /* cai para texto */\n }\n }\n if (/x-www-form-urlencoded/i.test(contentType)) {\n const params = new URLSearchParams(slice);\n const form: Record<string, string> = {};\n params.forEach((v, k) => (form[k] = this.isSensitiveKey(k) ? REDACTED : this.scrubString(v)));\n return { kind: \"form\", value: form, size, truncated };\n }\n return { kind: \"text\", value: this.scrubString(slice), size, truncated };\n }\n\n isTextual(contentType: string): boolean {\n return this.cfg.textContentTypes.some((re) => re.test(contentType));\n }\n\n isIgnoredUrl(url: string): boolean {\n return this.cfg.ignoreUrls.some((p) => (typeof p === \"string\" ? url.includes(p) : p.test(url)));\n }\n\n /** Referência opaca para valores não autorizados. */\n redactedRef(value: string, salt: string): string {\n let h = 2166136261;\n const s = salt + value;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 16777619);\n }\n return `ref_${(h >>> 0).toString(16).padStart(8, \"0\")}`;\n }\n\n /** Remove valores de atributos de seletor que podem conter dados sensíveis. */\n sanitizeSelectorCandidates(list: SelectorCandidate[]): SelectorCandidate[] {\n return list.map((c) => ({ ...c, selector: this.scrubString(c.selector) }));\n }\n}\n","export type OffscriptErrorCode =\n | \"CONFIG_INVALID\"\n | \"AUTH_FAILED\"\n | \"SESSION_EXPIRED\"\n | \"SESSION_DISABLED\"\n | \"INVALID_STATE\"\n | \"TRANSPORT_FAILED\"\n | \"PAYLOAD_TOO_LARGE\"\n | \"NOT_SUPPORTED\"\n | \"INTERNAL\";\n\nexport class OffscriptError extends Error {\n readonly code: OffscriptErrorCode;\n readonly status?: number;\n readonly cause?: unknown;\n constructor(code: OffscriptErrorCode, message: string, opts: { status?: number; cause?: unknown } = {}) {\n super(message);\n this.name = \"OffscriptError\";\n this.code = code;\n this.status = opts.status;\n this.cause = opts.cause;\n }\n}\n\nexport class ConfigError extends OffscriptError {\n constructor(message: string) {\n super(\"CONFIG_INVALID\", message);\n this.name = \"ConfigError\";\n }\n}\nexport class AuthError extends OffscriptError {\n constructor(message: string, status?: number) {\n super(\"AUTH_FAILED\", message, { status });\n this.name = \"AuthError\";\n }\n}\nexport class SessionExpiredError extends OffscriptError {\n constructor(message = \"Sessão expirada\") {\n super(\"SESSION_EXPIRED\", message, { status: 410 });\n this.name = \"SessionExpiredError\";\n }\n}\nexport class SessionDisabledError extends OffscriptError {\n constructor(message = \"Gravação desativada pelo backend\") {\n super(\"SESSION_DISABLED\", message);\n this.name = \"SessionDisabledError\";\n }\n}\nexport class InvalidStateError extends OffscriptError {\n constructor(message: string) {\n super(\"INVALID_STATE\", message);\n this.name = \"InvalidStateError\";\n }\n}\nexport class TransportError extends OffscriptError {\n readonly retryable: boolean;\n constructor(message: string, opts: { status?: number; retryable: boolean; cause?: unknown }) {\n super(\"TRANSPORT_FAILED\", message, opts);\n this.name = \"TransportError\";\n this.retryable = opts.retryable;\n }\n}\n\n/** Emissor tipado mínimo. */\nexport class Emitter<M extends Record<string, unknown>> {\n private handlers = new Map<keyof M, Set<(p: any) => void>>();\n on<K extends keyof M>(type: K, fn: (payload: M[K]) => void): () => void {\n let s = this.handlers.get(type);\n if (!s) this.handlers.set(type, (s = new Set()));\n s.add(fn);\n return () => this.off(type, fn);\n }\n off<K extends keyof M>(type: K, fn: (payload: M[K]) => void): void {\n this.handlers.get(type)?.delete(fn);\n }\n emit<K extends keyof M>(type: K, payload: M[K]): void {\n for (const fn of Array.from(this.handlers.get(type) ?? [])) {\n try {\n fn(payload);\n } catch {\n /* listener do usuário não pode quebrar o SDK */\n }\n }\n }\n clear(): void {\n this.handlers.clear();\n }\n}\n","import { AuthError, SessionExpiredError, TransportError } from \"../utils/errors\";\nimport { SDK_VERSION, type EventBatch } from \"../types/events\";\nimport type { CreateSessionResponse, EventsAck, HeartbeatResponse } from \"../types/session\";\n\nexport const ORIGINAL_FETCH = \"__offscriptOriginal\";\n\n/** Retorna o fetch nativo, mesmo que o HTTP Recorder esteja instalado. */\nexport function nativeFetch(): typeof fetch {\n const f = globalThis.fetch as typeof fetch & { [ORIGINAL_FETCH]?: typeof fetch };\n if (!f) throw new TransportError(\"fetch indisponível\", { retryable: false });\n return (f[ORIGINAL_FETCH] ?? f).bind(globalThis);\n}\n\nexport interface SendOptions {\n keepalive?: boolean;\n compress?: boolean;\n}\n\nexport class ApiClient {\n constructor(\n private readonly apiUrl: string,\n private readonly getToken: () => string,\n private readonly timeoutMs: number,\n ) {}\n\n get baseUrl(): string {\n return this.apiUrl;\n }\n\n createSession(body: Record<string, unknown>): Promise<CreateSessionResponse> {\n return this.json(\"POST\", \"/sdk/sessions\", body);\n }\n heartbeat(sessionId: string, body: Record<string, unknown>): Promise<HeartbeatResponse> {\n return this.json(\"POST\", `/sdk/sessions/${encodeURIComponent(sessionId)}/heartbeat`, body);\n }\n complete(sessionId: string, body: Record<string, unknown>): Promise<{ completed: boolean }> {\n return this.json(\"POST\", `/sdk/sessions/${encodeURIComponent(sessionId)}/complete`, body);\n }\n status(sessionId: string): Promise<HeartbeatResponse> {\n return this.json(\"GET\", `/sdk/sessions/${encodeURIComponent(sessionId)}/status`);\n }\n\n async sendEvents(batch: EventBatch, opts: SendOptions = {}): Promise<EventsAck> {\n const path = `/sdk/sessions/${encodeURIComponent(batch.sessionId)}/events`;\n return this.json(\"POST\", path, batch, { \"Idempotency-Key\": batch.batchId }, opts);\n }\n\n private async json<T>(\n method: string,\n path: string,\n body?: unknown,\n extraHeaders: Record<string, string> = {},\n opts: SendOptions = {},\n ): Promise<T> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n Authorization: `Bearer ${this.getToken()}`,\n \"X-Offscript-Sdk\": SDK_VERSION,\n ...extraHeaders,\n };\n let payload: BodyInit | undefined;\n if (body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n const text = JSON.stringify(body);\n payload = text;\n if (opts.compress && !opts.keepalive && text.length > 1024) {\n const gz = await gzip(text);\n if (gz) {\n payload = gz as BodyInit;\n headers[\"Content-Encoding\"] = \"gzip\";\n }\n }\n }\n\n const ctrl = typeof AbortController !== \"undefined\" ? new AbortController() : undefined;\n const timer = ctrl && !opts.keepalive ? setTimeout(() => ctrl.abort(), this.timeoutMs) : undefined;\n let res: Response;\n try {\n res = await nativeFetch()(this.apiUrl + path, {\n method,\n headers,\n body: payload,\n keepalive: opts.keepalive,\n credentials: \"omit\",\n mode: \"cors\",\n signal: ctrl?.signal,\n });\n } catch (e) {\n throw new TransportError(`Falha de rede: ${(e as Error)?.message ?? e}`, { retryable: true, cause: e });\n } finally {\n if (timer) clearTimeout(timer);\n }\n\n if (res.ok) {\n const text = await res.text();\n return (text ? JSON.parse(text) : {}) as T;\n }\n const detail = await res.text().catch(() => \"\");\n const msg = `HTTP ${res.status} ${method} ${path}${detail ? `: ${detail.slice(0, 200)}` : \"\"}`;\n if (res.status === 401 || res.status === 403) throw new AuthError(msg, res.status);\n if (res.status === 410) throw new SessionExpiredError(msg);\n const retryAfter = Number(res.headers.get(\"retry-after\"));\n const err = new TransportError(msg, {\n status: res.status,\n retryable: res.status === 408 || res.status === 429 || res.status >= 500,\n });\n if (retryAfter > 0) (err as TransportError & { retryAfterMs?: number }).retryAfterMs = retryAfter * 1000;\n throw err;\n }\n}\n\nasync function gzip(text: string): Promise<Uint8Array | null> {\n try {\n const CS = (globalThis as { CompressionStream?: new (f: string) => GenericTransformStream }).CompressionStream;\n if (!CS) return null;\n const body = new Response(text).body;\n if (!body) return null;\n return new Uint8Array(await new Response(body.pipeThrough(new CS(\"gzip\") as unknown as ReadableWritablePair)).arrayBuffer());\n } catch {\n return null;\n }\n}\n","import type { OffscriptEvent } from \"../types/events\";\nimport type { Priority } from \"../types/config\";\n\n/**\n * Fila de staging em memória + controle de backpressure.\n * Eventos \"critical\" (snapshots rrweb, lifecycle, ações) nunca são descartados\n * antes dos \"low\" (mousemove, scroll, console) e têm um teto 2x maior.\n */\nexport class EventQueue {\n private staged: OffscriptEvent[] = [];\n private pendingCount = 0;\n private pendingBytes = 0;\n dropped = 0;\n\n constructor(\n private readonly maxEvents: number,\n private readonly maxBytes: number,\n ) {}\n\n canAccept(priority: Priority): boolean {\n const factor = priority === \"critical\" ? 2 : priority === \"normal\" ? 1 : 0.5;\n return this.pendingCount < this.maxEvents * factor && this.pendingBytes < this.maxBytes * factor;\n }\n\n noteDropped(): void {\n this.dropped++;\n }\n\n push(e: OffscriptEvent, size: number): void {\n this.staged.push(e);\n this.pendingCount++;\n this.pendingBytes += size;\n }\n\n /** Devolve eventos ao staging sem recontar. */\n restore(events: OffscriptEvent[]): void {\n this.staged = [...events, ...this.staged];\n }\n\n takeStaged(): OffscriptEvent[] {\n const s = this.staged;\n this.staged = [];\n return s;\n }\n\n peekStaged(): readonly OffscriptEvent[] {\n return this.staged;\n }\n\n get stagedCount(): number {\n return this.staged.length;\n }\n\n acked(count: number, bytes: number): void {\n this.pendingCount = Math.max(0, this.pendingCount - count);\n this.pendingBytes = Math.max(0, this.pendingBytes - bytes);\n }\n\n reset(count: number, bytes: number): void {\n this.pendingCount = count;\n this.pendingBytes = bytes;\n }\n\n get pending(): number {\n return this.pendingCount;\n }\n get bytes(): number {\n return this.pendingBytes;\n }\n}\n","/** Exponential backoff com full jitter. */\nexport class RetryManager {\n constructor(\n private readonly baseMs: number,\n private readonly maxMs: number,\n private readonly random: () => number = Math.random,\n ) {}\n\n delay(attempt: number): number {\n const cap = Math.min(this.maxMs, this.baseMs * 2 ** Math.max(0, attempt));\n return Math.round(this.random() * cap);\n }\n\n sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n }\n}\n","import { SCHEMA_VERSION, SDK_VERSION, type EventBatch, type OffscriptEvent } from \"../types/events\";\nimport type { Priority, TransportConfig } from \"../types/config\";\nimport { ApiClient, nativeFetch } from \"../core/ApiClient\";\nimport { AuthError, Emitter, SessionExpiredError, TransportError } from \"../utils/errors\";\nimport { approxSize, safe } from \"../utils/misc\";\nimport type { EventBuffer } from \"./PersistentBuffer\";\nimport { EventQueue } from \"./EventQueue\";\nimport { RetryManager } from \"./RetryManager\";\n\nexport interface TransportIdentity {\n sessionId: string;\n executionId: string;\n tabId: string;\n}\n\nexport type TransportEvents = {\n flushed: { events: number; batchId: string; duplicate: boolean };\n failed: { error: unknown; willRetryInMs?: number };\n fatal: { error: AuthError | SessionExpiredError };\n overflow: { dropped: number };\n};\n\nexport interface DrainOptions {\n inlineRetries: number;\n deadline?: number;\n}\n\nexport class EventTransport extends Emitter<TransportEvents> {\n private queue: EventQueue;\n private retry: RetryManager;\n private identity: TransportIdentity | null = null;\n private commitTimer?: ReturnType<typeof setTimeout>;\n private flushTimer?: ReturnType<typeof setTimeout>;\n private retryTimer?: ReturnType<typeof setTimeout>;\n private running: Promise<boolean> | null = null;\n private again = false;\n private failures = 0;\n private stopped = true;\n private fatal = false;\n private online = true;\n private lastDroppedReported = 0;\n\n constructor(\n private readonly cfg: TransportConfig,\n private readonly api: ApiClient,\n private readonly buffer: EventBuffer,\n ) {\n super();\n this.queue = new EventQueue(cfg.maxMemoryEvents, cfg.maxBufferBytes);\n this.retry = new RetryManager(cfg.retryBaseMs, cfg.retryMaxMs);\n }\n\n get bufferKind(): string {\n return this.buffer.kind;\n }\n\n /** Inicia o transporte para uma sessão/aba e recupera o que ficou pendente no buffer. */\n async start(identity: TransportIdentity): Promise<void> {\n this.identity = identity;\n this.stopped = false;\n this.fatal = false;\n this.failures = 0;\n const st = await this.buffer.stats(identity.sessionId).catch(() => ({ count: 0, bytes: 0 }));\n this.queue.reset(st.count, st.bytes);\n this.scheduleFlush();\n }\n\n setOnline(online: boolean): void {\n this.online = online;\n if (online && !this.stopped) void this.flush();\n }\n\n canAccept(priority: Priority): boolean {\n return !this.stopped && !this.fatal && this.queue.canAccept(priority);\n }\n\n noteDropped(): void {\n this.queue.noteDropped();\n if (this.queue.dropped - this.lastDroppedReported >= 1) {\n this.lastDroppedReported = this.queue.dropped;\n this.emit(\"overflow\", { dropped: this.queue.dropped });\n }\n }\n\n get pending(): number {\n return this.queue.pending;\n }\n\n enqueue(event: OffscriptEvent): void {\n if (this.stopped) return;\n this.queue.push(event, approxSize(event));\n if (this.queue.stagedCount >= 50) void this.commit();\n else if (!this.commitTimer) this.commitTimer = setTimeout(() => void this.commit(), 100);\n }\n\n private async commit(): Promise<void> {\n if (this.commitTimer) clearTimeout(this.commitTimer);\n this.commitTimer = undefined;\n const staged = this.queue.takeStaged();\n if (!staged.length) return;\n try {\n await this.buffer.put(staged);\n } catch {\n // Persistência falhou: devolve para evitar perda silenciosa\n this.queue.restore(staged);\n throw new TransportError(\"Falha ao persistir eventos localmente\", { retryable: true });\n }\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer || this.stopped) return;\n this.flushTimer = setTimeout(() => {\n this.flushTimer = undefined;\n void this.flush().finally(() => this.scheduleFlush());\n }, this.cfg.flushIntervalMs);\n }\n\n /** Flush de melhor esforço. Retorna true se tudo foi confirmado pelo backend. */\n flush(opts: DrainOptions = { inlineRetries: 0 }): Promise<boolean> {\n if (this.running) {\n this.again = true;\n return this.running;\n }\n this.running = (async () => {\n try {\n let ok = await this.drain(opts);\n while (this.again && ok) {\n this.again = false;\n ok = await this.drain(opts);\n }\n return ok;\n } finally {\n this.running = null;\n this.again = false;\n }\n })();\n return this.running;\n }\n\n /** Flush final com retries inline e prazo máximo. */\n async flushFinal(maxWaitMs = 10_000): Promise<{ ok: boolean; pending: number }> {\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.retryTimer = undefined;\n const running = this.running;\n if (running) await running.catch(() => false);\n const ok = await this.flush({ inlineRetries: this.cfg.maxRetries, deadline: Date.now() + maxWaitMs });\n return { ok, pending: this.queue.pending };\n }\n\n private async drain(opts: DrainOptions): Promise<boolean> {\n const id = this.identity;\n if (!id || this.fatal) return false;\n for (;;) {\n try {\n await this.commit();\n const { items } = await this.buffer.peek(id.sessionId, id.tabId, this.cfg.batchMaxEvents, this.cfg.batchMaxBytes);\n if (!items.length) {\n this.failures = 0;\n return true;\n }\n const events = items.map((i) => i.event);\n await this.sendWithRetry(events, opts);\n await this.buffer.remove(items.map((i) => i.key));\n this.queue.acked(items.length, items.reduce((n, i) => n + i.size, 0));\n this.failures = 0;\n } catch (error) {\n return this.onFailure(error);\n }\n }\n }\n\n private onFailure(error: unknown): false {\n if (error instanceof AuthError || error instanceof SessionExpiredError) {\n this.fatal = true;\n this.emit(\"fatal\", { error });\n return false;\n }\n this.failures++;\n const retryable = !(error instanceof TransportError) || error.retryable;\n const willRetryInMs = retryable ? this.retry.delay(this.failures) : undefined;\n this.emit(\"failed\", { error, willRetryInMs });\n if (retryable && !this.stopped) {\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.retryTimer = setTimeout(() => {\n this.retryTimer = undefined;\n void this.flush();\n }, willRetryInMs);\n }\n return false;\n }\n\n private async sendWithRetry(events: OffscriptEvent[], opts: DrainOptions): Promise<void> {\n const batch = this.buildBatch(events);\n for (let attempt = 0; ; attempt++) {\n try {\n if (!this.online) throw new TransportError(\"Offline\", { retryable: true });\n const ack = await this.api.sendEvents(batch, { compress: this.cfg.compress });\n this.emit(\"flushed\", { events: events.length, batchId: batch.batchId, duplicate: !!ack.duplicate });\n return;\n } catch (e) {\n if (e instanceof TransportError && e.status === 413 && events.length > 1) {\n const mid = Math.ceil(events.length / 2);\n await this.sendWithRetry(events.slice(0, mid), opts);\n await this.sendWithRetry(events.slice(mid), opts);\n return;\n }\n const retryable = !(e instanceof TransportError) || e.retryable;\n if (!retryable || attempt >= opts.inlineRetries) throw e;\n const wait = Math.max(this.retry.delay(attempt), (e as { retryAfterMs?: number }).retryAfterMs ?? 0);\n if (opts.deadline && Date.now() + wait > opts.deadline) throw e;\n await this.retry.sleep(wait);\n }\n }\n }\n\n private buildBatch(events: OffscriptEvent[]): EventBatch {\n const id = this.identity!;\n const first = events[0].sequence;\n const last = events[events.length - 1].sequence;\n return {\n schemaVersion: SCHEMA_VERSION,\n batchId: `${id.sessionId}.${id.tabId}.${first}-${last}.${events.length}`,\n sessionId: id.sessionId,\n executionId: id.executionId,\n tabId: id.tabId,\n sequenceStart: first,\n sequenceEnd: last,\n createdAt: Date.now(),\n sdkVersion: SDK_VERSION,\n events,\n };\n }\n\n /**\n * Chamado em pagehide/beforeunload. Persiste o que está em staging (best effort, assíncrono) e\n * tenta enviar o final da fila com fetch keepalive (limite ~64KB). Sem ACK: os eventos continuam\n * no IndexedDB e serão reenviados (de forma idempotente) na próxima página.\n * Não há garantia de entrega se o navegador for encerrado abruptamente.\n */\n flushOnUnload(): void {\n const id = this.identity;\n if (!id || this.stopped || this.fatal) return;\n const staged = this.queue.takeStaged();\n if (!staged.length) return;\n safe(() => void this.buffer.put(staged).catch(() => undefined));\n const events: OffscriptEvent[] = [];\n let bytes = 0;\n for (const e of staged) {\n const s = approxSize(e);\n if (bytes + s > this.cfg.keepaliveMaxBytes) break;\n events.push(e);\n bytes += s;\n }\n if (!events.length) return;\n safe(() => void this.api.sendEvents(this.buildBatch(events), { keepalive: true }).catch(() => undefined));\n }\n\n /** Para timers; eventos não confirmados permanecem no buffer. */\n stop(): void {\n this.stopped = true;\n for (const t of [this.commitTimer, this.flushTimer, this.retryTimer]) if (t) clearTimeout(t);\n this.commitTimer = this.flushTimer = this.retryTimer = undefined;\n }\n\n async clearSession(sessionId: string): Promise<void> {\n await this.buffer.clearSession(sessionId).catch(() => undefined);\n this.queue.reset(0, 0);\n }\n\n async purgeExpired(retentionMs: number): Promise<void> {\n await this.buffer.purgeOlderThan(Date.now() - retentionMs).catch(() => undefined);\n }\n\n close(): void {\n this.stop();\n this.buffer.close();\n }\n}\n\nexport { nativeFetch };\n","import type { OffscriptEvent } from \"../types/events\";\nimport { approxSize, safe } from \"../utils/misc\";\n\nexport interface StoredEvent {\n key: string;\n sessionId: string;\n tabId: string;\n sequence: number;\n storedAt: number;\n size: number;\n event: OffscriptEvent;\n}\n\nexport interface PeekResult {\n items: StoredEvent[];\n bytes: number;\n}\n\nexport interface EventBuffer {\n readonly kind: \"indexeddb\" | \"memory\";\n put(events: OffscriptEvent[]): Promise<void>;\n peek(sessionId: string, tabId: string, maxEvents: number, maxBytes: number): Promise<PeekResult>;\n remove(keys: string[]): Promise<void>;\n stats(sessionId?: string): Promise<{ count: number; bytes: number }>;\n purgeOlderThan(ts: number): Promise<number>;\n clearSession(sessionId: string): Promise<void>;\n close(): void;\n}\n\nexport const eventKey = (sessionId: string, tabId: string, seq: number): string =>\n `${sessionId}|${tabId}|${String(seq).padStart(12, \"0\")}`;\n\nconst toStored = (e: OffscriptEvent): StoredEvent => ({\n key: eventKey(e.sessionId, e.tabId, e.sequence),\n sessionId: e.sessionId,\n tabId: e.tabId,\n sequence: e.sequence,\n storedAt: Date.now(),\n size: approxSize(e),\n event: e,\n});\n\nexport class MemoryBuffer implements EventBuffer {\n readonly kind = \"memory\" as const;\n private map = new Map<string, StoredEvent>();\n\n async put(events: OffscriptEvent[]): Promise<void> {\n for (const e of events) {\n const s = toStored(e);\n this.map.set(s.key, s);\n }\n }\n async peek(sessionId: string, tabId: string, maxEvents: number, maxBytes: number): Promise<PeekResult> {\n const prefix = `${sessionId}|${tabId}|`;\n const keys = Array.from(this.map.keys())\n .filter((k) => k.startsWith(prefix))\n .sort();\n const items: StoredEvent[] = [];\n let bytes = 0;\n for (const k of keys) {\n const s = this.map.get(k)!;\n if (items.length >= maxEvents || (items.length > 0 && bytes + s.size > maxBytes)) break;\n items.push(s);\n bytes += s.size;\n }\n return { items, bytes };\n }\n async remove(keys: string[]): Promise<void> {\n for (const k of keys) this.map.delete(k);\n }\n async stats(sessionId?: string) {\n let count = 0;\n let bytes = 0;\n for (const s of this.map.values()) {\n if (sessionId && s.sessionId !== sessionId) continue;\n count++;\n bytes += s.size;\n }\n return { count, bytes };\n }\n async purgeOlderThan(ts: number): Promise<number> {\n let n = 0;\n for (const [k, s] of this.map) if (s.storedAt < ts) (this.map.delete(k), n++);\n return n;\n }\n async clearSession(sessionId: string): Promise<void> {\n for (const [k, s] of this.map) if (s.sessionId === sessionId) this.map.delete(k);\n }\n close(): void {}\n}\n\nconst STORE = \"events\";\n\nfunction req<T>(r: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n r.onsuccess = () => resolve(r.result);\n r.onerror = () => reject(r.error);\n });\n}\nfunction done(tx: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n tx.onabort = () => reject(tx.error);\n });\n}\n\n/** Persistência temporária em IndexedDB. Eventos só saem daqui após o ACK do backend. */\nexport class IndexedDBBuffer implements EventBuffer {\n readonly kind = \"indexeddb\" as const;\n private constructor(private db: IDBDatabase) {}\n\n static async open(name: string): Promise<IndexedDBBuffer> {\n if (typeof indexedDB === \"undefined\") throw new Error(\"IndexedDB indisponível\");\n const db = await new Promise<IDBDatabase>((resolve, reject) => {\n const r = indexedDB.open(name, 1);\n r.onupgradeneeded = () => {\n const store = r.result.createObjectStore(STORE, { keyPath: \"key\" });\n store.createIndex(\"bySession\", \"sessionId\");\n store.createIndex(\"byStoredAt\", \"storedAt\");\n };\n r.onsuccess = () => resolve(r.result);\n r.onerror = () => reject(r.error);\n r.onblocked = () => reject(new Error(\"IndexedDB bloqueado\"));\n });\n return new IndexedDBBuffer(db);\n }\n\n async put(events: OffscriptEvent[]): Promise<void> {\n if (!events.length) return;\n const tx = this.db.transaction(STORE, \"readwrite\");\n const store = tx.objectStore(STORE);\n for (const e of events) store.put(toStored(e));\n await done(tx);\n }\n\n async peek(sessionId: string, tabId: string, maxEvents: number, maxBytes: number): Promise<PeekResult> {\n const prefix = `${sessionId}|${tabId}|`;\n const range = IDBKeyRange.bound(prefix, prefix + \"￿\");\n const tx = this.db.transaction(STORE, \"readonly\");\n const items: StoredEvent[] = [];\n let bytes = 0;\n await new Promise<void>((resolve, reject) => {\n const cur = tx.objectStore(STORE).openCursor(range);\n cur.onsuccess = () => {\n const c = cur.result;\n if (!c) return resolve();\n const s = c.value as StoredEvent;\n if (items.length >= maxEvents || (items.length > 0 && bytes + s.size > maxBytes)) return resolve();\n items.push(s);\n bytes += s.size;\n c.continue();\n };\n cur.onerror = () => reject(cur.error);\n });\n return { items, bytes };\n }\n\n async remove(keys: string[]): Promise<void> {\n if (!keys.length) return;\n const tx = this.db.transaction(STORE, \"readwrite\");\n const store = tx.objectStore(STORE);\n for (const k of keys) store.delete(k);\n await done(tx);\n }\n\n async stats(sessionId?: string) {\n const tx = this.db.transaction(STORE, \"readonly\");\n const store = tx.objectStore(STORE);\n if (!sessionId) return { count: await req(store.count()), bytes: 0 };\n let count = 0;\n let bytes = 0;\n await new Promise<void>((resolve, reject) => {\n const cur = store.index(\"bySession\").openCursor(IDBKeyRange.only(sessionId));\n cur.onsuccess = () => {\n const c = cur.result;\n if (!c) return resolve();\n count++;\n bytes += (c.value as StoredEvent).size;\n c.continue();\n };\n cur.onerror = () => reject(cur.error);\n });\n return { count, bytes };\n }\n\n async purgeOlderThan(ts: number): Promise<number> {\n const tx = this.db.transaction(STORE, \"readwrite\");\n let n = 0;\n await new Promise<void>((resolve, reject) => {\n const cur = tx.objectStore(STORE).index(\"byStoredAt\").openCursor(IDBKeyRange.upperBound(ts, true));\n cur.onsuccess = () => {\n const c = cur.result;\n if (!c) return resolve();\n c.delete();\n n++;\n c.continue();\n };\n cur.onerror = () => reject(cur.error);\n });\n await done(tx);\n return n;\n }\n\n async clearSession(sessionId: string): Promise<void> {\n const tx = this.db.transaction(STORE, \"readwrite\");\n await new Promise<void>((resolve, reject) => {\n const cur = tx.objectStore(STORE).index(\"bySession\").openCursor(IDBKeyRange.only(sessionId));\n cur.onsuccess = () => {\n const c = cur.result;\n if (!c) return resolve();\n c.delete();\n c.continue();\n };\n cur.onerror = () => reject(cur.error);\n });\n await done(tx);\n }\n\n close(): void {\n safe(() => this.db.close());\n }\n}\n\nexport async function openBuffer(name: string, persist: boolean): Promise<EventBuffer> {\n if (persist) {\n try {\n return await IndexedDBBuffer.open(name);\n } catch {\n /* fallback */\n }\n }\n return new MemoryBuffer();\n}\n","import type { Priority, ResolvedConfig } from \"../types/config\";\nimport type { EventKind, OffscriptEvent } from \"../types/events\";\nimport type { DataSanitizer } from \"../privacy/DataSanitizer\";\n\nexport interface EmitOptions {\n priority?: Priority;\n /** Momento em que o fato ocorreu, se diferente de agora. */\n at?: number;\n}\n\n/** Contrato entre os recorders e o núcleo. Recorders nunca falam com o transporte diretamente. */\nexport interface EventSink {\n readonly config: ResolvedConfig;\n readonly sanitizer: DataSanitizer;\n emit<T>(kind: EventKind, data: T, opts?: EmitOptions): OffscriptEvent<T> | null;\n}\n\nexport interface Recorder {\n readonly name: string;\n start(): void | Promise<void>;\n stop(): void;\n pause?(): void;\n resume?(): void | Promise<void>;\n}\n\n/** Executa um trecho sem nunca propagar erro para a aplicação hospedeira. */\nexport function guard(sink: { emit: EventSink[\"emit\"] } | null, name: string, fn: () => void): void {\n try {\n fn();\n } catch (e) {\n try {\n sink?.emit(\"lifecycle\", { type: \"recorder-error\", detail: { recorder: name, message: String((e as Error)?.message ?? e) } }, { priority: \"low\" });\n } catch {\n /* nada */\n }\n }\n}\n","import { ACTION_SCHEMA_VERSION, type ActionType, type RecordedAction } from \"../types/events\";\nimport { SelectorGenerator } from \"../playwright/SelectorGenerator\";\nimport { Disposer, debounce, safe } from \"../utils/misc\";\nimport { guard, type EventSink, type Recorder } from \"./types\";\n\nexport type ActionDraft = Omit<RecordedAction, \"id\" | \"sessionId\" | \"executionId\" | \"sequence\" | \"timestamp\">;\n\nconst KEYS = new Set([\"Enter\", \"Escape\", \"Tab\", \"Backspace\", \"Delete\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\", \"PageUp\", \"PageDown\"]);\nconst MODIFIERS = new Set([\"Control\", \"Shift\", \"Alt\", \"Meta\"]);\nconst INTERACTIVE = \"a,button,input,select,textarea,summary,[role=button],[role=link],[role=menuitem],[role=tab],[role=option],[data-testid],[data-test],[data-cy]\";\nconst INPUT_IDLE_MS = 700;\nconst DRAG_MIN_PX = 8;\n\ninterface PendingInput {\n el: Element;\n inputType: string;\n startedAt: number;\n}\n\n/** Ações semânticas do usuário. Eventos brutos → rascunhos de ação; a normalização é feita fora (ActionNormalizer). */\nexport class ActionRecorder implements Recorder {\n readonly name = \"actions\";\n private d = new Disposer();\n private gen: SelectorGenerator;\n private paused = false;\n private pendingInput?: PendingInput;\n private inputTimer?: ReturnType<typeof setTimeout>;\n private salt = Math.random().toString(36).slice(2);\n private lastClick?: { el: Element; t: number };\n private scrollState = new Map<EventTarget, { x: number; y: number; flush: ReturnType<typeof debounce> }>();\n private hover?: { el: Element; timer?: ReturnType<typeof setTimeout>; entered: boolean };\n private drag?: { el: Element; x: number; y: number; t: number; points: Array<{ x: number; y: number; t: number }>; html5: boolean };\n private move: Array<{ x: number; y: number; t: number }> = [];\n private moveFlush?: ReturnType<typeof debounce>;\n\n constructor(private readonly sink: EventSink) {\n const r = sink.config.recording;\n this.gen = new SelectorGenerator({ testIdAttributes: r.testIdAttributes, stableAttributes: r.stableAttributes });\n }\n\n start(): void {\n const d = this.d;\n const cap = { capture: true, passive: true } as const;\n const on = (type: string, fn: (e: any) => void, target: EventTarget = document) =>\n d.listen(target, type, (e) => guard(this.sink, this.name, () => !this.paused && fn(e)), cap);\n\n on(\"click\", (e: MouseEvent) => this.onClick(e));\n on(\"dblclick\", (e: MouseEvent) => this.onDblClick(e));\n on(\"input\", (e: Event) => this.onInput(e));\n on(\"change\", (e: Event) => this.onChange(e));\n on(\"keydown\", (e: KeyboardEvent) => this.onKey(e));\n on(\"focusin\", (e: FocusEvent) => this.onFocus(\"focus\", e));\n on(\"focusout\", (e: FocusEvent) => this.onFocus(\"blur\", e));\n on(\"scroll\", (e: Event) => this.onScroll(e));\n on(\"mouseover\", (e: MouseEvent) => this.onOver(e));\n on(\"mouseout\", (e: MouseEvent) => this.onOut(e));\n on(\"mousedown\", (e: MouseEvent) => this.onDown(e));\n on(\"mouseup\", (e: MouseEvent) => this.onUp(e));\n on(\"mousemove\", (e: MouseEvent) => this.onMove(e));\n on(\"dragstart\", () => this.drag && (this.drag.html5 = true));\n this.moveFlush = debounce(() => this.flushMove(), 500);\n d.add(() => this.moveFlush?.cancel());\n }\n\n pause(): void {\n this.flushAll();\n this.paused = true;\n }\n resume(): void {\n this.paused = false;\n }\n stop(): void {\n guard(this.sink, this.name, () => this.flushAll());\n this.d.dispose();\n for (const s of this.scrollState.values()) s.flush.cancel();\n this.scrollState.clear();\n if (this.hover?.timer) clearTimeout(this.hover.timer);\n }\n\n /** Descarrega estados pendentes (input em edição, scroll, trajetória do mouse). */\n flushAll(): void {\n this.flushInput();\n for (const s of this.scrollState.values()) s.flush.flush();\n this.flushMove();\n }\n\n // ---- API usada pelo núcleo ----------------------------------------------\n recordNavigation(from: string, to: string, kind: string): void {\n guard(this.sink, this.name, () => {\n if (this.paused) return;\n this.flushAll();\n const s = this.sink.sanitizer;\n this.emit({ type: \"navigate\", payload: { from: s.sanitizeUrl(from), to: s.sanitizeUrl(to), kind } });\n });\n }\n\n recordPageLoad(navType: string | undefined, referrer: string): void {\n guard(this.sink, this.name, () => {\n const s = this.sink.sanitizer;\n if (navType === \"reload\") this.emit({ type: \"reload\", payload: { url: s.sanitizeUrl(location.href) } });\n else if (navType === \"back_forward\" || navType === \"navigate\")\n this.emit({ type: \"navigate\", payload: { from: referrer ? s.sanitizeUrl(referrer) : undefined, to: s.sanitizeUrl(location.href), kind: navType === \"back_forward\" ? \"history\" : \"document\" } });\n });\n }\n\n // ---- helpers --------------------------------------------------------------\n private emit(draft: Partial<ActionDraft> & { type: ActionType }, el?: Element | null, extra?: { x?: number; y?: number }): void {\n const s = this.sink.sanitizer;\n const data: ActionDraft = {\n schemaVersion: ACTION_SCHEMA_VERSION,\n type: draft.type,\n url: s.sanitizeUrl(location.href),\n viewport: { width: window.innerWidth, height: window.innerHeight },\n payload: draft.payload,\n metadata: draft.metadata,\n };\n if (extra?.x !== undefined && extra.y !== undefined) data.coordinates = { x: Math.round(extra.x), y: Math.round(extra.y) };\n if (el) {\n const r = this.gen.generate(el);\n data.selector = s.scrubString(r.selector);\n data.selectorUnique = r.unique;\n data.selectorCandidates = s.sanitizeSelectorCandidates(r.candidates);\n data.element = this.gen.describe(el);\n if (data.element.text) data.element.text = s.scrubString(data.element.text);\n if (data.element.name) data.element.name = s.scrubString(data.element.name);\n }\n this.sink.emit(\"action\", data, { priority: \"normal\" });\n }\n\n private target(e: Event): Element | null {\n const t = e.target;\n const el = t instanceof Element ? t : t instanceof Node ? t.parentElement : null;\n if (!el) return null;\n const { ignoreSelectors, blockSelectors } = this.sink.config.privacy;\n const sel = [...ignoreSelectors, ...blockSelectors].join(\",\");\n if (sel && safe(() => el.closest(sel))) return null;\n return el;\n }\n\n // ---- handlers -------------------------------------------------------------\n private onClick(e: MouseEvent): void {\n const el = this.target(e);\n if (!el) return;\n this.flushInput();\n // Clique sintético disparado pelo browser no <input> ao clicar no <label>: já registrado no label.\n const last = this.lastClick;\n if (last && el instanceof HTMLInputElement && (last.el as HTMLLabelElement).control === el && e.timeStamp - last.t < 100) return;\n this.lastClick = { el, t: e.timeStamp };\n const clickable = (el.closest(INTERACTIVE) as Element | null) ?? el;\n this.emit({ type: \"click\", payload: { button: e.button, detail: e.detail, modifiers: mods(e), trusted: e.isTrusted } }, clickable, { x: e.clientX, y: e.clientY });\n }\n\n private onDblClick(e: MouseEvent): void {\n const el = this.target(e);\n if (!el) return;\n const interval = this.lastClick ? Math.round(e.timeStamp - this.lastClick.t) : undefined;\n this.emit({ type: \"dblclick\", payload: { intervalMs: interval, modifiers: mods(e) } }, (el.closest(INTERACTIVE) as Element | null) ?? el, { x: e.clientX, y: e.clientY });\n }\n\n private onInput(e: Event): void {\n const el = this.target(e);\n if (!el || !(el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement)) return;\n if (el instanceof HTMLInputElement && [\"checkbox\", \"radio\", \"file\"].includes(el.type)) return;\n if (this.pendingInput && this.pendingInput.el !== el) this.flushInput();\n this.pendingInput ??= { el, inputType: (e as InputEvent).inputType ?? \"input\", startedAt: Date.now() };\n if (this.inputTimer) clearTimeout(this.inputTimer);\n this.inputTimer = setTimeout(() => guard(this.sink, this.name, () => this.flushInput()), INPUT_IDLE_MS);\n }\n\n private flushInput(): void {\n if (this.inputTimer) clearTimeout(this.inputTimer);\n this.inputTimer = undefined;\n const p = this.pendingInput;\n this.pendingInput = undefined;\n if (!p || !p.el.isConnected) return;\n const el = p.el as HTMLInputElement | HTMLTextAreaElement;\n const value = el.value ?? \"\";\n const payload: Record<string, unknown> = { inputType: p.inputType, length: value.length, typingMs: Date.now() - p.startedAt, fieldType: el instanceof HTMLInputElement ? el.type : \"textarea\" };\n const policy = this.sink.config.privacy;\n const allowed = policy.allowedInputSelectors.join(\",\");\n const isPassword = el instanceof HTMLInputElement && el.type === \"password\";\n const listed = Boolean(allowed) && safe(() => el.matches(allowed));\n if (policy.captureSensitiveValues || (!isPassword && (!policy.maskSensitiveInputs || listed))) {\n payload.value = policy.captureSensitiveValues ? value : this.sink.sanitizer.scrubString(value);\n payload.valueCaptured = true;\n } else {\n payload.valueCaptured = false;\n payload.valueRef = this.sink.sanitizer.redactedRef(value, this.salt);\n }\n this.emit({ type: \"input\", payload }, el);\n }\n\n private onChange(e: Event): void {\n const el = this.target(e);\n if (!el) return;\n if (el instanceof HTMLInputElement && (el.type === \"checkbox\" || el.type === \"radio\")) {\n this.flushInput();\n const capture = this.sink.config.privacy.captureChoiceValues;\n this.emit({ type: \"check\", payload: { checked: el.checked, inputType: el.type, value: capture ? el.value : undefined } }, el);\n } else if (el instanceof HTMLSelectElement) {\n this.flushInput();\n const capture = this.sink.config.privacy.captureChoiceValues;\n const opts = Array.from(el.selectedOptions);\n this.emit(\n { type: \"select\", payload: capture ? { values: opts.map((o) => o.value), labels: opts.map((o) => o.label), multiple: el.multiple } : { count: opts.length, multiple: el.multiple } },\n el,\n );\n } else if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n this.flushInput();\n }\n }\n\n private onKey(e: KeyboardEvent): void {\n const el = this.target(e) ?? document.body;\n if (!el) return;\n const modified = e.ctrlKey || e.metaKey || e.altKey;\n const isModifier = MODIFIERS.has(e.key);\n const relevant = KEYS.has(e.key) || isModifier || /^F\\d{1,2}$/.test(e.key) || (modified && e.key.length === 1);\n if (!relevant || (isModifier && e.repeat)) return;\n if (e.key === \"Enter\" || e.key === \"Tab\") this.flushInput();\n // A própria tecla Control já é o evento. Não entra de novo como modificador, senão vira Control+Control.\n const modifiers = mods(e).filter((name) => name !== e.key);\n this.emit({ type: \"keydown\", payload: { key: e.key, code: e.code, modifiers, repeat: e.repeat } }, el);\n }\n\n private onFocus(type: \"focus\" | \"blur\", e: FocusEvent): void {\n const el = this.target(e);\n if (!el || el === document.body || el === document.documentElement) return;\n if (type === \"blur\") this.flushInput();\n this.emit({ type }, el);\n }\n\n private onScroll(e: Event): void {\n const t = e.target;\n const isDoc = t === document || t === document.documentElement || t === document.body;\n const el = isDoc ? null : t instanceof Element ? t : null;\n if (!isDoc && (!el || this.target(e) === null)) return;\n const pos = () => (isDoc ? { x: Math.round(window.scrollX), y: Math.round(window.scrollY) } : { x: Math.round(el!.scrollLeft), y: Math.round(el!.scrollTop) });\n const key = (isDoc ? document : t) as EventTarget;\n let st = this.scrollState.get(key);\n if (!st) {\n const start = pos();\n st = {\n ...start,\n flush: debounce(() => {\n const s = this.scrollState.get(key);\n if (!s) return;\n this.scrollState.delete(key);\n const end = pos();\n if (end.x === s.x && end.y === s.y) return;\n guard(this.sink, this.name, () => this.emit({ type: \"scroll\", payload: { from: { x: s.x, y: s.y }, to: end, target: isDoc ? \"window\" : \"element\" } }, el));\n }, 200),\n };\n this.scrollState.set(key, st);\n }\n st.flush();\n }\n\n private onOver(e: MouseEvent): void {\n const el = this.target(e);\n const hit = el?.closest(INTERACTIVE) as Element | null;\n if (!hit || this.hover?.el === hit) return;\n this.endHover();\n const h = { el: hit, entered: false } as NonNullable<ActionRecorder[\"hover\"]>;\n h.timer = setTimeout(() => {\n h.entered = true;\n guard(this.sink, this.name, () => this.emit({ type: \"hover\", payload: { phase: \"enter\" } }, hit, { x: e.clientX, y: e.clientY }));\n }, 200);\n this.hover = h;\n }\n\n private onOut(e: MouseEvent): void {\n const h = this.hover;\n if (!h) return;\n const to = e.relatedTarget as Node | null;\n if (to && h.el.contains(to)) return;\n this.endHover();\n }\n\n private endHover(): void {\n const h = this.hover;\n if (!h) return;\n if (h.timer) clearTimeout(h.timer);\n this.hover = undefined;\n if (h.entered) this.emit({ type: \"hover\", payload: { phase: \"leave\" } }, h.el);\n }\n\n private onDown(e: MouseEvent): void {\n const el = this.target(e);\n if (!el || e.button !== 0) return;\n this.drag = { el, x: e.clientX, y: e.clientY, t: Date.now(), points: [{ x: e.clientX, y: e.clientY, t: 0 }], html5: false };\n }\n\n private onUp(e: MouseEvent): void {\n const d = this.drag;\n this.drag = undefined;\n if (!d) return;\n const dist = Math.hypot(e.clientX - d.x, e.clientY - d.y);\n if (dist < DRAG_MIN_PX) return;\n const dropEl = safe(() => document.elementFromPoint(e.clientX, e.clientY));\n const traj = d.points.length > 50 ? d.points.filter((_, i) => i % Math.ceil(d.points.length / 50) === 0) : d.points;\n const to = dropEl && !(dropEl === d.el) ? this.gen.generate(dropEl) : undefined;\n this.emit(\n {\n type: \"drag\",\n payload: {\n from: { x: Math.round(d.x), y: Math.round(d.y) },\n to: { x: Math.round(e.clientX), y: Math.round(e.clientY) },\n trajectory: traj,\n durationMs: Date.now() - d.t,\n html5: d.html5,\n target: to ? { selector: this.sink.sanitizer.scrubString(to.selector), unique: to.unique, element: dropEl ? this.gen.describe(dropEl) : undefined } : undefined,\n },\n },\n d.el,\n { x: d.x, y: d.y },\n );\n }\n\n private onMove(e: MouseEvent): void {\n const t = Date.now();\n if (this.drag) {\n const last = this.drag.points[this.drag.points.length - 1];\n if (t - this.drag.t - last.t >= 30) this.drag.points.push({ x: Math.round(e.clientX), y: Math.round(e.clientY), t: t - this.drag.t });\n }\n if (!this.sink.config.recording.mouseMove) return;\n const last = this.move[this.move.length - 1];\n if (last && t - last.t < this.sink.config.recording.throttleMs) return;\n this.move.push({ x: Math.round(e.clientX), y: Math.round(e.clientY), t });\n if (this.move.length >= 40) this.flushMove();\n else this.moveFlush?.(); // descarrega quando o mouse para\n }\n\n private flushMove(): void {\n if (!this.move.length) return;\n const points = this.move;\n this.move = [];\n this.emit({ type: \"mousemove\", payload: { points } }, null, { x: points[points.length - 1].x, y: points[points.length - 1].y });\n }\n}\n\nfunction mods(e: MouseEvent | KeyboardEvent): string[] {\n const m: string[] = [];\n if (e.ctrlKey) m.push(\"Control\");\n if (e.metaKey) m.push(\"Meta\");\n if (e.altKey) m.push(\"Alt\");\n if (e.shiftKey) m.push(\"Shift\");\n return m;\n}\n","import { SDK_VERSION, type ContextEventData } from \"../types/events\";\nimport { Disposer, debounce, safe } from \"../utils/misc\";\nimport { guard, type EventSink, type Recorder } from \"./types\";\n\nexport interface ContextIdentity {\n platformId: string;\n testCaseId: string;\n executionId: string;\n}\n\nexport function parseBrowser(ua: string): { name?: string; version?: string } {\n const rules: Array<[string, RegExp]> = [\n [\"Edge\", /Edg(?:e|A|iOS)?\\/([\\d.]+)/],\n [\"Opera\", /OPR\\/([\\d.]+)/],\n [\"Firefox\", /Firefox\\/([\\d.]+)/],\n [\"Chrome\", /(?:Chrome|CriOS)\\/([\\d.]+)/],\n [\"Safari\", /Version\\/([\\d.]+).*Safari/],\n ];\n for (const [name, re] of rules) {\n const m = ua.match(re);\n if (m) return { name, version: m[1] };\n }\n return {};\n}\n\nexport function collectContext(\n id: ContextIdentity,\n reason: ContextEventData[\"reason\"],\n appVersion?: string,\n captureSensitiveValues = false,\n): ContextEventData {\n const nav = navigator as Navigator & { userAgentData?: { platform?: string; brands?: Array<{ brand: string; version: string }> } };\n const ua = nav.userAgent ?? \"\";\n let browser = parseBrowser(ua);\n const brands = nav.userAgentData?.brands?.filter((b) => !/not.?a.?brand/i.test(b.brand));\n const preferred = brands?.find((b) => /chrom|edge|opera/i.test(b.brand)) ?? brands?.[0];\n if (preferred && !browser.name) browser = { name: preferred.brand, version: preferred.version };\n const navEntry = safe(() => performance.getEntriesByType(\"navigation\")[0] as PerformanceNavigationTiming | undefined);\n return {\n reason,\n url: location.href,\n referrer: document.referrer || undefined,\n title: document.title || undefined,\n navigationType: navEntry?.type,\n browser,\n os: nav.userAgentData?.platform ?? nav.platform,\n userAgent: ua,\n screen: { width: screen?.width ?? 0, height: screen?.height ?? 0 },\n viewport: { width: window.innerWidth, height: window.innerHeight },\n devicePixelRatio: window.devicePixelRatio ?? 1,\n language: nav.language,\n timezone: safe(() => Intl.DateTimeFormat().resolvedOptions().timeZone),\n online: nav.onLine,\n visibility: document.visibilityState,\n platformId: id.platformId,\n testCaseId: id.testCaseId,\n executionId: id.executionId,\n sdkVersion: SDK_VERSION,\n appVersion,\n captureSensitiveValues,\n };\n}\n\n/** Metadados de investigação. Sem fingerprinting: apenas dados já expostos e úteis ao QA. */\nexport class ContextRecorder implements Recorder {\n readonly name = \"context\";\n private d = new Disposer();\n\n constructor(\n private readonly sink: EventSink,\n private readonly identity: () => ContextIdentity,\n ) {}\n\n start(): void {\n this.record(\"page-load\");\n const onResize = debounce(() => this.record(\"viewport\"), 500);\n this.d.listen(window, \"resize\", onResize);\n this.d.listen(window, \"orientationchange\", onResize);\n this.d.add(() => onResize.cancel());\n }\n\n record(reason: ContextEventData[\"reason\"]): void {\n guard(this.sink, this.name, () => {\n const data = collectContext(this.identity(), reason, this.sink.config.appVersion, this.sink.config.privacy.captureSensitiveValues);\n data.url = this.sink.sanitizer.sanitizeUrl(data.url);\n if (data.referrer) data.referrer = this.sink.sanitizer.sanitizeUrl(data.referrer);\n this.sink.emit(\"context\", data, { priority: \"normal\" });\n });\n }\n\n stop(): void {\n this.d.dispose();\n }\n}\n","import type { ConsoleEventData, ErrorEventData } from \"../types/events\";\nimport { Disposer, safe } from \"../utils/misc\";\nimport { guard, type EventSink, type Recorder } from \"./types\";\n\ntype Level = ConsoleEventData[\"level\"];\nconst MAX_ARG_DEPTH = 3;\nconst MAX_STR = 2000;\n\nexport function serializeArg(v: unknown, depth = 0, seen = new WeakSet<object>()): unknown {\n if (v === null || v === undefined) return v;\n const t = typeof v;\n if (t === \"string\") return (v as string).length > MAX_STR ? `${(v as string).slice(0, MAX_STR)}…` : v;\n if (t === \"number\" || t === \"boolean\") return v;\n if (t === \"bigint\") return `${String(v)}n`;\n if (t === \"function\") return `[Function ${(v as Function).name || \"anonymous\"}]`;\n if (t === \"symbol\") return String(v);\n if (v instanceof Error) return { name: v.name, message: v.message, stack: v.stack };\n if (typeof Node !== \"undefined\" && v instanceof Node) return `[${(v as Node).nodeName}]`;\n if (depth >= MAX_ARG_DEPTH) return \"[Object]\";\n const obj = v as object;\n if (seen.has(obj)) return \"[Circular]\";\n seen.add(obj);\n if (Array.isArray(obj)) return obj.slice(0, 20).map((x) => serializeArg(x, depth + 1, seen));\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(obj).slice(0, 30)) out[k] = safe(() => serializeArg((obj as Record<string, unknown>)[k], depth + 1, seen));\n return out;\n}\n\nconst FRAME = /(?:at\\s+.*?\\(|at\\s+|@)(.+?):(\\d+):(\\d+)\\)?$/;\nexport function firstFrame(stack?: string): { file?: string; line?: number; column?: number } {\n if (!stack) return {};\n for (const line of stack.split(\"\\n\")) {\n const m = line.trim().match(FRAME);\n if (m && !/offscript/i.test(m[1])) return { file: m[1], line: Number(m[2]), column: Number(m[3]) };\n }\n return {};\n}\n\nconst originals = new Map<Level, { orig: (...a: unknown[]) => void; wrapped: (...a: unknown[]) => void }>();\n\n/** Console + erros globais. Nunca altera argumentos, nem suprime saída, nem lança. */\nexport class ErrorRecorder implements Recorder {\n readonly name = \"errors\";\n private d = new Disposer();\n private busy = false;\n\n constructor(private readonly sink: EventSink) {}\n\n start(): void {\n const { console: wantConsole, errors, consoleLevels } = this.sink.config.recording;\n if (wantConsole) for (const level of consoleLevels) this.wrapConsole(level);\n if (errors) {\n this.d.listen(\n window,\n \"error\",\n (e: ErrorEvent) => {\n // Erros de carregamento de recursos não têm `message`, mas chegam com target.\n const target = e.target as (HTMLElement & { src?: string; href?: string }) | null;\n if (target && target !== (window as unknown) && (target as HTMLElement).tagName) {\n this.report({ source: \"resource\", message: `Falha ao carregar <${target.tagName.toLowerCase()}>`, file: target.src || target.href });\n return;\n }\n const err = e.error as Error | undefined;\n const frame = err?.stack ? firstFrame(err.stack) : {};\n this.report({\n source: \"window.onerror\",\n message: e.message || String(err),\n name: err?.name,\n stack: err?.stack,\n file: e.filename || frame.file,\n line: e.lineno || frame.line,\n column: e.colno || frame.column,\n });\n },\n true,\n );\n this.d.listen(window, \"unhandledrejection\", (e: PromiseRejectionEvent) => {\n const r = e.reason as Error | unknown;\n const isErr = r instanceof Error;\n const stack = isErr ? r.stack : undefined;\n this.report({\n source: \"unhandledrejection\",\n message: isErr ? r.message : String(safe(() => JSON.stringify(r)) ?? r),\n name: isErr ? r.name : undefined,\n stack,\n ...firstFrame(stack),\n });\n });\n }\n }\n\n private report(partial: Omit<ErrorEventData, \"url\">): void {\n guard(this.sink, this.name, () => {\n const s = this.sink.sanitizer;\n this.sink.emit<ErrorEventData>(\n \"error\",\n {\n ...partial,\n message: s.scrubString(partial.message ?? \"\"),\n stack: partial.stack ? s.scrubString(partial.stack) : undefined,\n file: partial.file ? s.sanitizeUrl(partial.file) : undefined,\n url: s.sanitizeUrl(location.href),\n },\n { priority: \"critical\" },\n );\n });\n }\n\n private wrapConsole(level: Level): void {\n const current = console[level] as (...a: unknown[]) => void;\n if (!current || originals.has(level)) return;\n const self = this;\n const wrapped = function (this: unknown, ...args: unknown[]) {\n // Chama primeiro o original: o comportamento da aplicação nunca depende do SDK.\n const result = current.apply(this === undefined ? console : this, args);\n if (!self.busy) {\n self.busy = true; // evita recursão se o SDK ou rrweb escreverem no console\n try {\n self.captureConsole(level, args);\n } catch {\n /* silencioso */\n } finally {\n self.busy = false;\n }\n }\n return result;\n };\n originals.set(level, { orig: current, wrapped });\n console[level] = wrapped as typeof console.log;\n this.d.add(() => {\n const entry = originals.get(level);\n if (entry && console[level] === entry.wrapped) console[level] = entry.orig as typeof console.log;\n originals.delete(level);\n });\n }\n\n private captureConsole(level: Level, args: unknown[]): void {\n const s = this.sink.sanitizer;\n const serial = args.map((a) => s.sanitizeValue(serializeArg(a)));\n const message = serial.map((a) => (typeof a === \"string\" ? a : safe(() => JSON.stringify(a)) ?? String(a))).join(\" \");\n const stack = level === \"error\" || level === \"warn\" ? s.scrubString(new Error().stack?.split(\"\\n\").slice(3).join(\"\\n\") ?? \"\") : undefined;\n this.sink.emit<ConsoleEventData>(\n \"console\",\n { level, args: serial, message: message.slice(0, 4000), stack, url: s.sanitizeUrl(location.href) },\n { priority: level === \"error\" ? \"normal\" : \"low\" },\n );\n }\n\n stop(): void {\n this.d.dispose();\n }\n}\n","export function uid(prefix = \"\"): string {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (c?.randomUUID) return prefix + c.randomUUID();\n const bytes = new Uint8Array(16);\n if (c?.getRandomValues) c.getRandomValues(bytes);\n else for (let i = 0; i < 16; i++) bytes[i] = Math.floor(Math.random() * 256);\n return prefix + Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n","import type { CapturedBody, HttpEventData } from \"../types/events\";\nimport { ORIGINAL_FETCH } from \"../core/ApiClient\";\nimport { uid } from \"../utils/id\";\nimport { guard, type EventSink, type Recorder } from \"./types\";\n\ntype PatchedFetch = typeof fetch & { [ORIGINAL_FETCH]?: typeof fetch };\nconst XHR_PATCHED = \"__offscriptXhrOriginal\";\n\ninterface Ctx {\n requestId: string;\n transport: \"fetch\" | \"xhr\";\n url: string;\n method: string;\n startedAt: number;\n concurrent: number;\n requestHeaders?: Record<string, string>;\n requestBody?: CapturedBody;\n}\n\ninterface XhrMeta {\n method: string;\n url: string;\n headers: Record<string, string>;\n ctx?: Ctx;\n aborted?: boolean;\n timedOut?: boolean;\n}\n\n/**\n * Instrumentação de fetch e XMLHttpRequest. Não altera assinatura, retorno, headers, credenciais,\n * AbortController nem consome streams do usuário (usa clone/leitura limitada e apenas quando habilitado).\n */\nexport class HTTPRecorder implements Recorder {\n readonly name = \"http\";\n private inflight = 0;\n private active = false;\n private restore: Array<() => void> = [];\n\n constructor(\n private readonly sink: EventSink,\n private readonly ownApiUrl: string,\n ) {}\n\n start(): void {\n if (this.active) return;\n this.active = true;\n this.patchFetch();\n this.patchXhr();\n }\n\n stop(): void {\n this.active = false; // mesmo se outra lib envolver nosso wrapper, ele vira no-op\n for (const r of this.restore.splice(0).reverse()) {\n try {\n r();\n } catch {\n /* nada */\n }\n }\n }\n\n private isIgnored(url: string): boolean {\n if (this.ownApiUrl && url.startsWith(this.ownApiUrl)) return true;\n return this.sink.sanitizer.isIgnoredUrl(url);\n }\n\n // ---------------------------------------------------------------- fetch\n private patchFetch(): void {\n if (typeof globalThis.fetch !== \"function\") return;\n const orig = globalThis.fetch as PatchedFetch;\n const self = this;\n const patched = function (this: unknown, input: RequestInfo | URL, init?: RequestInit) {\n let ctx: Ctx | null = null;\n if (self.active) {\n try {\n ctx = self.beginFetch(input, init);\n } catch {\n ctx = null;\n }\n }\n let p: Promise<Response>;\n try {\n p = orig.apply(this, arguments as unknown as [RequestInfo | URL, RequestInit?]);\n } catch (e) {\n if (ctx) self.inflight--;\n throw e;\n }\n if (ctx) {\n const c = ctx;\n // Ramo lateral: nunca rejeita e não altera a promise devolvida ao chamador.\n p.then(\n (res) => self.endFetch(c, res),\n (err) => self.failFetch(c, err),\n ).catch(() => undefined);\n }\n return p;\n } as PatchedFetch;\n patched[ORIGINAL_FETCH] = orig[ORIGINAL_FETCH] ?? orig;\n globalThis.fetch = patched;\n this.restore.push(() => {\n if (globalThis.fetch === patched) globalThis.fetch = orig;\n });\n }\n\n private beginFetch(input: RequestInfo | URL, init?: RequestInit): Ctx | null {\n const rawUrl = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url;\n const abs = new URL(rawUrl, location.href).href;\n if (this.isIgnored(abs)) return null;\n const isReq = typeof Request !== \"undefined\" && input instanceof Request;\n const method = (init?.method ?? (isReq ? input.method : \"GET\")).toUpperCase();\n const ctx: Ctx = { requestId: uid(\"req_\"), transport: \"fetch\", url: abs, method, startedAt: Date.now(), concurrent: this.inflight };\n const s = this.sink.sanitizer;\n const hdrs: Record<string, string> = {};\n new Headers(init?.headers ?? (isReq ? input.headers : undefined)).forEach((v, k) => (hdrs[k] = v));\n ctx.requestHeaders = s.sanitizeHeaders(hdrs);\n if (this.sink.config.privacy.captureRequestBodies) {\n const ct = hdrs[\"content-type\"] ?? \"\";\n if (init?.body != null) ctx.requestBody = this.describeBody(init.body, ct);\n else ctx.requestBody = { kind: \"omitted\", reason: isReq ? \"request-object\" : \"no-body\" };\n }\n this.inflight++;\n return ctx;\n }\n\n private endFetch(ctx: Ctx, res: Response): void {\n this.inflight = Math.max(0, this.inflight - 1);\n guard(this.sink, this.name, () => {\n const endedAt = Date.now();\n const headers: Record<string, string> = {};\n res.headers.forEach((v, k) => (headers[k] = v));\n const base = this.base(ctx, endedAt);\n base.status = res.status;\n base.statusText = res.statusText;\n base.responseHeaders = this.sink.sanitizer.sanitizeHeaders(headers);\n const ct = headers[\"content-type\"] ?? \"\";\n if (!this.sink.config.privacy.captureResponseBodies) return void this.emit(base);\n if (!this.sink.sanitizer.isTextual(ct) || /event-stream/i.test(ct) || !res.body) {\n base.responseBody = { kind: \"omitted\", reason: !res.body ? \"no-body\" : /event-stream/i.test(ct) ? \"stream\" : \"binary\" };\n return void this.emit(base);\n }\n // Leitura limitada de um clone; o corpo original permanece intacto para a aplicação.\n let clone: Response;\n try {\n clone = res.clone();\n } catch {\n base.responseBody = { kind: \"omitted\", reason: \"body-used\" };\n return void this.emit(base);\n }\n this.readBounded(clone)\n .then(({ text, size, truncated }) => {\n const b = this.sink.sanitizer.sanitizeTextBody(text, ct, size);\n b.truncated = truncated || b.truncated;\n base.responseBody = b;\n })\n .catch(() => {\n base.responseBody = { kind: \"omitted\", reason: \"read-failed\" };\n })\n .finally(() => guard(this.sink, this.name, () => this.emit(base)));\n });\n }\n\n private async readBounded(res: Response): Promise<{ text: string; size: number; truncated: boolean }> {\n const max = this.sink.config.privacy.maxBodyBytes;\n const reader = res.body!.getReader();\n const dec = new TextDecoder();\n let text = \"\";\n let size = 0;\n let truncated = false;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (text.length < max) text += dec.decode(value, { stream: true });\n if (size > max * 4) {\n truncated = true;\n await reader.cancel().catch(() => undefined); // cancela só o ramo clonado\n break;\n }\n }\n if (text.length > max) {\n text = text.slice(0, max);\n truncated = true;\n }\n return { text, size, truncated };\n }\n\n private failFetch(ctx: Ctx, err: unknown): void {\n this.inflight = Math.max(0, this.inflight - 1);\n guard(this.sink, this.name, () => {\n const e = err as Error;\n const base = this.base(ctx, Date.now());\n base.aborted = e?.name === \"AbortError\";\n base.error = { name: e?.name ?? \"Error\", message: this.sink.sanitizer.scrubString(String(e?.message ?? e)) };\n this.emit(base);\n });\n }\n\n // ---------------------------------------------------------------- XHR\n private patchXhr(): void {\n if (typeof XMLHttpRequest === \"undefined\") return;\n const proto = XMLHttpRequest.prototype;\n const self = this;\n const metas = new WeakMap<XMLHttpRequest, XhrMeta>();\n const origOpen = proto.open;\n const origSend = proto.send;\n const origSet = proto.setRequestHeader;\n\n const open = function (this: XMLHttpRequest, ...args: unknown[]) {\n try {\n if (self.active) metas.set(this, { method: String(args[0]).toUpperCase(), url: String(args[1]), headers: {} });\n } catch {\n /* nada */\n }\n return (origOpen as (...a: unknown[]) => void).apply(this, args);\n } as typeof proto.open;\n const setHeader = function (this: XMLHttpRequest, name: string, value: string) {\n try {\n const m = metas.get(this);\n if (m) m.headers[name.toLowerCase()] = value;\n } catch {\n /* nada */\n }\n return origSet.call(this, name, value);\n };\n const send = function (this: XMLHttpRequest, body?: Document | XMLHttpRequestBodyInit | null) {\n try {\n const m = metas.get(this);\n if (m && self.active) self.beginXhr(this, m, body);\n } catch {\n /* nada */\n }\n return origSend.call(this, body);\n };\n (open as unknown as Record<string, unknown>)[XHR_PATCHED] = origOpen;\n proto.open = open;\n proto.setRequestHeader = setHeader;\n proto.send = send;\n this.restore.push(() => {\n if (proto.open === open) proto.open = origOpen;\n if (proto.setRequestHeader === setHeader) proto.setRequestHeader = origSet;\n if (proto.send === send) proto.send = origSend;\n });\n }\n\n private beginXhr(xhr: XMLHttpRequest, m: XhrMeta, body?: Document | XMLHttpRequestBodyInit | null): void {\n const abs = new URL(m.url, location.href).href;\n if (this.isIgnored(abs)) return;\n const ctx: Ctx = { requestId: uid(\"req_\"), transport: \"xhr\", url: abs, method: m.method, startedAt: Date.now(), concurrent: this.inflight };\n ctx.requestHeaders = this.sink.sanitizer.sanitizeHeaders(m.headers);\n if (this.sink.config.privacy.captureRequestBodies) {\n ctx.requestBody = body == null ? { kind: \"omitted\", reason: \"no-body\" } : this.describeBody(body as BodyInit, m.headers[\"content-type\"] ?? \"\");\n }\n m.ctx = ctx;\n this.inflight++;\n xhr.addEventListener(\"abort\", () => (m.aborted = true));\n xhr.addEventListener(\"timeout\", () => (m.timedOut = true));\n xhr.addEventListener(\"loadend\", () => {\n this.inflight = Math.max(0, this.inflight - 1);\n guard(this.sink, this.name, () => this.endXhr(xhr, m, ctx));\n });\n }\n\n private endXhr(xhr: XMLHttpRequest, m: XhrMeta, ctx: Ctx): void {\n const base = this.base(ctx, Date.now());\n const failed = xhr.status === 0;\n if (!failed) {\n base.status = xhr.status;\n base.statusText = xhr.statusText;\n }\n const headers: Record<string, string> = {};\n xhr.getAllResponseHeaders().trim().split(/\\r?\\n/).forEach((line) => {\n const i = line.indexOf(\":\");\n if (i > 0) headers[line.slice(0, i).trim().toLowerCase()] = line.slice(i + 1).trim();\n });\n base.responseHeaders = this.sink.sanitizer.sanitizeHeaders(headers);\n if (m.aborted) base.aborted = true;\n if (failed) base.error = { name: m.aborted ? \"AbortError\" : m.timedOut ? \"TimeoutError\" : \"NetworkError\", message: m.aborted ? \"aborted\" : m.timedOut ? \"timeout\" : \"network error\" };\n if (!failed && this.sink.config.privacy.captureResponseBodies) {\n const ct = headers[\"content-type\"] ?? \"\";\n if (this.sink.sanitizer.isTextual(ct) && (xhr.responseType === \"\" || xhr.responseType === \"text\")) base.responseBody = this.sink.sanitizer.sanitizeTextBody(xhr.responseText, ct);\n else if (xhr.responseType === \"json\") base.responseBody = this.sink.sanitizer.sanitizeTextBody(JSON.stringify(xhr.response ?? null), \"application/json\");\n else base.responseBody = { kind: \"omitted\", reason: \"binary\" };\n }\n this.emit(base);\n }\n\n // ---------------------------------------------------------------- comum\n private base(ctx: Ctx, endedAt: number): HttpEventData {\n const s = this.sink.sanitizer;\n return {\n requestId: ctx.requestId,\n transport: ctx.transport,\n url: s.sanitizeUrl(ctx.url),\n method: ctx.method,\n query: s.parseQuery(ctx.url),\n requestHeaders: ctx.requestHeaders,\n requestBody: ctx.requestBody,\n startedAt: ctx.startedAt,\n endedAt,\n durationMs: endedAt - ctx.startedAt,\n concurrent: ctx.concurrent,\n };\n }\n\n private emit(data: HttpEventData): void {\n // Timestamp = início da requisição, para correlação temporal com a ação que a originou.\n this.sink.emit(\"http\", data, { priority: \"normal\", at: data.startedAt });\n }\n\n private describeBody(body: unknown, contentType: string): CapturedBody {\n const s = this.sink.sanitizer;\n const max = this.sink.config.privacy.maxBodyBytes;\n if (typeof body === \"string\") return s.sanitizeTextBody(body, contentType || \"text/plain\", body.length);\n if (typeof URLSearchParams !== \"undefined\" && body instanceof URLSearchParams) return s.sanitizeTextBody(body.toString(), \"application/x-www-form-urlencoded\");\n if (typeof FormData !== \"undefined\" && body instanceof FormData) {\n const form: Record<string, unknown> = {};\n body.forEach((v, k) => {\n form[k] = s.isSensitiveKey(k) ? \"[REDACTED]\" : typeof v === \"string\" ? s.scrubString(v.slice(0, max)) : `[File ${(v as File).name}, ${(v as File).size}B]`;\n });\n return { kind: \"form\", value: form };\n }\n if (typeof Blob !== \"undefined\" && body instanceof Blob) return { kind: \"binary\", size: body.size, reason: \"blob\" };\n if (body instanceof ArrayBuffer || ArrayBuffer.isView(body)) return { kind: \"binary\", size: (body as ArrayBuffer).byteLength };\n return { kind: \"omitted\", reason: \"unsupported-body\" };\n }\n}\n","import type { IframeEventData } from \"../types/events\";\nimport { Disposer, debounce, safe } from \"../utils/misc\";\nimport { guard, type EventSink, type Recorder } from \"./types\";\n\nconst SEATSIO = /(^|\\.)seatsio\\.net$|(^|\\.)seats\\.io$/i;\nconst LIMITATION =\n \"Conteúdo interno de iframes cross-origin não é acessível ao SDK nem ao rrweb; apenas presença, geometria, foco e interações observáveis na página principal são registrados.\";\n\n/**\n * Detecta iframes (ex.: seats.io) e registra metadados observáveis.\n * Nunca tenta acessar o DOM interno do iframe.\n */\nexport class IframeRecorder implements Recorder {\n readonly name = \"iframes\";\n private d = new Disposer();\n private known = new WeakMap<HTMLIFrameElement, number>();\n private counter = 0;\n private mo?: MutationObserver;\n\n constructor(private readonly sink: EventSink) {}\n\n start(): void {\n document.querySelectorAll(\"iframe\").forEach((f) => this.add(f));\n this.mo = new MutationObserver((records) =>\n guard(this.sink, this.name, () => {\n for (const r of records) {\n r.addedNodes.forEach((n) => this.scan(n, true));\n r.removedNodes.forEach((n) => this.scan(n, false));\n }\n }),\n );\n this.mo.observe(document.documentElement, { childList: true, subtree: true });\n this.d.add(() => this.mo?.disconnect());\n\n // Foco que entra em iframe: document.activeElement passa a ser o <iframe> e a janela perde foco.\n let focused: HTMLIFrameElement | null = null;\n this.d.listen(window, \"blur\", () =>\n setTimeout(() => {\n guard(this.sink, this.name, () => {\n const a = document.activeElement;\n if (a instanceof HTMLIFrameElement) {\n focused = a;\n this.event(\"focus\", a);\n }\n });\n }, 0),\n );\n this.d.listen(window, \"focus\", () =>\n guard(this.sink, this.name, () => {\n if (focused) {\n this.event(\"blur\", focused);\n focused = null;\n }\n }),\n );\n const onResize = debounce(() => document.querySelectorAll(\"iframe\").forEach((f) => this.known.has(f) && this.event(\"resized\", f)), 500);\n this.d.listen(window, \"resize\", onResize);\n this.d.add(() => onResize.cancel());\n }\n\n private scan(n: Node, added: boolean): void {\n if (!(n instanceof Element)) return;\n const frames = n instanceof HTMLIFrameElement ? [n] : Array.from(n.querySelectorAll(\"iframe\"));\n for (const f of frames) {\n if (added) this.add(f);\n else if (this.known.has(f)) this.event(\"removed\", f);\n }\n }\n\n private add(f: HTMLIFrameElement): void {\n if (this.known.has(f)) return;\n this.known.set(f, ++this.counter);\n this.event(\"present\", f);\n // src pode ser definido depois (componentes dinâmicos)\n f.addEventListener(\"load\", () => guard(this.sink, this.name, () => this.event(\"resized\", f)), { once: true });\n }\n\n private event(phase: IframeEventData[\"phase\"], f: HTMLIFrameElement): void {\n const src = f.getAttribute(\"src\") ?? \"\";\n let origin: string | undefined;\n let path: string | undefined;\n let host = \"\";\n try {\n const u = new URL(src, location.href);\n origin = u.origin;\n path = u.pathname; // query/hash descartados: podem carregar tokens\n host = u.hostname;\n } catch {\n /* src vazio / about:blank */\n }\n const crossOrigin = origin !== undefined && origin !== location.origin && origin !== \"null\";\n const r = safe(() => f.getBoundingClientRect());\n const idx = this.known.get(f) ?? 0;\n this.sink.emit<IframeEventData>(\n \"iframe\",\n {\n phase,\n provider: SEATSIO.test(host) ? \"seatsio\" : \"unknown\",\n origin,\n path,\n crossOrigin,\n rect: { x: Math.round(r?.x ?? 0), y: Math.round(r?.y ?? 0), width: Math.round(r?.width ?? 0), height: Math.round(r?.height ?? 0) },\n index: idx,\n limitation: crossOrigin ? LIMITATION : \"same-origin\",\n },\n { priority: \"normal\" },\n );\n }\n\n stop(): void {\n this.d.dispose();\n }\n}\n","import type { Priority } from \"../types/config\";\nimport { safe } from \"../utils/misc\";\nimport { guard, type EventSink, type Recorder } from \"./types\";\n\ntype RRWebModule = typeof import(\"rrweb\");\ntype RRWebEvent = { type: number; data?: any; timestamp: number };\n\n/** Tipos de evento rrweb: 0 DomContentLoaded, 1 Load, 2 FullSnapshot, 3 Incremental, 4 Meta, 5 Custom, 6 Plugin. */\nconst PRIORITY: Record<number, Priority> = { 2: \"critical\", 4: \"critical\", 5: \"critical\", 0: \"normal\", 1: \"normal\", 3: \"normal\", 6: \"normal\" };\n// IncrementalSource: 1 MouseMove, 6 TouchMove, 12 Drag, 3 Scroll\nconst URL_ATTRS = [\"src\", \"href\", \"action\", \"poster\", \"data-src\", \"data\", \"formaction\", \"srcset\", \"cite\", \"rr_src\"];\nconst LOW_SOURCES = new Set([1, 6, 12, 3]);\n\n/**\n * Captura visual (DOM + mutações + interações) usando rrweb. Carregado sob demanda.\n * Não produz ações semânticas: isso é responsabilidade do ActionRecorder.\n */\nexport class RRWebRecorder implements Recorder {\n readonly name = \"rrweb\";\n private stopFn?: () => void;\n private mod?: RRWebModule;\n private paused = false;\n private stopped = true;\n needsSnapshot = false;\n private snapshotsTaken = 0;\n\n constructor(private readonly sink: EventSink) {}\n\n async start(): Promise<void> {\n this.stopped = false;\n const { recording, privacy } = this.sink.config;\n const mod = (this.mod ??= (await import(\"rrweb\")) as RRWebModule);\n if (this.stopped) return;\n const allowed = privacy.allowedInputSelectors.join(\",\");\n const block = privacy.blockSelectors.join(\",\");\n const maskText = privacy.maskAllText ? \"*\" : privacy.maskTextSelectors.join(\",\");\n const options: Record<string, unknown> = {\n emit: (event: RRWebEvent) => this.onEvent(event),\n blockSelector: block || undefined,\n maskTextSelector: maskText || undefined,\n maskAllInputs: privacy.maskSensitiveInputs && !privacy.captureSensitiveValues,\n maskInputOptions: privacy.captureSensitiveValues\n ? { password: false }\n : privacy.maskSensitiveInputs\n ? { password: true, email: true, tel: true, text: true, textarea: true, search: true, url: true, number: true, select: true, date: true, \"datetime-local\": true, month: true, time: true, week: true }\n : { password: true },\n maskInputFn: (text: string, el: HTMLElement) => {\n if (privacy.captureSensitiveValues) return text;\n // Senhas nunca são liberadas, mesmo que o elemento esteja na allowlist.\n if ((el as HTMLInputElement)?.type === \"password\") return \"*\".repeat(text.length);\n if (allowed && safe(() => el.matches(allowed))) return text;\n return \"*\".repeat(text.length);\n },\n recordCanvas: recording.rrwebRecordCanvas,\n collectFonts: false,\n inlineStylesheet: true,\n sampling: { mousemove: Math.max(50, recording.throttleMs), scroll: 150, input: \"last\", media: 800 },\n slimDOMOptions: { script: true, comment: true, headFavicon: true, headWhitespace: true },\n checkoutEveryNms: recording.rrwebCheckoutEveryMs > 0 ? recording.rrwebCheckoutEveryMs : undefined,\n errorHandler: () => true, // erros internos do rrweb não propagam\n };\n this.stopFn = (mod.record as unknown as (o: Record<string, unknown>) => (() => void) | undefined)(options) ?? undefined;\n }\n\n private onEvent(event: RRWebEvent): void {\n if (this.paused) return;\n guard(this.sink, this.name, () => {\n this.sanitizeEvent(event);\n let priority = PRIORITY[event.type] ?? \"normal\";\n if (event.type === 3 && LOW_SOURCES.has(event.data?.source)) priority = \"low\";\n if (event.type === 2) this.snapshotsTaken++;\n const emitted = this.sink.emit(\"rrweb\", event, { priority, at: event.timestamp });\n // Se descartamos eventos incrementais, o replay perde consistência: força novo snapshot.\n if (!emitted && event.type === 3) this.needsSnapshot = true;\n });\n }\n\n /** Sanitiza URLs em atributos e padrões sensíveis em textos ANTES de persistir/enviar. */\n private sanitizeEvent(event: RRWebEvent): void {\n const s = this.sink.sanitizer;\n const clean = (k: string, v: string) =>\n k === \"srcset\" ? v.split(\",\").map((part) => { const [u, ...rest] = part.trim().split(/\\s+/); return [s.redactUrlAttribute(u), ...rest].join(\" \"); }).join(\", \") : s.redactUrlAttribute(v);\n const node = (n: any): void => {\n if (!n || typeof n !== \"object\") return;\n if (n.type === 2 && n.attributes) {\n for (const k of URL_ATTRS) if (typeof n.attributes[k] === \"string\") n.attributes[k] = clean(k, n.attributes[k]);\n } else if (n.type === 3 && typeof n.textContent === \"string\") {\n n.textContent = s.scrubString(n.textContent);\n }\n if (Array.isArray(n.childNodes)) for (const c of n.childNodes) node(c);\n };\n if (event.type === 4 && event.data?.href) event.data.href = s.sanitizeUrl(event.data.href);\n else if (event.type === 2) node(event.data?.node);\n else if (event.type === 3 && event.data?.source === 0) {\n for (const a of event.data.adds ?? []) node(a.node);\n for (const t of event.data.texts ?? []) if (typeof t.value === \"string\") t.value = s.scrubString(t.value);\n for (const a of event.data.attributes ?? []) {\n for (const k of URL_ATTRS) if (typeof a.attributes?.[k] === \"string\") a.attributes[k] = clean(k, a.attributes[k]);\n }\n }\n }\n\n /** Chamado pelo núcleo quando há folga novamente após descartes. */\n recoverIfNeeded(): void {\n if (this.needsSnapshot && !this.paused) {\n this.needsSnapshot = false;\n this.takeFullSnapshot();\n }\n }\n\n takeFullSnapshot(): void {\n if (this.stopped) return;\n guard(this.sink, this.name, () => this.mod?.record.takeFullSnapshot(true));\n }\n\n addCustomEvent(tag: string, payload: unknown): void {\n if (this.stopped) return;\n guard(this.sink, this.name, () => this.mod?.record.addCustomEvent(tag, payload));\n }\n\n get snapshots(): number {\n return this.snapshotsTaken;\n }\n\n pause(): void {\n this.paused = true;\n }\n\n /** Ao retomar, as mutações perdidas durante a pausa exigem um snapshot completo. */\n resume(): void {\n this.paused = false;\n this.takeFullSnapshot();\n }\n\n stop(): void {\n this.stopped = true;\n safe(() => this.stopFn?.());\n this.stopFn = undefined;\n }\n}\n","import { Disposer, safe } from \"../utils/misc\";\n\nexport type NavigationKind = \"pushState\" | \"replaceState\" | \"popstate\" | \"hashchange\";\n\nexport interface LifecycleHandlers {\n onPageHide(): void;\n onVisibility(hidden: boolean): void;\n onConnectivity(online: boolean): void;\n onNavigation(info: { from: string; to: string; kind: NavigationKind }): void;\n}\n\nconst PATCHED = \"__offscriptHistoryPatched\";\n\n/**\n * Eventos de ciclo de vida da página e instrumentação controlada da History API\n * (SPA: Vue Router, Inertia, React Router, etc.).\n */\nexport class LifecycleManager {\n private d = new Disposer();\n private lastUrl = \"\";\n private installed = false;\n\n constructor(private readonly h: LifecycleHandlers) {}\n\n install(): void {\n if (this.installed || typeof window === \"undefined\") return;\n this.installed = true;\n this.lastUrl = location.href;\n const d = this.d;\n // pagehide é o evento confiável (inclusive bfcache); beforeunload como reforço.\n d.listen(window, \"pagehide\", () => safe(() => this.h.onPageHide()), { capture: true });\n d.listen(window, \"beforeunload\", () => safe(() => this.h.onPageHide()), { capture: true });\n d.listen(document, \"visibilitychange\", () => {\n const hidden = document.visibilityState === \"hidden\";\n safe(() => this.h.onVisibility(hidden));\n if (hidden) safe(() => this.h.onPageHide());\n });\n d.listen(window, \"online\", () => safe(() => this.h.onConnectivity(true)));\n d.listen(window, \"offline\", () => safe(() => this.h.onConnectivity(false)));\n d.listen(window, \"popstate\", () => this.notify(\"popstate\"));\n d.listen(window, \"hashchange\", () => this.notify(\"hashchange\"));\n this.patchHistory(\"pushState\");\n this.patchHistory(\"replaceState\");\n }\n\n private notify(kind: NavigationKind): void {\n const to = location.href;\n if (to === this.lastUrl) return;\n const from = this.lastUrl;\n this.lastUrl = to;\n safe(() => this.h.onNavigation({ from, to, kind }));\n }\n\n private patchHistory(method: \"pushState\" | \"replaceState\"): void {\n const original = history[method] as History[\"pushState\"] & { [PATCHED]?: unknown };\n if (original[PATCHED]) return;\n const self = this;\n const patched = function (this: History, ...args: Parameters<History[\"pushState\"]>) {\n const result = original.apply(this, args);\n self.notify(method);\n return result;\n } as History[\"pushState\"] & { [PATCHED]?: unknown };\n patched[PATCHED] = original;\n history[method] = patched;\n this.d.add(() => {\n if (history[method] === patched) history[method] = original;\n });\n }\n\n uninstall(): void {\n this.d.dispose();\n this.installed = false;\n }\n}\n","import type { ResolvedConfig } from \"../types/config\";\nimport { SDK_VERSION } from \"../types/events\";\nimport type {\n CreateSessionResponse,\n HeartbeatResponse,\n PersistedSessionState,\n SessionInfo,\n StartRecordingOptions,\n} from \"../types/session\";\nimport { uid } from \"../utils/id\";\nimport { safe } from \"../utils/misc\";\nimport { ApiClient } from \"./ApiClient\";\nimport { AuthError, InvalidStateError, SessionDisabledError, SessionExpiredError } from \"../utils/errors\";\n\nconst STATE_VERSION = 1;\n\n/**\n * Identidade da sessão, persistência por aba (sessionStorage), sequência e heartbeat.\n *\n * Política multi-aba: cada aba grava de forma independente na MESMA sessão/execução, com `tabId`\n * próprio e sequência própria. A ordem canônica é (tabId, sequence); entre abas usa-se o timestamp.\n * Abas clonadas (window.open copia o sessionStorage) recebem um novo tabId via Web Locks quando disponível.\n */\nexport class SessionManager {\n private state: PersistedSessionState | null = null;\n private info: SessionInfo | null = null;\n private seq = 0;\n private heartbeatTimer?: ReturnType<typeof setInterval>;\n private token = \"\";\n private readonly storageKey: string;\n private readonly seqKey: string;\n readonly api: ApiClient;\n disabledReason?: string;\n\n constructor(private readonly cfg: ResolvedConfig) {\n this.storageKey = `${cfg.storagePrefix}:state:${cfg.platformId}`;\n this.seqKey = `${cfg.storagePrefix}:seq:${cfg.platformId}`;\n this.api = new ApiClient(cfg.apiUrl, () => this.token, cfg.transport.requestTimeoutMs);\n }\n\n get session(): SessionInfo | null {\n return this.info;\n }\n get tabId(): string | undefined {\n return this.info?.tabId;\n }\n get currentToken(): string {\n return this.token;\n }\n\n hasTokenAvailable(): boolean {\n return Boolean(this.token || readQueryToken());\n }\n\n // ---- persistência -------------------------------------------------------\n loadPersisted(): PersistedSessionState | null {\n const raw = safe(() => sessionStorage.getItem(this.storageKey));\n if (!raw) return null;\n try {\n const s = JSON.parse(raw) as PersistedSessionState;\n if (s.version !== STATE_VERSION || s.platformId !== this.cfg.platformId || !s.sessionId || !s.sessionToken) return null;\n if (s.expiresAt && s.expiresAt < Date.now()) return null;\n const seq = Number(safe(() => sessionStorage.getItem(this.seqKey)) ?? 0);\n s.sequence = Math.max(s.sequence ?? 0, Number.isFinite(seq) ? seq : 0);\n return s;\n } catch {\n return null;\n }\n }\n\n private persist(status: \"recording\" | \"paused\", extra: Partial<PersistedSessionState> = {}): void {\n if (!this.info) return;\n this.state = {\n version: STATE_VERSION,\n tabId: this.info.tabId,\n sessionId: this.info.sessionId,\n executionId: this.info.executionId,\n testCaseId: this.info.testCaseId,\n platformId: this.cfg.platformId,\n sessionToken: this.token,\n status,\n sequence: this.seq,\n pageCount: this.state?.pageCount ?? 0,\n heartbeatIntervalMs: this.state?.heartbeatIntervalMs,\n expiresAt: this.state?.expiresAt,\n updatedAt: Date.now(),\n ...extra,\n };\n safe(() => sessionStorage.setItem(this.storageKey, JSON.stringify(this.state)));\n }\n\n setStatus(status: \"recording\" | \"paused\"): void {\n this.persist(status);\n }\n\n clearPersisted(): void {\n safe(() => sessionStorage.removeItem(this.storageKey));\n safe(() => sessionStorage.removeItem(this.seqKey));\n this.state = null;\n }\n\n // ---- sequência ----------------------------------------------------------\n nextSequence(): number {\n this.seq++;\n safe(() => sessionStorage.setItem(this.seqKey, String(this.seq)));\n return this.seq;\n }\n\n get lastSequence(): number {\n return this.seq;\n }\n\n /** Sobe a sequência até pelo menos `n` (ex.: maior sequência encontrada no buffer). */\n ensureSequenceAtLeast(n: number): void {\n if (n > this.seq) this.seq = n;\n }\n\n newPage(): string {\n if (!this.info) throw new InvalidStateError(\"Sem sessão ativa\");\n this.info = { ...this.info, pageId: uid(\"pg_\") };\n this.persist(this.state?.status ?? \"recording\", { pageCount: (this.state?.pageCount ?? 0) + 1 });\n return this.info.pageId;\n }\n\n get pageCount(): number {\n return this.state?.pageCount ?? 0;\n }\n\n // ---- ciclo de vida ------------------------------------------------------\n /** Cria (ou obtém, de forma idempotente) a sessão no backend. */\n async create(opts: StartRecordingOptions, context: Record<string, unknown>): Promise<CreateSessionResponse> {\n const queryToken = consumeQueryToken();\n const sessionToken = opts?.sessionToken || this.token || queryToken;\n if (!sessionToken || !opts.executionId || !opts.testCaseId)\n throw new AuthError(\"sessionToken, executionId e testCaseId são obrigatórios\");\n this.token = sessionToken;\n const tabId = await resolveTabId(this.cfg.storagePrefix, this.loadPersisted()?.tabId);\n const res = await this.api.createSession({\n platformId: this.cfg.platformId,\n testCaseId: opts.testCaseId,\n executionId: opts.executionId,\n tabId,\n sdkVersion: SDK_VERSION,\n appVersion: this.cfg.appVersion,\n context,\n });\n if (!res.recording?.enabled) {\n this.disabledReason = res.recording?.reason;\n throw new SessionDisabledError(res.recording?.reason);\n }\n if (res.sessionToken) this.token = res.sessionToken;\n this.seq = 0;\n this.info = {\n sessionId: res.sessionId,\n executionId: opts.executionId,\n testCaseId: opts.testCaseId,\n platformId: this.cfg.platformId,\n tabId,\n pageId: uid(\"pg_\"),\n startedAt: Date.now(),\n };\n safe(() => sessionStorage.removeItem(this.seqKey));\n this.persist(\"recording\", {\n heartbeatIntervalMs: res.heartbeatIntervalMs,\n expiresAt: res.expiresAt,\n pageCount: 1,\n sequence: 0,\n });\n return res;\n }\n\n /** Reidrata sessão persistida (reload/navegação MPA) após validar no backend. */\n async resume(state: PersistedSessionState): Promise<HeartbeatResponse> {\n this.token = state.sessionToken;\n const tabId = await resolveTabId(this.cfg.storagePrefix, state.tabId);\n const res = await this.api.status(state.sessionId);\n if (res.status === \"expired\") throw new SessionExpiredError();\n if (res.status === \"disabled\") throw new SessionDisabledError();\n if (res.sessionToken) this.token = res.sessionToken;\n this.state = { ...state, tabId };\n this.seq = tabId === state.tabId ? state.sequence : 0;\n this.info = {\n sessionId: state.sessionId,\n executionId: state.executionId,\n testCaseId: state.testCaseId,\n platformId: state.platformId,\n tabId,\n pageId: uid(\"pg_\"),\n startedAt: Date.now(),\n };\n this.persist(state.status, { sessionToken: this.token, expiresAt: res.expiresAt ?? state.expiresAt, pageCount: state.pageCount + 1, tabId });\n return res;\n }\n\n startHeartbeat(onResult: (r: HeartbeatResponse) => void, onError: (e: unknown) => void, pending: () => number, status: () => string): void {\n this.stopHeartbeat();\n const every = this.state?.heartbeatIntervalMs ?? this.cfg.heartbeatIntervalMs;\n if (!every || every <= 0) return;\n this.heartbeatTimer = setInterval(async () => {\n if (!this.info) return;\n try {\n const r = await this.api.heartbeat(this.info.sessionId, {\n tabId: this.info.tabId,\n pageId: this.info.pageId,\n status: status(),\n pending: pending(),\n lastSequence: this.seq,\n });\n if (r.sessionToken) {\n this.token = r.sessionToken;\n this.persist(this.state?.status ?? \"recording\", { sessionToken: r.sessionToken, expiresAt: r.expiresAt });\n }\n onResult(r);\n } catch (e) {\n if (e instanceof AuthError || e instanceof SessionExpiredError) onError(e);\n // falhas de rede no heartbeat são toleradas\n }\n }, every);\n }\n\n stopHeartbeat(): void {\n if (this.heartbeatTimer) clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = undefined;\n }\n\n async complete(summary: Record<string, unknown>): Promise<boolean> {\n if (!this.info) return false;\n const r = await this.api.complete(this.info.sessionId, { tabId: this.info.tabId, lastSequence: this.seq, ...summary });\n return !!r.completed;\n }\n\n reset(): void {\n this.stopHeartbeat();\n this.info = null;\n this.state = null;\n this.token = \"\";\n this.seq = 0;\n }\n}\n\nfunction consumeQueryToken(): string {\n if (typeof window === \"undefined\") return \"\";\n\n try {\n const token = readQueryToken();\n if (!token) return \"\";\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"offscript_token\");\n window.history.replaceState(window.history.state, typeof document === \"undefined\" ? \"\" : document.title, `${url.pathname}${url.search}${url.hash}`);\n return token;\n } catch {\n return \"\";\n }\n}\n\nfunction readQueryToken(): string {\n if (typeof window === \"undefined\") return \"\";\n\n try {\n return new URL(window.location.href).searchParams.get(\"offscript_token\")?.trim() ?? \"\";\n } catch {\n return \"\";\n }\n}\n\nlet heldLocks: string[] = [];\n\n/**\n * Garante tabId único entre abas vivas. sessionStorage é copiado quando uma aba é aberta por\n * window.open/link; o Web Lock detecta se outra aba viva já é dona do mesmo tabId.\n */\nasync function resolveTabId(prefix: string, previous?: string): Promise<string> {\n const candidate = previous ?? uid(\"tab_\");\n const locks = (globalThis.navigator as Navigator & { locks?: LockManager })?.locks;\n if (!locks || !previous) {\n if (locks) void claim(locks, `${prefix}:tab:${candidate}`);\n return candidate;\n }\n if (heldLocks.includes(candidate)) return candidate;\n const ok = await claim(locks, `${prefix}:tab:${candidate}`);\n if (ok) return candidate;\n const fresh = uid(\"tab_\");\n void claim(locks, `${prefix}:tab:${fresh}`);\n return fresh;\n}\n\nfunction claim(locks: LockManager, name: string): Promise<boolean> {\n return new Promise((resolve) => {\n try {\n void locks\n .request(name, { ifAvailable: true }, (lock) => {\n if (!lock) {\n resolve(false);\n return undefined;\n }\n heldLocks.push(name.split(\":tab:\")[1]);\n resolve(true);\n return new Promise<void>(() => undefined); // mantém o lock até a aba fechar\n })\n .catch(() => resolve(true));\n } catch {\n resolve(true);\n }\n });\n}\n","import {\n DEFAULT_RECORDING,\n DEFAULT_TRANSPORT,\n type OffscriptConfig,\n type ResolvedConfig,\n} from \"../types/config\";\nimport { resolvePrivacy } from \"../privacy/PrivacyConfig\";\nimport { ConfigError } from \"../utils/errors\";\nimport { deepMerge } from \"../utils/misc\";\n\nexport function resolveConfig(input: OffscriptConfig): ResolvedConfig {\n if (!input || typeof input !== \"object\") throw new ConfigError(\"Configuração ausente\");\n if (!input.platformId) throw new ConfigError(\"platformId é obrigatório\");\n if (!input.apiUrl) throw new ConfigError(\"apiUrl é obrigatório\");\n let url: URL;\n try {\n url = new URL(input.apiUrl);\n } catch {\n throw new ConfigError(`apiUrl inválida: ${input.apiUrl}`);\n }\n const local = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname);\n if (url.protocol !== \"https:\" && !(url.protocol === \"http:\" && local))\n throw new ConfigError(\"apiUrl deve usar HTTPS (HTTP só é aceito em localhost)\");\n return {\n apiUrl: url.origin + url.pathname.replace(/\\/+$/, \"\"),\n platformId: input.platformId,\n appVersion: input.appVersion,\n recording: deepMerge(DEFAULT_RECORDING, input.recording),\n privacy: resolvePrivacy(input.privacy),\n transport: deepMerge(DEFAULT_TRANSPORT, input.transport),\n correlationWindowMs: input.correlationWindowMs ?? 3000,\n autoResume: input.autoResume ?? true,\n heartbeatIntervalMs: input.heartbeatIntervalMs ?? 30_000,\n storagePrefix: input.storagePrefix ?? \"offscript\",\n debug: input.debug ?? false,\n controls: input.controls ?? true,\n };\n}\n","import type { OffscriptState, RecordingStatus, SessionInfo, StopSummary } from \"../types/session\";\n\n/**\n * Alvo mínimo para o overlay não importar a classe do SDK.\n */\nexport interface RecordingControlTarget {\n getState(): OffscriptState;\n on(type: \"statusChange\", fn: (payload: { from: RecordingStatus; to: RecordingStatus }) => void): () => void;\n pauseRecording(): Promise<void>;\n resumeRecording(): Promise<void>;\n stopRecording(): Promise<StopSummary>;\n startArmedRecording(): Promise<SessionInfo>;\n startNewSession(): Promise<void>;\n capturesSensitiveValues(): boolean;\n}\n\nconst HOST_ATTR = \"data-offscript-console\";\n\nconst EYE_SEQUENCE = [\n { pose: \"open\", duration: 2600 },\n { pose: \"blink\", duration: 160 },\n { pose: \"open\", duration: 1800 },\n { pose: \"left\", duration: 700 },\n { pose: \"open\", duration: 1500 },\n { pose: \"wink\", duration: 480 },\n { pose: \"open\", duration: 1900 },\n { pose: \"right\", duration: 700 },\n { pose: \"open\", duration: 1600 },\n { pose: \"up\", duration: 640 },\n { pose: \"happy\", duration: 720 },\n] as const;\n\nconst EYE_PATHS: Record<string, [string, string]> = {\n open: [\"M59.5 79.5v15\", \"M93 79.5v15\"],\n blink: [\"M52 89q7.5 5 15 0\", \"M85.5 89q7.5 5 15 0\"],\n wink: [\"M52 89q7.5 5 15 0\", \"M93 79.5v15\"],\n happy: [\"M52 91q7.5-12 15 0\", \"M85.5 91q7.5-12 15 0\"],\n};\n\n/**\n * Controles da gravação. Fechado, só a marca; aberto, a logo e os ícones.\n * O host fica com tamanho zero e a interface mora num shadow fechado.\n */\nexport class RecordingControls {\n private host?: HTMLElement;\n private shadow?: ShadowRoot;\n private note?: HTMLElement;\n private observer?: MutationObserver;\n private dockWatch?: ResizeObserver;\n private unsubscribe?: () => void;\n private eyeTimer = 0;\n private placeFrame = 0;\n private eyeIndex = 0;\n private busy = false;\n private expanded = true;\n private privacyOpen = true;\n private failure = \"\";\n private readonly onVisibility = (): void => {\n window.clearTimeout(this.eyeTimer);\n if (!document.hidden) this.scheduleEye();\n };\n private readonly onViewport = (): void => {\n this.placeConfirm();\n this.schedulePlacePrivacy();\n };\n\n constructor(private readonly sdk: RecordingControlTarget) {}\n\n mount(): void {\n if (this.host || typeof document === \"undefined\") return;\n const host = document.createElement(\"div\");\n host.setAttribute(HOST_ATTR, \"\");\n host.setAttribute(\"data-offscript-ignore\", \"\");\n host.className = \"offscript-ignore\";\n host.style.cssText = \"position:fixed;left:0;top:0;width:0;height:0;margin:0;padding:0;border:0;overflow:visible;z-index:2147483646;pointer-events:none;\";\n const shadow = host.attachShadow({ mode: \"closed\" });\n shadow.innerHTML = TEMPLATE;\n this.bind(shadow);\n this.host = host;\n this.shadow = shadow;\n this.note = shadow.querySelector(\"[data-note]\") ?? undefined;\n this.place();\n this.watchDom();\n this.unsubscribe = this.sdk.on(\"statusChange\", () => this.render());\n window.addEventListener(\"resize\", this.onViewport);\n window.visualViewport?.addEventListener(\"resize\", this.onViewport);\n document.fonts?.ready.then(() => {\n if (this.host) this.onViewport();\n });\n this.watchDock();\n this.render();\n this.startEyes();\n }\n\n unmount(): void {\n this.unsubscribe?.();\n this.unsubscribe = undefined;\n this.observer?.disconnect();\n this.observer = undefined;\n this.dockWatch?.disconnect();\n this.dockWatch = undefined;\n window.cancelAnimationFrame(this.placeFrame);\n this.placeFrame = 0;\n window.clearTimeout(this.eyeTimer);\n window.removeEventListener(\"resize\", this.onViewport);\n window.visualViewport?.removeEventListener(\"resize\", this.onViewport);\n document.removeEventListener(\"visibilitychange\", this.onVisibility);\n this.host?.remove();\n this.host = undefined;\n this.shadow = undefined;\n }\n\n private place(): void {\n const host = this.host;\n const parent = document.body ?? document.documentElement;\n if (!host || !parent || host.parentNode === parent) return;\n parent.appendChild(host);\n }\n\n private watchDom(): void {\n if (typeof MutationObserver === \"undefined\") return;\n this.observer?.disconnect();\n this.observer = new MutationObserver(() => {\n this.place();\n if (document.body) this.observer?.observe(document.body, { childList: true });\n });\n this.observer.observe(document.documentElement, { childList: true });\n if (document.body) this.observer.observe(document.body, { childList: true });\n }\n\n private watchDock(): void {\n const dock = this.shadow?.querySelector(\".dock\");\n if (!(dock instanceof HTMLElement) || typeof ResizeObserver === \"undefined\") return;\n this.dockWatch?.disconnect();\n this.dockWatch = new ResizeObserver(() => this.placePrivacy());\n this.dockWatch.observe(dock);\n }\n\n private bind(shadow: ShadowRoot): void {\n const stop = (event: Event) => event.stopPropagation();\n shadow.addEventListener(\"click\", (event) => {\n const actionNode = event.composedPath().find((node) => node instanceof Element && node.hasAttribute(\"data-action\"));\n const action = actionNode instanceof Element ? actionNode.getAttribute(\"data-action\") : null;\n if (action === \"open\") {\n this.expanded = true;\n this.render();\n } else if (action === \"close\") {\n this.expanded = false;\n this.render();\n } else if (action === \"record\") void this.run(() => this.sdk.startArmedRecording());\n else if (action === \"pause\") void this.run(() => this.sdk.pauseRecording());\n else if (action === \"resume\") void this.run(() => this.sdk.resumeRecording());\n else if (action === \"stop\") void this.run(() => this.sdk.stopRecording());\n else if (action === \"new\") this.openConfirm();\n else if (action === \"cancel\") this.closeConfirm();\n else if (action === \"confirm\") {\n this.closeConfirm();\n void this.run(() => this.sdk.startNewSession());\n } else if (action === \"privacy-show\") {\n this.privacyOpen = true;\n this.render();\n } else if (action === \"privacy-hide\") {\n this.privacyOpen = false;\n this.render();\n }\n }, true);\n for (const type of [\"click\", \"dblclick\", \"auxclick\", \"contextmenu\", \"pointerdown\", \"pointerup\", \"mousedown\", \"mouseup\", \"keydown\", \"keyup\", \"keypress\", \"input\", \"change\", \"mouseover\", \"mouseout\"]) {\n shadow.addEventListener(type, stop);\n }\n shadow.querySelector(\"[data-confirm]\")?.addEventListener(\"keydown\", (event) => {\n if (event instanceof KeyboardEvent && event.key === \"Escape\") this.closeConfirm();\n });\n shadow.querySelector(\"[data-privacy]\")?.addEventListener(\"keydown\", (event) => {\n if (event instanceof KeyboardEvent && event.key === \"Escape\") {\n this.privacyOpen = false;\n this.render();\n }\n });\n }\n\n private openConfirm(): void {\n const bubble = this.shadow?.querySelector(\"[data-confirm]\");\n if (!(bubble instanceof HTMLElement) || this.busy || !bubble.hidden) return;\n bubble.hidden = false;\n this.placeConfirm();\n this.paintPrivacy();\n const cancel = bubble.querySelector(\"[data-action='cancel']\");\n if (cancel instanceof HTMLElement) cancel.focus();\n }\n\n private placeConfirm(): void {\n const bubble = this.shadow?.querySelector(\"[data-confirm]\");\n const card = bubble?.querySelector(\".bubble\");\n const button = this.shadow?.querySelector(\"[data-action='new']\");\n if (!(bubble instanceof HTMLElement) || !(card instanceof HTMLElement) || !(button instanceof HTMLElement)) return;\n const buttonBox = button.getBoundingClientRect();\n const buttonCenter = buttonBox.left + buttonBox.width / 2;\n const tailHalf = 4.5;\n const margin = 12;\n const viewport = document.documentElement.clientWidth;\n let rightEdge = buttonCenter + 22 + tailHalf;\n rightEdge = Math.min(viewport - margin, Math.max(margin + card.offsetWidth, rightEdge));\n bubble.style.right = `${Math.round(viewport - rightEdge)}px`;\n const tail = Math.min(Math.max(12, rightEdge - buttonCenter - tailHalf), Math.max(12, card.offsetWidth - 18));\n card.style.setProperty(\"--tail\", `${Math.round(tail)}px`);\n }\n\n private closeConfirm(): void {\n const bubble = this.shadow?.querySelector(\"[data-confirm]\");\n if (bubble instanceof HTMLElement) bubble.hidden = true;\n this.paintPrivacy();\n }\n\n private async run(task: () => Promise<unknown>): Promise<void> {\n if (this.busy) return;\n this.busy = true;\n this.failure = \"\";\n this.render();\n try {\n await task();\n } catch {\n this.failure = \"Não foi possível concluir\";\n } finally {\n this.busy = false;\n this.render();\n }\n }\n\n private render(): void {\n this.place();\n const status = this.sdk.getState().status;\n const shell = this.shadow?.querySelector(\"[data-shell]\");\n shell?.setAttribute(\"data-open\", this.expanded ? \"true\" : \"false\");\n shell?.setAttribute(\"data-state\", status);\n if (this.note) this.note.textContent = this.failure;\n const live = status === \"recording\" || status === \"paused\";\n if (!live) this.closeConfirm();\n this.paintPrivacy();\n this.setHidden(\"record\", live || status === \"initializing\" || status === \"stopping\");\n this.setHidden(\"pause\", status !== \"recording\");\n this.setHidden(\"resume\", status !== \"paused\");\n this.setHidden(\"new\", !live);\n this.setHidden(\"stop\", !live);\n this.setEnabled(\"record\", !this.busy && !live && status !== \"initializing\" && status !== \"stopping\");\n this.setEnabled(\"pause\", !this.busy && status === \"recording\");\n this.setEnabled(\"resume\", !this.busy && status === \"paused\");\n this.setEnabled(\"stop\", !this.busy && live);\n this.setEnabled(\"new\", !this.busy && live);\n }\n\n private paintPrivacy(): void {\n const flag = this.sdk.capturesSensitiveValues();\n const confirm = this.shadow?.querySelector(\"[data-confirm]\");\n const confirmOpen = confirm instanceof HTMLElement && !confirm.hidden;\n const bubble = this.shadow?.querySelector(\"[data-privacy]\");\n const show = flag && this.privacyOpen && this.expanded && !confirmOpen;\n if (bubble instanceof HTMLElement) {\n bubble.hidden = !show;\n if (!show) this.clearPrivacyPlace(bubble);\n }\n if (show) this.schedulePlacePrivacy();\n this.setHidden(\"privacy-show\", !flag || this.privacyOpen || !this.expanded);\n }\n\n private schedulePlacePrivacy(): void {\n this.placePrivacy();\n window.cancelAnimationFrame(this.placeFrame);\n this.placeFrame = window.requestAnimationFrame(() => {\n this.placePrivacy();\n this.placeFrame = window.requestAnimationFrame(() => {\n this.placeFrame = 0;\n this.placePrivacy();\n });\n });\n }\n\n private clearPrivacyPlace(wrap: HTMLElement): void {\n wrap.style.position = \"\";\n wrap.style.transform = \"\";\n wrap.style.width = \"\";\n wrap.style.maxWidth = \"\";\n wrap.style.left = \"\";\n wrap.style.right = \"\";\n wrap.style.top = \"\";\n wrap.style.bottom = \"\";\n }\n\n private placePrivacy(): void {\n const wrap = this.shadow?.querySelector(\"[data-privacy]\");\n const card = wrap?.querySelector(\".bubble\");\n const face = this.shadow?.querySelector(\".face\");\n if (!(wrap instanceof HTMLElement) || !(card instanceof HTMLElement) || !(face instanceof HTMLElement) || wrap.hidden) return;\n const box = face.getBoundingClientRect();\n if (box.width < 8 || box.height < 8 || (box.top < 1 && box.left < 1)) return;\n const margin = 12;\n const viewport = document.documentElement.clientWidth;\n const maxWidth = Math.min(264, viewport - margin * 2);\n wrap.style.position = \"fixed\";\n wrap.style.transform = \"none\";\n wrap.style.width = `${maxWidth}px`;\n wrap.style.maxWidth = `${maxWidth}px`;\n wrap.style.left = \"auto\";\n wrap.style.bottom = \"auto\";\n const faceCenter = box.left + box.width / 2;\n const tailHalf = 5;\n let rightEdge = faceCenter + 12 + tailHalf;\n rightEdge = Math.min(viewport - margin, Math.max(margin + maxWidth, rightEdge));\n wrap.style.right = `${Math.round(viewport - rightEdge)}px`;\n wrap.style.top = `${Math.round(Math.max(margin, box.top - 10 - wrap.offsetHeight))}px`;\n const tail = Math.min(Math.max(12, rightEdge - faceCenter - tailHalf), Math.max(12, maxWidth - 18));\n card.style.setProperty(\"--tail\", `${Math.round(tail)}px`);\n }\n\n private setEnabled(action: string, enabled: boolean): void {\n const button = this.shadow?.querySelector(`[data-action='${action}']`);\n if (button instanceof HTMLButtonElement) button.disabled = !enabled;\n }\n\n private setHidden(action: string, hidden: boolean): void {\n const button = this.shadow?.querySelector(`[data-action='${action}']`);\n if (button instanceof HTMLButtonElement) button.hidden = hidden;\n }\n\n private startEyes(): void {\n const media = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\");\n if (!media || media.matches) return;\n document.addEventListener(\"visibilitychange\", this.onVisibility);\n this.scheduleEye();\n }\n\n private scheduleEye(): void {\n const beat = EYE_SEQUENCE[this.eyeIndex % EYE_SEQUENCE.length];\n this.applyPose(beat.pose);\n this.eyeIndex = (this.eyeIndex + 1) % EYE_SEQUENCE.length;\n this.eyeTimer = window.setTimeout(() => this.scheduleEye(), beat.duration);\n }\n\n private applyPose(pose: string): void {\n const [left, right] = EYE_PATHS[pose] ?? EYE_PATHS.open;\n this.shadow?.querySelectorAll(\"[data-eye='left']\").forEach((node) => node.setAttribute(\"d\", left));\n this.shadow?.querySelectorAll(\"[data-eye='right']\").forEach((node) => node.setAttribute(\"d\", right));\n this.shadow?.querySelectorAll(\"[data-eyes]\").forEach((node) => node.setAttribute(\"data-pose\", pose));\n }\n}\n\nconst ICON = {\n pause: `<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M5 3.5v9M11 3.5v9\"/></svg>`,\n play: `<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M6 3.8 12.2 8 6 12.2z\" fill=\"currentColor\" stroke=\"none\"/></svg>`,\n close: `<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M4 4l8 8M12 4 4 12\"/></svg>`,\n speak: `<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M3.5 3.5h9a1.5 1.5 0 0 1 1.5 1.5v5a1.5 1.5 0 0 1-1.5 1.5H7.2L4.5 13.5v-2H3.5A1.5 1.5 0 0 1 2 10V5a1.5 1.5 0 0 1 1.5-1.5Z\"/></svg>`,\n};\n\nfunction mark(gradientId: string): string {\n return `<svg class=\"mark\" viewBox=\"14 9 138 126\" fill=\"none\" aria-hidden=\"true\">\n <defs>\n <linearGradient id=\"${gradientId}\" x1=\"112\" y1=\"41\" x2=\"143\" y2=\"17\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stop-color=\"#753eff\"></stop>\n <stop offset=\"1\" stop-color=\"#1772ff\"></stop>\n </linearGradient>\n </defs>\n <path d=\"M72 23C88 23 101 26 109 32L112 40C122 50 128 64 128 80C128 109 104 131 72 131C41 131 16 108 16 80C16 46 40 23 72 23Z\" fill=\"#eeeef7\"></path>\n <path d=\"M112 41C119 37 123 27 131 22C135 19 139 18 143 17\" stroke=\"url(#${gradientId})\" stroke-width=\"8\" stroke-linecap=\"round\"></path>\n <g class=\"eyes\" data-eyes data-pose=\"open\" stroke=\"#10182e\" stroke-width=\"7\" stroke-linecap=\"round\">\n <path data-eye=\"left\" d=\"M59.5 79.5v15\"></path>\n <path data-eye=\"right\" d=\"M93 79.5v15\"></path>\n </g>\n </svg>`;\n}\n\nconst TEMPLATE = `\n<style>\n :host { color-scheme: dark; }\n button {\n display: grid;\n place-items: center;\n width: 32px;\n height: 32px;\n margin: 0;\n padding: 0;\n border: 1px solid #3a4458;\n border-radius: 999px;\n background: transparent;\n color: #f4f3fc;\n cursor: pointer;\n }\n button svg {\n width: 15px;\n height: 15px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.7;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n button:hover:not(:disabled) { border-color: #a596ff; color: #d0c8ff; }\n button:focus-visible { outline: 2px solid #a596ff; outline-offset: 2px; }\n button:disabled { cursor: not-allowed; opacity: 0.4; }\n button[hidden] { display: none; }\n button.text {\n width: auto;\n padding: 0 12px;\n font: 600 12px/1 \"Plus Jakarta Sans\", ui-sans-serif, system-ui, sans-serif;\n }\n button.record {\n border: 0;\n background: linear-gradient(100deg, #6847ff, #1673ff);\n color: #fff;\n }\n button.finish {\n border: 0;\n background: #e5485f;\n color: #fff;\n }\n button.record:hover:not(:disabled),\n button.finish:hover:not(:disabled) { color: #fff; filter: brightness(1.08); }\n button.primary {\n border: 0;\n background: linear-gradient(100deg, #6847ff, #1673ff);\n color: #fff;\n }\n button.primary:hover:not(:disabled) { color: #fff; filter: brightness(1.08); }\n .launcher, .dock {\n position: fixed;\n right: 16px;\n bottom: 16px;\n z-index: 1;\n border: 1px solid #232b3b;\n background: #151b27;\n box-shadow: 0 18px 40px rgba(3, 5, 12, 0.5);\n pointer-events: auto;\n font-family: \"Plus Jakarta Sans\", ui-sans-serif, system-ui, sans-serif;\n }\n .launcher {\n width: 56px;\n height: 56px;\n padding: 8px;\n border-radius: 999px;\n cursor: pointer;\n }\n .launcher .mark { width: 100%; height: 100%; }\n .launcher::after {\n content: \"\";\n position: absolute;\n right: 1px;\n bottom: 1px;\n width: 10px;\n height: 10px;\n border-radius: 999px;\n background: #929bb1;\n box-shadow: 0 0 0 2px #151b27;\n }\n [data-state=\"recording\"] .launcher::after { background: #1673ff; }\n [data-state=\"paused\"] .launcher::after { background: #d0c8ff; }\n [data-state=\"error\"] .launcher::after { background: #e5485f; }\n .dock {\n display: flex;\n align-items: center;\n gap: 10px;\n max-width: calc(100vw - 32px);\n padding: 6px 6px 6px 12px;\n border-radius: 999px;\n color: #f4f3fc;\n overflow: visible;\n }\n [data-open=\"false\"] .dock, [data-open=\"true\"] .launcher { display: none; }\n .brand { display: flex; align-items: center; gap: 8px; min-width: 0; overflow: visible; }\n .face { position: relative; flex: none; width: 28px; height: 28px; overflow: visible; }\n .dock .mark { width: 28px; height: 28px; }\n .word {\n color: #f4f3fc;\n font-size: 14px;\n font-weight: 600;\n letter-spacing: -0.03em;\n line-height: 1;\n }\n .actions { display: flex; align-items: center; gap: 6px; }\n .note {\n position: fixed;\n right: 16px;\n bottom: 78px;\n z-index: 1;\n margin: 0;\n padding: 4px 10px;\n border-radius: 999px;\n background: #151b27;\n color: #ff9aa8;\n font: 600 11px/1.3 \"Plus Jakarta Sans\", ui-sans-serif, system-ui, sans-serif;\n pointer-events: none;\n }\n .note:empty { display: none; }\n [data-shell]:has(.note:not(:empty)) .privacy { bottom: calc(100% + 48px); }\n .eyes {\n transform-box: view-box;\n transform-origin: 0 0;\n transition: transform 280ms cubic-bezier(0.22, 1, 0.36, 1);\n }\n .eyes[data-pose=\"left\"] { transform: translate(-4.5%, 0.8%); }\n .eyes[data-pose=\"right\"] { transform: translate(4.5%, 0.8%); }\n .eyes[data-pose=\"up\"] { transform: translate(0, -3.5%); }\n @media (prefers-reduced-motion: reduce) {\n .eyes { transition: none; }\n .eyes[data-pose] { transform: none; }\n .speak:not([hidden]) .bubble { animation: none; }\n }\n .speak {\n position: fixed;\n right: 16px;\n bottom: 76px;\n z-index: 2;\n width: max-content;\n max-width: min(16rem, calc(100vw - 32px));\n pointer-events: auto;\n font-family: \"Plus Jakarta Sans\", ui-sans-serif, system-ui, sans-serif;\n }\n .speak[hidden] { display: none; }\n .bubble {\n position: relative;\n padding: 0.6rem 0.7rem 0.55rem;\n border: 1px solid #3d3590;\n border-radius: 1rem;\n background: #1b1a3f;\n color: #c7cadc;\n box-shadow: 0 16px 40px rgba(3, 5, 12, 0.45);\n animation: bubble-in 320ms cubic-bezier(0.22, 1, 0.36, 1);\n }\n .bubble::after {\n content: \"\";\n position: absolute;\n right: var(--tail, 22px);\n bottom: -5px;\n width: 9px;\n height: 9px;\n border-right: 1px solid #3d3590;\n border-bottom: 1px solid #3d3590;\n background: #1b1a3f;\n transform: rotate(45deg);\n }\n .bubble .mark {\n display: block;\n width: 22px;\n height: 22px;\n margin: 0 0 0.35rem;\n }\n @keyframes bubble-in {\n from { opacity: 0; transform: translateY(8px) scale(0.96); }\n to { opacity: 1; transform: none; }\n }\n .bubble p {\n margin: 0;\n color: #c7cadc;\n font-size: 0.8125rem;\n font-weight: 400;\n line-height: 1.45;\n }\n .privacy {\n position: absolute;\n left: auto;\n right: 50%;\n bottom: calc(100% + 18px);\n z-index: 3;\n width: min(16.5rem, calc(100vw - 24px));\n max-width: min(16.5rem, calc(100vw - 24px));\n pointer-events: auto;\n font-family: \"Plus Jakarta Sans\", ui-sans-serif, system-ui, sans-serif;\n transform: translateX(20px);\n }\n .privacy[hidden] { display: none; }\n .privacy .bubble {\n padding: 0.75rem 2.15rem 0.75rem 0.9rem;\n border-radius: 16px;\n }\n .privacy .bubble::after {\n right: var(--tail, 12px);\n bottom: -5px;\n width: 10px;\n height: 10px;\n }\n @media (max-width: 560px) {\n .word { display: none; }\n .privacy {\n position: fixed;\n left: 12px;\n right: 12px;\n bottom: 76px;\n width: auto;\n max-width: none;\n transform: none;\n }\n .privacy .bubble {\n padding: 0.65rem 1.85rem 0.6rem 0.75rem;\n }\n .privacy .bubble p { font-size: 0.75rem; }\n }\n .privacy button.hide {\n position: absolute;\n top: 0.4rem;\n right: 0.4rem;\n width: 24px;\n height: 24px;\n border: 0;\n background: transparent;\n color: #c7cadc;\n }\n .privacy button.hide:hover:not(:disabled) { color: #f4f3fc; }\n .choices { display: flex; gap: 6px; margin-top: 0.7rem; }\n .speak button.choice {\n width: auto;\n height: auto;\n min-height: 1.75rem;\n padding: 0 0.7rem;\n border-radius: 999px;\n font: 600 0.75rem/1 \"Plus Jakarta Sans\", ui-sans-serif, system-ui, sans-serif;\n }\n .speak button.secondary {\n border: 1px solid #3a4458;\n background: transparent;\n color: #f4f3fc;\n }\n .speak button.secondary:hover:not(:disabled) { border-color: #a596ff; color: #d0c8ff; }\n .speak button.danger {\n border: 0;\n background: #e5485f;\n color: #fff;\n }\n .speak button.danger:hover:not(:disabled) { color: #fff; background: color-mix(in srgb, #e5485f 88%, #fff); }\n</style>\n<div data-shell data-open=\"true\" data-state=\"recording\">\n <button type=\"button\" class=\"launcher\" data-action=\"open\" aria-label=\"Abrir controles da gravação\">\n ${mark(\"offscript-trail-launcher\")}\n </button>\n <div class=\"dock\" role=\"toolbar\" aria-label=\"Controles da gravação\">\n <div class=\"brand\">\n <span class=\"face\">\n ${mark(\"offscript-trail-dock\")}\n <div class=\"privacy\" data-privacy hidden>\n <div class=\"bubble\" role=\"status\">\n <button type=\"button\" class=\"hide\" data-action=\"privacy-hide\" aria-label=\"Fechar aviso\">${ICON.close}</button>\n <p>Tudo visível na tela será gravado, inclusive o que for digitado — senha e dado sensível também.</p>\n </div>\n </div>\n </span>\n <span class=\"word\">Offscript</span>\n </div>\n <div class=\"actions\">\n <button type=\"button\" data-action=\"privacy-show\" aria-label=\"Abrir aviso\" title=\"Tudo visível na tela será gravado, inclusive o que for digitado\" hidden>${ICON.speak}</button>\n <button type=\"button\" class=\"text record\" data-action=\"record\">Iniciar</button>\n <button type=\"button\" data-action=\"pause\" aria-label=\"Pausar\" title=\"Pausar\">${ICON.pause}</button>\n <button type=\"button\" data-action=\"resume\" aria-label=\"Retomar\" title=\"Retomar\">${ICON.play}</button>\n <button type=\"button\" class=\"text\" data-action=\"new\" title=\"Descarta o que foi gravado e volta ao início\">Nova sessão</button>\n <button type=\"button\" class=\"text finish\" data-action=\"stop\" title=\"Encerra a coleta e envia o que foi gravado\">Finalizar</button>\n <button type=\"button\" data-action=\"close\" aria-label=\"Fechar\" title=\"Fechar\">${ICON.close}</button>\n </div>\n </div>\n <div class=\"speak\" data-confirm hidden>\n <div class=\"bubble\" role=\"dialog\" aria-labelledby=\"offscript-confirm-title\">\n ${mark(\"offscript-trail-speak\")}\n <p id=\"offscript-confirm-title\">Descartar esta sessão? O que foi gravado será ignorado.</p>\n <div class=\"choices\">\n <button type=\"button\" class=\"choice secondary\" data-action=\"cancel\">Cancelar</button>\n <button type=\"button\" class=\"choice danger\" data-action=\"confirm\">Descartar</button>\n </div>\n </div>\n </div>\n <p class=\"note\" data-note></p>\n</div>\n`;\n","import type { OffscriptConfig, Priority, ResolvedConfig } from \"../types/config\";\nimport {\n SDK_VERSION,\n type EventKind,\n type LifecycleEventData,\n type OffscriptEvent,\n type RecordedAction,\n} from \"../types/events\";\nimport type { OffscriptState, RecordingStatus, SessionInfo, StartRecordingOptions, StopSummary } from \"../types/session\";\nimport { DataSanitizer } from \"../privacy/DataSanitizer\";\nimport { EventTransport } from \"../transport/EventTransport\";\nimport { openBuffer } from \"../transport/PersistentBuffer\";\nimport { ActionRecorder } from \"../recorders/ActionRecorder\";\nimport { ContextRecorder, collectContext } from \"../recorders/ContextRecorder\";\nimport { ErrorRecorder } from \"../recorders/ErrorRecorder\";\nimport { HTTPRecorder } from \"../recorders/HTTPRecorder\";\nimport { IframeRecorder } from \"../recorders/IframeRecorder\";\nimport { RRWebRecorder } from \"../recorders/RRWebRecorder\";\nimport type { EmitOptions, EventSink, Recorder } from \"../recorders/types\";\nimport {\n AuthError,\n Emitter,\n InvalidStateError,\n OffscriptError,\n SessionDisabledError,\n SessionExpiredError,\n} from \"../utils/errors\";\nimport { safe } from \"../utils/misc\";\nimport { LifecycleManager } from \"./LifecycleManager\";\nimport { SessionManager } from \"./SessionManager\";\nimport { resolveConfig } from \"./config\";\nimport { buildPlaywrightContract, type PlaywrightRecording } from \"../playwright/PlaywrightDataContract\";\nimport { RecordingControls } from \"../ui/RecordingControls\";\nimport { uid } from \"../utils/id\";\n\nexport type OffscriptEventMap = {\n statusChange: { from: RecordingStatus; to: RecordingStatus };\n error: OffscriptError | Error;\n sessionStart: SessionInfo;\n sessionEnd: StopSummary;\n sessionDiscard: { sessionId: string };\n flush: { events: number; batchId: string; duplicate: boolean };\n overflow: { dropped: number };\n disabled: { reason?: string };\n};\n\ninterface RecentAction {\n id: string;\n t: number;\n}\n\nconst MAX_LOG = 5000;\n\nexport class Offscript implements EventSink {\n private readonly bus = new Emitter<OffscriptEventMap>();\n readonly config: ResolvedConfig;\n readonly sanitizer: DataSanitizer;\n\n private status: RecordingStatus = \"idle\";\n private lastError?: { code: string; message: string };\n private sessions: SessionManager;\n private transport?: EventTransport;\n private lifecycle?: LifecycleManager;\n private recorders: Recorder[] = [];\n private rrweb?: RRWebRecorder;\n private actions?: ActionRecorder;\n private context?: ContextRecorder;\n private accepting = false;\n private initPromise?: Promise<void>;\n private startPromise?: Promise<SessionInfo>;\n private stopPromise?: Promise<StopSummary>;\n private destroyed = false;\n private recent: RecentAction[] = [];\n private actionLog: RecordedAction[] = [];\n private contextLog: Array<OffscriptEvent> = [];\n private eventCount = 0;\n private metrics = { emitMs: 0, emitted: 0, dropped: 0 };\n private controls?: RecordingControls;\n private lastStart?: StartRecordingOptions;\n private armed?: { testCaseId: string; sessionToken: string };\n\n constructor(config: OffscriptConfig) {\n this.config = resolveConfig(config);\n this.sanitizer = new DataSanitizer(this.config.privacy);\n this.sessions = new SessionManager(this.config);\n }\n\n // ------------------------------------------------------------------ API pública\n getState(): OffscriptState {\n return { status: this.status, session: this.sessions.session, pending: this.transport?.pending ?? 0, lastError: this.lastError };\n }\n\n capturesSensitiveValues(): boolean {\n return this.config.privacy.captureSensitiveValues === true;\n }\n\n getMetrics(): { emitted: number; dropped: number; avgEmitMs: number; bufferKind?: string } {\n return { emitted: this.metrics.emitted, dropped: this.metrics.dropped, avgEmitMs: this.metrics.emitted ? this.metrics.emitMs / this.metrics.emitted : 0, bufferKind: this.transport?.bufferKind };\n }\n\n /** Idempotente. Prepara armazenamento/transporte e retoma sessão persistida (reload/MPA). */\n init(): Promise<void> {\n if (this.destroyed) return Promise.reject(new InvalidStateError(\"SDK destruído\"));\n this.initPromise ??= this.doInit();\n return this.initPromise;\n }\n\n private async doInit(): Promise<void> {\n if (typeof window === \"undefined\") throw new OffscriptError(\"NOT_SUPPORTED\", \"O SDK requer um ambiente de navegador\");\n this.ensureControls();\n this.setStatus(\"initializing\");\n try {\n const buffer = await openBuffer(`${this.config.storagePrefix}-${this.config.platformId}`, this.config.transport.persist);\n this.transport = new EventTransport(this.config.transport, this.sessions.api, buffer);\n this.transport.on(\"flushed\", (e) => this.bus.emit(\"flush\", e));\n this.transport.on(\"overflow\", (e) => this.bus.emit(\"overflow\", e));\n this.transport.on(\"fatal\", ({ error }) => void this.onFatal(error));\n this.transport.on(\"failed\", ({ error }) => this.debug(\"transport failed\", error));\n await this.transport.purgeExpired(this.config.privacy.localRetentionMs);\n this.setStatus(\"idle\");\n const persisted = this.config.autoResume ? this.sessions.loadPersisted() : null;\n if (persisted) await this.resumePersisted(persisted);\n } catch (e) {\n this.fail(e);\n throw e;\n }\n }\n\n async startRecording(opts: StartRecordingOptions): Promise<SessionInfo> {\n if (this.destroyed) throw new InvalidStateError(\"SDK destruído\");\n if (this.startPromise) return this.startPromise; // proteção contra início concorrente\n const p = this.doStart(opts).finally(() => (this.startPromise = undefined));\n this.startPromise = p;\n return p;\n }\n\n private async doStart(opts: StartRecordingOptions): Promise<SessionInfo> {\n await this.init();\n const cur = this.sessions.session;\n if ((this.status === \"recording\" || this.status === \"paused\") && cur) {\n if (cur.executionId === opts.executionId) return cur; // idempotente\n throw new InvalidStateError(`Já existe gravação ativa para a execução ${cur.executionId}. Encerre-a antes.`);\n }\n if (this.status === \"stopping\") throw new InvalidStateError(\"Gravação em encerramento\");\n this.lastStart = { testCaseId: opts.testCaseId, executionId: opts.executionId, sessionToken: opts.sessionToken };\n this.setStatus(\"initializing\");\n try {\n const ctx = collectContext({ platformId: this.config.platformId, testCaseId: opts.testCaseId, executionId: opts.executionId }, \"initial\", this.config.appVersion, this.config.privacy.captureSensitiveValues);\n await this.sessions.create(opts, { ...ctx, url: this.sanitizer.sanitizeUrl(ctx.url), referrer: undefined, title: undefined });\n const s = this.sessions.session!;\n await this.transport!.start({ sessionId: s.sessionId, executionId: s.executionId, tabId: s.tabId });\n this.attach();\n this.accepting = true;\n this.setStatus(\"recording\");\n this.emitLifecycle(\"session-start\", { pageCount: 1 }, \"critical\");\n await this.startRecorders();\n this.sessions.startHeartbeat((r) => this.onHeartbeat(r.status), (e) => void this.onFatal(e as AuthError), () => this.transport?.pending ?? 0, () => this.status);\n this.bus.emit(\"sessionStart\", s);\n return s;\n } catch (e) {\n await this.teardown();\n this.sessions.clearPersisted();\n this.sessions.reset();\n this.fail(e);\n throw e;\n }\n }\n\n private async resumePersisted(state: NonNullable<ReturnType<SessionManager[\"loadPersisted\"]>>): Promise<void> {\n this.setStatus(\"initializing\");\n try {\n await this.sessions.resume(state);\n const s = this.sessions.session!;\n await this.transport!.start({ sessionId: s.sessionId, executionId: s.executionId, tabId: s.tabId });\n this.attach();\n this.accepting = state.status === \"recording\";\n this.setStatus(state.status);\n this.emitLifecycle(\"session-resume\", { pageCount: this.sessions.pageCount }, \"critical\");\n this.emitLifecycle(\"page-start\", { navigationType: safe(() => (performance.getEntriesByType(\"navigation\")[0] as PerformanceNavigationTiming | undefined)?.type) }, \"critical\");\n await this.startRecorders();\n if (state.status === \"paused\") this.recorders.forEach((r) => r.pause?.());\n this.actions?.recordPageLoad(safe(() => (performance.getEntriesByType(\"navigation\")[0] as PerformanceNavigationTiming | undefined)?.type), document.referrer);\n this.sessions.startHeartbeat((r) => this.onHeartbeat(r.status), (e) => void this.onFatal(e as AuthError), () => this.transport?.pending ?? 0, () => this.status);\n const token = this.sessions.currentToken;\n if (token) {\n this.lastStart = { testCaseId: s.testCaseId, executionId: s.executionId, sessionToken: token };\n this.armed ??= { testCaseId: s.testCaseId, sessionToken: token };\n }\n this.bus.emit(\"sessionStart\", s);\n } catch (e) {\n await this.teardown();\n this.sessions.clearPersisted();\n this.sessions.reset();\n this.fail(e);\n // Sessão expirada/desativada na retomada não é falha de init: o app continua funcionando.\n if (!(e instanceof SessionExpiredError || e instanceof SessionDisabledError || e instanceof AuthError)) throw e;\n }\n }\n\n /** Guarda caso de teste e token para o botão de gravar, sem abrir a sessão. */\n armRecording(opts: { testCaseId: string; sessionToken: string }): void {\n this.armed = { testCaseId: opts.testCaseId, sessionToken: opts.sessionToken };\n }\n\n /** Abre a coleta com os dados armados, ou com os da última sessão. */\n startArmedRecording(): Promise<SessionInfo> {\n if ((this.status === \"recording\" || this.status === \"paused\") && this.sessions.session) return Promise.resolve(this.sessions.session);\n return this.startRecording(this.freshStart());\n }\n\n /** Descarta a coleta atual e volta ao estado inicial, sem abrir outra. */\n async startNewSession(): Promise<void> {\n if (this.status !== \"recording\" && this.status !== \"paused\") return;\n await this.discardRecording();\n }\n\n private freshStart(): StartRecordingOptions {\n const base = this.armed ?? (this.lastStart ? { testCaseId: this.lastStart.testCaseId, sessionToken: this.lastStart.sessionToken } : undefined);\n if (!base?.testCaseId || !base.sessionToken) throw new InvalidStateError(\"Não há dados para iniciar a gravação\");\n return { testCaseId: base.testCaseId, sessionToken: base.sessionToken, executionId: uid(\"exec_\") };\n }\n\n private async discardRecording(): Promise<void> {\n const sessionId = this.sessions.session?.sessionId ?? \"\";\n this.accepting = false;\n this.stopRecorders();\n this.sessions.stopHeartbeat();\n this.transport?.stop();\n if (sessionId) await this.transport?.clearSession(sessionId);\n this.lifecycle?.uninstall();\n this.sessions.clearPersisted();\n this.sessions.reset();\n this.setStatus(\"idle\");\n if (sessionId) this.bus.emit(\"sessionDiscard\", { sessionId });\n }\n\n async pauseRecording(): Promise<void> {\n if (this.status === \"paused\") return;\n if (this.status !== \"recording\") throw new InvalidStateError(`Não é possível pausar no estado ${this.status}`);\n this.actions?.flushAll();\n this.emitLifecycle(\"pause\", {}, \"critical\");\n this.accepting = false;\n this.recorders.forEach((r) => safe(() => r.pause?.()));\n this.sessions.setStatus(\"paused\");\n this.setStatus(\"paused\");\n void this.transport?.flush();\n }\n\n async resumeRecording(): Promise<void> {\n if (this.status === \"recording\") return;\n if (this.status !== \"paused\") throw new InvalidStateError(`Não é possível retomar no estado ${this.status}`);\n this.accepting = true;\n this.sessions.setStatus(\"recording\");\n this.setStatus(\"recording\");\n this.emitLifecycle(\"resume\", {}, \"critical\");\n for (const r of this.recorders) await Promise.resolve(safe(() => r.resume?.()));\n }\n\n stopRecording(): Promise<StopSummary> {\n if (this.stopPromise) return this.stopPromise;\n const s = this.sessions.session;\n if (!s || (this.status !== \"recording\" && this.status !== \"paused\" && this.status !== \"error\")) {\n if (this.status === \"stopped\" || this.status === \"idle\")\n return Promise.resolve({ sessionId: s?.sessionId ?? \"\", flushed: true, pendingEvents: 0, completed: true }); // idempotente\n return Promise.reject(new InvalidStateError(`Não é possível encerrar no estado ${this.status}`));\n }\n this.stopPromise = this.doStop().finally(() => (this.stopPromise = undefined));\n return this.stopPromise;\n }\n\n private async doStop(): Promise<StopSummary> {\n const session = this.sessions.session!;\n this.setStatus(\"stopping\");\n if (this.status === \"stopping\") {\n this.actions?.flushAll();\n this.emitLifecycle(\"stop\", { eventCount: this.eventCount }, \"critical\");\n }\n this.accepting = false;\n this.stopRecorders();\n this.sessions.stopHeartbeat();\n const { ok, pending } = (await this.transport?.flushFinal()) ?? { ok: true, pending: 0 };\n let completed = false;\n if (ok) {\n try {\n completed = await this.sessions.complete({ eventCount: this.eventCount, pages: this.sessions.pageCount });\n } catch (e) {\n this.bus.emit(\"error\", e as Error);\n }\n }\n if (ok) await this.transport?.clearSession(session.sessionId);\n this.transport?.stop();\n this.lifecycle?.uninstall();\n this.sessions.clearPersisted();\n this.sessions.reset();\n const summary: StopSummary = { sessionId: session.sessionId, flushed: ok, pendingEvents: pending, completed };\n this.setStatus(\"stopped\");\n this.bus.emit(\"sessionEnd\", summary);\n return summary;\n }\n\n /**\n * Libera todos os recursos. Por padrão encerra a gravação ativa; com `{ complete: false }` apenas\n * desanexa a instrumentação e mantém a sessão persistida para ser retomada por outra instância.\n */\n async destroy(opts: { complete?: boolean } = {}): Promise<void> {\n if (this.destroyed) return;\n if (opts.complete !== false && (this.status === \"recording\" || this.status === \"paused\")) {\n await this.stopRecording().catch(() => undefined);\n } else {\n this.actions?.flushAll();\n if (this.accepting) this.emitLifecycle(\"page-end\", {}, \"critical\");\n this.accepting = false;\n await this.transport?.flushFinal(2000).catch(() => undefined);\n }\n this.destroyed = true;\n await this.teardown();\n this.controls?.unmount();\n this.controls = undefined;\n this.sessions.reset();\n this.transport?.close();\n this.bus.clear();\n }\n\n /** Dados estruturados para o motor Playwright, construídos a partir do que foi gravado nesta página. */\n exportPlaywrightData(): PlaywrightRecording {\n const s = this.sessions.session;\n if (!s) throw new InvalidStateError(\"Sem sessão ativa\");\n return buildPlaywrightContract({\n session: { sessionId: s.sessionId, executionId: s.executionId, testCaseId: s.testCaseId, platformId: s.platformId },\n actions: this.actionLog,\n contexts: this.contextLog.map((e) => e.data as never),\n });\n }\n\n getRecordedActions(): readonly RecordedAction[] {\n return this.actionLog;\n }\n\n // ------------------------------------------------------------------ EventSink\n on<K extends keyof OffscriptEventMap>(type: K, fn: (payload: OffscriptEventMap[K]) => void): () => void {\n return this.bus.on(type, fn);\n }\n off<K extends keyof OffscriptEventMap>(type: K, fn: (payload: OffscriptEventMap[K]) => void): void {\n this.bus.off(type, fn);\n }\n\n /** Usado pelos recorders. Não confundir com os eventos públicos (`on`). */\n emit<T>(kind: EventKind, data: T, opts: EmitOptions = {}): OffscriptEvent<T> | null {\n return this.record(kind, data, opts);\n }\n\n private record<T>(kind: EventKind, data: T, opts: EmitOptions): OffscriptEvent<T> | null {\n const t0 = typeof performance !== \"undefined\" ? performance.now() : 0;\n try {\n const session = this.sessions.session;\n const transport = this.transport;\n if (!this.accepting || !session || !transport) return null;\n const priority: Priority = opts.priority ?? \"normal\";\n if (!transport.canAccept(priority)) {\n transport.noteDropped();\n this.metrics.dropped++;\n return null;\n }\n this.rrweb?.recoverIfNeeded();\n const sequence = this.sessions.nextSequence();\n const timestamp = opts.at ?? Date.now();\n const id = `${session.tabId}:${sequence}`;\n let payload: unknown = data;\n let relatedActionId: string | undefined;\n let relatedActionDeltaMs: number | undefined;\n\n if (kind === \"action\") {\n const action = { ...(data as object), id, sessionId: session.sessionId, executionId: session.executionId, sequence, timestamp } as RecordedAction;\n payload = action;\n this.recent.push({ id, t: timestamp });\n if (this.recent.length > 50) this.recent.shift();\n this.actionLog.push(action);\n if (this.actionLog.length > MAX_LOG) this.actionLog.shift();\n } else if (kind === \"http\" || kind === \"console\" || kind === \"error\" || kind === \"iframe\") {\n const rel = this.correlate(timestamp);\n relatedActionId = rel?.id;\n relatedActionDeltaMs = rel ? timestamp - rel.t : undefined;\n }\n\n const event: OffscriptEvent<T> = {\n id,\n kind,\n sessionId: session.sessionId,\n executionId: session.executionId,\n tabId: session.tabId,\n pageId: session.pageId,\n sequence,\n timestamp,\n relatedActionId,\n relatedActionDeltaMs,\n data: payload as T,\n };\n if (kind === \"context\") {\n this.contextLog.push(event);\n if (this.contextLog.length > 50) this.contextLog.shift();\n }\n this.eventCount++;\n transport.enqueue(event as OffscriptEvent);\n this.metrics.emitted++;\n if (this.config.debug) this.debug(\"event\", kind, sequence);\n return event;\n } catch (e) {\n this.debug(\"emit failed\", e);\n return null;\n } finally {\n if (t0) this.metrics.emitMs += performance.now() - t0;\n }\n }\n\n private correlate(at: number): RecentAction | undefined {\n for (let i = this.recent.length - 1; i >= 0; i--) {\n const a = this.recent[i];\n if (a.t <= at) return at - a.t <= this.config.correlationWindowMs ? a : undefined;\n }\n return undefined;\n }\n\n // ------------------------------------------------------------------ internos\n private emitLifecycle(type: LifecycleEventData[\"type\"], detail: Record<string, unknown> = {}, priority: Priority = \"normal\"): void {\n this.record<LifecycleEventData>(\"lifecycle\", { type, detail }, { priority });\n }\n\n private attach(): void {\n this.lifecycle ??= new LifecycleManager({\n onPageHide: () => {\n if (!this.accepting) return;\n this.actions?.flushAll();\n this.emitLifecycle(\"page-end\", { url: this.sanitizer.sanitizeUrl(location.href) }, \"critical\");\n this.transport?.flushOnUnload();\n },\n onVisibility: (hidden) => {\n if (hidden && this.accepting) {\n this.actions?.flushAll();\n void this.transport?.flush();\n }\n },\n onConnectivity: (online) => this.transport?.setOnline(online),\n onNavigation: ({ from, to, kind }) => {\n if (!this.accepting) return;\n this.actions?.recordNavigation(from, to, kind);\n this.emitLifecycle(\"navigation\", { from: this.sanitizer.sanitizeUrl(from), to: this.sanitizer.sanitizeUrl(to), kind }, \"critical\");\n this.context?.record(\"navigation\");\n },\n });\n this.lifecycle.install();\n this.transport?.setOnline(typeof navigator === \"undefined\" ? true : navigator.onLine !== false);\n }\n\n private async startRecorders(): Promise<void> {\n this.ensureControls();\n const r = this.config.recording;\n const list: Recorder[] = [];\n // rrweb primeiro: o FullSnapshot precisa abrir a página no replay.\n if (r.rrweb) list.push((this.rrweb = new RRWebRecorder(this)));\n if (r.context) list.push((this.context = new ContextRecorder(this, () => ({ platformId: this.config.platformId, testCaseId: this.sessions.session!.testCaseId, executionId: this.sessions.session!.executionId }))));\n if (r.actions) list.push((this.actions = new ActionRecorder(this)));\n if (r.http) list.push(new HTTPRecorder(this, this.config.apiUrl));\n if (r.console || r.errors) list.push(new ErrorRecorder(this));\n if (r.iframes) list.push(new IframeRecorder(this));\n this.recorders = list;\n for (const rec of list) {\n try {\n await rec.start();\n } catch (e) {\n // Falha de um recorder nunca derruba a sessão nem a aplicação hospedeira.\n this.emitLifecycle(\"recorder-error\", { recorder: rec.name, message: String((e as Error)?.message ?? e) });\n this.bus.emit(\"error\", e as Error);\n }\n }\n }\n\n private stopRecorders(): void {\n for (const r of this.recorders.splice(0).reverse()) safe(() => r.stop());\n this.rrweb = this.actions = this.context = undefined;\n }\n\n private ensureControls(): void {\n if (!this.config.controls || typeof document === \"undefined\" || !this.sessions.hasTokenAvailable()) return;\n safe(() => {\n this.controls ??= new RecordingControls(this);\n this.controls.mount();\n });\n }\n\n private async teardown(): Promise<void> {\n this.accepting = false;\n this.stopRecorders();\n this.sessions.stopHeartbeat();\n this.lifecycle?.uninstall();\n this.lifecycle = undefined;\n this.transport?.stop();\n }\n\n private onHeartbeat(status: \"active\" | \"disabled\" | \"expired\"): void {\n if (status === \"disabled\") void this.shutdownRemote(new SessionDisabledError());\n else if (status === \"expired\") void this.onFatal(new SessionExpiredError());\n }\n\n /** Backend desativou a gravação: encerra com flush de melhor esforço. */\n private async shutdownRemote(err: SessionDisabledError): Promise<void> {\n if (this.status !== \"recording\" && this.status !== \"paused\") return;\n this.accepting = false;\n this.stopRecorders();\n this.sessions.stopHeartbeat();\n const session = this.sessions.session;\n await this.transport?.flushFinal(3000).catch(() => undefined);\n this.transport?.stop();\n this.lifecycle?.uninstall();\n this.sessions.clearPersisted();\n this.sessions.reset();\n this.setStatus(\"stopped\");\n this.bus.emit(\"disabled\", { reason: err.message });\n if (session) this.bus.emit(\"sessionEnd\", { sessionId: session.sessionId, flushed: false, pendingEvents: this.transport?.pending ?? 0, completed: false });\n }\n\n private async onFatal(err: AuthError | SessionExpiredError): Promise<void> {\n if (this.status === \"error\" || this.status === \"stopped\") return;\n await this.teardown();\n this.sessions.clearPersisted();\n this.sessions.reset();\n this.fail(err);\n }\n\n private fail(e: unknown): void {\n const err = e instanceof Error ? e : new Error(String(e));\n this.lastError = { code: (err as OffscriptError).code ?? \"INTERNAL\", message: err.message };\n this.setStatus(\"error\");\n this.bus.emit(\"error\", err);\n }\n\n private setStatus(to: RecordingStatus): void {\n const from = this.status;\n if (from === to) return;\n this.status = to;\n this.bus.emit(\"statusChange\", { from, to });\n }\n\n private debug(...args: unknown[]): void {\n if (this.config.debug) console.debug(\"[offscript]\", ...args);\n }\n\n static readonly version = SDK_VERSION;\n}\n\n"]}