vue-eye-sdk 1.0.0

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.
@@ -0,0 +1,710 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var config = {
6
+ url: '',
7
+ projectName: 'eyesdk',
8
+ appId: '123456',
9
+ userId: '123456',
10
+ isImageUpload: false,
11
+ batchSize: 5
12
+ };
13
+ function setConfig(options) {
14
+ for (var key in config) {
15
+ if (options[key]) {
16
+ config[key] = options[key];
17
+ }
18
+ }
19
+ }
20
+
21
+ function _arrayLikeToArray(r, a) {
22
+ (null == a || a > r.length) && (a = r.length);
23
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
24
+ return n;
25
+ }
26
+ function _createForOfIteratorHelper(r, e) {
27
+ var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
28
+ if (!t) {
29
+ if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) {
30
+ t && (r = t);
31
+ var n = 0,
32
+ F = function () {};
33
+ return {
34
+ s: F,
35
+ n: function () {
36
+ return n >= r.length ? {
37
+ done: true
38
+ } : {
39
+ done: false,
40
+ value: r[n++]
41
+ };
42
+ },
43
+ e: function (r) {
44
+ throw r;
45
+ },
46
+ f: F
47
+ };
48
+ }
49
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
50
+ }
51
+ var o,
52
+ a = true,
53
+ u = false;
54
+ return {
55
+ s: function () {
56
+ t = t.call(r);
57
+ },
58
+ n: function () {
59
+ var r = t.next();
60
+ return a = r.done, r;
61
+ },
62
+ e: function (r) {
63
+ u = true, o = r;
64
+ },
65
+ f: function () {
66
+ try {
67
+ a || null == t.return || t.return();
68
+ } finally {
69
+ if (u) throw o;
70
+ }
71
+ }
72
+ };
73
+ }
74
+ function _defineProperty(e, r, t) {
75
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
76
+ value: t,
77
+ enumerable: true,
78
+ configurable: true,
79
+ writable: true
80
+ }) : e[r] = t, e;
81
+ }
82
+ function ownKeys(e, r) {
83
+ var t = Object.keys(e);
84
+ if (Object.getOwnPropertySymbols) {
85
+ var o = Object.getOwnPropertySymbols(e);
86
+ r && (o = o.filter(function (r) {
87
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
88
+ })), t.push.apply(t, o);
89
+ }
90
+ return t;
91
+ }
92
+ function _objectSpread2(e) {
93
+ for (var r = 1; r < arguments.length; r++) {
94
+ var t = null != arguments[r] ? arguments[r] : {};
95
+ r % 2 ? ownKeys(Object(t), true).forEach(function (r) {
96
+ _defineProperty(e, r, t[r]);
97
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
98
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
99
+ });
100
+ }
101
+ return e;
102
+ }
103
+ function _toPrimitive(t, r) {
104
+ if ("object" != typeof t || !t) return t;
105
+ var e = t[Symbol.toPrimitive];
106
+ if (void 0 !== e) {
107
+ var i = e.call(t, r);
108
+ if ("object" != typeof i) return i;
109
+ throw new TypeError("@@toPrimitive must return a primitive value.");
110
+ }
111
+ return ("string" === r ? String : Number)(t);
112
+ }
113
+ function _toPropertyKey(t) {
114
+ var i = _toPrimitive(t, "string");
115
+ return "symbol" == typeof i ? i : i + "";
116
+ }
117
+ function _typeof(o) {
118
+ "@babel/helpers - typeof";
119
+
120
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
121
+ return typeof o;
122
+ } : function (o) {
123
+ return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
124
+ }, _typeof(o);
125
+ }
126
+ function _unsupportedIterableToArray(r, a) {
127
+ if (r) {
128
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
129
+ var t = {}.toString.call(r).slice(8, -1);
130
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
131
+ }
132
+ }
133
+
134
+ function deepCopy(target) {
135
+ if (_typeof(target) === 'object') {
136
+ var result = Array.isArray(target) ? [] : {};
137
+ for (var key in target) {
138
+ if (_typeof(target[key]) == 'object') {
139
+ result[key] = deepCopy(target[key]);
140
+ } else {
141
+ result[key] = target[key];
142
+ }
143
+ }
144
+ return result;
145
+ }
146
+ return target;
147
+ }
148
+ function generateUniqueId() {
149
+ return 'id-' + Date.now() + '-' + Math.random().toString(36).substring(2, 9);
150
+ }
151
+
152
+ var cache = [];
153
+ function getCache() {
154
+ return deepCopy(cache);
155
+ }
156
+ function addCache(data) {
157
+ cache.push(data);
158
+ }
159
+ function clearCache() {
160
+ cache.length = 0;
161
+ }
162
+
163
+ var originalOpen$1 = XMLHttpRequest.prototype.open;
164
+ var originalSend$1 = XMLHttpRequest.prototype.send;
165
+ function report(data) {
166
+ if (!config.url) {
167
+ console.error('请设置上传 url 地址');
168
+ }
169
+ var reportData = JSON.stringify({
170
+ id: generateUniqueId(),
171
+ data: data
172
+ });
173
+ // 上报数据,使用图片的方式
174
+ if (config.isImageUpload) {
175
+ imgRequest(reportData);
176
+ } else {
177
+ // 优先使用 sendBeacon
178
+ if (window.navigator.sendBeacon) {
179
+ return beaconRequest(reportData);
180
+ } else {
181
+ xhrRequest(reportData);
182
+ }
183
+ }
184
+ }
185
+ // 批量上报数据
186
+ function lazyReportBatch(data) {
187
+ addCache(data);
188
+ var dataCache = getCache();
189
+ console.error('dataCache', dataCache);
190
+ if (dataCache.length && dataCache.length > config.batchSize) {
191
+ report(dataCache);
192
+ clearCache();
193
+ }
194
+ //
195
+ }
196
+ // 图片发送数据
197
+ function imgRequest(data) {
198
+ var img = new Image();
199
+ // http://127.0.0.1:8080/api?data=encodeURIComponent(data)
200
+ img.src = "".concat(config.url, "?data=").concat(encodeURIComponent(JSON.stringify(data)));
201
+ }
202
+ // 普通ajax发送请求数据
203
+ function xhrRequest(data) {
204
+ if (window.requestIdleCallback) {
205
+ window.requestIdleCallback(function () {
206
+ var xhr = new XMLHttpRequest();
207
+ originalOpen$1.call(xhr, 'post', config.url);
208
+ originalSend$1.call(xhr, JSON.stringify(data));
209
+ }, {
210
+ timeout: 3000
211
+ });
212
+ } else {
213
+ setTimeout(function () {
214
+ var xhr = new XMLHttpRequest();
215
+ originalOpen$1.call(xhr, 'post', url);
216
+ originalSend$1.call(xhr, JSON.stringify(data));
217
+ });
218
+ }
219
+ }
220
+
221
+ // const sendBeacon = isSupportSendBeacon() ? navigator.sendBeacon : xhrRequest
222
+ function beaconRequest(data) {
223
+ if (window.requestIdleCallback) {
224
+ window.requestIdleCallback(function () {
225
+ window.navigator.sendBeacon(config.url, data);
226
+ }, {
227
+ timeout: 3000
228
+ });
229
+ } else {
230
+ setTimeout(function () {
231
+ window.navigator.sendBeacon(config.url, data);
232
+ });
233
+ }
234
+ }
235
+
236
+ var originalFetch = window.fetch;
237
+ function overwriteFetch() {
238
+ window.fetch = function newFetch(url, config) {
239
+ var startTime = Date.now();
240
+ var reportData = {
241
+ type: 'performance',
242
+ subType: 'fetch',
243
+ url: url,
244
+ startTime: startTime,
245
+ method: config.method
246
+ };
247
+ return originalFetch(url, config).then(function (res) {
248
+ var endTime = Date.now();
249
+ reportData.endTime = endTime;
250
+ reportData.duration = endTime - startTime;
251
+ var data = res.clone();
252
+ reportData.status = data.status;
253
+ reportData.success = data.ok;
254
+ // todo 上报数据
255
+ lazyReportBatch(reportData);
256
+ return res;
257
+ }).catch(function (err) {
258
+ var endTime = Date.now();
259
+ reportData.endTime = endTime;
260
+ reportData.duration = endTime - startTime;
261
+ reportData.status = 0;
262
+ reportData.success = false;
263
+ // todo 上报数据
264
+ lazyReportBatch(reportData);
265
+ });
266
+ };
267
+ }
268
+ function fetch() {
269
+ overwriteFetch();
270
+ }
271
+
272
+ function observerEntries() {
273
+ if (document.readyState === 'complete') {
274
+ observerEvent();
275
+ } else {
276
+ var _onLoad = function onLoad() {
277
+ observerEvent();
278
+ window.removeEventListener('load', _onLoad, true);
279
+ };
280
+ window.addEventListener('load', _onLoad, true);
281
+ }
282
+ }
283
+ function observerEvent() {
284
+ var entryHandler = function entryHandler(list) {
285
+ var data = list.getEntries();
286
+ var _iterator = _createForOfIteratorHelper(data),
287
+ _step;
288
+ try {
289
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
290
+ var entry = _step.value;
291
+ if (observer) {
292
+ observer.disconnect();
293
+ }
294
+ var reportData = {
295
+ name: entry.name,
296
+ // 资源的名字
297
+ type: 'performance',
298
+ // 类型
299
+ subType: entry.entryType,
300
+ //类型
301
+ sourceType: entry.initiatorType,
302
+ // 资源类型
303
+ duration: entry.duration,
304
+ // 加载时间
305
+ dns: entry.domainLookupEnd - entry.domainLookupStart,
306
+ // dns解析时间
307
+ tcp: entry.connectEnd - entry.connectStart,
308
+ // tcp连接时间
309
+ redirect: entry.redirectEnd - entry.redirectStart,
310
+ // 重定向时间
311
+ ttfb: entry.responseStart,
312
+ // 首字节时间
313
+ protocol: entry.nextHopProtocol,
314
+ // 请求协议
315
+ responseBodySize: entry.encodedBodySize,
316
+ // 响应内容大小
317
+ responseHeaderSize: entry.transferSize - entry.encodedBodySize,
318
+ // 响应头部大小
319
+ transferSize: entry.transferSize,
320
+ // 请求内容大小
321
+ resourceSize: entry.decodedBodySize,
322
+ // 资源解压后的大小
323
+ startTime: performance.now()
324
+ };
325
+ console.log("=================loading===========");
326
+ lazyReportBatch(reportData);
327
+ // console.log(entry);
328
+ }
329
+ } catch (err) {
330
+ _iterator.e(err);
331
+ } finally {
332
+ _iterator.f();
333
+ }
334
+ };
335
+ var observer = new PerformanceObserver(entryHandler);
336
+ observer.observe({
337
+ type: ['resource'],
338
+ buffered: true
339
+ });
340
+ }
341
+
342
+ function observerLCP() {
343
+ var entryHandler = function entryHandler(list) {
344
+ if (observer) {
345
+ observer.disconnect();
346
+ }
347
+ var _iterator = _createForOfIteratorHelper(list.getEntries()),
348
+ _step;
349
+ try {
350
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
351
+ var entry = _step.value;
352
+ var json = entry.toJSON();
353
+ console.log(json);
354
+ var reportData = _objectSpread2(_objectSpread2({}, json), {}, {
355
+ type: 'performance',
356
+ subType: entry.name,
357
+ pageUrl: window.location.href
358
+ });
359
+ // 发送数据 todo;
360
+ lazyReportBatch(reportData);
361
+ }
362
+ } catch (err) {
363
+ _iterator.e(err);
364
+ } finally {
365
+ _iterator.f();
366
+ }
367
+ };
368
+ // 统计和计算lcp的时间
369
+ var observer = new PerformanceObserver(entryHandler);
370
+ // buffered: true 确保观察到所有paint事件
371
+ observer.observe({
372
+ type: 'largest-contentful-paint',
373
+ buffered: true
374
+ });
375
+ }
376
+
377
+ function observerFCP() {
378
+ var entryHandler = function entryHandler(list) {
379
+ var _iterator = _createForOfIteratorHelper(list.getEntries()),
380
+ _step;
381
+ try {
382
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
383
+ var entry = _step.value;
384
+ if (entry.name === 'first-contentful-paint') {
385
+ observer.disconnect();
386
+ var json = entry.toJSON();
387
+ console.log(json);
388
+ var reportData = _objectSpread2(_objectSpread2({}, json), {}, {
389
+ type: 'performance',
390
+ subType: entry.name,
391
+ pageUrl: window.location.href
392
+ });
393
+ // 发送数据 todo;
394
+ lazyReportBatch(reportData);
395
+ }
396
+ }
397
+ } catch (err) {
398
+ _iterator.e(err);
399
+ } finally {
400
+ _iterator.f();
401
+ }
402
+ };
403
+ // 统计和计算fcp的时间
404
+ var observer = new PerformanceObserver(entryHandler);
405
+ // buffered: true 确保观察到所有paint事件
406
+ observer.observe({
407
+ type: 'paint',
408
+ buffered: true
409
+ });
410
+ }
411
+
412
+ function observerLoad() {
413
+ window.addEventListener('pageShow', function (event) {
414
+ requestAnimationFrame(function () {
415
+ ['load'].forEach(function (type) {
416
+ var reportData = {
417
+ type: 'performance',
418
+ subType: type,
419
+ pageUrl: window.location.href,
420
+ startTime: performance.now() - event.timeStamp
421
+ };
422
+ // 发送数据
423
+ lazyReportBatch(reportData);
424
+ });
425
+ }, true);
426
+ });
427
+ }
428
+
429
+ function observerPaint() {
430
+ var entryHandler = function entryHandler(list) {
431
+ var _iterator = _createForOfIteratorHelper(list.getEntries()),
432
+ _step;
433
+ try {
434
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
435
+ var entry = _step.value;
436
+ if (entry.name === 'first-paint') {
437
+ observer.disconnect();
438
+ var json = entry.toJSON();
439
+ console.log(json);
440
+ var reportData = _objectSpread2(_objectSpread2({}, json), {}, {
441
+ type: 'performance',
442
+ subType: entry.name,
443
+ pageUrl: window.location.href
444
+ });
445
+ // 发送数据 todo;
446
+ lazyReportBatch(reportData);
447
+ }
448
+ }
449
+ } catch (err) {
450
+ _iterator.e(err);
451
+ } finally {
452
+ _iterator.f();
453
+ }
454
+ };
455
+ // 统计和计算fp的时间
456
+ var observer = new PerformanceObserver(entryHandler);
457
+ // buffered: true 确保观察到所有paint事件
458
+ observer.observe({
459
+ type: 'paint',
460
+ buffered: true
461
+ });
462
+ }
463
+
464
+ var originalProto = XMLHttpRequest.prototype;
465
+ var originalSend = originalProto.send;
466
+ var originalOpen = originalProto.open;
467
+ function overwriteOpenAndSend() {
468
+ originalProto.open = function newOpen() {
469
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
470
+ args[_key] = arguments[_key];
471
+ }
472
+ this.url = args[1];
473
+ this.method = args[0];
474
+ originalOpen.apply(this, args);
475
+ };
476
+ originalProto.send = function newSend() {
477
+ var _this = this;
478
+ this.startTime = Date.now();
479
+ var _onLoaded = function onLoaded() {
480
+ _this.endTime = Date.now();
481
+ _this.duration = _this.endTime - _this.startTime;
482
+ var url = _this.url,
483
+ method = _this.method,
484
+ startTime = _this.startTime,
485
+ endTime = _this.endTime,
486
+ duration = _this.duration,
487
+ status = _this.status;
488
+ var reportData = {
489
+ status: status,
490
+ duration: duration,
491
+ startTime: startTime,
492
+ endTime: endTime,
493
+ url: url,
494
+ method: method.toUpperCase(),
495
+ type: 'performance',
496
+ success: status >= 200 && status < 300,
497
+ subType: 'xhr'
498
+ };
499
+ // todo 发送数据
500
+ lazyReportBatch(reportData);
501
+ _this.removeEventListener('loadend', _onLoaded, true);
502
+ };
503
+ this.addEventListener('loadend', _onLoaded, true);
504
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
505
+ args[_key2] = arguments[_key2];
506
+ }
507
+ originalSend.apply(this, args);
508
+ };
509
+ }
510
+ function xhr() {
511
+ overwriteOpenAndSend();
512
+ }
513
+
514
+ function performance$1() {
515
+ fetch();
516
+ observerEntries();
517
+ observerLCP();
518
+ observerFCP();
519
+ observerLoad();
520
+ observerPaint();
521
+ xhr();
522
+ }
523
+
524
+ function error() {
525
+ // 捕获资源加载失败的错误: js css img
526
+ window.addEventListener('error', function (e) {
527
+ var target = e.target;
528
+ if (target.src || target.href) {
529
+ var url = target.src || target.href;
530
+ var reportData = {
531
+ type: 'error',
532
+ subType: 'resource',
533
+ url: url,
534
+ html: target.outerHTML,
535
+ pageUrl: window.location.href,
536
+ pahts: e.path
537
+ };
538
+ // todo 发送错误信息
539
+ lazyReportBatch(reportData);
540
+ }
541
+ }, true);
542
+ // 捕获js错误
543
+ window.onerror = function (msg, url, lineNo, columnNo, error) {
544
+ var reportData = {
545
+ type: 'error',
546
+ subType: 'js',
547
+ msg: msg,
548
+ url: url,
549
+ lineNo: lineNo,
550
+ columnNo: columnNo,
551
+ stack: error.stack,
552
+ pageUrl: window.location.href,
553
+ startTime: performance.now()
554
+ };
555
+ // todo 发送错误信息
556
+ lazyReportBatch(reportData);
557
+ };
558
+ // 捕获promise错误 asyn await
559
+ window.addEventListener('unhandledrejection', function (e) {
560
+ var _e$reason;
561
+ var reportData = {
562
+ type: 'error',
563
+ subType: 'promise',
564
+ reason: (_e$reason = e.reason) === null || _e$reason === void 0 ? void 0 : _e$reason.stack,
565
+ pageUrl: window.location.href,
566
+ startTime: e.timeStamp
567
+ };
568
+ // todo 发送错误信息
569
+ lazyReportBatch(reportData);
570
+ }, true);
571
+ }
572
+
573
+ function onClick() {
574
+ ['mousedown', 'touchstart'].forEach(function (eventType) {
575
+ window.addEventListener(eventType, function (e) {
576
+ var target = e.target;
577
+ console.log('click', target);
578
+ if (target.tagName) {
579
+ var reportData = {
580
+ // scrollTop: document.documentElement.scrollTop,
581
+ type: 'behavior',
582
+ subType: 'click',
583
+ target: target.tagName,
584
+ startTime: e.timeStamp,
585
+ innerHtml: target.innerHTML,
586
+ outerHtml: target.outerHTML,
587
+ with: target.offsetWidth,
588
+ height: target.offsetHeight,
589
+ eventType: eventType,
590
+ path: e.path
591
+ };
592
+ lazyReportBatch(reportData);
593
+ }
594
+ });
595
+ });
596
+ }
597
+
598
+ function pageChange() {
599
+ // hash histroy
600
+ var oldUrl = '';
601
+ window.addEventListener('hashchange', function (event) {
602
+ console.error('hashchange', event);
603
+ var newUrl = event.newURL;
604
+ var reportData = {
605
+ form: oldUrl,
606
+ to: newUrl,
607
+ type: 'behavior',
608
+ subType: 'hashchange',
609
+ startTime: performance.now(),
610
+ uuid: generateUniqueId()
611
+ };
612
+ lazyReportBatch(reportData);
613
+ oldUrl = newUrl;
614
+ }, true);
615
+ var from = '';
616
+ window.addEventListener('popstate', function (event) {
617
+ console.error('popstate', event);
618
+ var to = window.location.href;
619
+ var reportData = {
620
+ form: from,
621
+ to: to,
622
+ type: 'behavior',
623
+ subType: 'popstate',
624
+ startTime: performance.now(),
625
+ uuid: generateUniqueId()
626
+ };
627
+ lazyReportBatch(reportData);
628
+ from = to;
629
+ }, true);
630
+ }
631
+
632
+ function pv() {
633
+ var reportData = {
634
+ type: 'behavior',
635
+ subType: 'pv',
636
+ startTime: performance.now(),
637
+ pageUrl: window.location.href,
638
+ referror: document.referrer,
639
+ uuid: generateUniqueId()
640
+ };
641
+ lazyReportBatch(reportData);
642
+ }
643
+
644
+ function behavior() {
645
+ onClick(), pageChange(), pv();
646
+ }
647
+
648
+ window.__webEyeSDK__ = {
649
+ version: '0.0.1'
650
+ };
651
+
652
+ // 针对Vue项目的错误捕获
653
+ function install(Vue, options) {
654
+ if (__webEyeSDK__.vue) return;
655
+ __webEyeSDK__.vue = true;
656
+ setConfig(options);
657
+ var handler = Vue.config.errorHandler;
658
+ // vue项目中 通过 Vue.config.errorHandler 捕获错误
659
+ Vue.config.errorHandler = function (err, vm, info) {
660
+ // todo: 上报具体的错误信息
661
+ var reportData = {
662
+ info: info,
663
+ error: err.stack,
664
+ subType: 'vue',
665
+ type: 'error',
666
+ startTime: window.performance.now(),
667
+ pageURL: window.location.href
668
+ };
669
+ console.log('vue error', reportData);
670
+ lazyReportBatch(reportData);
671
+ if (handler) {
672
+ handler.call(this, err, vm, info);
673
+ }
674
+ };
675
+ }
676
+ // 针对React项目的错误捕获
677
+ function errorBoundary(err, info) {
678
+ if (__webEyeSDK__.react) return;
679
+ __webEyeSDK__.react = true;
680
+ // todo: 上报具体的错误信息
681
+ var reportData = {
682
+ error: err === null || err === void 0 ? void 0 : err.stack,
683
+ info: info,
684
+ subType: 'react',
685
+ type: 'error',
686
+ startTime: window.performance.now(),
687
+ pageURL: window.location.href
688
+ };
689
+ lazyReportBatch(reportData);
690
+ }
691
+ function init(options) {
692
+ setConfig(options);
693
+ // performance();
694
+ error();
695
+ // behavior();
696
+ }
697
+ var webEyeSDK = {
698
+ install: install,
699
+ errorBoundary: errorBoundary,
700
+ performance: performance$1,
701
+ error: error,
702
+ behavior: behavior,
703
+ init: init
704
+ };
705
+
706
+ exports.default = webEyeSDK;
707
+ exports.errorBoundary = errorBoundary;
708
+ exports.init = init;
709
+ exports.install = install;
710
+ //# sourceMappingURL=monitor.cjs.js.map