clarity-decode 0.8.42 → 0.8.43
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 +26 -26
- package/build/clarity.decode.js +752 -752
- package/build/clarity.decode.min.js +1 -1
- package/build/clarity.decode.module.js +752 -752
- package/package.json +65 -65
- package/rollup.config.ts +32 -32
- package/src/clarity.ts +233 -233
- package/src/data.ts +126 -126
- package/src/diagnostic.ts +35 -35
- package/src/global.ts +9 -9
- package/src/index.ts +1 -1
- package/src/interaction.ts +116 -116
- package/src/layout.ts +186 -186
- package/src/performance.ts +30 -30
- package/tsconfig.json +21 -21
- package/tslint.json +32 -32
- package/types/core.d.ts +8 -8
- package/types/data.d.ts +94 -94
- package/types/diagnostic.d.ts +10 -10
- package/types/index.d.ts +10 -10
- package/types/interaction.d.ts +46 -46
- package/types/layout.d.ts +36 -36
- package/types/performance.d.ts +7 -7
package/src/data.ts
CHANGED
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
import { Data } from "clarity-js";
|
|
2
|
-
import { Constant, DataEvent } from "../types/data";
|
|
3
|
-
|
|
4
|
-
export function decode(tokens: Data.Token[]): DataEvent {
|
|
5
|
-
let time = tokens[0] as number;
|
|
6
|
-
let event = tokens[1] as Data.Event;
|
|
7
|
-
switch (event) {
|
|
8
|
-
case Data.Event.Ping:
|
|
9
|
-
let ping: Data.PingData = { gap: tokens[2] as number };
|
|
10
|
-
return { time, event, data: ping };
|
|
11
|
-
case Data.Event.Limit:
|
|
12
|
-
let limit: Data.LimitData = { check: tokens[2] as number };
|
|
13
|
-
return { time, event, data: limit };
|
|
14
|
-
case Data.Event.Custom:
|
|
15
|
-
let custom: Data.CustomData = { key: tokens[2] as string, value: tokens[3] as string };
|
|
16
|
-
return { time, event, data: custom };
|
|
17
|
-
case Data.Event.Upgrade:
|
|
18
|
-
let upgrade: Data.UpgradeData = { key: tokens[2] as string };
|
|
19
|
-
return { time, event, data: upgrade };
|
|
20
|
-
case Data.Event.Upload:
|
|
21
|
-
let upload: Data.UploadData = { sequence: tokens[2] as number, attempts: tokens[3] as number, status: tokens[4] as number };
|
|
22
|
-
return { time, event, data: upload };
|
|
23
|
-
case Data.Event.Metric:
|
|
24
|
-
let m = 2; // Start from 3rd index since first two are used for time & event
|
|
25
|
-
let metrics: Data.MetricData = {};
|
|
26
|
-
while (m < tokens.length) {
|
|
27
|
-
metrics[tokens[m++] as number] = tokens[m++] as number;
|
|
28
|
-
}
|
|
29
|
-
return { time, event, data: metrics };
|
|
30
|
-
case Data.Event.Dimension:
|
|
31
|
-
let d = 2; // Start from 3rd index since first two are used for time & event
|
|
32
|
-
let dimensions: Data.DimensionData = {};
|
|
33
|
-
while (d < tokens.length) {
|
|
34
|
-
dimensions[tokens[d++] as number] = tokens[d++] as string[];
|
|
35
|
-
}
|
|
36
|
-
return { time, event, data: dimensions };
|
|
37
|
-
case Data.Event.Summary:
|
|
38
|
-
let s = 2; // Start from 3rd index since first two are used for time & event
|
|
39
|
-
let summary: Data.SummaryData = {};
|
|
40
|
-
while (s < tokens.length) {
|
|
41
|
-
let key = tokens[s++] as number;
|
|
42
|
-
let values = tokens[s++] as number[];
|
|
43
|
-
summary[key] = [];
|
|
44
|
-
for (let i = 0; i < values.length - 1; i += 2) {
|
|
45
|
-
summary[key].push([values[i], values[i + 1]]);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return { time, event, data: summary };
|
|
49
|
-
case Data.Event.Baseline:
|
|
50
|
-
const tokenLength = tokens.length;
|
|
51
|
-
let baselineData: Data.BaselineData = {
|
|
52
|
-
visible: tokens[2] as number,
|
|
53
|
-
docWidth: tokens[3] as number,
|
|
54
|
-
docHeight: tokens[4] as number,
|
|
55
|
-
screenWidth: tokens[5] as number,
|
|
56
|
-
screenHeight: tokens[6] as number,
|
|
57
|
-
scrollX: tokens[7] as number,
|
|
58
|
-
scrollY: tokens[8] as number,
|
|
59
|
-
pointerX: tokens[9] as number,
|
|
60
|
-
pointerY: tokens[10] as number,
|
|
61
|
-
activityTime: tokens[11] as number,
|
|
62
|
-
scrollTime: tokenLength > 12 ? tokens[12] as number: null,
|
|
63
|
-
pointerTime: tokenLength > 13 ? tokens[13] as number: null,
|
|
64
|
-
moveX: tokenLength > 14 ? tokens[14] as number: null,
|
|
65
|
-
moveY: tokenLength > 15 ? tokens[15] as number: null,
|
|
66
|
-
moveTime: tokenLength > 16 ? tokens[16] as number: null,
|
|
67
|
-
downX: tokenLength > 17 ? tokens[17] as number: null,
|
|
68
|
-
downY: tokenLength > 18 ? tokens[18] as number: null,
|
|
69
|
-
downTime: tokenLength > 19 ? tokens[19] as number: null,
|
|
70
|
-
upX: tokenLength > 20 ? tokens[20] as number: null,
|
|
71
|
-
upY: tokenLength > 21 ? tokens[21] as number: null,
|
|
72
|
-
upTime: tokenLength > 22 ? tokens[22] as number: null,
|
|
73
|
-
pointerPrevX: tokenLength > 23 ? tokens[23] as number: null,
|
|
74
|
-
pointerPrevY: tokenLength > 24 ? tokens[24] as number: null,
|
|
75
|
-
pointerPrevTime: tokenLength > 25 ? tokens[25] as number: null,
|
|
76
|
-
modules: tokenLength > 26 ? tokens[26] as number[]: null,
|
|
77
|
-
}
|
|
78
|
-
return { time, event, data: baselineData };
|
|
79
|
-
case Data.Event.Variable:
|
|
80
|
-
let v = 2; // Start from 3rd index since first two are used for time & event
|
|
81
|
-
let variables: Data.VariableData = {};
|
|
82
|
-
while (v < tokens.length) {
|
|
83
|
-
variables[tokens[v++] as string] = typeof tokens[v + 1] == Constant.String ? [tokens[v++] as string] : tokens[v++] as string[];
|
|
84
|
-
}
|
|
85
|
-
return { time, event, data: variables };
|
|
86
|
-
case Data.Event.Extract:
|
|
87
|
-
let e = 2; // Start from 3rd index since first two are used for time & event
|
|
88
|
-
let extract: Data.ExtractData = {};
|
|
89
|
-
while (e < tokens.length) {
|
|
90
|
-
// For backward compatibility from version 0.7.4
|
|
91
|
-
if (typeof(tokens[e + 1]) == Constant.String) {
|
|
92
|
-
extract[tokens[e++] as string | number] = tokens[e++] as string;
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
let key = tokens[e++] as number;
|
|
96
|
-
let values = tokens[e++] as (number | string)[];
|
|
97
|
-
extract[key] = [];
|
|
98
|
-
for (let i = 0; i < values.length - 1; i += 2) {
|
|
99
|
-
extract[key][values[i] as number] = values[i + 1] as string;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return { time, event, data: extract };
|
|
104
|
-
case Data.Event.Consent:
|
|
105
|
-
let consent: Data.ConsentData = { source: tokens[2] as number, ad_Storage: tokens[3] as number, analytics_Storage: tokens[4] as number};
|
|
106
|
-
return { time, event, data: consent };
|
|
107
|
-
}
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export function envelope(tokens: Data.Token[]): Data.Envelope {
|
|
112
|
-
return {
|
|
113
|
-
version: tokens[0] as string,
|
|
114
|
-
sequence: tokens[1] as number,
|
|
115
|
-
start: tokens[2] as number,
|
|
116
|
-
duration: tokens[3] as number,
|
|
117
|
-
projectId: tokens[4] as string,
|
|
118
|
-
userId: tokens[5] as string,
|
|
119
|
-
sessionId: tokens[6] as string,
|
|
120
|
-
pageNum: tokens[7] as number,
|
|
121
|
-
upload: tokens[8] as Data.Upload,
|
|
122
|
-
end: tokens[9] as Data.BooleanFlag,
|
|
123
|
-
applicationPlatform: tokens[10] as number,
|
|
124
|
-
url: tokens[11] as string
|
|
125
|
-
};
|
|
126
|
-
}
|
|
1
|
+
import { Data } from "clarity-js";
|
|
2
|
+
import { Constant, DataEvent } from "../types/data";
|
|
3
|
+
|
|
4
|
+
export function decode(tokens: Data.Token[]): DataEvent {
|
|
5
|
+
let time = tokens[0] as number;
|
|
6
|
+
let event = tokens[1] as Data.Event;
|
|
7
|
+
switch (event) {
|
|
8
|
+
case Data.Event.Ping:
|
|
9
|
+
let ping: Data.PingData = { gap: tokens[2] as number };
|
|
10
|
+
return { time, event, data: ping };
|
|
11
|
+
case Data.Event.Limit:
|
|
12
|
+
let limit: Data.LimitData = { check: tokens[2] as number };
|
|
13
|
+
return { time, event, data: limit };
|
|
14
|
+
case Data.Event.Custom:
|
|
15
|
+
let custom: Data.CustomData = { key: tokens[2] as string, value: tokens[3] as string };
|
|
16
|
+
return { time, event, data: custom };
|
|
17
|
+
case Data.Event.Upgrade:
|
|
18
|
+
let upgrade: Data.UpgradeData = { key: tokens[2] as string };
|
|
19
|
+
return { time, event, data: upgrade };
|
|
20
|
+
case Data.Event.Upload:
|
|
21
|
+
let upload: Data.UploadData = { sequence: tokens[2] as number, attempts: tokens[3] as number, status: tokens[4] as number };
|
|
22
|
+
return { time, event, data: upload };
|
|
23
|
+
case Data.Event.Metric:
|
|
24
|
+
let m = 2; // Start from 3rd index since first two are used for time & event
|
|
25
|
+
let metrics: Data.MetricData = {};
|
|
26
|
+
while (m < tokens.length) {
|
|
27
|
+
metrics[tokens[m++] as number] = tokens[m++] as number;
|
|
28
|
+
}
|
|
29
|
+
return { time, event, data: metrics };
|
|
30
|
+
case Data.Event.Dimension:
|
|
31
|
+
let d = 2; // Start from 3rd index since first two are used for time & event
|
|
32
|
+
let dimensions: Data.DimensionData = {};
|
|
33
|
+
while (d < tokens.length) {
|
|
34
|
+
dimensions[tokens[d++] as number] = tokens[d++] as string[];
|
|
35
|
+
}
|
|
36
|
+
return { time, event, data: dimensions };
|
|
37
|
+
case Data.Event.Summary:
|
|
38
|
+
let s = 2; // Start from 3rd index since first two are used for time & event
|
|
39
|
+
let summary: Data.SummaryData = {};
|
|
40
|
+
while (s < tokens.length) {
|
|
41
|
+
let key = tokens[s++] as number;
|
|
42
|
+
let values = tokens[s++] as number[];
|
|
43
|
+
summary[key] = [];
|
|
44
|
+
for (let i = 0; i < values.length - 1; i += 2) {
|
|
45
|
+
summary[key].push([values[i], values[i + 1]]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return { time, event, data: summary };
|
|
49
|
+
case Data.Event.Baseline:
|
|
50
|
+
const tokenLength = tokens.length;
|
|
51
|
+
let baselineData: Data.BaselineData = {
|
|
52
|
+
visible: tokens[2] as number,
|
|
53
|
+
docWidth: tokens[3] as number,
|
|
54
|
+
docHeight: tokens[4] as number,
|
|
55
|
+
screenWidth: tokens[5] as number,
|
|
56
|
+
screenHeight: tokens[6] as number,
|
|
57
|
+
scrollX: tokens[7] as number,
|
|
58
|
+
scrollY: tokens[8] as number,
|
|
59
|
+
pointerX: tokens[9] as number,
|
|
60
|
+
pointerY: tokens[10] as number,
|
|
61
|
+
activityTime: tokens[11] as number,
|
|
62
|
+
scrollTime: tokenLength > 12 ? tokens[12] as number: null,
|
|
63
|
+
pointerTime: tokenLength > 13 ? tokens[13] as number: null,
|
|
64
|
+
moveX: tokenLength > 14 ? tokens[14] as number: null,
|
|
65
|
+
moveY: tokenLength > 15 ? tokens[15] as number: null,
|
|
66
|
+
moveTime: tokenLength > 16 ? tokens[16] as number: null,
|
|
67
|
+
downX: tokenLength > 17 ? tokens[17] as number: null,
|
|
68
|
+
downY: tokenLength > 18 ? tokens[18] as number: null,
|
|
69
|
+
downTime: tokenLength > 19 ? tokens[19] as number: null,
|
|
70
|
+
upX: tokenLength > 20 ? tokens[20] as number: null,
|
|
71
|
+
upY: tokenLength > 21 ? tokens[21] as number: null,
|
|
72
|
+
upTime: tokenLength > 22 ? tokens[22] as number: null,
|
|
73
|
+
pointerPrevX: tokenLength > 23 ? tokens[23] as number: null,
|
|
74
|
+
pointerPrevY: tokenLength > 24 ? tokens[24] as number: null,
|
|
75
|
+
pointerPrevTime: tokenLength > 25 ? tokens[25] as number: null,
|
|
76
|
+
modules: tokenLength > 26 ? tokens[26] as number[]: null,
|
|
77
|
+
}
|
|
78
|
+
return { time, event, data: baselineData };
|
|
79
|
+
case Data.Event.Variable:
|
|
80
|
+
let v = 2; // Start from 3rd index since first two are used for time & event
|
|
81
|
+
let variables: Data.VariableData = {};
|
|
82
|
+
while (v < tokens.length) {
|
|
83
|
+
variables[tokens[v++] as string] = typeof tokens[v + 1] == Constant.String ? [tokens[v++] as string] : tokens[v++] as string[];
|
|
84
|
+
}
|
|
85
|
+
return { time, event, data: variables };
|
|
86
|
+
case Data.Event.Extract:
|
|
87
|
+
let e = 2; // Start from 3rd index since first two are used for time & event
|
|
88
|
+
let extract: Data.ExtractData = {};
|
|
89
|
+
while (e < tokens.length) {
|
|
90
|
+
// For backward compatibility from version 0.7.4
|
|
91
|
+
if (typeof(tokens[e + 1]) == Constant.String) {
|
|
92
|
+
extract[tokens[e++] as string | number] = tokens[e++] as string;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
let key = tokens[e++] as number;
|
|
96
|
+
let values = tokens[e++] as (number | string)[];
|
|
97
|
+
extract[key] = [];
|
|
98
|
+
for (let i = 0; i < values.length - 1; i += 2) {
|
|
99
|
+
extract[key][values[i] as number] = values[i + 1] as string;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return { time, event, data: extract };
|
|
104
|
+
case Data.Event.Consent:
|
|
105
|
+
let consent: Data.ConsentData = { source: tokens[2] as number, ad_Storage: tokens[3] as number, analytics_Storage: tokens[4] as number};
|
|
106
|
+
return { time, event, data: consent };
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function envelope(tokens: Data.Token[]): Data.Envelope {
|
|
112
|
+
return {
|
|
113
|
+
version: tokens[0] as string,
|
|
114
|
+
sequence: tokens[1] as number,
|
|
115
|
+
start: tokens[2] as number,
|
|
116
|
+
duration: tokens[3] as number,
|
|
117
|
+
projectId: tokens[4] as string,
|
|
118
|
+
userId: tokens[5] as string,
|
|
119
|
+
sessionId: tokens[6] as string,
|
|
120
|
+
pageNum: tokens[7] as number,
|
|
121
|
+
upload: tokens[8] as Data.Upload,
|
|
122
|
+
end: tokens[9] as Data.BooleanFlag,
|
|
123
|
+
applicationPlatform: tokens[10] as number,
|
|
124
|
+
url: tokens[11] as string
|
|
125
|
+
};
|
|
126
|
+
}
|
package/src/diagnostic.ts
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
import { Data, Diagnostic } from "clarity-js";
|
|
2
|
-
import { DiagnosticEvent } from "../types/diagnostic";
|
|
3
|
-
|
|
4
|
-
export function decode(tokens: Data.Token[]): DiagnosticEvent {
|
|
5
|
-
let time = tokens[0] as number;
|
|
6
|
-
let event = tokens[1] as Data.Event;
|
|
7
|
-
switch (event) {
|
|
8
|
-
case Data.Event.ScriptError:
|
|
9
|
-
let scriptError: Diagnostic.ScriptErrorData = {
|
|
10
|
-
message: tokens[2] as string,
|
|
11
|
-
line: tokens[3] as number,
|
|
12
|
-
column: tokens[4] as number,
|
|
13
|
-
stack: tokens[5] as string,
|
|
14
|
-
source: tokens[6] as string
|
|
15
|
-
};
|
|
16
|
-
return { time, event, data: scriptError };
|
|
17
|
-
case Data.Event.Log:
|
|
18
|
-
let log: Diagnostic.LogData = {
|
|
19
|
-
code: tokens[2] as number,
|
|
20
|
-
name: tokens[3] as string,
|
|
21
|
-
message: tokens[4] as string,
|
|
22
|
-
stack: tokens[5] as string,
|
|
23
|
-
severity: tokens[6] as number
|
|
24
|
-
};
|
|
25
|
-
return { time, event, data: log };
|
|
26
|
-
case Data.Event.Fraud:
|
|
27
|
-
let fraud: Diagnostic.FraudData = {
|
|
28
|
-
id: tokens[2] as number,
|
|
29
|
-
target: tokens[3] as number,
|
|
30
|
-
checksum: tokens[4] as string
|
|
31
|
-
};
|
|
32
|
-
return { time, event, data: fraud };
|
|
33
|
-
}
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
1
|
+
import { Data, Diagnostic } from "clarity-js";
|
|
2
|
+
import { DiagnosticEvent } from "../types/diagnostic";
|
|
3
|
+
|
|
4
|
+
export function decode(tokens: Data.Token[]): DiagnosticEvent {
|
|
5
|
+
let time = tokens[0] as number;
|
|
6
|
+
let event = tokens[1] as Data.Event;
|
|
7
|
+
switch (event) {
|
|
8
|
+
case Data.Event.ScriptError:
|
|
9
|
+
let scriptError: Diagnostic.ScriptErrorData = {
|
|
10
|
+
message: tokens[2] as string,
|
|
11
|
+
line: tokens[3] as number,
|
|
12
|
+
column: tokens[4] as number,
|
|
13
|
+
stack: tokens[5] as string,
|
|
14
|
+
source: tokens[6] as string
|
|
15
|
+
};
|
|
16
|
+
return { time, event, data: scriptError };
|
|
17
|
+
case Data.Event.Log:
|
|
18
|
+
let log: Diagnostic.LogData = {
|
|
19
|
+
code: tokens[2] as number,
|
|
20
|
+
name: tokens[3] as string,
|
|
21
|
+
message: tokens[4] as string,
|
|
22
|
+
stack: tokens[5] as string,
|
|
23
|
+
severity: tokens[6] as number
|
|
24
|
+
};
|
|
25
|
+
return { time, event, data: log };
|
|
26
|
+
case Data.Event.Fraud:
|
|
27
|
+
let fraud: Diagnostic.FraudData = {
|
|
28
|
+
id: tokens[2] as number,
|
|
29
|
+
target: tokens[3] as number,
|
|
30
|
+
checksum: tokens[4] as string
|
|
31
|
+
};
|
|
32
|
+
return { time, event, data: fraud };
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
package/src/global.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import * as decode from "@src/clarity";
|
|
2
|
-
|
|
3
|
-
// Expose clarity variable globally to allow access to public interface in a browser
|
|
4
|
-
if (typeof window !== "undefined") {
|
|
5
|
-
if ((window as any).clarity === undefined || (window as any).clarity === null) {
|
|
6
|
-
(window as any).clarity = {};
|
|
7
|
-
}
|
|
8
|
-
(window as any).clarity.decode = decode;
|
|
9
|
-
}
|
|
1
|
+
import * as decode from "@src/clarity";
|
|
2
|
+
|
|
3
|
+
// Expose clarity variable globally to allow access to public interface in a browser
|
|
4
|
+
if (typeof window !== "undefined") {
|
|
5
|
+
if ((window as any).clarity === undefined || (window as any).clarity === null) {
|
|
6
|
+
(window as any).clarity = {};
|
|
7
|
+
}
|
|
8
|
+
(window as any).clarity.decode = decode;
|
|
9
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { decode } from "./clarity";
|
|
1
|
+
export { decode } from "./clarity";
|
package/src/interaction.ts
CHANGED
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
import { Data, Interaction, Layout } from "clarity-js";
|
|
2
|
-
import { InteractionEvent, ClickData, TimelineData } from "../types/interaction";
|
|
3
|
-
|
|
4
|
-
export function decode(tokens: Data.Token[]): InteractionEvent {
|
|
5
|
-
let time = tokens[0] as number;
|
|
6
|
-
let event = tokens[1] as Data.Event;
|
|
7
|
-
switch (event) {
|
|
8
|
-
case Data.Event.MouseDown:
|
|
9
|
-
case Data.Event.MouseUp:
|
|
10
|
-
case Data.Event.MouseMove:
|
|
11
|
-
case Data.Event.MouseWheel:
|
|
12
|
-
case Data.Event.DoubleClick:
|
|
13
|
-
case Data.Event.TouchStart:
|
|
14
|
-
case Data.Event.TouchCancel:
|
|
15
|
-
case Data.Event.TouchEnd:
|
|
16
|
-
case Data.Event.TouchMove:
|
|
17
|
-
let pointerData: Interaction.PointerData = {
|
|
18
|
-
target: tokens[2] as number,
|
|
19
|
-
x: tokens[3] as number,
|
|
20
|
-
y: tokens[4] as number,
|
|
21
|
-
id: tokens[5] as number | undefined,
|
|
22
|
-
};
|
|
23
|
-
return { time, event, data: pointerData };
|
|
24
|
-
case Data.Event.Click:
|
|
25
|
-
case Data.Event.ContextMenu:
|
|
26
|
-
let clickHashes = (tokens[12] as string).split(Data.Constant.Dot);
|
|
27
|
-
let clickData: ClickData = {
|
|
28
|
-
target: tokens[2] as number,
|
|
29
|
-
x: tokens[3] as number,
|
|
30
|
-
y: tokens[4] as number,
|
|
31
|
-
eX: tokens[5] as number,
|
|
32
|
-
eY: tokens[6] as number,
|
|
33
|
-
button: tokens[7] as number,
|
|
34
|
-
reaction: tokens[8] as number,
|
|
35
|
-
context: tokens[9] as number,
|
|
36
|
-
text: tokens[10] as string,
|
|
37
|
-
link: tokens[11] as string,
|
|
38
|
-
hash: clickHashes[0],
|
|
39
|
-
hashBeta: clickHashes.length > 0 ? clickHashes[1] : null,
|
|
40
|
-
trust: tokens.length > 13 ? tokens[13] as number : Data.BooleanFlag.True,
|
|
41
|
-
isFullText: tokens.length > 14 ? tokens[14] as number : null,
|
|
42
|
-
w: tokens.length > 15 ? tokens[15] as number : 0,
|
|
43
|
-
h: tokens.length > 16 ? tokens[16] as number : 0,
|
|
44
|
-
tag: tokens.length > 17 ? tokens[17] as string : null,
|
|
45
|
-
class: tokens.length > 18 ? tokens[18] as string : null,
|
|
46
|
-
id: tokens.length > 19 ? tokens[19] as string : null,
|
|
47
|
-
};
|
|
48
|
-
return { time, event, data: clickData };
|
|
49
|
-
case Data.Event.Clipboard:
|
|
50
|
-
let clipData: Interaction.ClipboardData = { target: tokens[2] as number, action: tokens[3] as Interaction.Clipboard };
|
|
51
|
-
return { time, event, data: clipData };
|
|
52
|
-
case Data.Event.Resize:
|
|
53
|
-
let resizeData: Interaction.ResizeData = { width: tokens[2] as number, height: tokens[3] as number };
|
|
54
|
-
return { time, event, data: resizeData };
|
|
55
|
-
case Data.Event.Input:
|
|
56
|
-
let inputData: Interaction.InputData = { target: tokens[2] as number, value: tokens[3] as string, trust: tokens.length > 4 ? tokens[4] as number : Data.BooleanFlag.True };
|
|
57
|
-
return { time, event, data: inputData };
|
|
58
|
-
case Data.Event.Selection:
|
|
59
|
-
let selectionData: Interaction.SelectionData = {
|
|
60
|
-
start: tokens[2] as number,
|
|
61
|
-
startOffset: tokens[3] as number,
|
|
62
|
-
end: tokens[4] as number,
|
|
63
|
-
endOffset: tokens[5] as number
|
|
64
|
-
};
|
|
65
|
-
return { time, event, data: selectionData };
|
|
66
|
-
case Data.Event.Change:
|
|
67
|
-
let changeData: Interaction.ChangeData = {
|
|
68
|
-
target: tokens[2] as number,
|
|
69
|
-
type: tokens[3] as string,
|
|
70
|
-
value: tokens[4] as string,
|
|
71
|
-
checksum: tokens[5] as string
|
|
72
|
-
};
|
|
73
|
-
return { time, event, data: changeData };
|
|
74
|
-
case Data.Event.Submit:
|
|
75
|
-
let submitData: Interaction.SubmitData = {
|
|
76
|
-
target: tokens[2] as number
|
|
77
|
-
};
|
|
78
|
-
return { time, event, data: submitData };
|
|
79
|
-
case Data.Event.Scroll:
|
|
80
|
-
let scrollData: Interaction.ScrollData = {
|
|
81
|
-
target: tokens[2] as number,
|
|
82
|
-
x: tokens[3] as number,
|
|
83
|
-
y: tokens[4] as number,
|
|
84
|
-
top: tokens.length > 5 ? tokens[5] as string : null,
|
|
85
|
-
bottom: tokens.length > 6 ? tokens[6] as string : null
|
|
86
|
-
};
|
|
87
|
-
return { time, event, data: scrollData };
|
|
88
|
-
case Data.Event.Timeline:
|
|
89
|
-
let timelineHashes = (tokens[3] as string).split(Data.Constant.Dot);
|
|
90
|
-
let timelineData: TimelineData = {
|
|
91
|
-
type: tokens[2] as number,
|
|
92
|
-
hash: timelineHashes[Layout.Selector.Alpha],
|
|
93
|
-
x: tokens[4] as number,
|
|
94
|
-
y: tokens[5] as number,
|
|
95
|
-
reaction: tokens[6] as number,
|
|
96
|
-
context: tokens[7] as number,
|
|
97
|
-
hashBeta: timelineHashes.length > 0 ? timelineHashes[Layout.Selector.Beta] : null
|
|
98
|
-
};
|
|
99
|
-
return { time, event, data: timelineData };
|
|
100
|
-
case Data.Event.Visibility:
|
|
101
|
-
let visibleData: Interaction.VisibilityData;
|
|
102
|
-
if (typeof tokens[2] === "number") {
|
|
103
|
-
visibleData = { visible: tokens[2] as number };
|
|
104
|
-
} else {
|
|
105
|
-
visibleData = { visible: (tokens[2] as string) === "visible" ? Data.BooleanFlag.True : Data.BooleanFlag.False };
|
|
106
|
-
}
|
|
107
|
-
return { time, event, data: visibleData };
|
|
108
|
-
case Data.Event.Focus:
|
|
109
|
-
let focusData: Interaction.FocusData = { focused: tokens[2] as number };
|
|
110
|
-
return { time, event, data: focusData };
|
|
111
|
-
case Data.Event.Unload:
|
|
112
|
-
let unloadData: Interaction.UnloadData = { name: tokens[2] as string, persisted: tokens[3] as number };
|
|
113
|
-
return { time, event, data: unloadData };
|
|
114
|
-
}
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
1
|
+
import { Data, Interaction, Layout } from "clarity-js";
|
|
2
|
+
import { InteractionEvent, ClickData, TimelineData } from "../types/interaction";
|
|
3
|
+
|
|
4
|
+
export function decode(tokens: Data.Token[]): InteractionEvent {
|
|
5
|
+
let time = tokens[0] as number;
|
|
6
|
+
let event = tokens[1] as Data.Event;
|
|
7
|
+
switch (event) {
|
|
8
|
+
case Data.Event.MouseDown:
|
|
9
|
+
case Data.Event.MouseUp:
|
|
10
|
+
case Data.Event.MouseMove:
|
|
11
|
+
case Data.Event.MouseWheel:
|
|
12
|
+
case Data.Event.DoubleClick:
|
|
13
|
+
case Data.Event.TouchStart:
|
|
14
|
+
case Data.Event.TouchCancel:
|
|
15
|
+
case Data.Event.TouchEnd:
|
|
16
|
+
case Data.Event.TouchMove:
|
|
17
|
+
let pointerData: Interaction.PointerData = {
|
|
18
|
+
target: tokens[2] as number,
|
|
19
|
+
x: tokens[3] as number,
|
|
20
|
+
y: tokens[4] as number,
|
|
21
|
+
id: tokens[5] as number | undefined,
|
|
22
|
+
};
|
|
23
|
+
return { time, event, data: pointerData };
|
|
24
|
+
case Data.Event.Click:
|
|
25
|
+
case Data.Event.ContextMenu:
|
|
26
|
+
let clickHashes = (tokens[12] as string).split(Data.Constant.Dot);
|
|
27
|
+
let clickData: ClickData = {
|
|
28
|
+
target: tokens[2] as number,
|
|
29
|
+
x: tokens[3] as number,
|
|
30
|
+
y: tokens[4] as number,
|
|
31
|
+
eX: tokens[5] as number,
|
|
32
|
+
eY: tokens[6] as number,
|
|
33
|
+
button: tokens[7] as number,
|
|
34
|
+
reaction: tokens[8] as number,
|
|
35
|
+
context: tokens[9] as number,
|
|
36
|
+
text: tokens[10] as string,
|
|
37
|
+
link: tokens[11] as string,
|
|
38
|
+
hash: clickHashes[0],
|
|
39
|
+
hashBeta: clickHashes.length > 0 ? clickHashes[1] : null,
|
|
40
|
+
trust: tokens.length > 13 ? tokens[13] as number : Data.BooleanFlag.True,
|
|
41
|
+
isFullText: tokens.length > 14 ? tokens[14] as number : null,
|
|
42
|
+
w: tokens.length > 15 ? tokens[15] as number : 0,
|
|
43
|
+
h: tokens.length > 16 ? tokens[16] as number : 0,
|
|
44
|
+
tag: tokens.length > 17 ? tokens[17] as string : null,
|
|
45
|
+
class: tokens.length > 18 ? tokens[18] as string : null,
|
|
46
|
+
id: tokens.length > 19 ? tokens[19] as string : null,
|
|
47
|
+
};
|
|
48
|
+
return { time, event, data: clickData };
|
|
49
|
+
case Data.Event.Clipboard:
|
|
50
|
+
let clipData: Interaction.ClipboardData = { target: tokens[2] as number, action: tokens[3] as Interaction.Clipboard };
|
|
51
|
+
return { time, event, data: clipData };
|
|
52
|
+
case Data.Event.Resize:
|
|
53
|
+
let resizeData: Interaction.ResizeData = { width: tokens[2] as number, height: tokens[3] as number };
|
|
54
|
+
return { time, event, data: resizeData };
|
|
55
|
+
case Data.Event.Input:
|
|
56
|
+
let inputData: Interaction.InputData = { target: tokens[2] as number, value: tokens[3] as string, trust: tokens.length > 4 ? tokens[4] as number : Data.BooleanFlag.True };
|
|
57
|
+
return { time, event, data: inputData };
|
|
58
|
+
case Data.Event.Selection:
|
|
59
|
+
let selectionData: Interaction.SelectionData = {
|
|
60
|
+
start: tokens[2] as number,
|
|
61
|
+
startOffset: tokens[3] as number,
|
|
62
|
+
end: tokens[4] as number,
|
|
63
|
+
endOffset: tokens[5] as number
|
|
64
|
+
};
|
|
65
|
+
return { time, event, data: selectionData };
|
|
66
|
+
case Data.Event.Change:
|
|
67
|
+
let changeData: Interaction.ChangeData = {
|
|
68
|
+
target: tokens[2] as number,
|
|
69
|
+
type: tokens[3] as string,
|
|
70
|
+
value: tokens[4] as string,
|
|
71
|
+
checksum: tokens[5] as string
|
|
72
|
+
};
|
|
73
|
+
return { time, event, data: changeData };
|
|
74
|
+
case Data.Event.Submit:
|
|
75
|
+
let submitData: Interaction.SubmitData = {
|
|
76
|
+
target: tokens[2] as number
|
|
77
|
+
};
|
|
78
|
+
return { time, event, data: submitData };
|
|
79
|
+
case Data.Event.Scroll:
|
|
80
|
+
let scrollData: Interaction.ScrollData = {
|
|
81
|
+
target: tokens[2] as number,
|
|
82
|
+
x: tokens[3] as number,
|
|
83
|
+
y: tokens[4] as number,
|
|
84
|
+
top: tokens.length > 5 ? tokens[5] as string : null,
|
|
85
|
+
bottom: tokens.length > 6 ? tokens[6] as string : null
|
|
86
|
+
};
|
|
87
|
+
return { time, event, data: scrollData };
|
|
88
|
+
case Data.Event.Timeline:
|
|
89
|
+
let timelineHashes = (tokens[3] as string).split(Data.Constant.Dot);
|
|
90
|
+
let timelineData: TimelineData = {
|
|
91
|
+
type: tokens[2] as number,
|
|
92
|
+
hash: timelineHashes[Layout.Selector.Alpha],
|
|
93
|
+
x: tokens[4] as number,
|
|
94
|
+
y: tokens[5] as number,
|
|
95
|
+
reaction: tokens[6] as number,
|
|
96
|
+
context: tokens[7] as number,
|
|
97
|
+
hashBeta: timelineHashes.length > 0 ? timelineHashes[Layout.Selector.Beta] : null
|
|
98
|
+
};
|
|
99
|
+
return { time, event, data: timelineData };
|
|
100
|
+
case Data.Event.Visibility:
|
|
101
|
+
let visibleData: Interaction.VisibilityData;
|
|
102
|
+
if (typeof tokens[2] === "number") {
|
|
103
|
+
visibleData = { visible: tokens[2] as number };
|
|
104
|
+
} else {
|
|
105
|
+
visibleData = { visible: (tokens[2] as string) === "visible" ? Data.BooleanFlag.True : Data.BooleanFlag.False };
|
|
106
|
+
}
|
|
107
|
+
return { time, event, data: visibleData };
|
|
108
|
+
case Data.Event.Focus:
|
|
109
|
+
let focusData: Interaction.FocusData = { focused: tokens[2] as number };
|
|
110
|
+
return { time, event, data: focusData };
|
|
111
|
+
case Data.Event.Unload:
|
|
112
|
+
let unloadData: Interaction.UnloadData = { name: tokens[2] as string, persisted: tokens[3] as number };
|
|
113
|
+
return { time, event, data: unloadData };
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|