@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,4 +1,4 @@
1
- export type OffscriptErrorCode = "CONFIG_INVALID" | "AUTH_FAILED" | "SESSION_EXPIRED" | "SESSION_DISABLED" | "INVALID_STATE" | "TRANSPORT_FAILED" | "PAYLOAD_TOO_LARGE" | "NOT_SUPPORTED" | "INTERNAL";
1
+ export type OffscriptErrorCode = "CONFIG_INVALID" | "INVALID_STATE" | "TRANSPORT_FAILED" | "PAYLOAD_TOO_LARGE" | "NOT_SUPPORTED" | "INTERNAL";
2
2
  export declare class OffscriptError extends Error {
3
3
  readonly code: OffscriptErrorCode;
4
4
  readonly status?: number;
@@ -11,26 +11,9 @@ export declare class OffscriptError extends Error {
11
11
  export declare class ConfigError extends OffscriptError {
12
12
  constructor(message: string);
13
13
  }
14
- export declare class AuthError extends OffscriptError {
15
- constructor(message: string, status?: number);
16
- }
17
- export declare class SessionExpiredError extends OffscriptError {
18
- constructor(message?: string);
19
- }
20
- export declare class SessionDisabledError extends OffscriptError {
21
- constructor(message?: string);
22
- }
23
14
  export declare class InvalidStateError extends OffscriptError {
24
15
  constructor(message: string);
25
16
  }
26
- export declare class TransportError extends OffscriptError {
27
- readonly retryable: boolean;
28
- constructor(message: string, opts: {
29
- status?: number;
30
- retryable: boolean;
31
- cause?: unknown;
32
- });
33
- }
34
17
  /** Emissor tipado mínimo. */
35
18
  export declare class Emitter<M extends Record<string, unknown>> {
36
19
  private handlers;
@@ -1,56 +1,7 @@
1
- # Contrato da API Offscript (SDK ↔ backend)
1
+ # Envio final
2
2
 
3
- Todos os endpoints exigem `Authorization: Bearer <sessionToken>` (token de curta duração, escopo: plataforma + execução + sessão). A aplicação pode entregar esse token ao SDK em `?offscript_token=` na URL inicial; o SDK o captura, remove o parâmetro da barra de endereço e o reutiliza em todas as chamadas, inclusive `/complete`. Respostas em JSON. CORS: o backend deve permitir os headers `Authorization, Content-Type, Content-Encoding, Idempotency-Key, X-Offscript-Sdk` (um `*` **não** cobre `Authorization`).
3
+ O SDK grava localmente. `complete({ endpoint, token })` encerra a captura e faz um POST ao endpoint informado pelo host, com JSON e `Authorization: Bearer <token>`.
4
4
 
5
- | Método | Caminho | Finalidade |
6
- |---|---|---|
7
- | POST | `/sdk/sessions` | Cria (ou obtém, idempotente por `executionId`) a sessão |
8
- | POST | `/sdk/sessions/{id}/events` | Recebe um lote de eventos |
9
- | POST | `/sdk/sessions/{id}/heartbeat` | Mantém a sessão viva; informa desativação remota |
10
- | POST | `/sdk/sessions/{id}/complete` | Encerra a sessão |
11
- | GET | `/sdk/sessions/{id}/status` | Estado da sessão (usado ao retomar após reload) |
5
+ Campos: `recording` é a lista de envelopes não HTTP, incluindo rrweb; `request` contém envelopes HTTP; `regression` descreve condições iniciais e passos Playwright. IDs do domínio não são enviados. A autorização e a associação do token pertencem ao destinatário.
12
6
 
13
- ## POST /sdk/sessions
14
- Request: `{ platformId, testCaseId, executionId, tabId, sdkVersion, appVersion?, context }`
15
-
16
- Response `200`:
17
- ```json
18
- { "sessionId": "ses_1", "recording": { "enabled": true, "reason": null },
19
- "expiresAt": 1790000000000, "heartbeatIntervalMs": 30000,
20
- "sessionToken": "(opcional) token renovado",
21
- "limits": { "maxBatchBytes": 524288, "maxBatchEvents": 200 } }
22
- ```
23
- Se `recording.enabled = false` o SDK **não grava** e lança `SessionDisabledError`.
24
- O backend deve validar que a plataforma, o caso de teste e a execução pertencem ao escopo do token.
25
-
26
- ## POST /sdk/sessions/{id}/events
27
- Headers: `Idempotency-Key: <batchId>`; opcionalmente `Content-Encoding: gzip` (se `transport.compress`).
28
-
29
- Body (`EventBatch`):
30
- ```json
31
- { "schemaVersion": "1.0", "batchId": "ses_1.tab_x.1-200.200", "sessionId": "ses_1",
32
- "executionId": "exec", "tabId": "tab_x", "sequenceStart": 1, "sequenceEnd": 200,
33
- "createdAt": 1790000000000, "sdkVersion": "0.1.0", "events": [ /* OffscriptEvent */ ] }
34
- ```
35
- Response `200`: `{ "batchId": "...", "accepted": 200, "duplicate": false, "persistedThrough": 200 }`
36
-
37
- Requisitos do backend:
38
- - **Idempotência**: deduplicar por `event.id` (e/ou `batchId`). Reenvios devem responder `200` com `duplicate: true`. O SDK reenvia lotes que não recebeu ACK, inclusive após reload e após o envio `keepalive` do encerramento da página.
39
- - **Ordenação lógica**: chunk por `(sessionId, tabId, sequenceStart)`; a ordem canônica é `(tabId, sequence)`; eventos podem chegar fora de ordem.
40
- - Armazenar em múltiplos chunks (um registro por lote), nunca um JSON único por sessão.
41
- - Códigos: `401/403` → `AuthError` (SDK para e vai para `error`); `410` → `SessionExpiredError`; `413` → o SDK divide o lote e reenvia; `408/429/5xx` e falhas de rede → retry com backoff exponencial + jitter (respeita `Retry-After`); outros `4xx` não são reenviados.
42
- - Rate limiting e validação de payload (`schemaVersion`, tamanhos, sequências) são responsabilidade do backend.
43
-
44
- ## POST /sdk/sessions/{id}/heartbeat
45
- Request: `{ tabId, pageId, status, pending, lastSequence }` → Response: `{ "status": "active" | "disabled" | "expired", "sessionToken"?, "expiresAt"? }`.
46
- `disabled` = desativação remota: o SDK faz flush de melhor esforço, para e emite `disabled`. `expired` → `SessionExpiredError`.
47
-
48
- ## POST /sdk/sessions/{id}/complete
49
- Request: `{ tabId, lastSequence, eventCount, pages }` → Response: `{ "completed": true }`.
50
-
51
- ## GET /sdk/sessions/{id}/status
52
- Response: `{ "status": "active" | "disabled" | "expired", "sessionToken"?, "expiresAt"? }`.
53
-
54
- ## Retenção / LGPD
55
- - Local: eventos não confirmados ficam no IndexedDB até o ACK ou até `privacy.localRetentionMs` (24 h por padrão); ao encerrar com sucesso o buffer da sessão é apagado.
56
- - Servidor: a política de retenção, base legal e direito de exclusão são do backend; o SDK só envia dados já sanitizados e permite desativação remota via `recording.enabled`/`heartbeat`.
7
+ Não existem requisições antes da finalização. Falhas HTTP rejeitam a promise e preservam o payload. Uma nova tentativa depende de outra chamada explícita. Após sucesso, a mesma instância retorna a resposta sem repetir o POST. Respostas de sucesso podem conter JSON, texto ou corpo vazio. A confirmação do HTTP de sucesso impede reenvio, independentemente do formato da resposta. Para destinos de outra origem, o servidor deve aceitar o preflight CORS para POST, Authorization e Content-Type.
@@ -1,38 +1,9 @@
1
- # Decisões de arquitetura
1
+ # Arquitetura
2
2
 
3
- ## Contexto do repositório
4
- O repositório `soffact/offscript-sdk` estava **vazio** (nenhum painel, backend, tabela, endpoint ou player). Portanto:
5
- - o SDK foi criado como pacote independente (`packages/offscript-sdk`), sem acoplamento a framework;
6
- - não existe backend a reutilizar: os contratos HTTP estão em [api-contract.md](./api-contract.md) e há um **servidor de referência** (`tests/helpers/referenceServer.ts`) que implementa esse contrato para testar o cliente de ponta a ponta. Ele **não** substitui o backend real da Offscript, que precisa implementar o mesmo contrato.
3
+ `Offscript` coordena o ciclo de captura e mantém envelopes em memória. Os recorders capturam rrweb, ações, HTTP, console/erros, contexto e iframes por meio de `EventSink`. `DataSanitizer` aplica as opções de privacidade. `LifecycleManager` observa navegação SPA e mudanças de visibilidade sem enviar dados.
7
4
 
8
- ## Dois fluxos independentes
9
- ```
10
- Session Manager + autorização
11
- ├─ Visual Recorder (rrweb: DOM, snapshots, mutações) → replay histórico
12
- ├─ Semantic Recorder (ações + seletores + contexto) → Playwright futuro
13
- ├─ Observability (HTTP, console, erros, iframes)
14
- └─ Event Transport → API Offscript (lotes idempotentes, IndexedDB, retry)
15
- ```
16
- - `RRWebRecorder` nunca produz ações; `ActionRecorder` nunca lê eventos rrweb. Ambos só falam com o núcleo via `EventSink.emit(kind, data)`.
17
- - Eventos brutos (`action`) ≠ passos normalizados (`ActionNormalizer`) ≠ contrato Playwright (`PlaywrightDataContract`). A normalização é função pura e roda fora do caminho de captura (no navegador via `exportPlaywrightData()` ou no backend com `buildPlaywrightContract`).
5
+ Ao finalizar, todos os recorders são parados. O núcleo monta o payload e o contrato Playwright. O host fornece destino e token a `complete`. O overlay usa `startRecording`, pausa/retomada, descarte e o callback `onComplete` do host. `stopRecording` permite obter o payload sem rede.
18
6
 
19
- ## Envelope e ordenação
20
- Todo evento tem `(sessionId, tabId, sequence, timestamp, pageId)`. A sequência é monotônica **por aba**, persistida em `sessionStorage` a cada evento, e continua entre páginas (MPA). O `id` do evento é `${tabId}:${sequence}` — determinístico, o que torna reenvios idempotentes. Entre abas a ordenação é por `timestamp`.
7
+ A persistência local é opcional, habilitada por `persistenceKey` fornecida pelo host. `RecordingStore` guarda status e eventos incrementalmente no IndexedDB. Ao sair do documento, um checkpoint síncrono no sessionStorage preserva a cauda ainda não confirmada. Na próxima página, o SDK recupera esse checkpoint, restaura os dados e retoma o estado anterior com um novo identificador de página e snapshot rrweb. Não há comunicação com backend durante essa continuidade.
21
8
 
22
- ## Política multi-aba
23
- Cada aba grava de forma independente na **mesma sessão/execução**, com `tabId` e sequência próprios. O estado da sessão fica em `sessionStorage` (escopo de aba). Abas abertas por `window.open` herdam uma cópia do `sessionStorage`; quando `navigator.locks` existe, um Web Lock por `tabId` detecta o clone e atribui um novo `tabId`.
24
-
25
- ## Segurança por padrão
26
- - Token de sessão de **curta duração**, emitido pelo backend; o SDK nunca recebe chaves administrativas. O token vai em `Authorization: Bearer` com `credentials: "omit"`.
27
- - Sanitização **antes** de qualquer persistência (IndexedDB) ou envio — inclusive atributos de URL e textos dentro dos eventos rrweb.
28
- - Valores digitados viram `valueRef` (referência opaca com sal por aba), exceto campos na allowlist (`data-offscript-allow`). Senhas nunca.
29
- - Bodies HTTP desligados por padrão.
30
-
31
- ## Transporte
32
- - Fila em memória (staging) → IndexedDB (`PersistentBuffer`, com fallback para memória) → lotes por aba.
33
- - Um evento só sai do buffer depois do ACK do backend (`200` com o `batchId`).
34
- - Backpressure por prioridade: `low` (mousemove, scroll, console) é descartado antes de `normal` e `critical` (snapshots rrweb, lifecycle). Se incrementais do rrweb forem descartados, o SDK força novo snapshot completo assim que houver folga.
35
- - Encerramento da página: `pagehide` → evento `page-end` + `fetch(..., {keepalive:true})` do que ainda está em staging (≤ 60 KB). **Não há ACK nesse caminho**; os eventos continuam no IndexedDB e são reenviados na próxima página (idempotente). `sendBeacon` não é usado porque não permite o header `Authorization`.
36
-
37
- ## Carregamento sob demanda
38
- `rrweb` é carregado com `import("rrweb")` apenas quando `recording.rrweb` está ligado; o pacote tem `sideEffects: false` e entradas separadas para adaptadores e para o contrato Playwright.
9
+ O host mantém o token separadamente na aba; o armazenamento do SDK não recebe credenciais. Sucesso no envio e descarte limpam o rascunho. `destroy` apenas fecha os recursos. Sem `persistenceKey`, o comportamento permanece em memória.
@@ -1,26 +1,5 @@
1
- # Contrato de eventos (schemaVersion 1.0)
1
+ # Eventos locais
2
2
 
3
- Envelope (`OffscriptEvent`): `id`, `kind`, `sessionId`, `executionId`, `tabId`, `pageId`, `sequence`, `timestamp`, `relatedActionId?`, `relatedActionDeltaMs?`, `data`.
3
+ Cada envelope possui `id`, `kind`, `tabId`, `pageId`, `sequence`, `timestamp` e `data`. A sequência é monotônica dentro da gravação. HTTP, console, erros e iframes podem conter `relatedActionId` e `relatedActionDeltaMs` para correlação temporal.
4
4
 
5
- `relatedActionId` liga `http`, `console`, `error` e `iframe` à ação mais recente do usuário dentro de `correlationWindowMs` (3 s por padrão). Para `http`, o `timestamp` é o **início** da requisição.
6
-
7
- | kind | `data` | Observações |
8
- |---|---|---|
9
- | `rrweb` | evento rrweb nativo (`type`: 2 snapshot, 3 incremental, 4 meta…) | URLs em atributos e textos sensíveis redigidos. Um `type 2` abre cada página. |
10
- | `action` | `RecordedAction` | `schemaVersion` próprio (`ACTION_SCHEMA_VERSION`), `sequence` = sequência do envelope |
11
- | `http` | `HttpEventData` | um evento por requisição, na conclusão |
12
- | `console` | `ConsoleEventData` | níveis configuráveis; argumentos serializados e sanitizados |
13
- | `error` | `ErrorEventData` | `window.onerror`, `unhandledrejection`, falha de recurso |
14
- | `context` | `ContextEventData` | `reason`: `page-load`, `viewport`, `navigation`… |
15
- | `iframe` | `IframeEventData` | presença/geometria/foco; **sem** conteúdo interno |
16
- | `lifecycle` | `LifecycleEventData` | `session-start/resume`, `page-start/end`, `pause/resume`, `stop`, `navigation`, `recorder-error` |
17
-
18
- Tipos completos: `src/types/events.ts`. Alterações compatíveis (campos opcionais novos) mantêm `1.x`; remoção/renomeação exige `2.0`.
19
-
20
- ## Ações (`RecordedAction.type`)
21
- `click`, `dblclick`, `hover` (`payload.phase`: enter/leave), `mousemove` (trajetória amostrada; desligado por padrão), `drag`, `input`, `keydown` (somente teclas relevantes: Enter, Esc, Tab, setas, F-keys, atalhos com Ctrl/Meta/Alt), `select`, `check`, `scroll` (from/to), `navigate`, `reload`, `focus`, `blur`.
22
-
23
- Valores de `input` **não** são gravados por padrão: `payload = { valueCaptured: false, valueRef, length, fieldType }`. Em campos com `data-offscript-allow` (ou seletor em `privacy.allowedInputSelectors`): `{ valueCaptured: true, value }`. Senhas nunca.
24
-
25
- ## Seletores
26
- `selector` é o primeiro candidato único na ordem: `testid` → `attribute` (name/data-id) → `role` (`role=button[name="Salvar"]`) → `label` → `placeholder` → `id` estável → `css` estrutural. Todos os candidatos são enviados em `selectorCandidates` com `unique`/`matches` no momento da ação. Classes geradas (CSS-in-JS, hashes) e ids dinâmicos são ignorados.
5
+ Tipos: `rrweb`, `action`, `http`, `console`, `error`, `context`, `iframe` e `lifecycle`. A tipagem canônica está em `src/types/events.ts`. Não há IDs do domínio. Os envelopes HTTP compõem `request`; os demais compõem `recording`. O player obtém o evento rrweb de `envelope.data`.
@@ -1,39 +1,5 @@
1
- # Playwright Data Contract (v1.0)
1
+ # Contrato Playwright
2
2
 
3
- O SDK **não executa Playwright**. Ele produz, a partir das ações gravadas, um documento versionado para um serviço externo converter em testes. Uma reprodução bem-sucedida **não** significa aprovação: as assertions pertencem aos casos de teste no painel.
3
+ `buildPlaywrightContract({ actions, contexts, extensions })` produz um contrato versionado `offscript.playwright-recording`, com versão do SDK, data de geração, condições iniciais, passos, estatísticas e limitações. Não exige identidade de backend.
4
4
 
5
- ```ts
6
- import { buildPlaywrightContract, validatePlaywrightContract } from "@offscript/sdk/playwright"; // sem puxar o runtime de gravação
7
- const contract = buildPlaywrightContract({ session, actions, contexts }); // backend ou navegador
8
- validatePlaywrightContract(contract); // [] = válido
9
- // ou, no navegador, com as ações da página atual:
10
- offscript.exportPlaywrightData();
11
- ```
12
-
13
- ```jsonc
14
- {
15
- "contractVersion": "1.0", "kind": "offscript.playwright-recording",
16
- "session": { "sessionId", "executionId", "testCaseId", "platformId" },
17
- "initialConditions": { "url", "viewport", "userAgent", "language", "timezone", "deviceScaleFactor", "browser" },
18
- "steps": [{
19
- "index": 0, "type": "click|dblclick|fill|press|select|check|uncheck|hover|drag|scroll|navigate|reload",
20
- "timestamp": 1790000000000, "waitBeforeMs": 420, "url": "…",
21
- "selector": "role=button[name=\"Salvar\"]", "selectorUnique": true,
22
- "selectorCandidates": [{ "strategy": "testid", "selector": "[data-testid=\"save\"]", "unique": true, "matches": 1 }],
23
- "element": { "tag": "button", "role": "button", "name": "Salvar", "testId": "save" },
24
- "args": { "value": "…" } /* ou { "valueRef", "valueCaptured": false } */,
25
- "expectsNavigation": { "to": "https://app/x" },
26
- "sourceActionIds": ["tab_x:12"], "causedByActionId": "…"
27
- }],
28
- "stats": { "rawActions": 40, "steps": 14, "merged": 26 },
29
- "limitations": ["…"], "extensions": {}
30
- }
31
- ```
32
-
33
- ## Normalização (`ActionNormalizer`)
34
- `click,click,dblclick` → `dblclick` · `click` + `check` → `check/uncheck` · vários `input` no mesmo campo → um `fill` · `keydown` → `press` (`Control+s`) · scrolls consecutivos → um `scroll` · `navigate` logo após um clique/Enter → `expectsNavigation` do passo causador · `focus`, `blur`, `mousemove` e `hover` isolado são descartados (permanecem nos eventos brutos). Cada passo mantém `sourceActionIds` para rastreabilidade.
35
-
36
- ## O que o motor externo deve fazer
37
- Resolver seletores (tentando `selectorCandidates` em ordem), pedir valores para `valueRef` (campos não autorizados não são reproduzíveis), aplicar esperas inteligentes (`waitBeforeMs` é só dica), validar assertions do caso de teste e produzir o resultado de regressão.
38
-
39
- Versionamento: `contractVersion` `MAJOR.MINOR`; `validatePlaywrightContract` recusa `MAJOR` diferente.
5
+ `normalizeActions` consolida ações em passos. Cada passo preserva os IDs das ações de origem para correlação. `validatePlaywrightContract` valida estrutura e ordem. O SDK descreve passos; não executa Playwright nem determina aprovação do teste. A tipagem canônica está em `src/playwright/PlaywrightDataContract.ts`.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@offscript/sdk",
3
- "version": "0.1.2",
4
- "description": "Offscript SDK - gravação de sessões de teste QA (rrweb, ações, rede, erros)",
3
+ "version": "0.1.5",
4
+ "description": "Offscript SDK - grava\u00e7\u00e3o de sess\u00f5es de teste QA (rrweb, a\u00e7\u00f5es, rede, erros)",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "sideEffects": false,
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/adapters/vanilla.ts"],"names":[],"mappings":";;;AAKA,eAAsB,gBAAgB,MAAA,EAA6C;AACjF,EAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,MAAM,CAAA;AAChC,EAAA,MAAM,IAAI,IAAA,EAAK;AACf,EAAA,OAAO,GAAA;AACT;AAEA,eAAsB,cAAA,CAAe,QAAyB,KAAA,EAAkD;AAC9G,EAAA,MAAM,GAAA,GAAM,MAAM,eAAA,CAAgB,MAAM,CAAA;AACxC,EAAA,MAAM,GAAA,CAAI,eAAe,KAAK,CAAA;AAC9B,EAAA,OAAO,GAAA;AACT","file":"chunk-HECPMGDC.js","sourcesContent":["import { Offscript } from \"../core/OffscriptSDK\";\nimport type { OffscriptConfig } from \"../types/config\";\nimport type { StartRecordingOptions } from \"../types/session\";\n\n/** Atalho para aplicações JS tradicionais, Blade e MPA: inicializa e retoma sessões persistidas. */\nexport async function createOffscript(config: OffscriptConfig): Promise<Offscript> {\n const sdk = new Offscript(config);\n await sdk.init();\n return sdk;\n}\n\nexport async function startOffscript(config: OffscriptConfig, start: StartRecordingOptions): Promise<Offscript> {\n const sdk = await createOffscript(config);\n await sdk.startRecording(start);\n return sdk;\n}\n"]}