@gem-sdk/clarity-decode 0.8.94
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/CHANGELOG.md +9 -0
- package/README.md +1 -0
- package/build/clarity.decode.js +807 -0
- package/build/clarity.decode.min.js +1 -0
- package/build/clarity.decode.module.js +805 -0
- package/package.json +45 -0
- package/rollup.config.ts +32 -0
- package/src/clarity.ts +233 -0
- package/src/data.ts +126 -0
- package/src/diagnostic.ts +35 -0
- package/src/global.ts +9 -0
- package/src/index.ts +1 -0
- package/src/interaction.ts +118 -0
- package/src/layout.ts +186 -0
- package/src/performance.ts +30 -0
- package/test/decode.test.ts +62 -0
- package/tsconfig.json +12 -0
- package/tslint.json +33 -0
- package/types/core.d.ts +8 -0
- package/types/data.d.ts +94 -0
- package/types/diagnostic.d.ts +10 -0
- package/types/index.d.ts +10 -0
- package/types/interaction.d.ts +46 -0
- package/types/layout.d.ts +36 -0
- package/types/performance.d.ts +7 -0
package/src/layout.ts
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { Constant } from "@clarity-types/data";
|
|
2
|
+
import { Data, Layout } from "@gem-sdk/clarity-js";
|
|
3
|
+
import { DomData, LayoutEvent, Interaction, RegionVisibility } from "../types/layout";
|
|
4
|
+
|
|
5
|
+
const AverageWordLength = 6;
|
|
6
|
+
const Space = " ";
|
|
7
|
+
|
|
8
|
+
export function decode(tokens: Data.Token[]): LayoutEvent {
|
|
9
|
+
let time = tokens[0] as number;
|
|
10
|
+
let event = tokens[1] as Data.Event;
|
|
11
|
+
|
|
12
|
+
switch (event) {
|
|
13
|
+
case Data.Event.Document:
|
|
14
|
+
let documentData: Layout.DocumentData = { width: tokens[2] as number, height: tokens[3] as number };
|
|
15
|
+
return { time, event, data: documentData };
|
|
16
|
+
case Data.Event.Region:
|
|
17
|
+
let regionData: Layout.RegionData[] = [];
|
|
18
|
+
// From 0.6.15 we send each reach update in an individual event. This allows us to include time with it.
|
|
19
|
+
// To keep it backward compatible (<= 0.6.14), we look for multiple regions in the same event. This works both with newer and older payloads.
|
|
20
|
+
// In future, we can update the logic to look deterministically for only 3 fields and remove the for loop.
|
|
21
|
+
let increment: number;
|
|
22
|
+
for (let i = 2; i < tokens.length; i += increment) {
|
|
23
|
+
let region: Layout.RegionData;
|
|
24
|
+
if (typeof(tokens[i+2]) == Constant.Number) {
|
|
25
|
+
region = {
|
|
26
|
+
id: tokens[i] as number,
|
|
27
|
+
interaction: tokens[i + 1] as number,
|
|
28
|
+
visibility: tokens[i + 2] as number,
|
|
29
|
+
name: tokens[i + 3] as string
|
|
30
|
+
};
|
|
31
|
+
increment = 4;
|
|
32
|
+
} else {
|
|
33
|
+
let state = tokens[i + 1] as number;
|
|
34
|
+
region = {
|
|
35
|
+
id: tokens[i] as number,
|
|
36
|
+
// For backward compatibility before 0.6.24 - where region states were sent as a single enum
|
|
37
|
+
// we convert the value into the two states tracked after 0.6.24
|
|
38
|
+
interaction: state >= Interaction.None ? state : Interaction.None,
|
|
39
|
+
visibility: state <= RegionVisibility.ScrolledToEnd ? state : RegionVisibility.Rendered,
|
|
40
|
+
name: tokens[i + 2] as string
|
|
41
|
+
};
|
|
42
|
+
increment = 3;
|
|
43
|
+
}
|
|
44
|
+
regionData.push(region);
|
|
45
|
+
}
|
|
46
|
+
return { time, event, data: regionData };
|
|
47
|
+
case Data.Event.StyleSheetAdoption:
|
|
48
|
+
let styleSheetAdoptionData: Layout.StyleSheetData = {
|
|
49
|
+
id: tokens[2] as number,
|
|
50
|
+
operation: tokens[3] as number,
|
|
51
|
+
newIds: tokens[4] as string[]
|
|
52
|
+
};
|
|
53
|
+
return { time, event, data: styleSheetAdoptionData };
|
|
54
|
+
case Data.Event.StyleSheetUpdate:
|
|
55
|
+
let styleSheetUpdateData: Layout.StyleSheetData = {
|
|
56
|
+
id: tokens[2] as string,
|
|
57
|
+
operation: tokens[3] as number,
|
|
58
|
+
cssRules: tokens[4] as string
|
|
59
|
+
}
|
|
60
|
+
return { time, event, data: styleSheetUpdateData };
|
|
61
|
+
case Data.Event.Animation:
|
|
62
|
+
let animationData: Layout.AnimationData = {
|
|
63
|
+
id: tokens[2] as string,
|
|
64
|
+
operation: tokens[3] as number,
|
|
65
|
+
keyFrames: tokens[4] as string,
|
|
66
|
+
timing: tokens[5] as string,
|
|
67
|
+
timeline: tokens[6] as string,
|
|
68
|
+
targetId: tokens[7] as number
|
|
69
|
+
}
|
|
70
|
+
return { time, event, data: animationData};
|
|
71
|
+
case Data.Event.Discover:
|
|
72
|
+
case Data.Event.Mutation:
|
|
73
|
+
case Data.Event.Snapshot:
|
|
74
|
+
let lastType = null;
|
|
75
|
+
let node = [];
|
|
76
|
+
let tagIndex = 0;
|
|
77
|
+
let domData: DomData[] = [];
|
|
78
|
+
for (let i = 2; i < tokens.length; i++) {
|
|
79
|
+
let token = tokens[i];
|
|
80
|
+
let type = typeof(token);
|
|
81
|
+
switch (type) {
|
|
82
|
+
case "number":
|
|
83
|
+
if (type !== lastType && lastType !== null) {
|
|
84
|
+
domData.push(process(node, tagIndex));
|
|
85
|
+
node = [];
|
|
86
|
+
tagIndex = 0;
|
|
87
|
+
}
|
|
88
|
+
node.push(token);
|
|
89
|
+
tagIndex++;
|
|
90
|
+
break;
|
|
91
|
+
case "string":
|
|
92
|
+
node.push(token);
|
|
93
|
+
break;
|
|
94
|
+
case "object":
|
|
95
|
+
let subtoken = token[0];
|
|
96
|
+
let subtype = typeof(subtoken);
|
|
97
|
+
switch (subtype) {
|
|
98
|
+
case "number":
|
|
99
|
+
for (let t of (token as number[])) {
|
|
100
|
+
node.push(tokens.length > t ? tokens[t] : null);
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
lastType = type;
|
|
106
|
+
}
|
|
107
|
+
// Process last node
|
|
108
|
+
domData.push(process(node, tagIndex));
|
|
109
|
+
|
|
110
|
+
return { time, event, data: domData };
|
|
111
|
+
case Data.Event.CustomElement:
|
|
112
|
+
let customElement: Layout.CustomElementData = { name: tokens[2] as string };
|
|
113
|
+
return { time, event, data: customElement };
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function process(node: any[] | number[], tagIndex: number): DomData {
|
|
119
|
+
// For backward compatibility, only extract the tag even if position is available as part of the tag name
|
|
120
|
+
// And, continue computing position in the visualization library from decoded payload.
|
|
121
|
+
let tag = node[tagIndex] ? node[tagIndex].split("~")[0] : node[tagIndex];
|
|
122
|
+
let output: DomData = {
|
|
123
|
+
id: Math.abs(node[0]),
|
|
124
|
+
parent: tagIndex > 1 ? node[1] : null,
|
|
125
|
+
previous: tagIndex > 2 ? node[2] : null,
|
|
126
|
+
tag
|
|
127
|
+
};
|
|
128
|
+
let masked = node[0] < 0;
|
|
129
|
+
let hasAttribute = false;
|
|
130
|
+
let attributes: Layout.Attributes = {};
|
|
131
|
+
let value = null;
|
|
132
|
+
|
|
133
|
+
for (let i = tagIndex + 1; i < node.length; i++) {
|
|
134
|
+
// Explicitly convert the token into a string value
|
|
135
|
+
let token = node[i].toString();
|
|
136
|
+
let keyIndex = token.indexOf("=");
|
|
137
|
+
let firstChar = token[0];
|
|
138
|
+
let lastChar = token[token.length - 1];
|
|
139
|
+
if (i === (node.length - 1) && output.tag === "STYLE") {
|
|
140
|
+
value = token;
|
|
141
|
+
} else if (output.tag !== Layout.Constant.TextTag && lastChar === ">" && keyIndex === -1) {
|
|
142
|
+
// Backward compatibility - since v0.6.25
|
|
143
|
+
// Ignore this conditional block since we no longer compute selectors at decode time to save on uploaded bytes
|
|
144
|
+
// Instead, we now compute selector and hash at visualization layer where we have access to all payloads together
|
|
145
|
+
} else if (output.tag !== Layout.Constant.TextTag && firstChar === Layout.Constant.Hash && keyIndex === -1) {
|
|
146
|
+
let parts = token.substr(1).split(Layout.Constant.Period);
|
|
147
|
+
if (parts.length === 2) {
|
|
148
|
+
output.width = num(parts[0]) / Data.Setting.BoxPrecision;
|
|
149
|
+
output.height = num(parts[1]) / Data.Setting.BoxPrecision;
|
|
150
|
+
}
|
|
151
|
+
} else if (output.tag !== Layout.Constant.TextTag && keyIndex > 0) {
|
|
152
|
+
hasAttribute = true;
|
|
153
|
+
let k = token.substr(0, keyIndex);
|
|
154
|
+
let v = token.substr(keyIndex + 1);
|
|
155
|
+
attributes[k] = v;
|
|
156
|
+
} else if (output.tag === Layout.Constant.TextTag) {
|
|
157
|
+
value = masked ? unmask(token) : token;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (hasAttribute) { output.attributes = attributes; }
|
|
162
|
+
if (value) { output.value = value; }
|
|
163
|
+
|
|
164
|
+
return output;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function num(input: string): number {
|
|
168
|
+
return input ? parseInt(input, 36) : null;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function unmask(value: string): string {
|
|
172
|
+
let trimmed = value.trim();
|
|
173
|
+
if (trimmed.length > 0 && trimmed.indexOf(Space) === -1) {
|
|
174
|
+
let length = num(trimmed);
|
|
175
|
+
if (length > 0) {
|
|
176
|
+
let quotient = Math.floor(length / AverageWordLength);
|
|
177
|
+
let remainder = length % AverageWordLength;
|
|
178
|
+
let output = Array(remainder + 1).join(Data.Constant.Mask);
|
|
179
|
+
for (let i = 0; i < quotient; i++) {
|
|
180
|
+
output += (i === 0 && remainder === 0 ? Data.Constant.Mask : Space) + Array(AverageWordLength).join(Data.Constant.Mask);
|
|
181
|
+
}
|
|
182
|
+
return output;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return value;
|
|
186
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Data, Performance } from "@gem-sdk/clarity-js";
|
|
2
|
+
import { PerformanceEvent } from "../types/performance";
|
|
3
|
+
|
|
4
|
+
export function decode(tokens: Data.Token[]): PerformanceEvent {
|
|
5
|
+
let time = tokens[0] as number;
|
|
6
|
+
let event = tokens[1] as Data.Event;
|
|
7
|
+
switch (event) {
|
|
8
|
+
case Data.Event.Navigation:
|
|
9
|
+
let navigationData: Performance.NavigationData = {
|
|
10
|
+
fetchStart: tokens[2] as number,
|
|
11
|
+
connectStart: tokens[3] as number,
|
|
12
|
+
connectEnd: tokens[4] as number,
|
|
13
|
+
requestStart: tokens[5] as number,
|
|
14
|
+
responseStart: tokens[6] as number,
|
|
15
|
+
responseEnd: tokens[7] as number,
|
|
16
|
+
domInteractive: tokens[8] as number,
|
|
17
|
+
domComplete: tokens[9] as number,
|
|
18
|
+
loadEventStart: tokens[10] as number,
|
|
19
|
+
loadEventEnd: tokens[11] as number,
|
|
20
|
+
redirectCount: tokens[12] as number,
|
|
21
|
+
size: tokens[13] as number,
|
|
22
|
+
type: tokens[14] as string,
|
|
23
|
+
protocol: tokens[15] as string,
|
|
24
|
+
encodedSize: tokens[16] as number,
|
|
25
|
+
decodedSize: tokens[17] as number
|
|
26
|
+
};
|
|
27
|
+
return { time, event, data: navigationData };
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { test, expect } from '@playwright/test';
|
|
2
|
+
import { decode } from '@gem-sdk/clarity-decode';
|
|
3
|
+
|
|
4
|
+
test.describe('decode function', () => {
|
|
5
|
+
test('should decode a simple payload', () => {
|
|
6
|
+
// This is a very simple test that focuses on basic decoding functionality
|
|
7
|
+
const testPayload = {
|
|
8
|
+
e: ["0.8.20", 1, 0, 506, "devtools", "1mtqiaz", "1c27tix", 2, 0, 0, 0, "https://test.com/"],
|
|
9
|
+
a: [
|
|
10
|
+
[2, 8, 1982, 3098],
|
|
11
|
+
[29, 11, 1982, 992],
|
|
12
|
+
[29, 28, 1],
|
|
13
|
+
[35, 29, 63, 65, 421, 421, 551, 552, 941, 1820, 1821, 1826, 0, 23734, "navigate", "h2", 23434, 138226],
|
|
14
|
+
[36, 7, 116, 16, 13, "1"],
|
|
15
|
+
[36, 7, 120, 16, 0, "2"],
|
|
16
|
+
[36, 7, 203, 16, 13, "3"],
|
|
17
|
+
[505, 1, 0, ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0"], 1, ["https://test.com/"], 3, ["A little bit of this and that!"], 4, ["test.com"], 5, ["BlogPosting"], 9, ["en-US"], 15, ["1xtxvl0"], 17, ["ltr"], 18, ["Story 8", "Story 7", "Story 6"], 20, ["A title!"], 21, ["blogger"], 22, ["macOS"], 23, ["15.5.0"], 24, ["undefined~8", "undefined~138"], 26, ["1.7999999523162842"], 27, ["4g"], 28, ["1979"], 29, ["2"], 31, ["44nejbc7s.6933hhug7"], 32, ["519i394pb.53uwavtzg"], 34, ["America/Los_Angeles"], 35, ["420"], 36, ["1"], 37, ["-1"]],
|
|
18
|
+
[505, 0, 0, 1752816151601, 1, 1, 3, 34, 4, 35, 5, 3, 7, 4, 8, 1636, 9, 0, 10, 2, 14, 1792, 15, 1120, 16, 24, 25, 9, 26, 0, 27, 0, 31, 1, 32, 0, 33, 8, 34, 8, 35, 0],
|
|
19
|
+
[506, 47, 0, 1, 1],
|
|
20
|
+
[550, 48, 488, 493, 484, 16383, 16383, 2, 1, 0, "It's a title", null, "1ltv07afj", "4ppc0yuhe", 1, 0]
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const input = JSON.stringify(testPayload);
|
|
25
|
+
|
|
26
|
+
const result = decode(input);
|
|
27
|
+
|
|
28
|
+
expect(typeof result).toBe('object');
|
|
29
|
+
expect(typeof result.timestamp).toBe('number');
|
|
30
|
+
expect(typeof result.envelope).toBe('object');
|
|
31
|
+
expect(result.envelope.version).toBe("0.8.20");
|
|
32
|
+
expect(result.visibility[0].data.visible).toBe(1);
|
|
33
|
+
expect(result.contextMenu[0].data.target).toBe(488);
|
|
34
|
+
expect(result.contextMenu[0].data.button).toBe(2);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('visibility event should be backward compatible to support string values', () => {
|
|
38
|
+
// This is a very simple test that focuses on basic decoding functionality
|
|
39
|
+
const testPayload = {
|
|
40
|
+
e: ["0.8.20", 1, 0, 506, "devtools", "1mtqiaz", "1c27tix", 2, 0, 0, 0, "https://test.com/"],
|
|
41
|
+
a: [
|
|
42
|
+
[2, 8, 1982, 3098],
|
|
43
|
+
[29, 11, 1982, 992],
|
|
44
|
+
[29, 28, "visible"],
|
|
45
|
+
[505, 1, 0, ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0"], 1, ["https://test.com/"], 3, ["A little bit of this and that!"], 4, ["test.com"], 5, ["BlogPosting"], 9, ["en-US"], 15, ["1xtxvl0"], 17, ["ltr"], 18, ["Story 8", "Story 7", "Story 6"], 20, ["A title!"], 21, ["blogger"], 22, ["macOS"], 23, ["15.5.0"], 24, ["undefined~8", "undefined~138"], 26, ["1.7999999523162842"], 27, ["4g"], 28, ["1979"], 29, ["2"], 31, ["44nejbc7s.6933hhug7"], 32, ["519i394pb.53uwavtzg"], 34, ["America/Los_Angeles"], 35, ["420"], 36, ["1"], 37, ["-1"]],
|
|
46
|
+
[505, 0, 0, 1752816151601, 1, 1, 3, 34, 4, 35, 5, 3, 7, 4, 8, 1636, 9, 0, 10, 2, 14, 1792, 15, 1120, 16, 24, 25, 9, 26, 0, 27, 0, 31, 1, 32, 0, 33, 8, 34, 8, 35, 0],
|
|
47
|
+
[506, 47, 0, 1, 1],
|
|
48
|
+
[550, 48, 488, 493, 484, 16383, 16383, 2, 1, 0, "It's a title", null, "1ltv07afj", "4ppc0yuhe", 1, 0]
|
|
49
|
+
],
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const input = JSON.stringify(testPayload);
|
|
53
|
+
|
|
54
|
+
const result = decode(input);
|
|
55
|
+
|
|
56
|
+
expect(typeof result).toBe('object');
|
|
57
|
+
expect(typeof result.timestamp).toBe('number');
|
|
58
|
+
expect(typeof result.envelope).toBe('object');
|
|
59
|
+
expect(result.envelope.version).toBe("0.8.20");
|
|
60
|
+
expect(result.visibility[0].data.visible).toBe(1);
|
|
61
|
+
});
|
|
62
|
+
});
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"baseUrl": ".",
|
|
5
|
+
"paths": {
|
|
6
|
+
"@src/*": ["src/*"],
|
|
7
|
+
"@clarity-types/*": ["types/*"]
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"include":["src/**/*.ts", "types/**/*.d.ts", "test/**/*.ts", "rollup.config.ts"],
|
|
11
|
+
"exclude": ["node_modules", "build"]
|
|
12
|
+
}
|
package/tslint.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "tslint:recommended",
|
|
3
|
+
"rules": {
|
|
4
|
+
"max-line-length": [
|
|
5
|
+
true,
|
|
6
|
+
140
|
|
7
|
+
],
|
|
8
|
+
"no-console": [
|
|
9
|
+
false
|
|
10
|
+
],
|
|
11
|
+
"no-string-literal": false,
|
|
12
|
+
"prefer-const": false,
|
|
13
|
+
"prefer-for-of": false,
|
|
14
|
+
"object-literal-sort-keys": false,
|
|
15
|
+
"one-variable-per-declaration": false,
|
|
16
|
+
"trailing-comma": [
|
|
17
|
+
false
|
|
18
|
+
],
|
|
19
|
+
"variable-name": false,
|
|
20
|
+
"interface-name": false,
|
|
21
|
+
"interface-over-type-literal": false,
|
|
22
|
+
"only-arrow-functions": false,
|
|
23
|
+
"typedef": [
|
|
24
|
+
true,
|
|
25
|
+
"call-signature",
|
|
26
|
+
"parameter",
|
|
27
|
+
"property-declaration",
|
|
28
|
+
"member-variable-declaration",
|
|
29
|
+
"object-destructuring",
|
|
30
|
+
"array-destructuring"
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
}
|
package/types/core.d.ts
ADDED
package/types/data.d.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Data } from "@gem-sdk/clarity-js";
|
|
2
|
+
import { DiagnosticEvent, FraudEvent, LogEvent, ScriptErrorEvent } from "./diagnostic";
|
|
3
|
+
import { ChangeEvent, ClickEvent, ContextMenuEvent, ClipboardEvent, InputEvent, InteractionEvent, PointerEvent, ResizeEvent, SubmitEvent } from "./interaction";
|
|
4
|
+
import { ScrollEvent, SelectionEvent, TimelineEvent, UnloadEvent, VisibilityEvent, FocusEvent } from "./interaction";
|
|
5
|
+
import { DocumentEvent, DomEvent, LayoutEvent, RegionEvent, CustomElementEvent } from "./layout";
|
|
6
|
+
import { NavigationEvent, PerformanceEvent } from "./performance";
|
|
7
|
+
import { PartialEvent } from "./core";
|
|
8
|
+
|
|
9
|
+
/* Redeclare enums */
|
|
10
|
+
export import Envelope = Data.Envelope;
|
|
11
|
+
export import Code = Data.Code;
|
|
12
|
+
export import Dimension = Data.Dimension;
|
|
13
|
+
export import Event = Data.Event;
|
|
14
|
+
export import Metric = Data.Metric;
|
|
15
|
+
export import Payload = Data.Payload;
|
|
16
|
+
export import BooleanFlag = Data.BooleanFlag;
|
|
17
|
+
export import Constant = Data.Constant;
|
|
18
|
+
export import Setting = Data.Setting;
|
|
19
|
+
|
|
20
|
+
/* Data Events */
|
|
21
|
+
export interface BaselineEvent extends PartialEvent { data: Data.BaselineData; }
|
|
22
|
+
export interface DimensionEvent extends PartialEvent { data: Data.DimensionData; }
|
|
23
|
+
export interface MetricEvent extends PartialEvent { data: Data.MetricData; }
|
|
24
|
+
export interface CustomEvent extends PartialEvent { data: Data.CustomData; }
|
|
25
|
+
export interface VariableEvent extends PartialEvent { data: Data.VariableData; }
|
|
26
|
+
export interface PingEvent extends PartialEvent { data: Data.PingData; }
|
|
27
|
+
export interface LimitEvent extends PartialEvent { data: Data.LimitData; }
|
|
28
|
+
export interface SummaryEvent extends PartialEvent { data: Data.SummaryData; }
|
|
29
|
+
export interface UpgradeEvent extends PartialEvent { data: Data.UpgradeData; }
|
|
30
|
+
export interface UploadEvent extends PartialEvent { data: Data.UploadData; }
|
|
31
|
+
export interface ExtractEvent extends PartialEvent { data: Data.ExtractData; }
|
|
32
|
+
export interface ConsentEvent extends PartialEvent { data: Data.ConsentData; }
|
|
33
|
+
export interface DataEvent extends PartialEvent {
|
|
34
|
+
data: Data.BaselineData |
|
|
35
|
+
Data.DimensionData |
|
|
36
|
+
Data.MetricData |
|
|
37
|
+
Data.CustomData |
|
|
38
|
+
Data.VariableData |
|
|
39
|
+
Data.PingData |
|
|
40
|
+
Data.LimitData |
|
|
41
|
+
Data.SummaryData |
|
|
42
|
+
Data.UpgradeData |
|
|
43
|
+
Data.UploadData |
|
|
44
|
+
Data.ExtractData |
|
|
45
|
+
Data.ConsentData;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export type DecodedEvent = DataEvent | DiagnosticEvent | InteractionEvent | LayoutEvent | PerformanceEvent;
|
|
49
|
+
|
|
50
|
+
export interface DecodedPayload {
|
|
51
|
+
timestamp: number;
|
|
52
|
+
envelope: Data.Envelope;
|
|
53
|
+
metric?: MetricEvent[];
|
|
54
|
+
dimension?: DimensionEvent[];
|
|
55
|
+
ping?: PingEvent[];
|
|
56
|
+
limit?: LimitEvent[];
|
|
57
|
+
script?: ScriptErrorEvent[];
|
|
58
|
+
input?: InputEvent[];
|
|
59
|
+
pointer?: PointerEvent[];
|
|
60
|
+
click?: ClickEvent[];
|
|
61
|
+
contextMenu?: ContextMenuEvent[];
|
|
62
|
+
clipboard?: ClipboardEvent[];
|
|
63
|
+
resize?: ResizeEvent[];
|
|
64
|
+
scroll?: ScrollEvent[];
|
|
65
|
+
selection?: SelectionEvent[];
|
|
66
|
+
change?: ChangeEvent[];
|
|
67
|
+
submit?: SubmitEvent[];
|
|
68
|
+
summary?: SummaryEvent[];
|
|
69
|
+
timeline?: TimelineEvent[];
|
|
70
|
+
unload?: UnloadEvent[];
|
|
71
|
+
upgrade?: UpgradeEvent[];
|
|
72
|
+
upload?: UploadEvent[];
|
|
73
|
+
visibility?: VisibilityEvent[];
|
|
74
|
+
focus?: FocusEvent[];
|
|
75
|
+
region?: RegionEvent[];
|
|
76
|
+
dom?: DomEvent[];
|
|
77
|
+
doc?: DocumentEvent[];
|
|
78
|
+
navigation?: NavigationEvent[];
|
|
79
|
+
log?: LogEvent[];
|
|
80
|
+
fraud?: FraudEvent[];
|
|
81
|
+
baseline?: BaselineEvent[];
|
|
82
|
+
variable?: VariableEvent[];
|
|
83
|
+
custom?: CustomEvent[];
|
|
84
|
+
extract?: ExtractEvent[];
|
|
85
|
+
consent?: ConsentEvent[];
|
|
86
|
+
customElement?: CustomElementEvent[];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface DecodedVersion {
|
|
90
|
+
major: number;
|
|
91
|
+
minor: number;
|
|
92
|
+
patch: number;
|
|
93
|
+
beta: number;
|
|
94
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Diagnostic } from "@gem-sdk/clarity-js";
|
|
2
|
+
import { PartialEvent } from "./core";
|
|
3
|
+
|
|
4
|
+
export interface ScriptErrorEvent extends PartialEvent { data: Diagnostic.ScriptErrorData; }
|
|
5
|
+
export interface LogEvent extends PartialEvent { data: Diagnostic.LogData; }
|
|
6
|
+
export interface FraudEvent extends PartialEvent { data: Diagnostic.FraudData; }
|
|
7
|
+
|
|
8
|
+
export interface DiagnosticEvent extends PartialEvent {
|
|
9
|
+
data: Diagnostic.FraudData | Diagnostic.LogData | Diagnostic.ScriptErrorData;
|
|
10
|
+
}
|
package/types/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as Core from "./core";
|
|
2
|
+
import * as Data from "./data";
|
|
3
|
+
import * as Diagnostic from "./diagnostic";
|
|
4
|
+
import * as Layout from "./layout";
|
|
5
|
+
import * as Interaction from "./interaction";
|
|
6
|
+
import * as Performance from "./performance";
|
|
7
|
+
|
|
8
|
+
export function decode(data: string): Data.DecodedPayload;
|
|
9
|
+
|
|
10
|
+
export { Core, Data, Diagnostic, Layout, Interaction, Performance };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Interaction } from "@gem-sdk/clarity-js";
|
|
2
|
+
import { PartialEvent } from "./core";
|
|
3
|
+
|
|
4
|
+
export interface ClickData extends Interaction.ClickData {
|
|
5
|
+
hashBeta: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface TimelineData extends Interaction.TimelineData {
|
|
9
|
+
hashBeta: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface ClickVizualizationData {
|
|
13
|
+
doc: HTMLElement;
|
|
14
|
+
click: HTMLElement;
|
|
15
|
+
time: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface InputEvent extends PartialEvent { data: Interaction.InputData; }
|
|
19
|
+
export interface ChangeEvent extends PartialEvent { data: Interaction.ChangeData; }
|
|
20
|
+
export interface ClickEvent extends PartialEvent { data: ClickData; }
|
|
21
|
+
export interface ContextMenuEvent extends PartialEvent { data: ClickData; }
|
|
22
|
+
export interface ClipboardEvent extends PartialEvent { data: Interaction.ClipboardData; }
|
|
23
|
+
export interface PointerEvent extends PartialEvent { data: Interaction.PointerData; }
|
|
24
|
+
export interface ResizeEvent extends PartialEvent { data: Interaction.ResizeData; }
|
|
25
|
+
export interface ScrollEvent extends PartialEvent { data: Interaction.ScrollData; }
|
|
26
|
+
export interface SelectionEvent extends PartialEvent { data: Interaction.SelectionData; }
|
|
27
|
+
export interface SubmitEvent extends PartialEvent { data: Interaction.SubmitData; }
|
|
28
|
+
export interface TimelineEvent extends PartialEvent { data: TimelineData; }
|
|
29
|
+
export interface UnloadEvent extends PartialEvent { data: Interaction.UnloadData; }
|
|
30
|
+
export interface VisibilityEvent extends PartialEvent { data: Interaction.VisibilityData; }
|
|
31
|
+
export interface FocusEvent extends PartialEvent { data: Interaction.FocusData; }
|
|
32
|
+
export interface InteractionEvent extends PartialEvent {
|
|
33
|
+
data: ClickData |
|
|
34
|
+
Interaction.ChangeData |
|
|
35
|
+
Interaction.ClipboardData |
|
|
36
|
+
Interaction.InputData |
|
|
37
|
+
Interaction.PointerData |
|
|
38
|
+
Interaction.ResizeData |
|
|
39
|
+
Interaction.ScrollData |
|
|
40
|
+
Interaction.SelectionData |
|
|
41
|
+
Interaction.SubmitData |
|
|
42
|
+
TimelineData |
|
|
43
|
+
Interaction.UnloadData |
|
|
44
|
+
Interaction.VisibilityData |
|
|
45
|
+
Interaction.FocusData;
|
|
46
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Layout } from "@gem-sdk/clarity-js";
|
|
2
|
+
import { PartialEvent } from "./core";
|
|
3
|
+
|
|
4
|
+
export interface RegionEvent extends PartialEvent { data: Layout.RegionData[]; }
|
|
5
|
+
export interface DocumentEvent extends PartialEvent { data: Layout.DocumentData; }
|
|
6
|
+
export interface DomEvent extends PartialEvent { data: DomData[]; }
|
|
7
|
+
export interface StyleSheetEvent extends PartialEvent { data: Layout.StyleSheetData }
|
|
8
|
+
export interface AnimationEvent extends PartialEvent { data: Layout.AnimationData; }
|
|
9
|
+
export interface CustomElementEvent extends PartialEvent { data: Layout.CustomElementData; }
|
|
10
|
+
export interface LayoutEvent extends PartialEvent {
|
|
11
|
+
data: Layout.RegionData[] | Layout.DocumentData | DomData[] | Layout.StyleSheetData | Layout.AnimationData | Layout.CustomElementData;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Redeclare enums */
|
|
15
|
+
export import Constant = Layout.Constant;
|
|
16
|
+
export import Interaction = Layout.InteractionState;
|
|
17
|
+
export import RegionVisibility = Layout.RegionVisibility;
|
|
18
|
+
export import SelectorInput = Layout.SelectorInput;
|
|
19
|
+
export import Selector = Layout.Selector;
|
|
20
|
+
|
|
21
|
+
/* Event Data */
|
|
22
|
+
export interface DomData {
|
|
23
|
+
id: number;
|
|
24
|
+
parent: number;
|
|
25
|
+
previous: number;
|
|
26
|
+
tag: string;
|
|
27
|
+
attributes?: Layout.Attributes;
|
|
28
|
+
value?: string;
|
|
29
|
+
width?: number;
|
|
30
|
+
height?: number;
|
|
31
|
+
selectorAlpha?: string;
|
|
32
|
+
hashAlpha?: string;
|
|
33
|
+
selectorBeta?: string;
|
|
34
|
+
hashBeta?: string;
|
|
35
|
+
checksum?: string;
|
|
36
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Performance } from "@gem-sdk/clarity-js";
|
|
2
|
+
import { PartialEvent } from "./core";
|
|
3
|
+
|
|
4
|
+
export interface NavigationEvent extends PartialEvent { data: Performance.NavigationData; }
|
|
5
|
+
export interface PerformanceEvent extends PartialEvent {
|
|
6
|
+
data: Performance.NavigationData
|
|
7
|
+
}
|