-
Notifications
You must be signed in to change notification settings - Fork 665
/
Copy pathtrackingUtils.ts
130 lines (111 loc) · 3.72 KB
/
trackingUtils.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import * as vscode from "vscode";
import axios from "axios";
import { getLeetCodeEndpoint } from "../commands/plugin";
import { Endpoint } from "../shared";
import { leetCodeManager } from "../leetCodeManager";
const getTimeZone = (): string => {
const endPoint: string = getLeetCodeEndpoint();
if (endPoint === Endpoint.LeetCodeCN) {
return "Asia/Shanghai";
} else {
return "UTC";
}
};
interface IReportData {
event_key: string;
type?: "click" | "expose" | string;
anonymous_id?: string;
tid?: number;
ename?: string; // event name
href?: string;
referer?: string;
extra?: string;
target?: string;
}
interface ITrackData {
reportCache: IReportData[];
isSubmit: boolean;
report: (reportItems: IReportData | IReportData[]) => void;
submitReport: (useSendBeason: boolean) => Promise<void>;
reportUrl: string;
}
const testReportUrl = "https://analysis.lingkou.xyz/i/event";
const prodReportUrl = "https://analysis.leetcode.cn/i/event";
function getReportUrl() {
if (process.env.NODE_ENV === "production") {
return prodReportUrl;
} else {
return testReportUrl;
}
}
const _charStr = "abacdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+=";
function RandomIndex(min: number, max: number, i: number) {
let index = Math.floor(Math.random() * (max - min + 1) + min);
const numStart = _charStr.length - 10;
if (i === 0 && index >= numStart) {
index = RandomIndex(min, max, i);
}
return index;
}
function getRandomString(len: number) {
const min = 0;
const max = _charStr.length - 1;
let _str = "";
len = len || 15;
for (let i = 0, index; i < len; i++) {
index = RandomIndex(min, max, i);
_str += _charStr[index];
}
return _str;
}
function getAllowReportDataConfig() {
const leetCodeConfig = vscode.workspace.getConfiguration("leetcode");
const allowReportData = !!leetCodeConfig.get<boolean>("allowReportData");
return allowReportData;
}
class TrackData implements ITrackData {
public reportCache: IReportData[] = [];
public isSubmit: boolean = false;
public reportUrl: string = getReportUrl();
private sendTimer: NodeJS.Timeout | undefined;
public report = (reportItems: IReportData | IReportData[]) => {
if (!getAllowReportDataConfig()) return;
this.sendTimer && clearTimeout(this.sendTimer);
if (!Array.isArray(reportItems)) {
reportItems = [reportItems];
}
const randomId = getRandomString(60);
reportItems.forEach((item) => {
this.reportCache.push({
...item,
referer: "vscode",
target: leetCodeManager.getUser() ?? "",
anonymous_id: item.anonymous_id ?? (randomId as string),
});
});
this.sendTimer = setTimeout(this.submitReport, 800);
};
public submitReport = async () => {
if (!getAllowReportDataConfig()) return;
const dataList = JSON.stringify(this.reportCache);
if (!this.reportCache.length || this.isSubmit) {
return;
}
this.reportCache = [];
try {
this.isSubmit = true;
axios.defaults.withCredentials = true;
await axios.post(this.reportUrl, `dataList=${encodeURIComponent(dataList)}`, {
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"x-timezone": getTimeZone(),
},
});
} catch (e) {
this.reportCache = this.reportCache.concat(JSON.parse(dataList));
} finally {
this.isSubmit = false;
}
};
}
export default new TrackData();