@rk911/tracker-sdk 1.6.5 → 1.6.7
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/core/compat.js +4 -0
- package/package.json +1 -1
- package/plugins/api-watch.js +5 -26
- package/plugins/click.js +13 -0
- package/plugins/js-error.js +2 -1
- package/plugins/page-view.js +4 -0
package/core/compat.js
CHANGED
|
@@ -178,6 +178,9 @@ export function createPageStayMixin(tracker) {
|
|
|
178
178
|
} catch (e) {}
|
|
179
179
|
if (!route) return
|
|
180
180
|
this._pageStayRoute = route.charAt(0) === '/' ? route : '/' + route
|
|
181
|
+
this._pageStayReferrer = tracker.getReferrer() || null
|
|
182
|
+
// 解决 onLoad 内打点 pageRoute 错位问题:进入新页面 onLoad 时立即同步更新 SDK 路由状态
|
|
183
|
+
tracker.updatePageRoute(this._pageStayRoute)
|
|
181
184
|
this._pageStayTitle = ''
|
|
182
185
|
try {
|
|
183
186
|
if (typeof document !== 'undefined' && document.title) {
|
|
@@ -332,6 +335,7 @@ export function createPageStayMixin(tracker) {
|
|
|
332
335
|
|
|
333
336
|
tracker.track('page_stay', {
|
|
334
337
|
pageRoute: this._pageStayRoute,
|
|
338
|
+
referrer: this._pageStayReferrer || tracker.getReferrer() || null,
|
|
335
339
|
pageTitle: this._pageStayTitle || null,
|
|
336
340
|
duration: duration,
|
|
337
341
|
frontUrl: stayFrontUrl,
|
package/package.json
CHANGED
package/plugins/api-watch.js
CHANGED
|
@@ -188,37 +188,16 @@ export class ApiWatchPlugin {
|
|
|
188
188
|
return str
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
+
// header 直接透传(不再做混淆/截断)——原 _encryptValue 会把 token 截断成前16字节
|
|
192
|
+
// 导致后台无法还原([解码失败]),已移除。敏感 header 现以明文上报。
|
|
191
193
|
_filterHeaders(headers) {
|
|
192
194
|
if (!headers || typeof headers !== 'object') return null
|
|
193
|
-
var
|
|
194
|
-
var sensitiveKeys = ['authorization', 'token', 'rsb-token', 'cookie', 'set-cookie']
|
|
195
|
+
var copy = {}
|
|
195
196
|
for (var key in headers) {
|
|
196
197
|
if (!headers.hasOwnProperty(key)) continue
|
|
197
|
-
|
|
198
|
-
filtered[key] = this._encryptValue(headers[key])
|
|
199
|
-
} else {
|
|
200
|
-
filtered[key] = headers[key]
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
return filtered
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
_encryptValue(value) {
|
|
207
|
-
if (!value) return ''
|
|
208
|
-
try {
|
|
209
|
-
var encoded = encodeURIComponent(value)
|
|
210
|
-
var result = ''
|
|
211
|
-
for (var i = 0; i < encoded.length; i++) {
|
|
212
|
-
result += String.fromCharCode(encoded.charCodeAt(i) ^ 0x5A)
|
|
213
|
-
}
|
|
214
|
-
var full = btoa(result)
|
|
215
|
-
if (full.length > 16) {
|
|
216
|
-
return 'ENC:' + full.substring(0, 16) + '...'
|
|
217
|
-
}
|
|
218
|
-
return 'ENC:' + full
|
|
219
|
-
} catch (e) {
|
|
220
|
-
return ''
|
|
198
|
+
copy[key] = headers[key]
|
|
221
199
|
}
|
|
200
|
+
return copy
|
|
222
201
|
}
|
|
223
202
|
|
|
224
203
|
destroy() {
|
package/plugins/click.js
CHANGED
|
@@ -261,6 +261,19 @@ export class ClickPlugin {
|
|
|
261
261
|
var text = (container.innerText || container.textContent || '').trim()
|
|
262
262
|
// 排除空文本
|
|
263
263
|
if (!text) return ''
|
|
264
|
+
// 若包含换行符(弹窗/引导层容器),提取最符合按钮特性的短行
|
|
265
|
+
if (text.indexOf('\n') > -1) {
|
|
266
|
+
var lines = text.split('\n').map(function (l) { return l.trim() }).filter(Boolean)
|
|
267
|
+
if (lines.length > 0) {
|
|
268
|
+
for (var i = lines.length - 1; i >= 0; i--) {
|
|
269
|
+
if (lines[i].length > 0 && lines[i].length <= 12) {
|
|
270
|
+
text = lines[i]
|
|
271
|
+
break
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (text.indexOf('\n') > -1) text = lines[0]
|
|
275
|
+
}
|
|
276
|
+
}
|
|
264
277
|
// 排除图标字体单字符(Unicode 私用区)
|
|
265
278
|
if (text.length === 1 && text.charCodeAt(0) > 0xe000) return ''
|
|
266
279
|
// [PROJECT-ADAPT] 设计工具命名过滤
|
package/plugins/js-error.js
CHANGED
|
@@ -57,7 +57,8 @@ export class JsErrorPlugin {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
var
|
|
60
|
+
var route = this._getCurrentRoute()
|
|
61
|
+
var fingerprint = 'vue|' + route + '|' + message + '|' + componentName + '|' + (info || '')
|
|
61
62
|
|
|
62
63
|
if (this._isDuplicate(fingerprint)) return
|
|
63
64
|
if (!this._shouldReport()) return
|
package/plugins/page-view.js
CHANGED
|
@@ -90,6 +90,9 @@ export class PageViewPlugin {
|
|
|
90
90
|
// 去重:同一个页面不重复上报
|
|
91
91
|
if (currentPage === this._lastPage) return
|
|
92
92
|
|
|
93
|
+
// 锁定进页时刻的时间戳(避免被后方的 title 异步重试链延迟 100~500ms)
|
|
94
|
+
var entryTimestamp = adapter.getTimestamp()
|
|
95
|
+
|
|
93
96
|
// 防抖:同路由 500ms 内不重复上报(防框架路由重入导致的竞态)
|
|
94
97
|
var now = Date.now()
|
|
95
98
|
if (this._lastFiredRoute === currentPage && now - this._lastFiredTime < 500) return
|
|
@@ -144,6 +147,7 @@ export class PageViewPlugin {
|
|
|
144
147
|
pageRoute: currentPage,
|
|
145
148
|
page: currentPage,
|
|
146
149
|
pageTitle: title,
|
|
150
|
+
timestamp: entryTimestamp,
|
|
147
151
|
})
|
|
148
152
|
}
|
|
149
153
|
reportWithTitle()
|