@offscript/sdk 0.1.5 → 0.1.6
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.
- package/README.md +10 -20
- package/dist/adapters/nuxt.cjs +3 -3
- package/dist/adapters/nuxt.js +2 -2
- package/dist/adapters/vanilla.cjs +5 -5
- package/dist/adapters/vanilla.js +3 -3
- package/dist/adapters/vue.cjs +3 -3
- package/dist/adapters/vue.js +2 -2
- package/dist/{chunk-XBXFGCUT.js → chunk-5ZBR6FI5.js} +88 -9
- package/dist/chunk-5ZBR6FI5.js.map +1 -0
- package/dist/{chunk-6ROP37WI.js → chunk-KHKIWCLM.js} +3 -3
- package/dist/{chunk-6ROP37WI.js.map → chunk-KHKIWCLM.js.map} +1 -1
- package/dist/{chunk-HPDLEAAL.cjs → chunk-MZXF2LF2.cjs} +3 -3
- package/dist/{chunk-HPDLEAAL.cjs.map → chunk-MZXF2LF2.cjs.map} +1 -1
- package/dist/{chunk-VYCDQLP7.cjs → chunk-PCJRHW66.cjs} +93 -14
- package/dist/chunk-PCJRHW66.cjs.map +1 -0
- package/dist/{chunk-V2YYWGIA.js → chunk-R2PPPR4K.js} +3 -3
- package/dist/{chunk-V2YYWGIA.js.map → chunk-R2PPPR4K.js.map} +1 -1
- package/dist/{chunk-2MY2FWIA.cjs → chunk-RAUSXUGS.cjs} +4 -4
- package/dist/{chunk-2MY2FWIA.cjs.map → chunk-RAUSXUGS.cjs.map} +1 -1
- package/dist/core/OffscriptSDK.d.ts +10 -2
- package/dist/index.cjs +20 -20
- package/dist/index.js +3 -3
- package/dist/playwright.cjs +13 -13
- package/dist/playwright.js +1 -1
- package/dist/types/config.d.ts +5 -2
- package/dist/types/events.d.ts +1 -1
- package/dist/types/recording.d.ts +2 -2
- package/docs/api-contract.md +1 -1
- package/docs/architecture.md +3 -3
- package/package.json +1 -1
- package/dist/chunk-VYCDQLP7.cjs.map +0 -1
- package/dist/chunk-XBXFGCUT.js.map +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkPCJRHW66_cjs = require('./chunk-PCJRHW66.cjs');
|
|
4
4
|
|
|
5
5
|
// src/adapters/vanilla.ts
|
|
6
6
|
async function createOffscript(config) {
|
|
7
|
-
const sdk = new
|
|
7
|
+
const sdk = new chunkPCJRHW66_cjs.Offscript(config);
|
|
8
8
|
await sdk.init();
|
|
9
9
|
return sdk;
|
|
10
10
|
}
|
|
@@ -16,5 +16,5 @@ async function startOffscript(config) {
|
|
|
16
16
|
|
|
17
17
|
exports.createOffscript = createOffscript;
|
|
18
18
|
exports.startOffscript = startOffscript;
|
|
19
|
-
//# sourceMappingURL=chunk-
|
|
20
|
-
//# sourceMappingURL=chunk-
|
|
19
|
+
//# sourceMappingURL=chunk-RAUSXUGS.cjs.map
|
|
20
|
+
//# sourceMappingURL=chunk-RAUSXUGS.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/vanilla.ts"],"names":["Offscript"],"mappings":";;;;;AAIA,eAAsB,gBAAgB,MAAA,EAA6C;AACjF,EAAA,MAAM,GAAA,GAAM,IAAIA,2BAAA,CAAU,MAAM,CAAA;AAChC,EAAA,MAAM,IAAI,IAAA,EAAK;AACf,EAAA,OAAO,GAAA;AACT;AAEA,eAAsB,eAAe,MAAA,EAA6C;AAChF,EAAA,MAAM,GAAA,GAAM,MAAM,eAAA,CAAgB,MAAM,CAAA;AACxC,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,OAAO,GAAA;AACT","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/adapters/vanilla.ts"],"names":["Offscript"],"mappings":";;;;;AAIA,eAAsB,gBAAgB,MAAA,EAA6C;AACjF,EAAA,MAAM,GAAA,GAAM,IAAIA,2BAAA,CAAU,MAAM,CAAA;AAChC,EAAA,MAAM,IAAI,IAAA,EAAK;AACf,EAAA,OAAO,GAAA;AACT;AAEA,eAAsB,eAAe,MAAA,EAA6C;AAChF,EAAA,MAAM,GAAA,GAAM,MAAM,eAAA,CAAgB,MAAM,CAAA;AACxC,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,OAAO,GAAA;AACT","file":"chunk-RAUSXUGS.cjs","sourcesContent":["import { Offscript } from \"../core/OffscriptSDK\";\nimport type { OffscriptConfig } from \"../types/config\";\n\n/** Atalho para aplicações JS tradicionais, Blade e MPA: inicializa a captura local. */\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): Promise<Offscript> {\n const sdk = await createOffscript(config);\n await sdk.startRecording();\n return sdk;\n}\n"]}
|
|
@@ -14,7 +14,7 @@ export type OffscriptEventMap = {
|
|
|
14
14
|
recordingEnd: RecordingPayload;
|
|
15
15
|
};
|
|
16
16
|
export declare class Offscript implements EventSink {
|
|
17
|
-
static readonly version = "0.1.
|
|
17
|
+
static readonly version = "0.1.6";
|
|
18
18
|
readonly config: ResolvedConfig;
|
|
19
19
|
readonly sanitizer: DataSanitizer;
|
|
20
20
|
private readonly bus;
|
|
@@ -44,10 +44,18 @@ export declare class Offscript implements EventSink {
|
|
|
44
44
|
private payload?;
|
|
45
45
|
private submitted;
|
|
46
46
|
private response;
|
|
47
|
+
private launchToken?;
|
|
48
|
+
private launchTokenChanged;
|
|
47
49
|
constructor(config?: OffscriptConfig);
|
|
48
50
|
getState(): OffscriptState;
|
|
49
51
|
capturesSensitiveValues(): boolean;
|
|
50
52
|
init(): Promise<void>;
|
|
53
|
+
private initialize;
|
|
54
|
+
private resolveLaunchToken;
|
|
55
|
+
private getOrCreateDraftKey;
|
|
56
|
+
private readSessionValue;
|
|
57
|
+
private writeSessionValue;
|
|
58
|
+
private removeSessionValue;
|
|
51
59
|
private initializeDraft;
|
|
52
60
|
private restoreDraft;
|
|
53
61
|
private save;
|
|
@@ -57,7 +65,7 @@ export declare class Offscript implements EventSink {
|
|
|
57
65
|
resumeRecording(): Promise<void>;
|
|
58
66
|
stopRecording(): Promise<RecordingPayload>;
|
|
59
67
|
private doStop;
|
|
60
|
-
complete(options
|
|
68
|
+
complete(options?: CompleteOptions): Promise<unknown>;
|
|
61
69
|
private doComplete;
|
|
62
70
|
finishRecording(): Promise<unknown>;
|
|
63
71
|
discardRecording(): Promise<void>;
|
package/dist/index.cjs
CHANGED
|
@@ -1,78 +1,78 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var chunkRAUSXUGS_cjs = require('./chunk-RAUSXUGS.cjs');
|
|
4
|
+
var chunkPCJRHW66_cjs = require('./chunk-PCJRHW66.cjs');
|
|
5
|
+
var chunkMZXF2LF2_cjs = require('./chunk-MZXF2LF2.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
Object.defineProperty(exports, "createOffscript", {
|
|
10
10
|
enumerable: true,
|
|
11
|
-
get: function () { return
|
|
11
|
+
get: function () { return chunkRAUSXUGS_cjs.createOffscript; }
|
|
12
12
|
});
|
|
13
13
|
Object.defineProperty(exports, "startOffscript", {
|
|
14
14
|
enumerable: true,
|
|
15
|
-
get: function () { return
|
|
15
|
+
get: function () { return chunkRAUSXUGS_cjs.startOffscript; }
|
|
16
16
|
});
|
|
17
17
|
Object.defineProperty(exports, "ConfigError", {
|
|
18
18
|
enumerable: true,
|
|
19
|
-
get: function () { return
|
|
19
|
+
get: function () { return chunkPCJRHW66_cjs.ConfigError; }
|
|
20
20
|
});
|
|
21
21
|
Object.defineProperty(exports, "DEFAULT_PRIVACY", {
|
|
22
22
|
enumerable: true,
|
|
23
|
-
get: function () { return
|
|
23
|
+
get: function () { return chunkPCJRHW66_cjs.DEFAULT_PRIVACY; }
|
|
24
24
|
});
|
|
25
25
|
Object.defineProperty(exports, "DEFAULT_RECORDING", {
|
|
26
26
|
enumerable: true,
|
|
27
|
-
get: function () { return
|
|
27
|
+
get: function () { return chunkPCJRHW66_cjs.DEFAULT_RECORDING; }
|
|
28
28
|
});
|
|
29
29
|
Object.defineProperty(exports, "DataSanitizer", {
|
|
30
30
|
enumerable: true,
|
|
31
|
-
get: function () { return
|
|
31
|
+
get: function () { return chunkPCJRHW66_cjs.DataSanitizer; }
|
|
32
32
|
});
|
|
33
33
|
Object.defineProperty(exports, "InvalidStateError", {
|
|
34
34
|
enumerable: true,
|
|
35
|
-
get: function () { return
|
|
35
|
+
get: function () { return chunkPCJRHW66_cjs.InvalidStateError; }
|
|
36
36
|
});
|
|
37
37
|
Object.defineProperty(exports, "Offscript", {
|
|
38
38
|
enumerable: true,
|
|
39
|
-
get: function () { return
|
|
39
|
+
get: function () { return chunkPCJRHW66_cjs.Offscript; }
|
|
40
40
|
});
|
|
41
41
|
Object.defineProperty(exports, "OffscriptError", {
|
|
42
42
|
enumerable: true,
|
|
43
|
-
get: function () { return
|
|
43
|
+
get: function () { return chunkPCJRHW66_cjs.OffscriptError; }
|
|
44
44
|
});
|
|
45
45
|
Object.defineProperty(exports, "ACTION_SCHEMA_VERSION", {
|
|
46
46
|
enumerable: true,
|
|
47
|
-
get: function () { return
|
|
47
|
+
get: function () { return chunkMZXF2LF2_cjs.ACTION_SCHEMA_VERSION; }
|
|
48
48
|
});
|
|
49
49
|
Object.defineProperty(exports, "PLAYWRIGHT_CONTRACT_VERSION", {
|
|
50
50
|
enumerable: true,
|
|
51
|
-
get: function () { return
|
|
51
|
+
get: function () { return chunkMZXF2LF2_cjs.PLAYWRIGHT_CONTRACT_VERSION; }
|
|
52
52
|
});
|
|
53
53
|
Object.defineProperty(exports, "SCHEMA_VERSION", {
|
|
54
54
|
enumerable: true,
|
|
55
|
-
get: function () { return
|
|
55
|
+
get: function () { return chunkMZXF2LF2_cjs.SCHEMA_VERSION; }
|
|
56
56
|
});
|
|
57
57
|
Object.defineProperty(exports, "SDK_VERSION", {
|
|
58
58
|
enumerable: true,
|
|
59
|
-
get: function () { return
|
|
59
|
+
get: function () { return chunkMZXF2LF2_cjs.SDK_VERSION; }
|
|
60
60
|
});
|
|
61
61
|
Object.defineProperty(exports, "SelectorGenerator", {
|
|
62
62
|
enumerable: true,
|
|
63
|
-
get: function () { return
|
|
63
|
+
get: function () { return chunkMZXF2LF2_cjs.SelectorGenerator; }
|
|
64
64
|
});
|
|
65
65
|
Object.defineProperty(exports, "buildPlaywrightContract", {
|
|
66
66
|
enumerable: true,
|
|
67
|
-
get: function () { return
|
|
67
|
+
get: function () { return chunkMZXF2LF2_cjs.buildPlaywrightContract; }
|
|
68
68
|
});
|
|
69
69
|
Object.defineProperty(exports, "normalizeActions", {
|
|
70
70
|
enumerable: true,
|
|
71
|
-
get: function () { return
|
|
71
|
+
get: function () { return chunkMZXF2LF2_cjs.normalizeActions; }
|
|
72
72
|
});
|
|
73
73
|
Object.defineProperty(exports, "validatePlaywrightContract", {
|
|
74
74
|
enumerable: true,
|
|
75
|
-
get: function () { return
|
|
75
|
+
get: function () { return chunkMZXF2LF2_cjs.validatePlaywrightContract; }
|
|
76
76
|
});
|
|
77
77
|
//# sourceMappingURL=index.cjs.map
|
|
78
78
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { createOffscript, startOffscript } from './chunk-
|
|
2
|
-
export { ConfigError, DEFAULT_PRIVACY, DEFAULT_RECORDING, DataSanitizer, InvalidStateError, Offscript, OffscriptError } from './chunk-
|
|
3
|
-
export { ACTION_SCHEMA_VERSION, PLAYWRIGHT_CONTRACT_VERSION, SCHEMA_VERSION, SDK_VERSION, SelectorGenerator, buildPlaywrightContract, normalizeActions, validatePlaywrightContract } from './chunk-
|
|
1
|
+
export { createOffscript, startOffscript } from './chunk-R2PPPR4K.js';
|
|
2
|
+
export { ConfigError, DEFAULT_PRIVACY, DEFAULT_RECORDING, DataSanitizer, InvalidStateError, Offscript, OffscriptError } from './chunk-5ZBR6FI5.js';
|
|
3
|
+
export { ACTION_SCHEMA_VERSION, PLAYWRIGHT_CONTRACT_VERSION, SCHEMA_VERSION, SDK_VERSION, SelectorGenerator, buildPlaywrightContract, normalizeActions, validatePlaywrightContract } from './chunk-KHKIWCLM.js';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/playwright.cjs
CHANGED
|
@@ -1,56 +1,56 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkMZXF2LF2_cjs = require('./chunk-MZXF2LF2.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
Object.defineProperty(exports, "CONTRACT_LIMITATIONS", {
|
|
8
8
|
enumerable: true,
|
|
9
|
-
get: function () { return
|
|
9
|
+
get: function () { return chunkMZXF2LF2_cjs.CONTRACT_LIMITATIONS; }
|
|
10
10
|
});
|
|
11
11
|
Object.defineProperty(exports, "PLAYWRIGHT_CONTRACT_KIND", {
|
|
12
12
|
enumerable: true,
|
|
13
|
-
get: function () { return
|
|
13
|
+
get: function () { return chunkMZXF2LF2_cjs.PLAYWRIGHT_CONTRACT_KIND; }
|
|
14
14
|
});
|
|
15
15
|
Object.defineProperty(exports, "PLAYWRIGHT_CONTRACT_VERSION", {
|
|
16
16
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
17
|
+
get: function () { return chunkMZXF2LF2_cjs.PLAYWRIGHT_CONTRACT_VERSION; }
|
|
18
18
|
});
|
|
19
19
|
Object.defineProperty(exports, "SelectorGenerator", {
|
|
20
20
|
enumerable: true,
|
|
21
|
-
get: function () { return
|
|
21
|
+
get: function () { return chunkMZXF2LF2_cjs.SelectorGenerator; }
|
|
22
22
|
});
|
|
23
23
|
Object.defineProperty(exports, "accessibleName", {
|
|
24
24
|
enumerable: true,
|
|
25
|
-
get: function () { return
|
|
25
|
+
get: function () { return chunkMZXF2LF2_cjs.accessibleName; }
|
|
26
26
|
});
|
|
27
27
|
Object.defineProperty(exports, "buildPlaywrightContract", {
|
|
28
28
|
enumerable: true,
|
|
29
|
-
get: function () { return
|
|
29
|
+
get: function () { return chunkMZXF2LF2_cjs.buildPlaywrightContract; }
|
|
30
30
|
});
|
|
31
31
|
Object.defineProperty(exports, "implicitRole", {
|
|
32
32
|
enumerable: true,
|
|
33
|
-
get: function () { return
|
|
33
|
+
get: function () { return chunkMZXF2LF2_cjs.implicitRole; }
|
|
34
34
|
});
|
|
35
35
|
Object.defineProperty(exports, "isStableClass", {
|
|
36
36
|
enumerable: true,
|
|
37
|
-
get: function () { return
|
|
37
|
+
get: function () { return chunkMZXF2LF2_cjs.isStableClass; }
|
|
38
38
|
});
|
|
39
39
|
Object.defineProperty(exports, "isStableId", {
|
|
40
40
|
enumerable: true,
|
|
41
|
-
get: function () { return
|
|
41
|
+
get: function () { return chunkMZXF2LF2_cjs.isStableId; }
|
|
42
42
|
});
|
|
43
43
|
Object.defineProperty(exports, "labelText", {
|
|
44
44
|
enumerable: true,
|
|
45
|
-
get: function () { return
|
|
45
|
+
get: function () { return chunkMZXF2LF2_cjs.labelText; }
|
|
46
46
|
});
|
|
47
47
|
Object.defineProperty(exports, "normalizeActions", {
|
|
48
48
|
enumerable: true,
|
|
49
|
-
get: function () { return
|
|
49
|
+
get: function () { return chunkMZXF2LF2_cjs.normalizeActions; }
|
|
50
50
|
});
|
|
51
51
|
Object.defineProperty(exports, "validatePlaywrightContract", {
|
|
52
52
|
enumerable: true,
|
|
53
|
-
get: function () { return
|
|
53
|
+
get: function () { return chunkMZXF2LF2_cjs.validatePlaywrightContract; }
|
|
54
54
|
});
|
|
55
55
|
//# sourceMappingURL=playwright.cjs.map
|
|
56
56
|
//# sourceMappingURL=playwright.cjs.map
|
package/dist/playwright.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { CONTRACT_LIMITATIONS, PLAYWRIGHT_CONTRACT_KIND, PLAYWRIGHT_CONTRACT_VERSION, SelectorGenerator, accessibleName, buildPlaywrightContract, implicitRole, isStableClass, isStableId, labelText, normalizeActions, validatePlaywrightContract } from './chunk-
|
|
1
|
+
export { CONTRACT_LIMITATIONS, PLAYWRIGHT_CONTRACT_KIND, PLAYWRIGHT_CONTRACT_VERSION, SelectorGenerator, accessibleName, buildPlaywrightContract, implicitRole, isStableClass, isStableId, labelText, normalizeActions, validatePlaywrightContract } from './chunk-KHKIWCLM.js';
|
|
2
2
|
//# sourceMappingURL=playwright.js.map
|
|
3
3
|
//# sourceMappingURL=playwright.js.map
|
package/dist/types/config.d.ts
CHANGED
|
@@ -70,9 +70,11 @@ export interface OffscriptConfig {
|
|
|
70
70
|
privacy?: Partial<PrivacyConfig>;
|
|
71
71
|
correlationWindowMs?: number;
|
|
72
72
|
controls?: boolean;
|
|
73
|
-
/**
|
|
73
|
+
/** Endpoint that receives completed recordings. */
|
|
74
|
+
endpoint?: string;
|
|
75
|
+
/** Optional opaque key for a local draft; the SDK creates and stores one for tokenized sessions by default. */
|
|
74
76
|
persistenceKey?: string;
|
|
75
|
-
/**
|
|
77
|
+
/** Optional custom handler called by the overlay when the user finishes. */
|
|
76
78
|
onComplete?: () => Promise<unknown>;
|
|
77
79
|
}
|
|
78
80
|
export interface ResolvedConfig {
|
|
@@ -80,6 +82,7 @@ export interface ResolvedConfig {
|
|
|
80
82
|
privacy: PrivacyConfig;
|
|
81
83
|
correlationWindowMs: number;
|
|
82
84
|
controls: boolean;
|
|
85
|
+
endpoint?: string;
|
|
83
86
|
persistenceKey?: string;
|
|
84
87
|
onComplete?: () => Promise<unknown>;
|
|
85
88
|
}
|
package/dist/types/events.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const SCHEMA_VERSION = "1.0";
|
|
2
|
-
export declare const SDK_VERSION = "0.1.
|
|
2
|
+
export declare const SDK_VERSION = "0.1.6";
|
|
3
3
|
export type EventKind = "rrweb" | "action" | "http" | "console" | "error" | "context" | "iframe" | "lifecycle";
|
|
4
4
|
/** Envelope comum a todos os eventos. A ordem canônica é (tabId, sequence). */
|
|
5
5
|
export interface OffscriptEvent<T = unknown> {
|
package/docs/api-contract.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Envio final
|
|
2
2
|
|
|
3
|
-
O SDK grava localmente. `complete(
|
|
3
|
+
O SDK grava localmente. `complete()` encerra a captura e faz um POST ao endpoint configurado, com JSON e `Authorization: Bearer <token>`. O token vem de `offscript_token` na URL ou da sessão da aba; a query não é removida. É possível sobrescrever endpoint/token explicitamente em integrações personalizadas.
|
|
4
4
|
|
|
5
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.
|
|
6
6
|
|
package/docs/architecture.md
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
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.
|
|
4
4
|
|
|
5
|
-
Ao finalizar, todos os recorders são parados. O núcleo monta o payload e o contrato Playwright. O host
|
|
5
|
+
Ao finalizar, todos os recorders são parados. O núcleo monta o payload e o contrato Playwright. O host configura o endpoint; o SDK lê o token de `offscript_token` ou da sessão da aba e usa ambos em `complete()`. O overlay usa `startRecording`, pausa/retomada, descarte e, opcionalmente, o callback `onComplete` do host. `stopRecording` permite obter o payload sem rede.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Em sessões com token, a persistência local usa uma chave opaca gerenciada pelo SDK. `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.
|
|
8
8
|
|
|
9
|
-
O
|
|
9
|
+
O SDK mantém o token de execução na sessão da aba, sem remover a query da URL. Sucesso no envio limpa o rascunho e marca a sessão concluída; `destroy` apenas fecha os recursos.
|