@swifty.js/sentry 0.0.2 → 0.0.4
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 +23 -23
- package/dist/core/api.cjs +1 -1
- package/dist/core/api.js +1 -1
- package/dist/core/breadcrumb.cjs +1 -1
- package/dist/core/breadcrumb.js +1 -1
- package/dist/core/bus.cjs +1 -1
- package/dist/core/bus.js +1 -1
- package/dist/core/decorate-http.cjs +1 -1
- package/dist/core/decorate-http.js +1 -1
- package/dist/core/decorate-route.cjs +1 -1
- package/dist/core/decorate-route.js +1 -1
- package/dist/core/decorates.cjs +1 -1
- package/dist/core/decorates.js +1 -1
- package/dist/core/framework-error.cjs +1 -1
- package/dist/core/framework-error.d.ts +32 -0
- package/dist/core/framework-error.js +1 -1
- package/dist/core/handle-code-error.cjs +1 -1
- package/dist/core/handle-code-error.js +1 -1
- package/dist/core/handle-error.cjs +1 -1
- package/dist/core/handle-error.js +1 -1
- package/dist/core/handle-events.cjs +1 -1
- package/dist/core/handle-events.js +1 -1
- package/dist/core/handle-http.cjs +1 -1
- package/dist/core/handle-http.js +1 -1
- package/dist/core/handle-route.cjs +1 -1
- package/dist/core/handle-route.js +1 -1
- package/dist/core/identity.cjs +1 -1
- package/dist/core/identity.js +1 -1
- package/dist/core/ip.d.ts +21 -0
- package/dist/core/pv-lifecycle.cjs +1 -1
- package/dist/core/pv-lifecycle.js +1 -1
- package/dist/core/sdk-lifecycle.cjs +1 -1
- package/dist/core/sdk-lifecycle.d.ts +22 -0
- package/dist/core/sdk-lifecycle.js +1 -1
- package/dist/core/setup.cjs +1 -1
- package/dist/core/setup.js +1 -1
- package/dist/core/white-screen.cjs +1 -1
- package/dist/core/white-screen.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -1
- package/dist/package.json.cjs +1 -1
- package/dist/package.json.js +1 -1
- package/dist/plugins/exposure/index.cjs +1 -1
- package/dist/plugins/exposure/index.d.ts +22 -0
- package/dist/plugins/exposure/index.js +1 -1
- package/dist/plugins/performance/index.cjs +1 -1
- package/dist/plugins/performance/index.d.ts +22 -0
- package/dist/plugins/performance/index.js +1 -1
- package/dist/plugins/performance/navigation-timing.cjs +1 -1
- package/dist/plugins/performance/navigation-timing.js +1 -1
- package/dist/plugins/performance/perf.cjs +1 -1
- package/dist/plugins/performance/perf.js +1 -1
- package/dist/plugins/performance/resource-element-fallback.cjs +1 -1
- package/dist/plugins/performance/resource-element-fallback.js +1 -1
- package/dist/plugins/performance/resource-timing.cjs +1 -1
- package/dist/plugins/performance/resource-timing.js +1 -1
- package/dist/plugins/screen-record/index.cjs +1 -1
- package/dist/plugins/screen-record/index.d.ts +22 -0
- package/dist/plugins/screen-record/index.js +1 -1
- package/dist/plugins/screen-record/recorder.cjs +1 -1
- package/dist/plugins/screen-record/recorder.d.ts +22 -0
- package/dist/plugins/screen-record/recorder.js +1 -1
- package/dist/react.d.ts +22 -0
- package/dist/reporter/batch.cjs +1 -1
- package/dist/reporter/batch.js +1 -1
- package/dist/reporter/index.cjs +1 -1
- package/dist/reporter/index.js +1 -1
- package/dist/reporter/network-listener.cjs +1 -1
- package/dist/reporter/network-listener.js +1 -1
- package/dist/reporter/offline-cache.cjs +1 -1
- package/dist/reporter/offline-cache.js +1 -1
- package/dist/reporter/report-data.cjs +1 -1
- package/dist/reporter/report-data.js +1 -1
- package/dist/reporter/send-preflight.cjs +1 -1
- package/dist/reporter/send-preflight.js +1 -1
- package/dist/reporter/server-recovery.cjs +1 -1
- package/dist/reporter/server-recovery.js +1 -1
- package/dist/reporter/transports.cjs +1 -1
- package/dist/reporter/transports.js +1 -1
- package/dist/sourcemap/sourcemap.cjs +1 -0
- package/dist/sourcemap/sourcemap.js +1 -0
- package/dist/sourcemap/vite.cjs +1 -0
- package/dist/sourcemap/vite.js +1 -0
- package/dist/sourcemap/webpack.cjs +1 -0
- package/dist/sourcemap/webpack.js +1 -0
- package/dist/types/common.d.ts +31 -3
- package/dist/types/enums.cjs +1 -1
- package/dist/types/enums.d.ts +22 -1
- package/dist/types/enums.js +1 -1
- package/dist/types/handlers.d.ts +22 -0
- package/dist/types/options.d.ts +22 -0
- package/dist/types/plugin.d.ts +22 -0
- package/dist/utils/click-data.cjs +1 -1
- package/dist/utils/click-data.js +1 -1
- package/dist/utils/decorate-prop.d.ts +21 -0
- package/dist/utils/is-type.cjs +1 -1
- package/dist/utils/is-type.js +1 -1
- package/dist/vite.cjs +1 -1
- package/dist/vite.d.ts +22 -0
- package/dist/vite.js +1 -1
- package/dist/vue.d.ts +22 -0
- package/dist/webpack.cjs +1 -1
- package/dist/webpack.d.ts +22 -0
- package/dist/webpack.js +1 -1
- package/package.json +8 -15
- package/dist/preact.cjs +0 -1
- package/dist/preact.d.ts +0 -52
- package/dist/preact.js +0 -1
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
import { SentryPlugin } from '../../types/plugin.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Copyright (c) 2026 hangtiancheng
|
|
6
|
+
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
|
15
|
+
* all copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
* SOFTWARE.
|
|
24
|
+
*/
|
|
25
|
+
|
|
4
26
|
declare const exposureTargetSchema: z.ZodObject<{
|
|
5
27
|
target: z.ZodCustom<Element, Element>;
|
|
6
28
|
threshold: z.ZodOptional<z.ZodNumber>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventType as e,Status as t}from"../../types/enums.js";import{SentryPlugin as s}from"../../types/plugin.js";import r from"../../reporter/index.js";import"../../constants/index.js";import o from"../../utils/get-base-data.js";import"../../utils/sentry.js";import{sentryLogger as i}from"../../utils/logger.js";import{z as a}from"zod";const n=a.object({target:a.custom(e=>"Element"in globalThis&&e instanceof globalThis.Element),threshold:a.number().min(0).max(1).optional(),params:a.record(a.string(),a.unknown()).optional()});class p extends s{ioMap=new Map;targetMap=new Map;constructor(){super(e.Exposure)}init(){i.info("Exposure plugin initialized")}initObserver(e){return new IntersectionObserver(e=>{e.forEach(e=>{const t=this.targetMap.get(e.target);if(t)if(e.isIntersecting)t.showTime=Date.now();else{if(!t.showTime)return;const e=Date.now();this.sendEvent(t,e),delete t.showTime}})},{threshold:e})}sendEvent(s,i){s.showTime&&r.send({...o(),type:e.Exposure,name:"Exposure",message:"Element Exposure",status:t.OK,extra:{threshold:s.threshold,observeTime:s.observeTime,showTime:s.showTime,showEndTime:i,duration:i-s.showTime,params:s.params}})}observe(e){(Array.isArray(e)?e:[e]).map(e=>n.parse(e)).forEach(e=>{const t=e.threshold||.5,s=this.ioMap.get(t)??this.initObserver(t);this.ioMap.set(t,s),this.targetMap.has(e.target)||(s.observe(e.target),this.targetMap.set(e.target,{threshold:t,observeTime:Date.now(),params:e.params??{}}))})}unobserve(e){(Array.isArray(e)?e:[e]).forEach(e=>this.unobserveOne(e))}unobserveOne(e){const t=this.targetMap.get(e);if(!t)return;const s=this.ioMap.get(t.threshold);s&&s.unobserve(e),this.targetMap.delete(e)}destroy(){this.ioMap.forEach(e=>{e.disconnect()}),this.ioMap.clear(),this.targetMap.clear()}}export{p as default};
|
|
1
|
+
import{EventType as e,Status as t}from"../../types/enums.js";import{SentryPlugin as s}from"../../types/plugin.js";import r from"../../reporter/index.js";import"../../constants/index.js";import o from"../../utils/get-base-data.js";import"../../utils/sentry.js";import"../../utils/is-type.js";import{sentryLogger as i}from"../../utils/logger.js";import{z as a}from"zod";const n=a.object({target:a.custom(e=>"Element"in globalThis&&e instanceof globalThis.Element),threshold:a.number().min(0).max(1).optional(),params:a.record(a.string(),a.unknown()).optional()});class p extends s{ioMap=new Map;targetMap=new Map;constructor(){super(e.Exposure)}init(){i.info("Exposure plugin initialized")}initObserver(e){return new IntersectionObserver(e=>{e.forEach(e=>{const t=this.targetMap.get(e.target);if(t)if(e.isIntersecting)t.showTime=Date.now();else{if(!t.showTime)return;const e=Date.now();this.sendEvent(t,e),delete t.showTime}})},{threshold:e})}sendEvent(s,i){s.showTime&&r.send({...o(),type:e.Exposure,name:"Exposure",message:"Element Exposure",status:t.OK,extra:{threshold:s.threshold,observeTime:s.observeTime,showTime:s.showTime,showEndTime:i,duration:i-s.showTime,params:s.params}})}observe(e){(Array.isArray(e)?e:[e]).map(e=>n.parse(e)).forEach(e=>{const t=e.threshold||.5,s=this.ioMap.get(t)??this.initObserver(t);this.ioMap.set(t,s),this.targetMap.has(e.target)||(s.observe(e.target),this.targetMap.set(e.target,{threshold:t,observeTime:Date.now(),params:e.params??{}}))})}unobserve(e){(Array.isArray(e)?e:[e]).forEach(e=>this.unobserveOne(e))}unobserveOne(e){const t=this.targetMap.get(e);if(!t)return;const s=this.ioMap.get(t.threshold);s&&s.unobserve(e),this.targetMap.delete(e)}destroy(){this.ioMap.forEach(e=>{e.disconnect()}),this.ioMap.clear(),this.targetMap.clear()}}export{p as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../types/enums.cjs"),r=require("../../types/plugin.cjs"),s=require("../../reporter/index.cjs");require("../../constants/index.cjs");var t=require("../../utils/get-base-data.cjs");require("../../utils/sentry.cjs");var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../types/enums.cjs"),r=require("../../types/plugin.cjs"),s=require("../../reporter/index.cjs");require("../../constants/index.cjs");var t=require("../../utils/get-base-data.cjs");require("../../utils/sentry.cjs"),require("../../utils/is-type.cjs");var i=require("./navigation-timing.cjs"),n=require("./perf.cjs"),o=require("./performance-observer-support.cjs"),a=require("./resource-element-fallback.cjs"),c=require("./resource-timing.cjs");function u(){}class p extends r.SentryPlugin{cleanups=[];constructor(){super(e.EventType.Performance)}init(){this.startWebVitals(),this.cleanups.push(this.observeLongTasks()),this.cleanups.push(c.observeResourceTimings(e=>this.report(e))),this.cleanups.push(a.observeResourceElementFallback(e=>this.report(e))),this.cleanups.push(this.onPageReady(()=>{this.reportPageLoadTimings()})),this.reportMemory()}destroy(){this.cleanups.toReversed().forEach(e=>{e()}),this.cleanups=[]}report(e){s.default.send(e)}startWebVitals(){try{n.getWebVitals(e=>{this.report(e)})}catch{return}}observeLongTasks(){if(!o.supportsPerformanceEntryType("longtask"))return u;const r=new globalThis.PerformanceObserver(r=>{const s={...t.default(),name:"LongTask",type:e.EventType.Performance,longTasks:r.getEntries()};this.report(s)});return r.observe({entryTypes:["longtask"]}),()=>{r.disconnect()}}onPageReady(e){if("complete"===document.readyState)return queueMicrotask(e),u;const r=()=>{e()};return globalThis.addEventListener("load",r,{once:!0}),()=>{globalThis.removeEventListener("load",r)}}reportPageLoadTimings(){const e=i.getNavigationTimingData();e&&this.report(e);const r=c.getInitialResourceListData();r&&this.report(r)}async reportMemory(){if("performance"in globalThis&&"measureUserAgentSpecificMemory"in globalThis.performance&&"function"==typeof globalThis.performance.measureUserAgentSpecificMemory){const r={...t.default(),name:"Memory",type:e.EventType.Performance,message:"performance.measureUserAgentSpecificMemory",memory:await globalThis.performance.measureUserAgentSpecificMemory()};this.report(r)}}}exports.default=p;
|
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
import { SentryPlugin } from '../../types/plugin.js';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Copyright (c) 2026 hangtiancheng
|
|
5
|
+
*
|
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
* in the Software without restriction, including without limitation the rights
|
|
9
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
* furnished to do so, subject to the following conditions:
|
|
12
|
+
*
|
|
13
|
+
* The above copyright notice and this permission notice shall be included in
|
|
14
|
+
* all copies or substantial portions of the Software.
|
|
15
|
+
*
|
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
* SOFTWARE.
|
|
23
|
+
*/
|
|
24
|
+
|
|
3
25
|
declare class PerformancePlugin extends SentryPlugin {
|
|
4
26
|
private cleanups;
|
|
5
27
|
constructor();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventType as e}from"../../types/enums.js";import{SentryPlugin as r}from"../../types/plugin.js";import s from"../../reporter/index.js";import"../../constants/index.js";import t from"../../utils/get-base-data.js";import"../../utils/sentry.js";import{getNavigationTimingData as o}from"./navigation-timing.js";import{getWebVitals as
|
|
1
|
+
import{EventType as e}from"../../types/enums.js";import{SentryPlugin as r}from"../../types/plugin.js";import s from"../../reporter/index.js";import"../../constants/index.js";import t from"../../utils/get-base-data.js";import"../../utils/sentry.js";import"../../utils/is-type.js";import{getNavigationTimingData as o}from"./navigation-timing.js";import{getWebVitals as i}from"./perf.js";import{supportsPerformanceEntryType as n}from"./performance-observer-support.js";import{observeResourceElementFallback as a}from"./resource-element-fallback.js";import{observeResourceTimings as p,getInitialResourceListData as m}from"./resource-timing.js";function c(){}class l extends r{cleanups=[];constructor(){super(e.Performance)}init(){this.startWebVitals(),this.cleanups.push(this.observeLongTasks()),this.cleanups.push(p(e=>this.report(e))),this.cleanups.push(a(e=>this.report(e))),this.cleanups.push(this.onPageReady(()=>{this.reportPageLoadTimings()})),this.reportMemory()}destroy(){this.cleanups.toReversed().forEach(e=>{e()}),this.cleanups=[]}report(e){s.send(e)}startWebVitals(){try{i(e=>{this.report(e)})}catch{return}}observeLongTasks(){if(!n("longtask"))return c;const r=new globalThis.PerformanceObserver(r=>{const s={...t(),name:"LongTask",type:e.Performance,longTasks:r.getEntries()};this.report(s)});return r.observe({entryTypes:["longtask"]}),()=>{r.disconnect()}}onPageReady(e){if("complete"===document.readyState)return queueMicrotask(e),c;const r=()=>{e()};return globalThis.addEventListener("load",r,{once:!0}),()=>{globalThis.removeEventListener("load",r)}}reportPageLoadTimings(){const e=o();e&&this.report(e);const r=m();r&&this.report(r)}async reportMemory(){if("performance"in globalThis&&"measureUserAgentSpecificMemory"in globalThis.performance&&"function"==typeof globalThis.performance.measureUserAgentSpecificMemory){const r={...t(),name:"Memory",type:e.Performance,message:"performance.measureUserAgentSpecificMemory",memory:await globalThis.performance.measureUserAgentSpecificMemory()};this.report(r)}}}export{l as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var t=require("../../types/enums.cjs");require("../../constants/index.cjs");var e=require("../../utils/get-base-data.cjs");function n(t,e){return Math.max(0,Math.round(t-e))}function r(t,e){const r=t.fetchStart;return{paintTime:e>0?n(e,r):0,domInteractive:n(t.domInteractive,r),domContentLoaded:n(t.domContentLoadedEventEnd,r),loadEvent:n(t.loadEventStart,r),firstByte:n(t.responseStart,r),dnsLookup:n(t.domainLookupEnd,t.domainLookupStart),tcpConnection:n(t.connectEnd,t.connectStart),tlsHandshake:n(t.connectEnd,t.secureConnectionStart),timeToFirstByte:n(t.responseStart,t.requestStart),contentTransfer:n(t.responseEnd,t.responseStart),domProcessing:n(t.domInteractive,t.responseEnd),resourceLoad:n(t.loadEventStart,t.domContentLoadedEventEnd),redirect:n(t.redirectEnd,t.redirectStart),unloadTime:n(t.unloadEventEnd,t.unloadEventStart),triggerPageUrl:location.href}}require("../../utils/sentry.cjs"),exports.getNavigationTimingData=function(){if(!("performance"in globalThis)||"function"!=typeof globalThis.performance.getEntriesByType)return null;const n=function(){const t=globalThis.performance.getEntriesByType("navigation")[0];return t&&function(t){return"navigation"===t.entryType&&"fetchStart"in t}(t)?t:null}();return n?{...e.default(),type:t.EventType.Performance,name:"NavigationTiming",message:"Page navigation timing",status:t.Status.OK,extra:r(n,globalThis.performance.getEntriesByType("paint").at(-1)?.startTime??0)}:null};
|
|
1
|
+
"use strict";var t=require("../../types/enums.cjs");require("../../constants/index.cjs");var e=require("../../utils/get-base-data.cjs");function n(t,e){return Math.max(0,Math.round(t-e))}function r(t,e){const r=t.fetchStart;return{paintTime:e>0?n(e,r):0,domInteractive:n(t.domInteractive,r),domContentLoaded:n(t.domContentLoadedEventEnd,r),loadEvent:n(t.loadEventStart,r),firstByte:n(t.responseStart,r),dnsLookup:n(t.domainLookupEnd,t.domainLookupStart),tcpConnection:n(t.connectEnd,t.connectStart),tlsHandshake:n(t.connectEnd,t.secureConnectionStart),timeToFirstByte:n(t.responseStart,t.requestStart),contentTransfer:n(t.responseEnd,t.responseStart),domProcessing:n(t.domInteractive,t.responseEnd),resourceLoad:n(t.loadEventStart,t.domContentLoadedEventEnd),redirect:n(t.redirectEnd,t.redirectStart),unloadTime:n(t.unloadEventEnd,t.unloadEventStart),triggerPageUrl:location.href}}require("../../utils/sentry.cjs"),require("../../utils/is-type.cjs"),exports.getNavigationTimingData=function(){if(!("performance"in globalThis)||"function"!=typeof globalThis.performance.getEntriesByType)return null;const n=function(){const t=globalThis.performance.getEntriesByType("navigation")[0];return t&&function(t){return"navigation"===t.entryType&&"fetchStart"in t}(t)?t:null}();return n?{...e.default(),type:t.EventType.Performance,name:"NavigationTiming",message:"Page navigation timing",status:t.Status.OK,extra:r(n,globalThis.performance.getEntriesByType("paint").at(-1)?.startTime??0)}:null};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Status as t,EventType as n}from"../../types/enums.js";import"../../constants/index.js";import e from"../../utils/get-base-data.js";import"../../utils/sentry.js";function o(t,n){return Math.max(0,Math.round(t-n))}function r(t,n){const e=t.fetchStart;return{paintTime:n>0?o(n,e):0,domInteractive:o(t.domInteractive,e),domContentLoaded:o(t.domContentLoadedEventEnd,e),loadEvent:o(t.loadEventStart,e),firstByte:o(t.responseStart,e),dnsLookup:o(t.domainLookupEnd,t.domainLookupStart),tcpConnection:o(t.connectEnd,t.connectStart),tlsHandshake:o(t.connectEnd,t.secureConnectionStart),timeToFirstByte:o(t.responseStart,t.requestStart),contentTransfer:o(t.responseEnd,t.responseStart),domProcessing:o(t.domInteractive,t.responseEnd),resourceLoad:o(t.loadEventStart,t.domContentLoadedEventEnd),redirect:o(t.redirectEnd,t.redirectStart),unloadTime:o(t.unloadEventEnd,t.unloadEventStart),triggerPageUrl:location.href}}function a(){if(!("performance"in globalThis)||"function"!=typeof globalThis.performance.getEntriesByType)return null;const o=function(){const t=globalThis.performance.getEntriesByType("navigation")[0];return t&&function(t){return"navigation"===t.entryType&&"fetchStart"in t}(t)?t:null}();return o?{...e(),type:n.Performance,name:"NavigationTiming",message:"Page navigation timing",status:t.OK,extra:r(o,globalThis.performance.getEntriesByType("paint").at(-1)?.startTime??0)}:null}export{a as getNavigationTimingData};
|
|
1
|
+
import{Status as t,EventType as n}from"../../types/enums.js";import"../../constants/index.js";import e from"../../utils/get-base-data.js";import"../../utils/sentry.js";import"../../utils/is-type.js";function o(t,n){return Math.max(0,Math.round(t-n))}function r(t,n){const e=t.fetchStart;return{paintTime:n>0?o(n,e):0,domInteractive:o(t.domInteractive,e),domContentLoaded:o(t.domContentLoadedEventEnd,e),loadEvent:o(t.loadEventStart,e),firstByte:o(t.responseStart,e),dnsLookup:o(t.domainLookupEnd,t.domainLookupStart),tcpConnection:o(t.connectEnd,t.connectStart),tlsHandshake:o(t.connectEnd,t.secureConnectionStart),timeToFirstByte:o(t.responseStart,t.requestStart),contentTransfer:o(t.responseEnd,t.responseStart),domProcessing:o(t.domInteractive,t.responseEnd),resourceLoad:o(t.loadEventStart,t.domContentLoadedEventEnd),redirect:o(t.redirectEnd,t.redirectStart),unloadTime:o(t.unloadEventEnd,t.unloadEventStart),triggerPageUrl:location.href}}function a(){if(!("performance"in globalThis)||"function"!=typeof globalThis.performance.getEntriesByType)return null;const o=function(){const t=globalThis.performance.getEntriesByType("navigation")[0];return t&&function(t){return"navigation"===t.entryType&&"fetchStart"in t}(t)?t:null}();return o?{...e(),type:n.Performance,name:"NavigationTiming",message:"Page navigation timing",status:t.OK,extra:r(o,globalThis.performance.getEntriesByType("paint").at(-1)?.startTime??0)}:null}export{a as getNavigationTimingData};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("../../types/enums.cjs"),t=require("web-vitals");require("../../constants/index.cjs");var r=require("../../utils/get-base-data.cjs");require("../../utils/sentry.cjs");var s=require("../../utils/metric2perf-data.cjs"),
|
|
1
|
+
"use strict";var e=require("../../types/enums.cjs"),t=require("web-vitals");require("../../constants/index.cjs");var r=require("../../utils/get-base-data.cjs");require("../../utils/sentry.cjs"),require("../../utils/is-type.cjs");var s=require("../../utils/metric2perf-data.cjs"),i=require("../../utils/logger.cjs"),n=require("./first-screen-paint.cjs");exports.getWebVitals=function(u){i.sentryLogger.info("Starting web vitals monitoring...");const a=e=>{i.sentryLogger.success(`Metric: ${e.name}`,e,function(e){if("value"in e&&"number"==typeof e.value)return Math.round(e.value)}(e)),u(e)};t.onLCP(e=>{a(s.default(e))}),t.onFCP(e=>{a(s.default(e))}),t.onCLS(e=>{a(s.default(e))}),t.onINP(e=>{a(s.default(e))}),t.onTTFB(e=>{a(s.default(e))}),n.getFirstScreenPaint(t=>{const s={...r.default(),name:"FSP",value:t,type:e.EventType.Performance,message:"First screen paint"};a(s)})};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventType as t}from"../../types/enums.js";import{onLCP as e,onFCP as r,onCLS as s,onINP as i,onTTFB as o}from"web-vitals";import"../../constants/index.js";import n from"../../utils/get-base-data.js";import"../../utils/sentry.js";import m from"../../utils/metric2perf-data.js";import{sentryLogger as a}from"../../utils/logger.js";import{getFirstScreenPaint as p}from"./first-screen-paint.js";function u(u){a.info("Starting web vitals monitoring...");const f=t=>{a.success(`Metric: ${t.name}`,t,function(t){if("value"in t&&"number"==typeof t.value)return Math.round(t.value)}(t)),u(t)};e(t=>{f(m(t))}),r(t=>{f(m(t))}),s(t=>{f(m(t))}),i(t=>{f(m(t))}),o(t=>{f(m(t))}),p(e=>{const r={...n(),name:"FSP",value:e,type:t.Performance,message:"First screen paint"};f(r)})}export{u as getWebVitals};
|
|
1
|
+
import{EventType as t}from"../../types/enums.js";import{onLCP as e,onFCP as r,onCLS as s,onINP as i,onTTFB as o}from"web-vitals";import"../../constants/index.js";import n from"../../utils/get-base-data.js";import"../../utils/sentry.js";import"../../utils/is-type.js";import m from"../../utils/metric2perf-data.js";import{sentryLogger as a}from"../../utils/logger.js";import{getFirstScreenPaint as p}from"./first-screen-paint.js";function u(u){a.info("Starting web vitals monitoring...");const f=t=>{a.success(`Metric: ${t.name}`,t,function(t){if("value"in t&&"number"==typeof t.value)return Math.round(t.value)}(t)),u(t)};e(t=>{f(m(t))}),r(t=>{f(m(t))}),s(t=>{f(m(t))}),i(t=>{f(m(t))}),o(t=>{f(m(t))}),p(e=>{const r={...n(),name:"FSP",value:e,type:t.Performance,message:"First screen paint"};f(r)})}export{u as getWebVitals};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";require("../../constants/index.cjs"),require("../../types/enums.cjs");var e=require("../../utils/sentry.cjs")
|
|
1
|
+
"use strict";require("../../constants/index.cjs"),require("../../types/enums.cjs");var e=require("../../utils/sentry.cjs");require("../../utils/is-type.cjs");var r=require("./resource-timing.cjs"),n=require("./performance-observer-support.cjs");const t=new Set(["IMG","SCRIPT","LINK"]);exports.observeResourceElementFallback=function(s){if(n.supportsPerformanceEntryType("resource")||!("MutationObserver"in globalThis)||"function"!=typeof globalThis.MutationObserver)return()=>{};const o=[],i=new Set,a=n=>{const t=function(e){return e instanceof HTMLImageElement?e.currentSrc||e.src:e instanceof HTMLScriptElement?e.src:e.href}(n);if(!t||i.has(t)||t.includes(e.default.options.dsn))return;i.add(t);const o=function(e){return r.getResourceList().filter(r=>r.name===e).at(-1)??null}(t)??function(e,r){const n="performance"in globalThis?Math.round(globalThis.performance.now()):Date.now();return{name:e,initiatorType:r,startTime:n,responseEnd:n,duration:0,transferSize:0,encodedBodySize:0,decodedBodySize:0,fromCache:!1}}(t,n.tagName.toLowerCase());s(r.createResourceTimingData(o))},c=new globalThis.MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{(function(e){return e instanceof HTMLElement&&t.has(e.tagName)})(e)&&(e=>{const r=()=>{a(e)};e.addEventListener("load",r,{once:!0}),e.addEventListener("error",r,{once:!0}),o.push({element:e,eventName:"load",listener:r}),o.push({element:e,eventName:"error",listener:r})})(e)})})});return c.observe(document.documentElement,{childList:!0,subtree:!0}),()=>{c.disconnect(),o.forEach(({element:e,eventName:r,listener:n})=>{e.removeEventListener(r,n)})}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../../constants/index.js";import"../../types/enums.js";import e from"../../utils/sentry.js";import{createResourceTimingData as n,getResourceList as t}from"./resource-timing.js";import{supportsPerformanceEntryType as r}from"./performance-observer-support.js";const o=new Set(["IMG","SCRIPT","LINK"]);function s(s){if(r("resource")||!("MutationObserver"in globalThis)||"function"!=typeof globalThis.MutationObserver)return()=>{};const i=[],a=new Set,c=r=>{const o=function(e){return e instanceof HTMLImageElement?e.currentSrc||e.src:e instanceof HTMLScriptElement?e.src:e.href}(r);if(!o||a.has(o)||o.includes(e.options.dsn))return;a.add(o);const i=function(e){return t().filter(n=>n.name===e).at(-1)??null}(o)??function(e,n){const t="performance"in globalThis?Math.round(globalThis.performance.now()):Date.now();return{name:e,initiatorType:n,startTime:t,responseEnd:t,duration:0,transferSize:0,encodedBodySize:0,decodedBodySize:0,fromCache:!1}}(o,r.tagName.toLowerCase());s(n(i))},m=new globalThis.MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{(function(e){return e instanceof HTMLElement&&o.has(e.tagName)})(e)&&(e=>{const n=()=>{c(e)};e.addEventListener("load",n,{once:!0}),e.addEventListener("error",n,{once:!0}),i.push({element:e,eventName:"load",listener:n}),i.push({element:e,eventName:"error",listener:n})})(e)})})});return m.observe(document.documentElement,{childList:!0,subtree:!0}),()=>{m.disconnect(),i.forEach(({element:e,eventName:n,listener:t})=>{e.removeEventListener(n,t)})}}export{s as observeResourceElementFallback};
|
|
1
|
+
import"../../constants/index.js";import"../../types/enums.js";import e from"../../utils/sentry.js";import"../../utils/is-type.js";import{createResourceTimingData as n,getResourceList as t}from"./resource-timing.js";import{supportsPerformanceEntryType as r}from"./performance-observer-support.js";const o=new Set(["IMG","SCRIPT","LINK"]);function s(s){if(r("resource")||!("MutationObserver"in globalThis)||"function"!=typeof globalThis.MutationObserver)return()=>{};const i=[],a=new Set,c=r=>{const o=function(e){return e instanceof HTMLImageElement?e.currentSrc||e.src:e instanceof HTMLScriptElement?e.src:e.href}(r);if(!o||a.has(o)||o.includes(e.options.dsn))return;a.add(o);const i=function(e){return t().filter(n=>n.name===e).at(-1)??null}(o)??function(e,n){const t="performance"in globalThis?Math.round(globalThis.performance.now()):Date.now();return{name:e,initiatorType:n,startTime:t,responseEnd:t,duration:0,transferSize:0,encodedBodySize:0,decodedBodySize:0,fromCache:!1}}(o,r.tagName.toLowerCase());s(n(i))},m=new globalThis.MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{(function(e){return e instanceof HTMLElement&&o.has(e.tagName)})(e)&&(e=>{const n=()=>{c(e)};e.addEventListener("load",n,{once:!0}),e.addEventListener("error",n,{once:!0}),i.push({element:e,eventName:"load",listener:n}),i.push({element:e,eventName:"error",listener:n})})(e)})})});return m.observe(document.documentElement,{childList:!0,subtree:!0}),()=>{m.disconnect(),i.forEach(({element:e,eventName:n,listener:t})=>{e.removeEventListener(n,t)})}}export{s as observeResourceElementFallback};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("../../types/enums.cjs");require("../../constants/index.cjs");var r=require("../../utils/get-base-data.cjs"),t=require("../../utils/sentry.cjs")
|
|
1
|
+
"use strict";var e=require("../../types/enums.cjs");require("../../constants/index.cjs");var r=require("../../utils/get-base-data.cjs"),t=require("../../utils/sentry.cjs");require("../../utils/is-type.cjs");var n=require("./performance-observer-support.cjs");const s=new Set(["fetch","xmlhttprequest","beacon"]);function i(e){return"resource"===e.entryType&&"initiatorType"in e}function o(e){return!s.has(e.initiatorType)&&!function(e){return""!==t.default.options.dsn&&e.name.includes(t.default.options.dsn)}(e)}function a(e){return{name:e.name,initiatorType:e.initiatorType,startTime:Math.round(e.startTime),responseEnd:Math.round(e.responseEnd),duration:Math.round(e.duration),transferSize:e.transferSize,encodedBodySize:e.encodedBodySize,decodedBodySize:e.decodedBodySize,fromCache:c(e)}}function u(t){return{...r.default(),type:e.EventType.Performance,name:"ResourceTiming",message:t.name,status:e.Status.OK,value:t.duration,extra:{resource:t}}}function c(e){return 0===e.transferSize||0!==e.transferSize&&0===e.encodedBodySize}function p(){return"performance"in globalThis&&"function"==typeof globalThis.performance.getEntriesByType?globalThis.performance.getEntriesByType("resource").filter(i).filter(o).map(a):[]}exports.createResourceTimingData=u,exports.getInitialResourceListData=function(){return{...r.default(),name:"ResourceList",type:e.EventType.Performance,status:e.Status.OK,resourceList:p()}},exports.getResourceList=p,exports.isFromCache=c,exports.observeResourceTimings=function(e){if(!n.supportsPerformanceEntryType("resource"))return()=>{};const r=new globalThis.PerformanceObserver(r=>{r.getEntries().filter(i).filter(o).map(a).forEach(r=>{e(u(r))})});return r.observe({entryTypes:["resource"]}),()=>{r.disconnect()}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Status as e,EventType as r}from"../../types/enums.js";import"../../constants/index.js";import
|
|
1
|
+
import{Status as e,EventType as r}from"../../types/enums.js";import"../../constants/index.js";import t from"../../utils/get-base-data.js";import n from"../../utils/sentry.js";import"../../utils/is-type.js";import{supportsPerformanceEntryType as o}from"./performance-observer-support.js";const i=new Set(["fetch","xmlhttprequest","beacon"]);function s(e){return"resource"===e.entryType&&"initiatorType"in e}function a(e){return!i.has(e.initiatorType)&&!function(e){return""!==n.options.dsn&&e.name.includes(n.options.dsn)}(e)}function u(e){return{name:e.name,initiatorType:e.initiatorType,startTime:Math.round(e.startTime),responseEnd:Math.round(e.responseEnd),duration:Math.round(e.duration),transferSize:e.transferSize,encodedBodySize:e.encodedBodySize,decodedBodySize:e.decodedBodySize,fromCache:f(e)}}function c(n){return{...t(),type:r.Performance,name:"ResourceTiming",message:n.name,status:e.OK,value:n.duration,extra:{resource:n}}}function f(e){return 0===e.transferSize||0!==e.transferSize&&0===e.encodedBodySize}function p(){return"performance"in globalThis&&"function"==typeof globalThis.performance.getEntriesByType?globalThis.performance.getEntriesByType("resource").filter(s).filter(a).map(u):[]}function m(){return{...t(),name:"ResourceList",type:r.Performance,status:e.OK,resourceList:p()}}function d(e){if(!o("resource"))return()=>{};const r=new globalThis.PerformanceObserver(r=>{r.getEntries().filter(s).filter(a).map(u).forEach(r=>{e(c(r))})});return r.observe({entryTypes:["resource"]}),()=>{r.disconnect()}}export{c as createResourceTimingData,m as getInitialResourceListData,p as getResourceList,f as isFromCache,d as observeResourceTimings};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../types/enums.cjs"),r=require("../../types/plugin.cjs"),s=require("../../constants/index.cjs"),n=require("../../utils/sentry.cjs")
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../types/enums.cjs"),r=require("../../types/plugin.cjs"),s=require("../../constants/index.cjs"),n=require("../../utils/sentry.cjs");require("../../utils/is-type.cjs");var t=require("../../reporter/index.cjs"),c=require("./recorder.cjs");class o extends r.SentryPlugin{durationMs=s.DEFAULT_OPTIONS.screenRecordDurationMs;eventTypes=s.DEFAULT_OPTIONS.screenRecordEventTypes;cleanup=null;constructor(r={durationMs:s.DEFAULT_OPTIONS.screenRecordDurationMs,eventTypes:s.DEFAULT_OPTIONS.screenRecordEventTypes}){super(e.EventType.ScreenRecord);const{durationMs:n=s.DEFAULT_OPTIONS.screenRecordDurationMs,eventTypes:t=s.DEFAULT_OPTIONS.screenRecordEventTypes}=r;this.durationMs=n,this.eventTypes=t}init(){n.default.options.enableScreenRecord=!0,n.default.options.screenRecordEventTypes=this.eventTypes,n.default.options.screenRecordDurationMs=this.durationMs,c.recorder(t.default).then(e=>{this.cleanup=e})}destroy(){this.cleanup?.(),this.cleanup=null}}exports.unzipScreenRecord=c.unzipScreenRecord,exports.default=o;
|
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
import { EventType } from '../../types/enums.js';
|
|
2
2
|
import { SentryPlugin } from '../../types/plugin.js';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Copyright (c) 2026 hangtiancheng
|
|
6
|
+
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
|
15
|
+
* all copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
* SOFTWARE.
|
|
24
|
+
*/
|
|
25
|
+
|
|
4
26
|
interface ScreenRecordPluginOptions {
|
|
5
27
|
durationMs?: number;
|
|
6
28
|
eventTypes?: EventType[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventType as e}from"../../types/enums.js";import{SentryPlugin as r}from"../../types/plugin.js";import{DEFAULT_OPTIONS as s}from"../../constants/index.js";import
|
|
1
|
+
import{EventType as e}from"../../types/enums.js";import{SentryPlugin as r}from"../../types/plugin.js";import{DEFAULT_OPTIONS as s}from"../../constants/index.js";import t from"../../utils/sentry.js";import"../../utils/is-type.js";import n from"../../reporter/index.js";import{recorder as o}from"./recorder.js";export{unzipScreenRecord}from"./recorder.js";class i extends r{durationMs=s.screenRecordDurationMs;eventTypes=s.screenRecordEventTypes;cleanup=null;constructor(r={durationMs:s.screenRecordDurationMs,eventTypes:s.screenRecordEventTypes}){super(e.ScreenRecord);const{durationMs:t=s.screenRecordDurationMs,eventTypes:n=s.screenRecordEventTypes}=r;this.durationMs=t,this.eventTypes=n}init(){t.options.enableScreenRecord=!0,t.options.screenRecordEventTypes=this.eventTypes,t.options.screenRecordDurationMs=this.durationMs,o(n).then(e=>{this.cleanup=e})}destroy(){this.cleanup?.(),this.cleanup=null}}export{i as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("../../types/enums.cjs");require("../../constants/index.cjs");var r=require("../../utils/get-base-data.cjs"),t=require("../../utils/sentry.cjs")
|
|
1
|
+
"use strict";var e=require("../../types/enums.cjs");require("../../constants/index.cjs");var r=require("../../utils/get-base-data.cjs"),t=require("../../utils/sentry.cjs");require("../../utils/is-type.cjs");var n=require("../../utils/logger.cjs"),o=require("zod");let s=null;const c=o.z.object({timestamp:o.z.number()}).passthrough();function i(){}function u(e,r){const n=r-t.default.options.screenRecordDurationMs;return e.filter(e=>e.timestamp>=n)}function a(e){if(!e||!s)return"";const r=JSON.stringify(e);return function(e){let r="";return e.forEach(e=>{r+=String.fromCharCode(e)}),btoa(r)}(s.gzip(r))}exports.recorder=async function(o){n.sentryLogger.info("Initializing web recorder...");try{const[{record:d},l]=await Promise.all([import("@rrweb/record"),import("pako")]);s=l.default;let f=[];const p=d({emit(s,i){const d=c.safeParse(s);if(d.success&&(f=u([...f,d.data],d.data.timestamp),i&&(f=u(f,d.data.timestamp)),t.default.shouldScreenRecord&&f.length>0)){const s={...r.default(),name:"ScreenRecord",type:e.EventType.ScreenRecord,event:a(f),eventCount:f.length};n.sentryLogger.success("Screen record window packaged and sent",{eventCount:s.eventCount}),o.send(s),t.default.shouldScreenRecord=!1}},recordCanvas:!0,checkoutEveryNms:t.default.options.screenRecordDurationMs});return"function"==typeof p?p:i}catch(e){return n.sentryLogger.error("Failed to load web recorder",e),i}},exports.unzipScreenRecord=function(e){if(!e||!s)return null;const r=s.ungzip(function(e){const r=atob(e);return Uint8Array.from(r,e=>e.charCodeAt(0))}(e),{to:"string"});return JSON.parse(r)},exports.zip=a;
|
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 hangtiancheng
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in
|
|
12
|
+
* all copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
|
|
1
23
|
declare function unzipScreenRecord(data: string): unknown;
|
|
2
24
|
|
|
3
25
|
export { unzipScreenRecord };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventType as t}from"../../types/enums.js";import"../../constants/index.js";import e from"../../utils/get-base-data.js";import r from"../../utils/sentry.js";import{sentryLogger as n}from"../../utils/logger.js";import{z as o}from"zod";let s=null;const
|
|
1
|
+
import{EventType as t}from"../../types/enums.js";import"../../constants/index.js";import e from"../../utils/get-base-data.js";import r from"../../utils/sentry.js";import"../../utils/is-type.js";import{sentryLogger as n}from"../../utils/logger.js";import{z as o}from"zod";let s=null;const i=o.object({timestamp:o.number()}).passthrough();function c(){}function a(t,e){const n=e-r.options.screenRecordDurationMs;return t.filter(t=>t.timestamp>=n)}async function u(o){n.info("Initializing web recorder...");try{const[{record:u},d]=await Promise.all([import("@rrweb/record"),import("pako")]);s=d.default;let p=[];const f=u({emit(s,c){const u=i.safeParse(s);if(u.success&&(p=a([...p,u.data],u.data.timestamp),c&&(p=a(p,u.data.timestamp)),r.shouldScreenRecord&&p.length>0)){const s={...e(),name:"ScreenRecord",type:t.ScreenRecord,event:m(p),eventCount:p.length};n.success("Screen record window packaged and sent",{eventCount:s.eventCount}),o.send(s),r.shouldScreenRecord=!1}},recordCanvas:!0,checkoutEveryNms:r.options.screenRecordDurationMs});return"function"==typeof f?f:c}catch(t){return n.error("Failed to load web recorder",t),c}}function m(t){if(!t||!s)return"";const e=JSON.stringify(t);return function(t){let e="";return t.forEach(t=>{e+=String.fromCharCode(t)}),btoa(e)}(s.gzip(e))}function d(t){if(!t||!s)return null;const e=s.ungzip(function(t){const e=atob(t);return Uint8Array.from(e,t=>t.charCodeAt(0))}(t),{to:"string"});return JSON.parse(e)}export{u as recorder,d as unzipScreenRecord,m as zip};
|
package/dist/react.d.ts
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
import { Component, ReactNode, ErrorInfo } from 'react';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Copyright (c) 2026 hangtiancheng
|
|
5
|
+
*
|
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
* in the Software without restriction, including without limitation the rights
|
|
9
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
* furnished to do so, subject to the following conditions:
|
|
12
|
+
*
|
|
13
|
+
* The above copyright notice and this permission notice shall be included in
|
|
14
|
+
* all copies or substantial portions of the Software.
|
|
15
|
+
*
|
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
* SOFTWARE.
|
|
23
|
+
*/
|
|
24
|
+
|
|
3
25
|
/**
|
|
4
26
|
* Props for the {@link ReactErrorBoundary} component.
|
|
5
27
|
*
|
package/dist/reporter/batch.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";require("../constants/index.cjs"),require("../types/enums.cjs");var e=require("../utils/sentry.cjs")
|
|
1
|
+
"use strict";require("../constants/index.cjs"),require("../types/enums.cjs");var e=require("../utils/sentry.cjs");require("../utils/is-type.cjs");var s=require("./promise.cjs");function r(e){return!1===e?[]:[...e]}exports.applyBeforePushHook=function(t){const i=e.default.options.beforePushEventList?e.default.options.beforePushEventList(t):t;return s.isPromise(i)?i.then(r):r(i)};
|
package/dist/reporter/batch.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../constants/index.js";import"../types/enums.js";import t from"../utils/sentry.js";import{isPromise as
|
|
1
|
+
import"../constants/index.js";import"../types/enums.js";import t from"../utils/sentry.js";import"../utils/is-type.js";import{isPromise as s}from"./promise.js";function o(o){const e=t.options.beforePushEventList?t.options.beforePushEventList(o):o;return s(e)?e.then(n):n(e)}function n(t){return!1===t?[]:[...t]}export{o as applyBeforePushHook};
|
package/dist/reporter/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../utils/data-structures.cjs");require("../types/enums.cjs");var t=require("../utils/sentry.cjs")
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../utils/data-structures.cjs");require("../types/enums.cjs");var t=require("../utils/sentry.cjs");require("../utils/is-type.cjs");var s=require("../utils/logger.cjs"),i=require("./batch.cjs"),r=require("./flush-scheduler.cjs"),n=require("./network-listener.cjs"),h=require("./offline-cache.cjs"),u=require("./promise.cjs"),a=require("./report-data.cjs"),l=require("./send-preflight.cjs"),c=require("./server-recovery.cjs"),o=require("./transports.cjs");class f{cbQueue=new e.CallbackQueue;id=crypto.randomUUID();events=[];timeoutID;retryTimer;isOnline=!0;isFlushing=!1;static#e=null;constructor(){n.initNetworkListener({setOnline:e=>{this.isOnline=e},loadOfflineCache:()=>this.loadOfflineCache(),flush:()=>this.flush()})}static get instance(){return this.#e||(this.#e=new f),this.#e}static reset(){this.#e&&this.#e.dispose(),this.#e=null}dispose(){this.timeoutID&&clearTimeout(this.timeoutID),this.retryTimer&&clearTimeout(this.retryTimer),this.events=[],this.isFlushing=!1}loadOfflineCache(){this.events.unshift(...h.loadOfflineCache()),this.events=this.events.slice(-t.default.options.maxQueueLength)}saveOfflineCache(){h.saveOfflineCache(this.events)}handleServerError(){this.retryTimer=c.scheduleServerRecovery(this.retryTimer,{setOnline:e=>{this.isOnline=e},setRetryTimer:e=>{this.retryTimer=e},loadOfflineCache:()=>this.loadOfflineCache(),flush:()=>this.flush()})}async flush(){if(0!==this.events.length&&!this.isFlushing){this.isFlushing=!0;try{if(!this.isOnline)return this.events=this.events.slice(-t.default.options.maxQueueLength),void this.saveOfflineCache();const e=this.takeBatch(),i=u.isPromise(e)?await e:e;if(0===i.length)return void this.scheduleNextFlush();const r=performance.now(),n=this.sendBatch(i);if(!(u.isPromise(n)?await n:n))return this.events=[...i,...this.events].slice(-t.default.options.maxQueueLength),void this.saveOfflineCache();t.default.options.afterSendData?.(i),s.sentryLogger.success("Batch report queued or sent",{count:i.length},Math.round(performance.now()-r))}finally{this.isFlushing=!1}this.scheduleNextFlush()}}takeBatch(){const e=t.default.options.cacheMaxLength,s=this.events.slice(0,e);return this.events=this.events.slice(e),i.applyBeforePushHook(s)}sendBatch(e){return!(o.isObjectOverSizeLimit(e,60)||!o.sendBeacon(e))||(t.default.options.useImageReport&&!o.isObjectOverSizeLimit(e,2)?(o.reportByImage(e,this.cbQueue),!0):o.reportByFetch(e,()=>this.handleServerError()))}scheduleNextFlush(){0!==this.events.length&&(this.timeoutID=r.scheduleFlush(this.timeoutID,100,()=>this.flush()))}async flushOfflineCache(){this.loadOfflineCache(),await this.flush()}async send(e,i=!1){const n=t.default.options;if(!l.shouldQueuePayload(e))return;const h=a.runBeforeReportHook(this.id,e),c=u.isPromise(h)?await h:h;if(c){if(s.sentryLogger.info(`Type: ${e.type}`,c),this.events.push(c),!this.isOnline)return this.events=this.events.slice(-n.maxQueueLength),void this.saveOfflineCache();this.timeoutID&&clearTimeout(this.timeoutID),i||this.events.length>=n.cacheMaxLength?await this.flush():this.timeoutID=r.scheduleFlush(this.timeoutID,n.cacheWaitingTime,()=>this.flush())}}}let d=null;var v=new Proxy({},{get(e,t){const s=(d||(d=f.instance),d),i=Reflect.get(s,t,s);return"function"==typeof i?i.bind(s):i}});exports.DataReporter=f,exports.default=v,exports.resetReporter=function(){d&&(f.reset(),d=null)};
|
package/dist/reporter/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{CallbackQueue as t}from"../utils/data-structures.js";import"../types/enums.js";import e from"../utils/sentry.js";import{sentryLogger as s}from"../utils/logger.js";import{applyBeforePushHook as i}from"./batch.js";import{scheduleFlush as n}from"./flush-scheduler.js";import{initNetworkListener as h}from"./network-listener.js";import{loadOfflineCache as r,saveOfflineCache as o}from"./offline-cache.js";import{isPromise as a}from"./promise.js";import{runBeforeReportHook as l}from"./report-data.js";import{shouldQueuePayload as u}from"./send-preflight.js";import{scheduleServerRecovery as c}from"./server-recovery.js";import{isObjectOverSizeLimit as f,sendBeacon as m,reportByImage as p,reportByFetch as d}from"./transports.js";class v{cbQueue=new t;id=crypto.randomUUID();events=[];timeoutID;retryTimer;isOnline=!0;isFlushing=!1;static#t=null;constructor(){h({setOnline:t=>{this.isOnline=t},loadOfflineCache:()=>this.loadOfflineCache(),flush:()=>this.flush()})}static get instance(){return this.#t||(this.#t=new v),this.#t}static reset(){this.#t&&this.#t.dispose(),this.#t=null}dispose(){this.timeoutID&&clearTimeout(this.timeoutID),this.retryTimer&&clearTimeout(this.retryTimer),this.events=[],this.isFlushing=!1}loadOfflineCache(){this.events.unshift(...r()),this.events=this.events.slice(-e.options.maxQueueLength)}saveOfflineCache(){o(this.events)}handleServerError(){this.retryTimer=c(this.retryTimer,{setOnline:t=>{this.isOnline=t},setRetryTimer:t=>{this.retryTimer=t},loadOfflineCache:()=>this.loadOfflineCache(),flush:()=>this.flush()})}async flush(){if(0!==this.events.length&&!this.isFlushing){this.isFlushing=!0;try{if(!this.isOnline)return this.events=this.events.slice(-e.options.maxQueueLength),void this.saveOfflineCache();const t=this.takeBatch(),i=a(t)?await t:t;if(0===i.length)return void this.scheduleNextFlush();const n=performance.now(),h=this.sendBatch(i);if(!(a(h)?await h:h))return this.events=[...i,...this.events].slice(-e.options.maxQueueLength),void this.saveOfflineCache();e.options.afterSendData?.(i),s.success("Batch report queued or sent",{count:i.length},Math.round(performance.now()-n))}finally{this.isFlushing=!1}this.scheduleNextFlush()}}takeBatch(){const t=e.options.cacheMaxLength,s=this.events.slice(0,t);return this.events=this.events.slice(t),i(s)}sendBatch(t){return!(f(t,60)||!m(t))||(e.options.useImageReport&&!f(t,2)?(p(t,this.cbQueue),!0):d(t,()=>this.handleServerError()))}scheduleNextFlush(){0!==this.events.length&&(this.timeoutID=n(this.timeoutID,100,()=>this.flush()))}async flushOfflineCache(){this.loadOfflineCache(),await this.flush()}async send(t,i=!1){const h=e.options;if(!u(t))return;const r=l(this.id,t),o=a(r)?await r:r;if(o){if(s.info(`Type: ${t.type}`,o),this.events.push(o),!this.isOnline)return this.events=this.events.slice(-h.maxQueueLength),void this.saveOfflineCache();this.timeoutID&&clearTimeout(this.timeoutID),i||this.events.length>=h.cacheMaxLength?await this.flush():this.timeoutID=n(this.timeoutID,h.cacheWaitingTime,()=>this.flush())}}}let g=null;function y(){g&&(v.reset(),g=null)}var O=new Proxy({},{get(t,e){const s=(g||(g=v.instance),g),i=Reflect.get(s,e,s);return"function"==typeof i?i.bind(s):i}});export{v as DataReporter,O as default,y as resetReporter};
|
|
1
|
+
import{CallbackQueue as t}from"../utils/data-structures.js";import"../types/enums.js";import e from"../utils/sentry.js";import"../utils/is-type.js";import{sentryLogger as s}from"../utils/logger.js";import{applyBeforePushHook as i}from"./batch.js";import{scheduleFlush as n}from"./flush-scheduler.js";import{initNetworkListener as h}from"./network-listener.js";import{loadOfflineCache as r,saveOfflineCache as o}from"./offline-cache.js";import{isPromise as a}from"./promise.js";import{runBeforeReportHook as l}from"./report-data.js";import{shouldQueuePayload as u}from"./send-preflight.js";import{scheduleServerRecovery as c}from"./server-recovery.js";import{isObjectOverSizeLimit as f,sendBeacon as m,reportByImage as p,reportByFetch as d}from"./transports.js";class v{cbQueue=new t;id=crypto.randomUUID();events=[];timeoutID;retryTimer;isOnline=!0;isFlushing=!1;static#t=null;constructor(){h({setOnline:t=>{this.isOnline=t},loadOfflineCache:()=>this.loadOfflineCache(),flush:()=>this.flush()})}static get instance(){return this.#t||(this.#t=new v),this.#t}static reset(){this.#t&&this.#t.dispose(),this.#t=null}dispose(){this.timeoutID&&clearTimeout(this.timeoutID),this.retryTimer&&clearTimeout(this.retryTimer),this.events=[],this.isFlushing=!1}loadOfflineCache(){this.events.unshift(...r()),this.events=this.events.slice(-e.options.maxQueueLength)}saveOfflineCache(){o(this.events)}handleServerError(){this.retryTimer=c(this.retryTimer,{setOnline:t=>{this.isOnline=t},setRetryTimer:t=>{this.retryTimer=t},loadOfflineCache:()=>this.loadOfflineCache(),flush:()=>this.flush()})}async flush(){if(0!==this.events.length&&!this.isFlushing){this.isFlushing=!0;try{if(!this.isOnline)return this.events=this.events.slice(-e.options.maxQueueLength),void this.saveOfflineCache();const t=this.takeBatch(),i=a(t)?await t:t;if(0===i.length)return void this.scheduleNextFlush();const n=performance.now(),h=this.sendBatch(i);if(!(a(h)?await h:h))return this.events=[...i,...this.events].slice(-e.options.maxQueueLength),void this.saveOfflineCache();e.options.afterSendData?.(i),s.success("Batch report queued or sent",{count:i.length},Math.round(performance.now()-n))}finally{this.isFlushing=!1}this.scheduleNextFlush()}}takeBatch(){const t=e.options.cacheMaxLength,s=this.events.slice(0,t);return this.events=this.events.slice(t),i(s)}sendBatch(t){return!(f(t,60)||!m(t))||(e.options.useImageReport&&!f(t,2)?(p(t,this.cbQueue),!0):d(t,()=>this.handleServerError()))}scheduleNextFlush(){0!==this.events.length&&(this.timeoutID=n(this.timeoutID,100,()=>this.flush()))}async flushOfflineCache(){this.loadOfflineCache(),await this.flush()}async send(t,i=!1){const h=e.options;if(!u(t))return;const r=l(this.id,t),o=a(r)?await r:r;if(o){if(s.info(`Type: ${t.type}`,o),this.events.push(o),!this.isOnline)return this.events=this.events.slice(-h.maxQueueLength),void this.saveOfflineCache();this.timeoutID&&clearTimeout(this.timeoutID),i||this.events.length>=h.cacheMaxLength?await this.flush():this.timeoutID=n(this.timeoutID,h.cacheWaitingTime,()=>this.flush())}}}let g=null;function y(){g&&(v.reset(),g=null)}var O=new Proxy({},{get(t,e){const s=(g||(g=v.instance),g),i=Reflect.get(s,e,s);return"function"==typeof i?i.bind(s):i}});export{v as DataReporter,O as default,y as resetReporter};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";require("../constants/index.cjs"),require("../types/enums.cjs"),require("../utils/sentry.cjs");var e=require("../utils/logger.cjs");exports.initNetworkListener=function(n){n.setOnline(!1!==navigator.onLine),globalThis.addEventListener("online",()=>{n.setOnline(!0),e.sentryLogger.info("Network is back online, flushing cache"),n.loadOfflineCache(),n.flush()}),globalThis.addEventListener("offline",()=>{n.setOnline(!1),e.sentryLogger.info("Network is offline, caching events")})};
|
|
1
|
+
"use strict";require("../constants/index.cjs"),require("../types/enums.cjs"),require("../utils/sentry.cjs"),require("../utils/is-type.cjs");var e=require("../utils/logger.cjs");exports.initNetworkListener=function(n){n.setOnline(!1!==navigator.onLine),globalThis.addEventListener("online",()=>{n.setOnline(!0),e.sentryLogger.info("Network is back online, flushing cache"),n.loadOfflineCache(),n.flush()}),globalThis.addEventListener("offline",()=>{n.setOnline(!1),e.sentryLogger.info("Network is offline, caching events")})};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../constants/index.js";import"../types/enums.js";import"../utils/sentry.js";import{sentryLogger as n}from"../utils/logger.js";function e(e){e.setOnline(!1!==navigator.onLine),globalThis.addEventListener("online",()=>{e.setOnline(!0),n.info("Network is back online, flushing cache"),e.loadOfflineCache(),e.flush()}),globalThis.addEventListener("offline",()=>{e.setOnline(!1),n.info("Network is offline, caching events")})}export{e as initNetworkListener};
|
|
1
|
+
import"../constants/index.js";import"../types/enums.js";import"../utils/sentry.js";import"../utils/is-type.js";import{sentryLogger as n}from"../utils/logger.js";function e(e){e.setOnline(!1!==navigator.onLine),globalThis.addEventListener("online",()=>{e.setOnline(!0),n.info("Network is back online, flushing cache"),e.loadOfflineCache(),e.flush()}),globalThis.addEventListener("offline",()=>{e.setOnline(!1),n.info("Network is offline, caching events")})}export{e as initNetworkListener};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";require("../constants/index.cjs"),require("../types/enums.cjs");var e=require("../utils/sentry.cjs")
|
|
1
|
+
"use strict";require("../constants/index.cjs"),require("../types/enums.cjs");var e=require("../utils/sentry.cjs");require("../utils/is-type.cjs");var t=require("../utils/logger.cjs"),r=require("./report-data-schema.cjs");exports.loadOfflineCache=function(){try{const t=localStorage.getItem(e.default.options.offlineCacheKey);if(!t)return[];const a=JSON.parse(t),s=r.reportDataListSchema.safeParse(a);return s.success?(localStorage.removeItem(e.default.options.offlineCacheKey),s.data.slice(-e.default.options.maxQueueLength)):[]}catch{return localStorage.removeItem(e.default.options.offlineCacheKey),[]}},exports.saveOfflineCache=function(r){try{localStorage.setItem(e.default.options.offlineCacheKey,JSON.stringify(r.slice(-e.default.options.maxQueueLength)))}catch{t.sentryLogger.error("Failed to save offline cache")}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../constants/index.js";import"../types/enums.js";import e from"../utils/sentry.js";import{sentryLogger as t}from"../utils/logger.js";import{reportDataListSchema as o}from"./report-data-schema.js";function
|
|
1
|
+
import"../constants/index.js";import"../types/enums.js";import e from"../utils/sentry.js";import"../utils/is-type.js";import{sentryLogger as t}from"../utils/logger.js";import{reportDataListSchema as o}from"./report-data-schema.js";function s(){try{const t=localStorage.getItem(e.options.offlineCacheKey);if(!t)return[];const s=JSON.parse(t),r=o.safeParse(s);return r.success?(localStorage.removeItem(e.options.offlineCacheKey),r.data.slice(-e.options.maxQueueLength)):[]}catch{return localStorage.removeItem(e.options.offlineCacheKey),[]}}function r(o){try{localStorage.setItem(e.options.offlineCacheKey,JSON.stringify(o.slice(-e.options.maxQueueLength)))}catch{t.error("Failed to save offline cache")}}export{s as loadOfflineCache,r as saveOfflineCache};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("../constants/index.cjs");require("../types/enums.cjs");var t=require("../utils/sentry.cjs")
|
|
1
|
+
"use strict";var e=require("../constants/index.cjs");require("../types/enums.cjs");var t=require("../utils/sentry.cjs");require("../utils/is-type.cjs");var r=require("./promise.cjs");function s(r,s){const{type:o,name:n,time:i,timestamp:a,message:u,status:p}=s;return{type:o,name:n,time:i,timestamp:a,message:u,status:p,id:r,url:location.href,userId:t.default.options.userId,projectId:t.default.options.projectId,sdkVersion:e.SDK_VERSION,deviceInfo:t.default.deviceInfo,payload:s}}function o(e){return!1===e?null:e}exports.payloadToReportData=s,exports.runBeforeReportHook=function(e,n){const i=s(e,n);if(!t.default.options.onBeforeReportData)return i;const a=t.default.options.onBeforeReportData(i);return r.isPromise(a)?a.then(o):o(a)};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SDK_VERSION as t}from"../constants/index.js";import"../types/enums.js";import e from"../utils/sentry.js";import{isPromise as o}from"./promise.js";function
|
|
1
|
+
import{SDK_VERSION as t}from"../constants/index.js";import"../types/enums.js";import e from"../utils/sentry.js";import"../utils/is-type.js";import{isPromise as o}from"./promise.js";function s(o,s){const{type:n,name:r,time:i,timestamp:p,message:m,status:a}=s;return{type:n,name:r,time:i,timestamp:p,message:m,status:a,id:o,url:location.href,userId:e.options.userId,projectId:e.options.projectId,sdkVersion:t,deviceInfo:e.deviceInfo,payload:s}}function n(t,n){const i=s(t,n);if(!e.options.onBeforeReportData)return i;const p=e.options.onBeforeReportData(i);return o(p)?p.then(r):r(p)}function r(t){return!1===t?null:t}export{s as payloadToReportData,n as runBeforeReportHook};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";require("../constants/index.cjs"),require("../types/enums.cjs");var e=require("../utils/sentry.cjs")
|
|
1
|
+
"use strict";require("../constants/index.cjs"),require("../types/enums.cjs");var e=require("../utils/sentry.cjs");require("../utils/is-type.cjs");var r=require("../utils/logger.cjs");exports.shouldQueuePayload=function(s){const t=e.default.options;return""===t.dsn?(r.sentryLogger.error("DSN is empty, report cancelled",s),!1):Math.random()>t.tracesSampleRate?(r.sentryLogger.info(`Dropped by sample rate: ${s.type}`),!1):(t.screenRecordEventTypes.includes(s.type)&&(e.default.shouldScreenRecord=!0),!0)};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../constants/index.js";import"../types/enums.js";import e from"../utils/sentry.js";import{sentryLogger as
|
|
1
|
+
import"../constants/index.js";import"../types/enums.js";import e from"../utils/sentry.js";import"../utils/is-type.js";import{sentryLogger as t}from"../utils/logger.js";function r(r){const s=e.options;return""===s.dsn?(t.error("DSN is empty, report cancelled",r),!1):Math.random()>s.tracesSampleRate?(t.info(`Dropped by sample rate: ${r.type}`),!1):(s.screenRecordEventTypes.includes(r.type)&&(e.shouldScreenRecord=!0),!0)}export{r as shouldQueuePayload};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";require("../constants/index.cjs"),require("../types/enums.cjs");var e=require("../utils/sentry.cjs")
|
|
1
|
+
"use strict";require("../constants/index.cjs"),require("../types/enums.cjs");var e=require("../utils/sentry.cjs");require("../utils/is-type.cjs");var r=require("../utils/logger.cjs"),t=require("./timer.cjs");function s(i,n){n.setOnline(!1),i&&clearTimeout(i);const c=setTimeout(()=>{!function(t){fetch(e.default.options.dsn,{method:"HEAD"}).then(e=>{e.ok?(t.setOnline(!0),r.sentryLogger.info("Server is back available, flushing cache"),t.loadOfflineCache(),t.flush()):s(void 0,t)}).catch(()=>{s(void 0,t)})}(n)},e.default.options.retryIntervalMilliseconds);return t.unrefTimer(c),n.setRetryTimer(c),c}exports.scheduleServerRecovery=s;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../constants/index.js";import"../types/enums.js";import t from"../utils/sentry.js";import{sentryLogger as e}from"../utils/logger.js";import{unrefTimer as i}from"./timer.js";function o(s,n){n.setOnline(!1),s&&clearTimeout(s);const r=setTimeout(()=>{!function(i){fetch(t.options.dsn,{method:"HEAD"}).then(t=>{t.ok?(i.setOnline(!0),e.info("Server is back available, flushing cache"),i.loadOfflineCache(),i.flush()):o(void 0,i)}).catch(()=>{o(void 0,i)})}(n)},t.options.retryIntervalMilliseconds);return i(r),n.setRetryTimer(r),r}export{o as scheduleServerRecovery};
|
|
1
|
+
import"../constants/index.js";import"../types/enums.js";import t from"../utils/sentry.js";import"../utils/is-type.js";import{sentryLogger as e}from"../utils/logger.js";import{unrefTimer as i}from"./timer.js";function o(s,n){n.setOnline(!1),s&&clearTimeout(s);const r=setTimeout(()=>{!function(i){fetch(t.options.dsn,{method:"HEAD"}).then(t=>{t.ok?(i.setOnline(!0),e.info("Server is back available, flushing cache"),i.loadOfflineCache(),i.flush()):o(void 0,i)}).catch(()=>{o(void 0,i)})}(n)},t.options.retryIntervalMilliseconds);return i(r),n.setRetryTimer(r),r}export{o as scheduleServerRecovery};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";require("../constants/index.cjs"),require("../types/enums.cjs");var e=require("../utils/sentry.cjs")
|
|
1
|
+
"use strict";require("../constants/index.cjs"),require("../types/enums.cjs");var e=require("../utils/sentry.cjs");require("../utils/is-type.cjs");var t=require("../utils/logger.cjs");exports.isObjectOverSizeLimit=function(e,t){const n=JSON.stringify(e);return(new TextEncoder).encode(n).byteLength>1024*t},exports.reportByFetch=async function(n,r){try{const t=await fetch(e.default.options.dsn,{method:"POST",body:JSON.stringify(n),headers:{"Content-Type":"application/json"},keepalive:!0});return t.ok||r(),t.ok}catch(e){return t.sentryLogger.error("Fetch report failed",e),r(),!1}},exports.reportByImage=function(t,n){const{dsn:r}=e.default.options;n.push(()=>{const e=new Image,n=r.includes("?")?"&":"?";e.src=`${r}${n}data=${encodeURIComponent(JSON.stringify(t))}`})},exports.sendBeacon=function(t){return!("undefined"==typeof navigator||!navigator.sendBeacon)&&navigator.sendBeacon(e.default.options.dsn,JSON.stringify(t))};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../constants/index.js";import"../types/enums.js";import n from"../utils/sentry.js";import{sentryLogger as t}from"../utils/logger.js";function e(n,t){const e=JSON.stringify(n);return(new TextEncoder).encode(e).byteLength>1024*t}function o(t){return!("undefined"==typeof navigator||!navigator.sendBeacon)&&navigator.sendBeacon(n.options.dsn,JSON.stringify(t))}async function
|
|
1
|
+
import"../constants/index.js";import"../types/enums.js";import n from"../utils/sentry.js";import"../utils/is-type.js";import{sentryLogger as t}from"../utils/logger.js";function e(n,t){const e=JSON.stringify(n);return(new TextEncoder).encode(e).byteLength>1024*t}function o(t){return!("undefined"==typeof navigator||!navigator.sendBeacon)&&navigator.sendBeacon(n.options.dsn,JSON.stringify(t))}async function s(e,o){try{const t=await fetch(n.options.dsn,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json"},keepalive:!0});return t.ok||o(),t.ok}catch(n){return t.error("Fetch report failed",n),o(),!1}}function i(t,e){const{dsn:o}=n.options;e.push(()=>{const n=new Image,e=o.includes("?")?"&":"?";n.src=`${o}${e}data=${encodeURIComponent(JSON.stringify(t))}`})}export{e as isObjectOverSizeLimit,s as reportByFetch,i as reportByImage,o as sendBeacon};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var n=require("source-map"),t=require("zod");const e=t.z.object({version:t.z.union([t.z.number(),t.z.string()]),sources:t.z.array(t.z.string().nullable()),names:t.z.array(t.z.string()),mappings:t.z.string()}),r=t.z.looseObject({type:t.z.string().optional(),name:t.z.string().optional(),payload:t.z.looseObject({line:t.z.number().optional(),column:t.z.number().optional(),extra:t.z.unknown().optional(),stack:t.z.unknown().optional()}).optional()}),o=/^\s*at (?:(.+?)\s+)?\(?(\S+?):(\d+):(\d+)\)?\s*$/,s=/^\s*(?:(.*?)@)?(\S+?):(\d+):(\d+)\s*$/;function a(n){const t=[];for(const e of n.split("\n")){if(t.length>=30)break;const n=o.exec(e)??s.exec(e);if(!n)continue;const[,r,a,c,i]=n;if(!a||!c||!i)continue;const u={url:a,line:Number.parseInt(c,10),column:Number.parseInt(i,10)};r&&(u.func=r),t.push(u)}return t}async function c(t,r){const o={resolved:!1,...r};try{const s=await t(r.url);return e.safeParse(s).success?await n.SourceMapConsumer.with(JSON.stringify(s),null,n=>{const t=n.originalPositionFor({line:r.line,column:Math.max(0,r.column-1)});if(null===t.source||null===t.line)return o;const e=n.sourceContentFor(t.source,!0),s={...o,resolved:!0,source:t.source,originalLine:t.line};return null!==t.column&&(s.originalColumn=t.column),null!==t.name&&(s.name=t.name),e&&(s.snippet=function(n,t){const e=n.split("\n"),r=Math.max(1,t-3),o=Math.min(e.length,t+3),s=[];for(let n=r;n<=o;n++)s.push({line:n,code:e[n-1]??"",highlight:n===t});return s}(e,t.line)),s}):o}catch{return o}}async function i(n,t){const e=a(t),r=[];for(const t of e)r.push(await c(n,t));return r}async function u(n,t){const e=r.safeParse(t);if(!e.success)return t;const o=e.data,s=o.payload;if(!s)return t;const a=[];var u;return"Error"===o.type&&"string"==typeof o.name&&"number"==typeof s.line&&"number"==typeof s.column?a.push(await c(n,{url:o.name,line:s.line,column:s.column})):"string"==typeof s.extra&&(u=s.extra,/(^|\n)\s*at .+:\d+:\d+/.test(u)||/@.+:\d+:\d+/.test(u))?a.push(...await i(n,s.extra)):"React"!==o.type&&"Vue"!==o.type||"string"!=typeof s.stack||a.push(...await i(n,s.stack)),0===a.length?t:{...o,sourcemap:{frames:a}}}exports.enrichReportData=async function(n,t){if(!Array.isArray(t))return t;const e=[];for(const r of t)e.push(await u(n,r));return e},exports.parseStack=a,exports.resolveFrame=c,exports.resolveStack=i,exports.splitScriptUrl=function(n){try{const t=new URL(n);return{pathname:t.pathname,search:t.search}}catch{const t=n.search(/[?#]/);return-1!==t?{pathname:n.slice(0,t),search:n.slice(t)}:{pathname:n,search:""}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{SourceMapConsumer as n}from"source-map";import{z as t}from"zod";const e=t.object({version:t.union([t.number(),t.string()]),sources:t.array(t.string().nullable()),names:t.array(t.string()),mappings:t.string()}),o=t.looseObject({type:t.string().optional(),name:t.string().optional(),payload:t.looseObject({line:t.number().optional(),column:t.number().optional(),extra:t.unknown().optional(),stack:t.unknown().optional()}).optional()}),r=/^\s*at (?:(.+?)\s+)?\(?(\S+?):(\d+):(\d+)\)?\s*$/,s=/^\s*(?:(.*?)@)?(\S+?):(\d+):(\d+)\s*$/;function a(n){const t=[];for(const e of n.split("\n")){if(t.length>=30)break;const n=r.exec(e)??s.exec(e);if(!n)continue;const[,o,a,c,i]=n;if(!a||!c||!i)continue;const u={url:a,line:Number.parseInt(c,10),column:Number.parseInt(i,10)};o&&(u.func=o),t.push(u)}return t}function c(n){try{const t=new URL(n);return{pathname:t.pathname,search:t.search}}catch{const t=n.search(/[?#]/);return-1!==t?{pathname:n.slice(0,t),search:n.slice(t)}:{pathname:n,search:""}}}async function i(t,o){const r={resolved:!1,...o};try{const s=await t(o.url);return e.safeParse(s).success?await n.with(JSON.stringify(s),null,n=>{const t=n.originalPositionFor({line:o.line,column:Math.max(0,o.column-1)});if(null===t.source||null===t.line)return r;const e=n.sourceContentFor(t.source,!0),s={...r,resolved:!0,source:t.source,originalLine:t.line};return null!==t.column&&(s.originalColumn=t.column),null!==t.name&&(s.name=t.name),e&&(s.snippet=function(n,t){const e=n.split("\n"),o=Math.max(1,t-3),r=Math.min(e.length,t+3),s=[];for(let n=o;n<=r;n++)s.push({line:n,code:e[n-1]??"",highlight:n===t});return s}(e,t.line)),s}):r}catch{return r}}async function u(n,t){const e=a(t),o=[];for(const t of e)o.push(await i(n,t));return o}async function l(n,t){const e=o.safeParse(t);if(!e.success)return t;const r=e.data,s=r.payload;if(!s)return t;const a=[];var c;return"Error"===r.type&&"string"==typeof r.name&&"number"==typeof s.line&&"number"==typeof s.column?a.push(await i(n,{url:r.name,line:s.line,column:s.column})):"string"==typeof s.extra&&(c=s.extra,/(^|\n)\s*at .+:\d+:\d+/.test(c)||/@.+:\d+:\d+/.test(c))?a.push(...await u(n,s.extra)):"React"!==r.type&&"Vue"!==r.type||"string"!=typeof s.stack||a.push(...await u(n,s.stack)),0===a.length?t:{...r,sourcemap:{frames:a}}}async function p(n,t){if(!Array.isArray(t))return t;const e=[];for(const o of t)e.push(await l(n,o));return e}export{p as enrichReportData,a as parseStack,i as resolveFrame,u as resolveStack,c as splitScriptUrl};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var r=require("./sourcemap.cjs");exports.parseStack=r.parseStack,exports.enrichReportData=async function(t,e){return r.enrichReportData(function(t){return async e=>{const{pathname:a,search:n}=r.splitScriptUrl(e),s=await t.moduleGraph.getModuleByUrl(a+n)??await t.moduleGraph.getModuleByUrl(a);return s?.transformResult?.map??null}}(t),e)};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{enrichReportData as r,splitScriptUrl as a}from"./sourcemap.js";export{parseStack}from"./sourcemap.js";async function e(e,t){return r(function(r){return async e=>{const{pathname:t,search:o}=a(e),n=await r.moduleGraph.getModuleByUrl(t+o)??await r.moduleGraph.getModuleByUrl(t);return n?.transformResult?.map??null}}(e),t)}export{e as enrichReportData};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./sourcemap.cjs");function r(e){return e.replace(/\\/g,"/").replace(/^\/+/,"")}exports.enrichReportData=e.enrichReportData,exports.parseStack=e.parseStack,exports.resolveFrame=e.resolveFrame,exports.resolveStack=e.resolveStack,exports.createAssetMapStore=function(){const t=new Map;return{put:(e,a)=>{const s=r(e);s.endsWith(".map")&&t.set(s,a)},loadMap:async a=>{const{pathname:s}=e.splitScriptUrl(a),o=r(s);if(!o)return null;let p=t.get(`${o}.map`);if(void 0===p){const e=`${o.split("/").pop()}.map`;for(const[r,a]of t)if(r===e||r.endsWith(`/${e}`)){p=a;break}}if(void 0===p)return null;try{return JSON.parse(p)}catch{return null}}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{splitScriptUrl as e}from"./sourcemap.js";export{enrichReportData,parseStack,resolveFrame,resolveStack}from"./sourcemap.js";function r(e){return e.replace(/\\/g,"/").replace(/^\/+/,"")}function t(){const t=new Map;return{put:(e,n)=>{const o=r(e);o.endsWith(".map")&&t.set(o,n)},loadMap:async n=>{const{pathname:o}=e(n),a=r(o);if(!a)return null;let p=t.get(`${a}.map`);if(void 0===p){const e=`${a.split("/").pop()}.map`;for(const[r,n]of t)if(r===e||r.endsWith(`/${e}`)){p=n;break}}if(void 0===p)return null;try{return JSON.parse(p)}catch{return null}}}}export{t as createAssetMapStore};
|
package/dist/types/common.d.ts
CHANGED
|
@@ -2,6 +2,28 @@ import { EventType, Status, HttpMethod, BreadcrumbType } from './enums.js';
|
|
|
2
2
|
import { Metric } from 'web-vitals';
|
|
3
3
|
import { IOptions } from './options.js';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Copyright (c) 2026 hangtiancheng
|
|
7
|
+
*
|
|
8
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
10
|
+
* in the Software without restriction, including without limitation the rights
|
|
11
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
13
|
+
* furnished to do so, subject to the following conditions:
|
|
14
|
+
*
|
|
15
|
+
* The above copyright notice and this permission notice shall be included in
|
|
16
|
+
* all copies or substantial portions of the Software.
|
|
17
|
+
*
|
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
24
|
+
* SOFTWARE.
|
|
25
|
+
*/
|
|
26
|
+
|
|
5
27
|
interface ISentry {
|
|
6
28
|
codeErrors: {
|
|
7
29
|
has(value: string): boolean;
|
|
@@ -128,10 +150,16 @@ interface IDataReporter {
|
|
|
128
150
|
send(payload: TReportPayload): Promise<void>;
|
|
129
151
|
flushOfflineCache(): Promise<void>;
|
|
130
152
|
}
|
|
131
|
-
|
|
153
|
+
/**
|
|
154
|
+
* Resource load failures (img/script/link/...) dispatch a plain `Event`
|
|
155
|
+
* (not an `ErrorEvent`) whose target is the failed element. `<img>` and
|
|
156
|
+
* `<script>` expose `src`, `<link>` exposes `href` — never both, so both
|
|
157
|
+
* fields are optional and at least one is present on a real resource error.
|
|
158
|
+
*/
|
|
159
|
+
interface IExtendedErrorEvent extends Event {
|
|
132
160
|
target: EventTarget & {
|
|
133
|
-
src
|
|
134
|
-
href
|
|
161
|
+
src?: string;
|
|
162
|
+
href?: string;
|
|
135
163
|
localName: string;
|
|
136
164
|
};
|
|
137
165
|
}
|
package/dist/types/enums.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e,t,o,r,a,n,s;exports.HttpStatus=void 0,(e=exports.HttpStatus||(exports.HttpStatus={})).OK="OK",e.BadRequest="Bad Request",e.Unauthorized="Unauthorized",e.Forbidden="Forbidden",e.NotFound="NotFound",e.Conflict="Conflict",e.PayloadTooLarge="Payload Too Large",e.TooManyRequests="Too Many Requests",e.InternalServerError="Internal Server Error",e.NotImplemented="Not Implemented",e.ServiceUnavailable="Service Unavailable",e.GatewayTimeout="Gateway Timeout",e.UnknownError="Unknown Error",exports.BreadcrumbType=void 0,(t=exports.BreadcrumbType||(exports.BreadcrumbType={})).Http="Http",t.Click="Click",t.Route="Route",t.Resource="Resource",t.CodeError="Code Error",t.Custom="Custom",exports.Status=void 0,(o=exports.Status||(exports.Status={})).Error="Error",o.OK="OK",exports.EventType=void 0,(r=exports.EventType||(exports.EventType={})).Xhr="XMLHttpRequest",r.Fetch="fetch",r.Click="Click",r.HashChange="Event hashchange",r.History="History",r.Resource="Resource",r.UnhandledRejection="Event unhandledrejection",r.Error="Error",r.Vue="Vue",r.React="React",r.
|
|
1
|
+
"use strict";var e,t,o,r,a,n,s;exports.HttpStatus=void 0,(e=exports.HttpStatus||(exports.HttpStatus={})).OK="OK",e.BadRequest="Bad Request",e.Unauthorized="Unauthorized",e.Forbidden="Forbidden",e.NotFound="NotFound",e.Conflict="Conflict",e.PayloadTooLarge="Payload Too Large",e.TooManyRequests="Too Many Requests",e.InternalServerError="Internal Server Error",e.NotImplemented="Not Implemented",e.ServiceUnavailable="Service Unavailable",e.GatewayTimeout="Gateway Timeout",e.UnknownError="Unknown Error",exports.BreadcrumbType=void 0,(t=exports.BreadcrumbType||(exports.BreadcrumbType={})).Http="Http",t.Click="Click",t.Route="Route",t.Resource="Resource",t.CodeError="Code Error",t.Custom="Custom",exports.Status=void 0,(o=exports.Status||(exports.Status={})).Error="Error",o.OK="OK",exports.EventType=void 0,(r=exports.EventType||(exports.EventType={})).Xhr="XMLHttpRequest",r.Fetch="fetch",r.Click="Click",r.HashChange="Event hashchange",r.History="History",r.Resource="Resource",r.UnhandledRejection="Event unhandledrejection",r.Error="Error",r.Vue="Vue",r.React="React",r.OtherFrameworks="OtherFrameworks",r.Performance="Performance",r.ScreenRecord="ScreenRecord",r.Exposure="Exposure",r.WhiteScreen="WhiteScreen",r.Custom="Custom",r.PV="PV",exports.HttpType=void 0,(a=exports.HttpType||(exports.HttpType={})).Xhr="XMLHttpRequest",a.Fetch="fetch",exports.HttpStatusCode=void 0,(n=exports.HttpStatusCode||(exports.HttpStatusCode={}))[n.OK=200]="OK",n[n.BadRequest=400]="BadRequest",n[n.Unauthorized=401]="Unauthorized",n[n.Forbidden=403]="Forbidden",n[n.NotFound=404]="NotFound",n[n.Conflict=409]="Conflict",n[n.PayloadTooLarge=413]="PayloadTooLarge",n[n.TooManyRequests=429]="TooManyRequests",n[n.InternalServerError=500]="InternalServerError",n[n.NotImplemented=501]="NotImplemented",n[n.ServiceUnavailable=503]="ServiceUnavailable",n[n.GatewayTimeout=504]="GatewayTimeout",exports.HttpMethod=void 0,(s=exports.HttpMethod||(exports.HttpMethod={})).Get="GET",s.Head="HEAD",s.Post="POST",s.Put="PUT",s.Delete="DELETE",s.Connect="CONNECT",s.Options="OPTIONS",s.Trace="TRACE",s.Patch="PATCH";
|