@grafana/faro-core 1.11.0 → 1.12.1

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.
@@ -1 +1 @@
1
- var GrafanaFaroCore=function(e){"use strict";function n(e,n){return typeof e===n}function t(e,n){return Object.prototype.toString.call(e)===`[object ${n}]`}function r(e,n){try{return e instanceof n}catch(e){return!1}}const a=e=>n(e,"null"),i=e=>n(e,"string"),o=e=>n(e,"number")&&!isNaN(e)||n(e,"bigint"),s=e=>!a(e)&&n(e,"object"),u=e=>n(e,"function"),l=e=>t(e,"Array"),c="undefined"!=typeof Event,d="undefined"!=typeof Error,g=e=>d&&r(e,Error),p="undefined"!=typeof Element,f="undefined"!=typeof Map;function m(e,t){if(e===t)return!0;if(n(e,"number")&&isNaN(e))return n(t,"number")&&isNaN(t);const r=l(e),a=l(t);if(r!==a)return!1;if(r&&a){const n=e.length;if(n!==t.length)return!1;for(let r=n;0!=r--;)if(!m(e[r],t[r]))return!1;return!0}const i=s(e),o=s(t);if(i!==o)return!1;if(e&&t&&i&&o){const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;for(let r of n)if(!m(e[r],t[r]))return!1;return!0}return!1}function v(){return(new Date).toISOString()}function b(e){return new Date(e).toISOString()}var h;e.LogLevel=void 0,(h=e.LogLevel||(e.LogLevel={})).TRACE="trace",h.DEBUG="debug",h.INFO="info",h.LOG="log",h.WARN="warn",h.ERROR="error";const E=e.LogLevel.LOG,y=[e.LogLevel.TRACE,e.LogLevel.DEBUG,e.LogLevel.INFO,e.LogLevel.LOG,e.LogLevel.WARN,e.LogLevel.ERROR];function I(){}const T="abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789";const O="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof self?self:void 0;class L{constructor(e,n){var t,r;this.signalBuffer=[],this.itemLimit=null!==(t=null==n?void 0:n.itemLimit)&&void 0!==t?t:50,this.sendTimeout=null!==(r=null==n?void 0:n.sendTimeout)&&void 0!==r?r:250,this.paused=(null==n?void 0:n.paused)||!1,this.sendFn=e,this.flushInterval=-1,this.paused||this.start(),document.addEventListener("visibilitychange",(()=>{"hidden"===document.visibilityState&&this.flush()}))}addItem(e){this.paused||(this.signalBuffer.push(e),this.signalBuffer.length>=this.itemLimit&&this.flush())}start(){this.paused=!1,this.sendTimeout>0&&(this.flushInterval=window.setInterval((()=>this.flush()),this.sendTimeout))}pause(){this.paused=!0,clearInterval(this.flushInterval)}groupItems(e){const n=new Map;return e.forEach((e=>{const t=JSON.stringify(e.meta);let r=n.get(t);r=void 0===r?[e]:[...r,e],n.set(t,r)})),Array.from(n.values())}flush(){if(this.paused||0===this.signalBuffer.length)return;this.groupItems(this.signalBuffer).forEach(this.sendFn),this.signalBuffer=[]}}var S;e.TransportItemType=void 0,(S=e.TransportItemType||(e.TransportItemType={})).EXCEPTION="exception",S.LOG="log",S.MEASUREMENT="measurement",S.TRACE="trace",S.EVENT="event";const N={[e.TransportItemType.EXCEPTION]:"exceptions",[e.TransportItemType.LOG]:"logs",[e.TransportItemType.MEASUREMENT]:"measurements",[e.TransportItemType.TRACE]:"traces",[e.TransportItemType.EVENT]:"events"};function x(n){return t=>{if(t.type===e.TransportItemType.EXCEPTION&&t.payload){const e=t.payload,r=`${e.type}: ${e.value}`;if(function(e,n){return e.some((e=>i(e)?n.includes(e):!!n.match(e)))}(n,r))return null}return t}}function R(e,n,t,r){var a;n.debug("Initializing transports");const i=[];let o=t.paused,s=[];const u=e=>{let n=e;for(const e of s){const t=n.map(e).filter(Boolean);if(0===t.length)return[];n=t}return n},l=e=>{const t=u(e);if(0!==t.length)for(const e of i)n.debug(`Transporting item using ${e.name}\n`,t),e.isBatched()&&e.send(t)};let c;(null===(a=t.batching)||void 0===a?void 0:a.enabled)&&(c=new L(l,{sendTimeout:t.batching.sendTimeout,itemLimit:t.batching.itemLimit,paused:o}));return{add:(...a)=>{n.debug("Adding transports"),a.forEach((a=>{n.debug(`Adding "${a.name}" transport`);i.some((e=>e===a))?n.warn(`Transport ${a.name} is already added`):(a.unpatchedConsole=e,a.internalLogger=n,a.config=t,a.metas=r,i.push(a))}))},addBeforeSendHooks:(...e)=>{n.debug("Adding beforeSendHooks\n",s),e.forEach((e=>{e&&s.push(e)}))},addIgnoreErrorsPatterns:(...e)=>{n.debug("Adding ignoreErrorsPatterns\n",e),e.forEach((e=>{e&&s.push(x(e))}))},getBeforeSendHooks:()=>[...s],execute:e=>{var r;o||((null===(r=t.batching)||void 0===r?void 0:r.enabled)&&(null==c||c.addItem(e)),(e=>{var r,a;if((null===(r=t.batching)||void 0===r?void 0:r.enabled)&&i.every((e=>e.isBatched())))return;const[o]=u([e]);if(void 0!==o)for(const e of i)n.debug(`Transporting item using ${e.name}\n`,o),e.isBatched()?(null===(a=t.batching)||void 0===a?void 0:a.enabled)||e.send([o]):e.send(o)})(e))},isPaused:()=>o,pause:()=>{n.debug("Pausing transports"),null==c||c.pause(),o=!0},remove:(...e)=>{n.debug("Removing transports"),e.forEach((e=>{n.debug(`Removing "${e.name}" transport`);const t=i.indexOf(e);-1!==t?i.splice(t,1):n.warn(`Transport "${e.name}" is not added`)}))},removeBeforeSendHooks:(...e)=>{s.filter((n=>!e.includes(n)))},get transports(){return[...i]},unpause:()=>{n.debug("Unpausing transports"),null==c||c.start(),o=!1}}}var j;e.InternalLoggerLevel=void 0,(j=e.InternalLoggerLevel||(e.InternalLoggerLevel={}))[j.OFF=0]="OFF",j[j.ERROR=1]="ERROR",j[j.WARN=2]="WARN",j[j.INFO=3]="INFO",j[j.VERBOSE=4]="VERBOSE";const A={debug:I,error:I,info:I,prefix:"Faro",warn:I},w=e.InternalLoggerLevel.ERROR,C=Object.assign({},console);let k=C;function _(e){var n;return k=null!==(n=e.unpatchedConsole)&&void 0!==n?n:k,k}function P(n=C,t=w){const r=A;return t>e.InternalLoggerLevel.OFF&&(r.error=t>=e.InternalLoggerLevel.ERROR?function(...e){n.error(`${r.prefix}\n`,...e)}:I,r.warn=t>=e.InternalLoggerLevel.WARN?function(...e){n.warn(`${r.prefix}\n`,...e)}:I,r.info=t>=e.InternalLoggerLevel.INFO?function(...e){n.info(`${r.prefix}\n`,...e)}:I,r.debug=t>=e.InternalLoggerLevel.VERBOSE?function(...e){n.debug(`${r.prefix}\n`,...e)}:I),r}let B=A;function F(e,n){return B=P(e,n.internalLoggerLevel),B}class D{constructor(){this.unpatchedConsole=C,this.internalLogger=A,this.config={},this.metas={}}logDebug(...e){this.internalLogger.debug(`${this.name}\n`,...e)}logInfo(...e){this.internalLogger.info(`${this.name}\n`,...e)}logWarn(...e){this.internalLogger.warn(`${this.name}\n`,...e)}logError(...e){this.internalLogger.error(`${this.name}\n`,...e)}}function M(e,n){var t,r;if(void 0===n)return e;if(void 0===e)return{resourceSpans:n};const a=null===(t=e.resourceSpans)||void 0===t?void 0:t[0];if(void 0===a)return e;const i=(null==a?void 0:a.scopeSpans)||[],o=(null===(r=null==n?void 0:n[0])||void 0===r?void 0:r.scopeSpans)||[];return Object.assign(Object.assign({},e),{resourceSpans:[Object.assign(Object.assign({},a),{scopeSpans:[...i,...o]})]})}const $="Error";let G;function V(e){let n=e.cause;return g(n)?n=e.cause.toString():null!==n&&(s(e.cause)||l(e.cause))?n=JSON.stringify(e.cause):null!=n&&(n=e.cause.toString()),null==n?{}:{cause:n}}const z=e=>e.map((e=>{try{return String(e)}catch(e){return""}})).join(" ");function U(n,t,r,i,o){t.debug("Initializing API");const s=function(n,t,r,a,i){let o;return t.debug("Initializing traces API"),{getOTEL:()=>o,getTraceContext:()=>{const e=null==o?void 0:o.trace.getSpanContext(o.context.active());return e?{trace_id:e.traceId,span_id:e.spanId}:void 0},initOTEL:(e,n)=>{t.debug("Initializing OpenTelemetry"),o={trace:e,context:n}},isOTELInitialized:()=>!!o,pushTraces:n=>{try{const r={type:e.TransportItemType.TRACE,payload:n,meta:a.value};t.debug("Pushing trace\n",r),i.execute(r)}catch(e){t.error("Error pushing trace\n",e)}}}}(0,t,0,i,o);return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},s),function(n,t,r,i,o,s){var u;t.debug("Initializing exceptions API");let l=null;G=null!==(u=r.parseStacktrace)&&void 0!==u?u:G;const c=e=>{t.debug("Changing stacktrace parser"),G=null!=e?e:G};return c(r.parseStacktrace),{changeStacktraceParser:c,getStacktraceParser:()=>G,pushError:(n,{skipDedupe:u,stackFrames:c,type:d,context:g,spanContext:p,timestampOverwriteMs:f}={})=>{d=d||n.name||$;const h={meta:i.value,payload:{type:d,value:n.message,timestamp:f?b(f):v(),trace:p?{trace_id:p.traceId,span_id:p.spanId}:s.getTraceContext(),context:Object.assign(Object.assign({},V(n)),null!=g?g:{})},type:e.TransportItemType.EXCEPTION};(null==(c=null!=c?c:n.stack?null==G?void 0:G(n).frames:void 0)?void 0:c.length)&&(h.payload.stacktrace={frames:c});const E={type:h.payload.type,value:h.payload.value,stackTrace:h.payload.stacktrace,context:h.payload.context};u||!r.dedupe||a(l)||!m(E,l)?(l=E,t.debug("Pushing exception\n",h),o.execute(h)):t.debug("Skipping error push because it is the same as the last one\n",h.payload)}}}(0,t,r,i,o,s)),function(e,n,t,r){let a,i,o;n.debug("Initializing meta API");const s=e=>{i&&r.remove(i),i={user:e},r.add(i)},u=e=>{a&&r.remove(a),a={session:e},r.add(a)};return{setUser:s,resetUser:s,setSession:u,resetSession:u,getSession:()=>r.value.session,setView:e=>{var n;if((null===(n=null==o?void 0:o.view)||void 0===n?void 0:n.name)===(null==e?void 0:e.name))return;const t=o;o={view:e},r.add(o),t&&r.remove(t)},getView:()=>r.value.view}}(0,t,0,i)),function(n,t,r,i,o,s){var u;t.debug("Initializing logs API");let l=null;const c=null!==(u=r.logArgsSerializer)&&void 0!==u?u:z;return{pushLog:(n,{context:u,level:d,skipDedupe:g,spanContext:p,timestampOverwriteMs:f}={})=>{try{const h={type:e.TransportItemType.LOG,payload:{message:c(n),level:null!=d?d:E,context:null!=u?u:{},timestamp:f?b(f):v(),trace:p?{trace_id:p.traceId,span_id:p.spanId}:s.getTraceContext()},meta:i.value},y={message:h.payload.message,level:h.payload.level,context:h.payload.context};if(!g&&r.dedupe&&!a(l)&&m(y,l))return void t.debug("Skipping log push because it is the same as the last one\n",h.payload);l=y,t.debug("Pushing log\n",h),o.execute(h)}catch(e){t.error("Error pushing log\n",e)}}}}(0,t,r,i,o,s)),function(n,t,r,i,o,s){t.debug("Initializing measurements API");let u=null;return{pushMeasurement:(n,{skipDedupe:l,context:c,spanContext:d,timestampOverwriteMs:g}={})=>{try{const p={type:e.TransportItemType.MEASUREMENT,payload:Object.assign(Object.assign({},n),{trace:d?{trace_id:d.traceId,span_id:d.spanId}:s.getTraceContext(),timestamp:g?b(g):v(),context:null!=c?c:{}}),meta:i.value},f={type:p.payload.type,values:p.payload.values,context:p.payload.context};if(!l&&r.dedupe&&!a(u)&&m(f,u))return void t.debug("Skipping measurement push because it is the same as the last one\n",p.payload);u=f,t.debug("Pushing measurement\n",p),o.execute(p)}catch(e){t.error("Error pushing measurement\n",e)}}}}(0,t,r,i,o,s)),function(n,t,r,i,o,s){let u=null;return{pushEvent:(n,l,c,{skipDedupe:d,spanContext:g,timestampOverwriteMs:p}={})=>{try{const f={meta:i.value,payload:{name:n,domain:null!=c?c:r.eventDomain,attributes:l,timestamp:p?b(p):v(),trace:g?{trace_id:g.traceId,span_id:g.spanId}:s.getTraceContext()},type:e.TransportItemType.EVENT},h={name:f.payload.name,attributes:f.payload.attributes,domain:f.payload.domain};if(!d&&r.dedupe&&!a(u)&&m(h,u))return void t.debug("Skipping event push because it is the same as the last one\n",f.payload);u=h,t.debug("Pushing event\n",f),o.execute(f)}catch(e){t.error("Error pushing event",e)}}}}(0,t,r,i,o,s))}const K="1.11.0";const H="_faroInternal";function W(e){e.config.isolate?e.internalLogger.debug("Skipping registering internal Faro instance on global object"):(e.internalLogger.debug("Registering internal Faro instance on global object"),Object.defineProperty(O,H,{configurable:!1,enumerable:!1,writable:!1,value:e}))}function X(){return H in O}function J(n,t,r,a,i,o,s){return t.debug("Initializing Faro"),e.faro={api:o,config:r,instrumentations:s,internalLogger:t,metas:a,pause:i.pause,transports:i,unpatchedConsole:n,unpause:i.unpause},W(e.faro),function(e){if(e.config.preventGlobalExposure)e.internalLogger.debug("Skipping registering public Faro instance in the global scope");else{if(e.internalLogger.debug(`Registering public faro reference in the global scope using "${e.config.globalObjectKey}" key`),e.config.globalObjectKey in O)return void e.internalLogger.warn(`Skipping global registration due to key "${e.config.globalObjectKey}" being used already. Please set "globalObjectKey" to something else or set "preventGlobalExposure" to "true"`);Object.defineProperty(O,e.config.globalObjectKey,{configurable:!1,writable:!1,value:e})}}(e.faro),e.faro}e.faro={};return e.BaseExtension=D,e.BaseInstrumentation=class extends D{constructor(){super(...arguments),this.api={},this.transports={}}},e.BaseTransport=class extends D{isBatched(){return!1}getIgnoreUrls(){return[]}},e.Conventions={EventNames:{CLICK:"click",NAVIGATION:"navigation",SESSION_START:"session_start",VIEW_CHANGED:"view_changed"}},e.EVENT_CLICK="click",e.EVENT_NAVIGATION="navigation",e.EVENT_ROUTE_CHANGE="route_change",e.EVENT_SESSION_EXTEND="session_extend",e.EVENT_SESSION_RESUME="session_resume",e.EVENT_SESSION_START="session_start",e.EVENT_VIEW_CHANGED="view_changed",e.VERSION=K,e.allLogLevels=y,e.createInternalLogger=P,e.createPromiseBuffer=function(e){const{size:n,concurrency:t}=e,r=[];let a=0;const i=()=>{if(a<t&&r.length){const{producer:e,resolve:n,reject:t}=r.shift();a++,e().then((e=>{a--,i(),n(e)}),(e=>{a--,i(),t(e)}))}};return{add:e=>{if(r.length+a>=n)throw new Error("Task buffer full");return new Promise(((n,t)=>{r.push({producer:e,resolve:n,reject:t}),i()}))}}},e.dateNow=function(){return Date.now()},e.deepEqual=m,e.defaultBatchingConfig={enabled:!0,sendTimeout:250,itemLimit:50},e.defaultExceptionType=$,e.defaultGlobalObjectKey="faro",e.defaultInternalLoggerLevel=w,e.defaultLogArgsSerializer=z,e.defaultLogLevel=E,e.defaultUnpatchedConsole=C,e.genShortID=function(e=10){return Array.from(Array(e)).map((()=>T[Math.floor(59*Math.random())])).join("")},e.getCurrentTimestamp=v,e.getInternalFaroFromGlobalObject=function(){return O[H]},e.getTransportBody=function(n){let t={meta:{}};return void 0!==n[0]&&(t.meta=n[0].meta),n.forEach((n=>{switch(n.type){case e.TransportItemType.LOG:case e.TransportItemType.EVENT:case e.TransportItemType.EXCEPTION:case e.TransportItemType.MEASUREMENT:const r=N[n.type],a=t[r];t=Object.assign(Object.assign({},t),{[r]:void 0===a?[n.payload]:[...a,n.payload]});break;case e.TransportItemType.TRACE:t=Object.assign(Object.assign({},t),{traces:M(t.traces,n.payload.resourceSpans)})}})),t},e.globalObject=O,e.initializeFaro=function(e){const n=_(e),t=F(n,e);if(X()&&!e.isolate)return void t.error('Faro is already registered. Either add instrumentations, transports etc. to the global faro instance or use the "isolate" property');t.debug("Initializing");const r=function(e,n){let t=[],r=[];const a=()=>t.reduce(((e,n)=>Object.assign(e,u(n)?n():n)),{}),i=()=>{if(r.length){const e=a();r.forEach((n=>n(e)))}};return{add:(...e)=>{n.debug("Adding metas\n",e),t.push(...e),i()},remove:(...e)=>{n.debug("Removing metas\n",e),t=t.filter((n=>!e.includes(n))),i()},addListener:e=>{n.debug("Adding metas listener\n",e),r.push(e)},removeListener:e=>{n.debug("Removing metas listener\n",e),r=r.filter((n=>n!==e))},get value(){return a()}}}(0,t),a=R(n,t,e,r),i=U(0,t,e,r,a),o=function(e,n,t,r,a,i){n.debug("Initializing instrumentations");const o=[];return{add:(...s)=>{n.debug("Adding instrumentations"),s.forEach((s=>{n.debug(`Adding "${s.name}" instrumentation`),o.some((e=>e.name===s.name))?n.warn(`Instrumentation ${s.name} is already added`):(s.unpatchedConsole=e,s.internalLogger=n,s.config=t,s.metas=r,s.transports=a,s.api=i,o.push(s),s.initialize())}))},get instrumentations(){return[...o]},remove:(...e)=>{n.debug("Removing instrumentations"),e.forEach((e=>{var t,r;n.debug(`Removing "${e.name}" instrumentation`);const a=o.reduce(((n,t,r)=>null===n&&t.name===e.name?r:null),null);a?(null===(r=(t=o[a]).destroy)||void 0===r||r.call(t),o.splice(a,1)):n.warn(`Instrumentation "${e.name}" is not added`)}))}}}(n,t,e,r,a,i),s=J(n,t,e,r,a,i,o);return function(e){var n,t;const r={sdk:{version:K},app:{bundleId:e.config.app.name&&(a=e.config.app.name,null==O?void 0:O[`__faroBundleId_${a}`])}};var a;const i=null===(n=e.config.sessionTracking)||void 0===n?void 0:n.session;i&&e.api.setSession(i),e.config.app&&(r.app=Object.assign(Object.assign({},e.config.app),r.app)),e.config.user&&(r.user=e.config.user),e.config.view&&(r.view=e.config.view),e.metas.add(r,...null!==(t=e.config.metas)&&void 0!==t?t:[])}(s),function(e){e.transports.add(...e.config.transports),e.transports.addBeforeSendHooks(e.config.beforeSend),e.transports.addIgnoreErrorsPatterns(e.config.ignoreErrors)}(s),function(e){e.instrumentations.add(...e.config.instrumentations)}(s),s},e.internalGlobalObjectKey=H,e.isArray=l,e.isBoolean=e=>n(e,"boolean"),e.isDomError=e=>t(e,"DOMError"),e.isDomException=e=>t(e,"DOMException"),e.isElement=e=>p&&r(e,Element),e.isElementDefined=p,e.isError=g,e.isErrorDefined=d,e.isErrorEvent=e=>t(e,"ErrorEvent"),e.isEvent=e=>c&&r(e,Event),e.isEventDefined=c,e.isFunction=u,e.isInstanceOf=r,e.isInt=e=>o(e)&&Number.isInteger(e),e.isInternalFaroOnGlobalObject=X,e.isMap=e=>f&&r(e,Map),e.isMapDefined=f,e.isNull=a,e.isNumber=o,e.isObject=s,e.isPrimitive=e=>!s(e)&&!u(e),e.isRegExp=e=>t(e,"RegExp"),e.isString=i,e.isSymbol=e=>n(e,"symbol"),e.isSyntheticEvent=e=>s(e)&&"nativeEvent"in e&&"preventDefault"in e&&"stopPropagation"in e,e.isThenable=e=>u(null==e?void 0:e.then),e.isToString=t,e.isTypeof=n,e.isUndefined=e=>n(e,"undefined"),e.noop=I,e.setInternalFaroOnGlobalObject=W,e.transportItemTypeToBodyKey=N,e.unknownString="unknown",e}({});
1
+ var GrafanaFaroCore=function(e){"use strict";function n(e,n){return typeof e===n}function t(e,n){return Object.prototype.toString.call(e)===`[object ${n}]`}function r(e,n){try{return e instanceof n}catch(e){return!1}}const a=e=>n(e,"null"),i=e=>n(e,"string"),o=e=>n(e,"number")&&!isNaN(e)||n(e,"bigint"),s=e=>!a(e)&&n(e,"object"),u=e=>n(e,"function"),l=e=>t(e,"Array"),c="undefined"!=typeof Event,d="undefined"!=typeof Error,g=e=>d&&r(e,Error),p="undefined"!=typeof Element,f="undefined"!=typeof Map;function m(e,t){if(e===t)return!0;if(n(e,"number")&&isNaN(e))return n(t,"number")&&isNaN(t);const r=l(e),a=l(t);if(r!==a)return!1;if(r&&a){const n=e.length;if(n!==t.length)return!1;for(let r=n;0!=r--;)if(!m(e[r],t[r]))return!1;return!0}const i=s(e),o=s(t);if(i!==o)return!1;if(e&&t&&i&&o){const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;for(let r of n)if(!m(e[r],t[r]))return!1;return!0}return!1}function v(){return(new Date).toISOString()}function b(e){return new Date(e).toISOString()}var h;e.LogLevel=void 0,(h=e.LogLevel||(e.LogLevel={})).TRACE="trace",h.DEBUG="debug",h.INFO="info",h.LOG="log",h.WARN="warn",h.ERROR="error";const E=e.LogLevel.LOG,y=[e.LogLevel.TRACE,e.LogLevel.DEBUG,e.LogLevel.INFO,e.LogLevel.LOG,e.LogLevel.WARN,e.LogLevel.ERROR];function I(){}const T="abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789";const O="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof self?self:void 0;class L{constructor(e,n){var t,r;this.signalBuffer=[],this.itemLimit=null!==(t=null==n?void 0:n.itemLimit)&&void 0!==t?t:50,this.sendTimeout=null!==(r=null==n?void 0:n.sendTimeout)&&void 0!==r?r:250,this.paused=(null==n?void 0:n.paused)||!1,this.sendFn=e,this.flushInterval=-1,this.paused||this.start(),document.addEventListener("visibilitychange",(()=>{"hidden"===document.visibilityState&&this.flush()}))}addItem(e){this.paused||(this.signalBuffer.push(e),this.signalBuffer.length>=this.itemLimit&&this.flush())}start(){this.paused=!1,this.sendTimeout>0&&(this.flushInterval=window.setInterval((()=>this.flush()),this.sendTimeout))}pause(){this.paused=!0,clearInterval(this.flushInterval)}groupItems(e){const n=new Map;return e.forEach((e=>{const t=JSON.stringify(e.meta);let r=n.get(t);r=void 0===r?[e]:[...r,e],n.set(t,r)})),Array.from(n.values())}flush(){if(this.paused||0===this.signalBuffer.length)return;this.groupItems(this.signalBuffer).forEach(this.sendFn),this.signalBuffer=[]}}var S;e.TransportItemType=void 0,(S=e.TransportItemType||(e.TransportItemType={})).EXCEPTION="exception",S.LOG="log",S.MEASUREMENT="measurement",S.TRACE="trace",S.EVENT="event";const N={[e.TransportItemType.EXCEPTION]:"exceptions",[e.TransportItemType.LOG]:"logs",[e.TransportItemType.MEASUREMENT]:"measurements",[e.TransportItemType.TRACE]:"traces",[e.TransportItemType.EVENT]:"events"};function x(n){return t=>{if(t.type===e.TransportItemType.EXCEPTION&&t.payload){const e=t.payload,r=`${e.type}: ${e.value}`;if(function(e,n){return e.some((e=>i(e)?n.includes(e):!!n.match(e)))}(n,r))return null}return t}}function R(e,n,t,r){var a;n.debug("Initializing transports");const i=[];let o=t.paused,s=[];const u=e=>{let n=e;for(const e of s){const t=n.map(e).filter(Boolean);if(0===t.length)return[];n=t}return n},l=e=>{const t=u(e);if(0!==t.length)for(const e of i)n.debug(`Transporting item using ${e.name}\n`,t),e.isBatched()&&e.send(t)};let c;(null===(a=t.batching)||void 0===a?void 0:a.enabled)&&(c=new L(l,{sendTimeout:t.batching.sendTimeout,itemLimit:t.batching.itemLimit,paused:o}));return{add:(...a)=>{n.debug("Adding transports"),a.forEach((a=>{n.debug(`Adding "${a.name}" transport`);i.some((e=>e===a))?n.warn(`Transport ${a.name} is already added`):(a.unpatchedConsole=e,a.internalLogger=n,a.config=t,a.metas=r,i.push(a))}))},addBeforeSendHooks:(...e)=>{n.debug("Adding beforeSendHooks\n",s),e.forEach((e=>{e&&s.push(e)}))},addIgnoreErrorsPatterns:(...e)=>{n.debug("Adding ignoreErrorsPatterns\n",e),e.forEach((e=>{e&&s.push(x(e))}))},getBeforeSendHooks:()=>[...s],execute:e=>{var r;o||((null===(r=t.batching)||void 0===r?void 0:r.enabled)&&(null==c||c.addItem(e)),(e=>{var r,a;if((null===(r=t.batching)||void 0===r?void 0:r.enabled)&&i.every((e=>e.isBatched())))return;const[o]=u([e]);if(void 0!==o)for(const e of i)n.debug(`Transporting item using ${e.name}\n`,o),e.isBatched()?(null===(a=t.batching)||void 0===a?void 0:a.enabled)||e.send([o]):e.send(o)})(e))},isPaused:()=>o,pause:()=>{n.debug("Pausing transports"),null==c||c.pause(),o=!0},remove:(...e)=>{n.debug("Removing transports"),e.forEach((e=>{n.debug(`Removing "${e.name}" transport`);const t=i.indexOf(e);-1!==t?i.splice(t,1):n.warn(`Transport "${e.name}" is not added`)}))},removeBeforeSendHooks:(...e)=>{s.filter((n=>!e.includes(n)))},get transports(){return[...i]},unpause:()=>{n.debug("Unpausing transports"),null==c||c.start(),o=!1}}}var j;e.InternalLoggerLevel=void 0,(j=e.InternalLoggerLevel||(e.InternalLoggerLevel={}))[j.OFF=0]="OFF",j[j.ERROR=1]="ERROR",j[j.WARN=2]="WARN",j[j.INFO=3]="INFO",j[j.VERBOSE=4]="VERBOSE";const A={debug:I,error:I,info:I,prefix:"Faro",warn:I},w=e.InternalLoggerLevel.ERROR,C=Object.assign({},console);let k=C;function _(e){var n;return k=null!==(n=e.unpatchedConsole)&&void 0!==n?n:k,k}function P(n=C,t=w){const r=A;return t>e.InternalLoggerLevel.OFF&&(r.error=t>=e.InternalLoggerLevel.ERROR?function(...e){n.error(`${r.prefix}\n`,...e)}:I,r.warn=t>=e.InternalLoggerLevel.WARN?function(...e){n.warn(`${r.prefix}\n`,...e)}:I,r.info=t>=e.InternalLoggerLevel.INFO?function(...e){n.info(`${r.prefix}\n`,...e)}:I,r.debug=t>=e.InternalLoggerLevel.VERBOSE?function(...e){n.debug(`${r.prefix}\n`,...e)}:I),r}let B=A;function F(e,n){return B=P(e,n.internalLoggerLevel),B}class D{constructor(){this.unpatchedConsole=C,this.internalLogger=A,this.config={},this.metas={}}logDebug(...e){this.internalLogger.debug(`${this.name}\n`,...e)}logInfo(...e){this.internalLogger.info(`${this.name}\n`,...e)}logWarn(...e){this.internalLogger.warn(`${this.name}\n`,...e)}logError(...e){this.internalLogger.error(`${this.name}\n`,...e)}}function M(e,n){var t,r;if(void 0===n)return e;if(void 0===e)return{resourceSpans:n};const a=null===(t=e.resourceSpans)||void 0===t?void 0:t[0];if(void 0===a)return e;const i=(null==a?void 0:a.scopeSpans)||[],o=(null===(r=null==n?void 0:n[0])||void 0===r?void 0:r.scopeSpans)||[];return Object.assign(Object.assign({},e),{resourceSpans:[Object.assign(Object.assign({},a),{scopeSpans:[...i,...o]})]})}const $="Error";let G;function V(e){let n=e.cause;return g(n)?n=e.cause.toString():null!==n&&(s(e.cause)||l(e.cause))?n=JSON.stringify(e.cause):null!=n&&(n=e.cause.toString()),null==n?{}:{cause:n}}const z=e=>e.map((e=>{try{return String(e)}catch(e){return""}})).join(" ");function U(n,t,r,i,o){t.debug("Initializing API");const s=function(n,t,r,a,i){let o;return t.debug("Initializing traces API"),{getOTEL:()=>o,getTraceContext:()=>{const e=null==o?void 0:o.trace.getSpanContext(o.context.active());return e?{trace_id:e.traceId,span_id:e.spanId}:void 0},initOTEL:(e,n)=>{t.debug("Initializing OpenTelemetry"),o={trace:e,context:n}},isOTELInitialized:()=>!!o,pushTraces:n=>{try{const r={type:e.TransportItemType.TRACE,payload:n,meta:a.value};t.debug("Pushing trace\n",r),i.execute(r)}catch(e){t.error("Error pushing trace\n",e)}}}}(0,t,0,i,o);return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},s),function(n,t,r,i,o,s){var u;t.debug("Initializing exceptions API");let l=null;G=null!==(u=r.parseStacktrace)&&void 0!==u?u:G;const c=e=>{t.debug("Changing stacktrace parser"),G=null!=e?e:G};return c(r.parseStacktrace),{changeStacktraceParser:c,getStacktraceParser:()=>G,pushError:(n,{skipDedupe:u,stackFrames:c,type:d,context:g,spanContext:p,timestampOverwriteMs:f}={})=>{d=d||n.name||$;const h={meta:i.value,payload:{type:d,value:n.message,timestamp:f?b(f):v(),trace:p?{trace_id:p.traceId,span_id:p.spanId}:s.getTraceContext(),context:Object.assign(Object.assign({},V(n)),null!=g?g:{})},type:e.TransportItemType.EXCEPTION};(null==(c=null!=c?c:n.stack?null==G?void 0:G(n).frames:void 0)?void 0:c.length)&&(h.payload.stacktrace={frames:c});const E={type:h.payload.type,value:h.payload.value,stackTrace:h.payload.stacktrace,context:h.payload.context};u||!r.dedupe||a(l)||!m(E,l)?(l=E,t.debug("Pushing exception\n",h),o.execute(h)):t.debug("Skipping error push because it is the same as the last one\n",h.payload)}}}(0,t,r,i,o,s)),function(e,n,t,r){let a,i,o;n.debug("Initializing meta API");const s=e=>{i&&r.remove(i),i={user:e},r.add(i)},u=e=>{a&&r.remove(a),a={session:e},r.add(a)};return{setUser:s,resetUser:s,setSession:u,resetSession:u,getSession:()=>r.value.session,setView:e=>{var n;if((null===(n=null==o?void 0:o.view)||void 0===n?void 0:n.name)===(null==e?void 0:e.name))return;const t=o;o={view:e},r.add(o),t&&r.remove(t)},getView:()=>r.value.view}}(0,t,0,i)),function(n,t,r,i,o,s){var u;t.debug("Initializing logs API");let l=null;const c=null!==(u=r.logArgsSerializer)&&void 0!==u?u:z;return{pushLog:(n,{context:u,level:d,skipDedupe:g,spanContext:p,timestampOverwriteMs:f}={})=>{try{const h={type:e.TransportItemType.LOG,payload:{message:c(n),level:null!=d?d:E,context:null!=u?u:{},timestamp:f?b(f):v(),trace:p?{trace_id:p.traceId,span_id:p.spanId}:s.getTraceContext()},meta:i.value},y={message:h.payload.message,level:h.payload.level,context:h.payload.context};if(!g&&r.dedupe&&!a(l)&&m(y,l))return void t.debug("Skipping log push because it is the same as the last one\n",h.payload);l=y,t.debug("Pushing log\n",h),o.execute(h)}catch(e){t.error("Error pushing log\n",e)}}}}(0,t,r,i,o,s)),function(n,t,r,i,o,s){t.debug("Initializing measurements API");let u=null;return{pushMeasurement:(n,{skipDedupe:l,context:c,spanContext:d,timestampOverwriteMs:g}={})=>{try{const p={type:e.TransportItemType.MEASUREMENT,payload:Object.assign(Object.assign({},n),{trace:d?{trace_id:d.traceId,span_id:d.spanId}:s.getTraceContext(),timestamp:g?b(g):v(),context:null!=c?c:{}}),meta:i.value},f={type:p.payload.type,values:p.payload.values,context:p.payload.context};if(!l&&r.dedupe&&!a(u)&&m(f,u))return void t.debug("Skipping measurement push because it is the same as the last one\n",p.payload);u=f,t.debug("Pushing measurement\n",p),o.execute(p)}catch(e){t.error("Error pushing measurement\n",e)}}}}(0,t,r,i,o,s)),function(n,t,r,i,o,s){let u=null;return{pushEvent:(n,l,c,{skipDedupe:d,spanContext:g,timestampOverwriteMs:p}={})=>{try{const f={meta:i.value,payload:{name:n,domain:null!=c?c:r.eventDomain,attributes:l,timestamp:p?b(p):v(),trace:g?{trace_id:g.traceId,span_id:g.spanId}:s.getTraceContext()},type:e.TransportItemType.EVENT},h={name:f.payload.name,attributes:f.payload.attributes,domain:f.payload.domain};if(!d&&r.dedupe&&!a(u)&&m(h,u))return void t.debug("Skipping event push because it is the same as the last one\n",f.payload);u=h,t.debug("Pushing event\n",f),o.execute(f)}catch(e){t.error("Error pushing event",e)}}}}(0,t,r,i,o,s))}const K="1.12.1";const H="_faroInternal";function W(e){e.config.isolate?e.internalLogger.debug("Skipping registering internal Faro instance on global object"):(e.internalLogger.debug("Registering internal Faro instance on global object"),Object.defineProperty(O,H,{configurable:!1,enumerable:!1,writable:!1,value:e}))}function X(){return H in O}function J(n,t,r,a,i,o,s){return t.debug("Initializing Faro"),e.faro={api:o,config:r,instrumentations:s,internalLogger:t,metas:a,pause:i.pause,transports:i,unpatchedConsole:n,unpause:i.unpause},W(e.faro),function(e){if(e.config.preventGlobalExposure)e.internalLogger.debug("Skipping registering public Faro instance in the global scope");else{if(e.internalLogger.debug(`Registering public faro reference in the global scope using "${e.config.globalObjectKey}" key`),e.config.globalObjectKey in O)return void e.internalLogger.warn(`Skipping global registration due to key "${e.config.globalObjectKey}" being used already. Please set "globalObjectKey" to something else or set "preventGlobalExposure" to "true"`);Object.defineProperty(O,e.config.globalObjectKey,{configurable:!1,writable:!1,value:e})}}(e.faro),e.faro}e.faro={};return e.BaseExtension=D,e.BaseInstrumentation=class extends D{constructor(){super(...arguments),this.api={},this.transports={}}},e.BaseTransport=class extends D{isBatched(){return!1}getIgnoreUrls(){return[]}},e.Conventions={EventNames:{CLICK:"click",NAVIGATION:"navigation",SESSION_START:"session_start",VIEW_CHANGED:"view_changed"}},e.EVENT_CLICK="click",e.EVENT_NAVIGATION="navigation",e.EVENT_ROUTE_CHANGE="route_change",e.EVENT_SESSION_EXTEND="session_extend",e.EVENT_SESSION_RESUME="session_resume",e.EVENT_SESSION_START="session_start",e.EVENT_VIEW_CHANGED="view_changed",e.VERSION=K,e.allLogLevels=y,e.createInternalLogger=P,e.createPromiseBuffer=function(e){const{size:n,concurrency:t}=e,r=[];let a=0;const i=()=>{if(a<t&&r.length){const{producer:e,resolve:n,reject:t}=r.shift();a++,e().then((e=>{a--,i(),n(e)}),(e=>{a--,i(),t(e)}))}};return{add:e=>{if(r.length+a>=n)throw new Error("Task buffer full");return new Promise(((n,t)=>{r.push({producer:e,resolve:n,reject:t}),i()}))}}},e.dateNow=function(){return Date.now()},e.deepEqual=m,e.defaultBatchingConfig={enabled:!0,sendTimeout:250,itemLimit:50},e.defaultExceptionType=$,e.defaultGlobalObjectKey="faro",e.defaultInternalLoggerLevel=w,e.defaultLogArgsSerializer=z,e.defaultLogLevel=E,e.defaultUnpatchedConsole=C,e.genShortID=function(e=10){return Array.from(Array(e)).map((()=>T[Math.floor(59*Math.random())])).join("")},e.getCurrentTimestamp=v,e.getInternalFaroFromGlobalObject=function(){return O[H]},e.getTransportBody=function(n){let t={meta:{}};return void 0!==n[0]&&(t.meta=n[0].meta),n.forEach((n=>{switch(n.type){case e.TransportItemType.LOG:case e.TransportItemType.EVENT:case e.TransportItemType.EXCEPTION:case e.TransportItemType.MEASUREMENT:const r=N[n.type],a=t[r];t=Object.assign(Object.assign({},t),{[r]:void 0===a?[n.payload]:[...a,n.payload]});break;case e.TransportItemType.TRACE:t=Object.assign(Object.assign({},t),{traces:M(t.traces,n.payload.resourceSpans)})}})),t},e.globalObject=O,e.initializeFaro=function(e){const n=_(e),t=F(n,e);if(X()&&!e.isolate)return void t.error('Faro is already registered. Either add instrumentations, transports etc. to the global faro instance or use the "isolate" property');t.debug("Initializing");const r=function(e,n){let t=[],r=[];const a=()=>t.reduce(((e,n)=>Object.assign(e,u(n)?n():n)),{}),i=()=>{if(r.length){const e=a();r.forEach((n=>n(e)))}};return{add:(...e)=>{n.debug("Adding metas\n",e),t.push(...e),i()},remove:(...e)=>{n.debug("Removing metas\n",e),t=t.filter((n=>!e.includes(n))),i()},addListener:e=>{n.debug("Adding metas listener\n",e),r.push(e)},removeListener:e=>{n.debug("Removing metas listener\n",e),r=r.filter((n=>n!==e))},get value(){return a()}}}(0,t),a=R(n,t,e,r),i=U(0,t,e,r,a),o=function(e,n,t,r,a,i){n.debug("Initializing instrumentations");const o=[];return{add:(...s)=>{n.debug("Adding instrumentations"),s.forEach((s=>{n.debug(`Adding "${s.name}" instrumentation`),o.some((e=>e.name===s.name))?n.warn(`Instrumentation ${s.name} is already added`):(s.unpatchedConsole=e,s.internalLogger=n,s.config=t,s.metas=r,s.transports=a,s.api=i,o.push(s),s.initialize())}))},get instrumentations(){return[...o]},remove:(...e)=>{n.debug("Removing instrumentations"),e.forEach((e=>{var t,r;n.debug(`Removing "${e.name}" instrumentation`);const a=o.reduce(((n,t,r)=>null===n&&t.name===e.name?r:null),null);a?(null===(r=(t=o[a]).destroy)||void 0===r||r.call(t),o.splice(a,1)):n.warn(`Instrumentation "${e.name}" is not added`)}))}}}(n,t,e,r,a,i),s=J(n,t,e,r,a,i,o);return function(e){var n,t;const r={sdk:{version:K},app:{bundleId:e.config.app.name&&(a=e.config.app.name,null==O?void 0:O[`__faroBundleId_${a}`])}};var a;const i=null===(n=e.config.sessionTracking)||void 0===n?void 0:n.session;i&&e.api.setSession(i),e.config.app&&(r.app=Object.assign(Object.assign({},e.config.app),r.app)),e.config.user&&(r.user=e.config.user),e.config.view&&(r.view=e.config.view),e.metas.add(r,...null!==(t=e.config.metas)&&void 0!==t?t:[])}(s),function(e){e.transports.add(...e.config.transports),e.transports.addBeforeSendHooks(e.config.beforeSend),e.transports.addIgnoreErrorsPatterns(e.config.ignoreErrors)}(s),function(e){e.instrumentations.add(...e.config.instrumentations)}(s),s},e.internalGlobalObjectKey=H,e.isArray=l,e.isBoolean=e=>n(e,"boolean"),e.isDomError=e=>t(e,"DOMError"),e.isDomException=e=>t(e,"DOMException"),e.isElement=e=>p&&r(e,Element),e.isElementDefined=p,e.isError=g,e.isErrorDefined=d,e.isErrorEvent=e=>t(e,"ErrorEvent"),e.isEvent=e=>c&&r(e,Event),e.isEventDefined=c,e.isFunction=u,e.isInstanceOf=r,e.isInt=e=>o(e)&&Number.isInteger(e),e.isInternalFaroOnGlobalObject=X,e.isMap=e=>f&&r(e,Map),e.isMapDefined=f,e.isNull=a,e.isNumber=o,e.isObject=s,e.isPrimitive=e=>!s(e)&&!u(e),e.isRegExp=e=>t(e,"RegExp"),e.isString=i,e.isSymbol=e=>n(e,"symbol"),e.isSyntheticEvent=e=>s(e)&&"nativeEvent"in e&&"preventDefault"in e&&"stopPropagation"in e,e.isThenable=e=>u(null==e?void 0:e.then),e.isToString=t,e.isTypeof=n,e.isUndefined=e=>n(e,"undefined"),e.noop=I,e.setInternalFaroOnGlobalObject=W,e.transportItemTypeToBodyKey=N,e.unknownString="unknown",e}({});
@@ -4,42 +4,154 @@ import type { InternalLoggerLevel } from '../internalLogger';
4
4
  import type { Meta, MetaApp, MetaItem, MetaSession, MetaUser, MetaView } from '../metas';
5
5
  import type { BatchExecutorOptions, BeforeSendHook, Transport } from '../transports';
6
6
  import type { UnpatchedConsole } from '../unpatchedConsole';
7
+ import type { LogLevel } from '../utils';
7
8
  type SamplingContext = {
8
9
  metas: Meta;
9
10
  };
10
11
  export interface Config<P = APIEvent> {
12
+ /**
13
+ * Application metadata
14
+ */
11
15
  app: MetaApp;
16
+ /**
17
+ * Set max number and max interval for signals to be batched before sending
18
+ */
12
19
  batching?: BatchExecutorOptions;
20
+ /**
21
+ * A flag for toggling deduplication for signals
22
+ */
13
23
  dedupe: boolean;
24
+ /**
25
+ * The key (name) to use for the global Faro object (default: 'faro')
26
+ */
14
27
  globalObjectKey: string;
28
+ /**
29
+ * The (custom) instrumentations to use with Faro
30
+ */
15
31
  instrumentations: Instrumentation[];
32
+ /**
33
+ * The level of information printed to console for internal messages (default: LogLevel.ERROR)
34
+ */
16
35
  internalLoggerLevel: InternalLoggerLevel;
36
+ /**
37
+ * Isolate Faro instance from other Faro instances on the same page. (default: false)
38
+ */
17
39
  isolate: boolean;
40
+ /**
41
+ * Custom function to serialize log arguments
42
+ */
18
43
  logArgsSerializer?: LogArgsSerializer;
44
+ /**
45
+ * Add custom Metas during Faro initialization
46
+ */
19
47
  metas: MetaItem[];
48
+ /**
49
+ * Custom function used to parse stack traces
50
+ */
20
51
  parseStacktrace: StacktraceParser;
52
+ /**
53
+ * Pause sending data (default: false)
54
+ */
21
55
  paused: boolean;
56
+ /**
57
+ * Prevent Faro from exposing itself to the global object (default: false)
58
+ */
22
59
  preventGlobalExposure: boolean;
60
+ /**
61
+ * The transports to use for sending beacons
62
+ */
23
63
  transports: Transport[];
64
+ /**
65
+ * Some instrumentations might override the default console methods but Faro instance provides a
66
+ * way to access the unmodified console methods.
67
+ *
68
+ * faro.unpatchedConsole.log('This is a log');
69
+ * faro.unpatchedConsole.warn('This is a warning');
70
+ */
24
71
  unpatchedConsole: UnpatchedConsole;
72
+ /**
73
+ * Function which invoked before pushing event to transport. Can be used to modify or filter events
74
+ */
25
75
  beforeSend?: BeforeSendHook<P>;
76
+ /**
77
+ * Error message patterns for errors that should be ignored
78
+ */
26
79
  ignoreErrors?: Patterns;
80
+ /**
81
+ * Path patterns for Endpoints that should be ignored form being tracked
82
+ */
27
83
  ignoreUrls?: Patterns;
84
+ /**
85
+ * Configuration for the built in session tracker
86
+ */
28
87
  sessionTracking?: {
88
+ /**
89
+ * Enable session tracking (default: true)
90
+ */
29
91
  enabled?: boolean;
92
+ /**
93
+ * Wether to use sticky sessions (default: false)
94
+ */
30
95
  persistent?: boolean;
96
+ /**
97
+ * Session metadata object to be used when initializing session tracking
98
+ */
31
99
  session?: MetaSession;
100
+ /**
101
+ * How long is a sticky session valid for recurring users (default: 15 minutes)
102
+ */
32
103
  maxSessionPersistenceTime?: number;
104
+ /**
105
+ * Called each time a session changes. This can be when a new session is created or when an existing session is updated.
106
+ * @param oldSession
107
+ * @param newSession
108
+ */
33
109
  onSessionChange?: (oldSession: MetaSession | null, newSession: MetaSession) => void;
110
+ /**
111
+ * Then sampling rate for the session based sampler (default: 1). If a session is not part of a sample, no signals for this session are tracked.
112
+ */
34
113
  samplingRate?: number;
114
+ /**
115
+ * Custom sampler function if custom sampling logic is needed.
116
+ * @param context
117
+ */
35
118
  sampler?: (context: SamplingContext) => number;
119
+ /**
120
+ * Custom function to generate session id. If available Faro uses this function instead of the internal one.
121
+ */
36
122
  generateSessionId?: () => string;
37
123
  };
124
+ /**
125
+ * Meta object for user data
126
+ */
38
127
  user?: MetaUser;
128
+ /**
129
+ * Meta object for view data
130
+ */
39
131
  view?: MetaView;
40
132
  eventDomain?: string;
133
+ /**
134
+ * Only resource timings for fetch and xhr requests are tracked by default. Set this to true to track all resources (default: false).
135
+ */
41
136
  trackResources?: boolean;
137
+ /**
138
+ * Track web vitals attribution data (default: false)
139
+ */
42
140
  trackWebVitalsAttribution?: boolean;
141
+ /**
142
+ * Configuration for the console instrumentation
143
+ */
144
+ consoleInstrumentation?: {
145
+ /**
146
+ * Configure what console levels should be captured by Faro. By default the follwoing levels
147
+ * are disabled: console.debug, console.trace, console.log
148
+ *
149
+ * If you want to collect all levels set captureConsoleDisabledLevels: [];
150
+ * If you want to disable only some levels set captureConsoleDisabledLevels: [LogLevel.DEBUG, LogLevel.TRACE];
151
+ */
152
+ disabledLevels?: LogLevel[];
153
+ consoleErrorAsLog?: boolean;
154
+ };
43
155
  }
44
156
  export type Patterns = Array<string | RegExp>;
45
157
  export {};
@@ -4,7 +4,7 @@ import type { Transport, TransportItem } from '../transports';
4
4
  export declare class MockTransport extends BaseTransport implements Transport {
5
5
  private ignoreURLs;
6
6
  readonly name = "@grafana/transport-mock";
7
- readonly version = "1.11.0";
7
+ readonly version = "1.12.1";
8
8
  items: TransportItem[];
9
9
  constructor(ignoreURLs?: Patterns);
10
10
  send(items: TransportItem[]): void | Promise<void>;
@@ -1 +1 @@
1
- export declare const VERSION = "1.11.0";
1
+ export declare const VERSION = "1.12.1";
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { APIEvent, LogArgsSerializer, StacktraceParser } from '../api';\nimport type { Instrumentation } from '../instrumentations';\nimport type { InternalLoggerLevel } from '../internalLogger';\nimport type { Meta, MetaApp, MetaItem, MetaSession, MetaUser, MetaView } from '../metas';\nimport type { BatchExecutorOptions, BeforeSendHook, Transport } from '../transports';\nimport type { UnpatchedConsole } from '../unpatchedConsole';\n\ntype SamplingContext = {\n metas: Meta;\n};\n\nexport interface Config<P = APIEvent> {\n app: MetaApp;\n batching?: BatchExecutorOptions;\n dedupe: boolean;\n globalObjectKey: string;\n instrumentations: Instrumentation[];\n internalLoggerLevel: InternalLoggerLevel;\n isolate: boolean;\n logArgsSerializer?: LogArgsSerializer;\n metas: MetaItem[];\n parseStacktrace: StacktraceParser;\n paused: boolean;\n preventGlobalExposure: boolean;\n transports: Transport[];\n unpatchedConsole: UnpatchedConsole;\n\n beforeSend?: BeforeSendHook<P>;\n ignoreErrors?: Patterns;\n ignoreUrls?: Patterns;\n sessionTracking?: {\n enabled?: boolean;\n persistent?: boolean;\n session?: MetaSession;\n maxSessionPersistenceTime?: number;\n onSessionChange?: (oldSession: MetaSession | null, newSession: MetaSession) => void;\n samplingRate?: number;\n sampler?: (context: SamplingContext) => number;\n generateSessionId?: () => string;\n };\n\n user?: MetaUser;\n view?: MetaView;\n eventDomain?: string;\n\n trackResources?: boolean;\n trackWebVitalsAttribution?: boolean;\n}\n\nexport type Patterns = Array<string | RegExp>;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { APIEvent, LogArgsSerializer, StacktraceParser } from '../api';\nimport type { Instrumentation } from '../instrumentations';\nimport type { InternalLoggerLevel } from '../internalLogger';\nimport type { Meta, MetaApp, MetaItem, MetaSession, MetaUser, MetaView } from '../metas';\nimport type { BatchExecutorOptions, BeforeSendHook, Transport } from '../transports';\nimport type { UnpatchedConsole } from '../unpatchedConsole';\nimport type { LogLevel } from '../utils';\n\ntype SamplingContext = {\n metas: Meta;\n};\n\nexport interface Config<P = APIEvent> {\n /**\n * Application metadata\n */\n app: MetaApp;\n\n /**\n * Set max number and max interval for signals to be batched before sending\n */\n batching?: BatchExecutorOptions;\n\n /**\n * A flag for toggling deduplication for signals\n */\n dedupe: boolean;\n\n /**\n * The key (name) to use for the global Faro object (default: 'faro')\n */\n globalObjectKey: string;\n\n /**\n * The (custom) instrumentations to use with Faro\n */\n instrumentations: Instrumentation[];\n\n /**\n * The level of information printed to console for internal messages (default: LogLevel.ERROR)\n */\n internalLoggerLevel: InternalLoggerLevel;\n\n /**\n * Isolate Faro instance from other Faro instances on the same page. (default: false)\n */\n isolate: boolean;\n\n /**\n * Custom function to serialize log arguments\n */\n logArgsSerializer?: LogArgsSerializer;\n\n /**\n * Add custom Metas during Faro initialization\n */\n metas: MetaItem[];\n\n /**\n * Custom function used to parse stack traces\n */\n parseStacktrace: StacktraceParser;\n\n /**\n * Pause sending data (default: false)\n */\n paused: boolean;\n\n /**\n * Prevent Faro from exposing itself to the global object (default: false)\n */\n preventGlobalExposure: boolean;\n\n /**\n * The transports to use for sending beacons\n */\n transports: Transport[];\n\n /**\n * Some instrumentations might override the default console methods but Faro instance provides a\n * way to access the unmodified console methods.\n *\n * faro.unpatchedConsole.log('This is a log');\n * faro.unpatchedConsole.warn('This is a warning');\n */\n unpatchedConsole: UnpatchedConsole;\n\n /**\n * Function which invoked before pushing event to transport. Can be used to modify or filter events\n */\n beforeSend?: BeforeSendHook<P>;\n\n /**\n * Error message patterns for errors that should be ignored\n */\n ignoreErrors?: Patterns;\n\n /**\n * Path patterns for Endpoints that should be ignored form being tracked\n */\n ignoreUrls?: Patterns;\n\n /**\n * Configuration for the built in session tracker\n */\n sessionTracking?: {\n /**\n * Enable session tracking (default: true)\n */\n enabled?: boolean;\n /**\n * Wether to use sticky sessions (default: false)\n */\n persistent?: boolean;\n /**\n * Session metadata object to be used when initializing session tracking\n */\n session?: MetaSession;\n /**\n * How long is a sticky session valid for recurring users (default: 15 minutes)\n */\n maxSessionPersistenceTime?: number;\n /**\n * Called each time a session changes. This can be when a new session is created or when an existing session is updated.\n * @param oldSession\n * @param newSession\n */\n onSessionChange?: (oldSession: MetaSession | null, newSession: MetaSession) => void;\n /**\n * Then sampling rate for the session based sampler (default: 1). If a session is not part of a sample, no signals for this session are tracked.\n */\n samplingRate?: number;\n /**\n * Custom sampler function if custom sampling logic is needed.\n * @param context\n */\n sampler?: (context: SamplingContext) => number;\n /**\n * Custom function to generate session id. If available Faro uses this function instead of the internal one.\n */\n generateSessionId?: () => string;\n };\n\n /**\n * Meta object for user data\n */\n user?: MetaUser;\n\n /**\n * Meta object for view data\n */\n view?: MetaView;\n\n eventDomain?: string;\n\n /**\n * Only resource timings for fetch and xhr requests are tracked by default. Set this to true to track all resources (default: false).\n */\n trackResources?: boolean;\n\n /**\n * Track web vitals attribution data (default: false)\n */\n trackWebVitalsAttribution?: boolean;\n\n /**\n * Configuration for the console instrumentation\n */\n consoleInstrumentation?: {\n /**\n * Configure what console levels should be captured by Faro. By default the follwoing levels\n * are disabled: console.debug, console.trace, console.log\n *\n * If you want to collect all levels set captureConsoleDisabledLevels: [];\n * If you want to disable only some levels set captureConsoleDisabledLevels: [LogLevel.DEBUG, LogLevel.TRACE];\n */\n disabledLevels?: LogLevel[];\n /*\n * By default, Faro sends an error for console.error calls. If you want to send a log instead, set this to true.\n */\n consoleErrorAsLog?: boolean;\n };\n}\n\nexport type Patterns = Array<string | RegExp>;\n"]}
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  // auto-generated by bin/genVersion.ts
5
- exports.VERSION = '1.11.0';
5
+ exports.VERSION = '1.12.1';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAA,sCAAsC;AACzB,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["// auto-generated by bin/genVersion.ts\nexport const VERSION = '1.11.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAA,sCAAsC;AACzB,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["// auto-generated by bin/genVersion.ts\nexport const VERSION = '1.12.1';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { APIEvent, LogArgsSerializer, StacktraceParser } from '../api';\nimport type { Instrumentation } from '../instrumentations';\nimport type { InternalLoggerLevel } from '../internalLogger';\nimport type { Meta, MetaApp, MetaItem, MetaSession, MetaUser, MetaView } from '../metas';\nimport type { BatchExecutorOptions, BeforeSendHook, Transport } from '../transports';\nimport type { UnpatchedConsole } from '../unpatchedConsole';\n\ntype SamplingContext = {\n metas: Meta;\n};\n\nexport interface Config<P = APIEvent> {\n app: MetaApp;\n batching?: BatchExecutorOptions;\n dedupe: boolean;\n globalObjectKey: string;\n instrumentations: Instrumentation[];\n internalLoggerLevel: InternalLoggerLevel;\n isolate: boolean;\n logArgsSerializer?: LogArgsSerializer;\n metas: MetaItem[];\n parseStacktrace: StacktraceParser;\n paused: boolean;\n preventGlobalExposure: boolean;\n transports: Transport[];\n unpatchedConsole: UnpatchedConsole;\n\n beforeSend?: BeforeSendHook<P>;\n ignoreErrors?: Patterns;\n ignoreUrls?: Patterns;\n sessionTracking?: {\n enabled?: boolean;\n persistent?: boolean;\n session?: MetaSession;\n maxSessionPersistenceTime?: number;\n onSessionChange?: (oldSession: MetaSession | null, newSession: MetaSession) => void;\n samplingRate?: number;\n sampler?: (context: SamplingContext) => number;\n generateSessionId?: () => string;\n };\n\n user?: MetaUser;\n view?: MetaView;\n eventDomain?: string;\n\n trackResources?: boolean;\n trackWebVitalsAttribution?: boolean;\n}\n\nexport type Patterns = Array<string | RegExp>;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { APIEvent, LogArgsSerializer, StacktraceParser } from '../api';\nimport type { Instrumentation } from '../instrumentations';\nimport type { InternalLoggerLevel } from '../internalLogger';\nimport type { Meta, MetaApp, MetaItem, MetaSession, MetaUser, MetaView } from '../metas';\nimport type { BatchExecutorOptions, BeforeSendHook, Transport } from '../transports';\nimport type { UnpatchedConsole } from '../unpatchedConsole';\nimport type { LogLevel } from '../utils';\n\ntype SamplingContext = {\n metas: Meta;\n};\n\nexport interface Config<P = APIEvent> {\n /**\n * Application metadata\n */\n app: MetaApp;\n\n /**\n * Set max number and max interval for signals to be batched before sending\n */\n batching?: BatchExecutorOptions;\n\n /**\n * A flag for toggling deduplication for signals\n */\n dedupe: boolean;\n\n /**\n * The key (name) to use for the global Faro object (default: 'faro')\n */\n globalObjectKey: string;\n\n /**\n * The (custom) instrumentations to use with Faro\n */\n instrumentations: Instrumentation[];\n\n /**\n * The level of information printed to console for internal messages (default: LogLevel.ERROR)\n */\n internalLoggerLevel: InternalLoggerLevel;\n\n /**\n * Isolate Faro instance from other Faro instances on the same page. (default: false)\n */\n isolate: boolean;\n\n /**\n * Custom function to serialize log arguments\n */\n logArgsSerializer?: LogArgsSerializer;\n\n /**\n * Add custom Metas during Faro initialization\n */\n metas: MetaItem[];\n\n /**\n * Custom function used to parse stack traces\n */\n parseStacktrace: StacktraceParser;\n\n /**\n * Pause sending data (default: false)\n */\n paused: boolean;\n\n /**\n * Prevent Faro from exposing itself to the global object (default: false)\n */\n preventGlobalExposure: boolean;\n\n /**\n * The transports to use for sending beacons\n */\n transports: Transport[];\n\n /**\n * Some instrumentations might override the default console methods but Faro instance provides a\n * way to access the unmodified console methods.\n *\n * faro.unpatchedConsole.log('This is a log');\n * faro.unpatchedConsole.warn('This is a warning');\n */\n unpatchedConsole: UnpatchedConsole;\n\n /**\n * Function which invoked before pushing event to transport. Can be used to modify or filter events\n */\n beforeSend?: BeforeSendHook<P>;\n\n /**\n * Error message patterns for errors that should be ignored\n */\n ignoreErrors?: Patterns;\n\n /**\n * Path patterns for Endpoints that should be ignored form being tracked\n */\n ignoreUrls?: Patterns;\n\n /**\n * Configuration for the built in session tracker\n */\n sessionTracking?: {\n /**\n * Enable session tracking (default: true)\n */\n enabled?: boolean;\n /**\n * Wether to use sticky sessions (default: false)\n */\n persistent?: boolean;\n /**\n * Session metadata object to be used when initializing session tracking\n */\n session?: MetaSession;\n /**\n * How long is a sticky session valid for recurring users (default: 15 minutes)\n */\n maxSessionPersistenceTime?: number;\n /**\n * Called each time a session changes. This can be when a new session is created or when an existing session is updated.\n * @param oldSession\n * @param newSession\n */\n onSessionChange?: (oldSession: MetaSession | null, newSession: MetaSession) => void;\n /**\n * Then sampling rate for the session based sampler (default: 1). If a session is not part of a sample, no signals for this session are tracked.\n */\n samplingRate?: number;\n /**\n * Custom sampler function if custom sampling logic is needed.\n * @param context\n */\n sampler?: (context: SamplingContext) => number;\n /**\n * Custom function to generate session id. If available Faro uses this function instead of the internal one.\n */\n generateSessionId?: () => string;\n };\n\n /**\n * Meta object for user data\n */\n user?: MetaUser;\n\n /**\n * Meta object for view data\n */\n view?: MetaView;\n\n eventDomain?: string;\n\n /**\n * Only resource timings for fetch and xhr requests are tracked by default. Set this to true to track all resources (default: false).\n */\n trackResources?: boolean;\n\n /**\n * Track web vitals attribution data (default: false)\n */\n trackWebVitalsAttribution?: boolean;\n\n /**\n * Configuration for the console instrumentation\n */\n consoleInstrumentation?: {\n /**\n * Configure what console levels should be captured by Faro. By default the follwoing levels\n * are disabled: console.debug, console.trace, console.log\n *\n * If you want to collect all levels set captureConsoleDisabledLevels: [];\n * If you want to disable only some levels set captureConsoleDisabledLevels: [LogLevel.DEBUG, LogLevel.TRACE];\n */\n disabledLevels?: LogLevel[];\n /*\n * By default, Faro sends an error for console.error calls. If you want to send a log instead, set this to true.\n */\n consoleErrorAsLog?: boolean;\n };\n}\n\nexport type Patterns = Array<string | RegExp>;\n"]}
@@ -1,3 +1,3 @@
1
1
  // auto-generated by bin/genVersion.ts
2
- export const VERSION = '1.11.0';
2
+ export const VERSION = '1.12.1';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["// auto-generated by bin/genVersion.ts\nexport const VERSION = '1.11.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["// auto-generated by bin/genVersion.ts\nexport const VERSION = '1.12.1';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/config/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { APIEvent, LogArgsSerializer, StacktraceParser } from '../api';\nimport type { Instrumentation } from '../instrumentations';\nimport type { InternalLoggerLevel } from '../internalLogger';\nimport type { Meta, MetaApp, MetaItem, MetaSession, MetaUser, MetaView } from '../metas';\nimport type { BatchExecutorOptions, BeforeSendHook, Transport } from '../transports';\nimport type { UnpatchedConsole } from '../unpatchedConsole';\n\ntype SamplingContext = {\n metas: Meta;\n};\n\nexport interface Config<P = APIEvent> {\n app: MetaApp;\n batching?: BatchExecutorOptions;\n dedupe: boolean;\n globalObjectKey: string;\n instrumentations: Instrumentation[];\n internalLoggerLevel: InternalLoggerLevel;\n isolate: boolean;\n logArgsSerializer?: LogArgsSerializer;\n metas: MetaItem[];\n parseStacktrace: StacktraceParser;\n paused: boolean;\n preventGlobalExposure: boolean;\n transports: Transport[];\n unpatchedConsole: UnpatchedConsole;\n\n beforeSend?: BeforeSendHook<P>;\n ignoreErrors?: Patterns;\n ignoreUrls?: Patterns;\n sessionTracking?: {\n enabled?: boolean;\n persistent?: boolean;\n session?: MetaSession;\n maxSessionPersistenceTime?: number;\n onSessionChange?: (oldSession: MetaSession | null, newSession: MetaSession) => void;\n samplingRate?: number;\n sampler?: (context: SamplingContext) => number;\n generateSessionId?: () => string;\n };\n\n user?: MetaUser;\n view?: MetaView;\n eventDomain?: string;\n\n trackResources?: boolean;\n trackWebVitalsAttribution?: boolean;\n}\n\nexport type Patterns = Array<string | RegExp>;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/config/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { APIEvent, LogArgsSerializer, StacktraceParser } from '../api';\nimport type { Instrumentation } from '../instrumentations';\nimport type { InternalLoggerLevel } from '../internalLogger';\nimport type { Meta, MetaApp, MetaItem, MetaSession, MetaUser, MetaView } from '../metas';\nimport type { BatchExecutorOptions, BeforeSendHook, Transport } from '../transports';\nimport type { UnpatchedConsole } from '../unpatchedConsole';\nimport type { LogLevel } from '../utils';\n\ntype SamplingContext = {\n metas: Meta;\n};\n\nexport interface Config<P = APIEvent> {\n /**\n * Application metadata\n */\n app: MetaApp;\n\n /**\n * Set max number and max interval for signals to be batched before sending\n */\n batching?: BatchExecutorOptions;\n\n /**\n * A flag for toggling deduplication for signals\n */\n dedupe: boolean;\n\n /**\n * The key (name) to use for the global Faro object (default: 'faro')\n */\n globalObjectKey: string;\n\n /**\n * The (custom) instrumentations to use with Faro\n */\n instrumentations: Instrumentation[];\n\n /**\n * The level of information printed to console for internal messages (default: LogLevel.ERROR)\n */\n internalLoggerLevel: InternalLoggerLevel;\n\n /**\n * Isolate Faro instance from other Faro instances on the same page. (default: false)\n */\n isolate: boolean;\n\n /**\n * Custom function to serialize log arguments\n */\n logArgsSerializer?: LogArgsSerializer;\n\n /**\n * Add custom Metas during Faro initialization\n */\n metas: MetaItem[];\n\n /**\n * Custom function used to parse stack traces\n */\n parseStacktrace: StacktraceParser;\n\n /**\n * Pause sending data (default: false)\n */\n paused: boolean;\n\n /**\n * Prevent Faro from exposing itself to the global object (default: false)\n */\n preventGlobalExposure: boolean;\n\n /**\n * The transports to use for sending beacons\n */\n transports: Transport[];\n\n /**\n * Some instrumentations might override the default console methods but Faro instance provides a\n * way to access the unmodified console methods.\n *\n * faro.unpatchedConsole.log('This is a log');\n * faro.unpatchedConsole.warn('This is a warning');\n */\n unpatchedConsole: UnpatchedConsole;\n\n /**\n * Function which invoked before pushing event to transport. Can be used to modify or filter events\n */\n beforeSend?: BeforeSendHook<P>;\n\n /**\n * Error message patterns for errors that should be ignored\n */\n ignoreErrors?: Patterns;\n\n /**\n * Path patterns for Endpoints that should be ignored form being tracked\n */\n ignoreUrls?: Patterns;\n\n /**\n * Configuration for the built in session tracker\n */\n sessionTracking?: {\n /**\n * Enable session tracking (default: true)\n */\n enabled?: boolean;\n /**\n * Wether to use sticky sessions (default: false)\n */\n persistent?: boolean;\n /**\n * Session metadata object to be used when initializing session tracking\n */\n session?: MetaSession;\n /**\n * How long is a sticky session valid for recurring users (default: 15 minutes)\n */\n maxSessionPersistenceTime?: number;\n /**\n * Called each time a session changes. This can be when a new session is created or when an existing session is updated.\n * @param oldSession\n * @param newSession\n */\n onSessionChange?: (oldSession: MetaSession | null, newSession: MetaSession) => void;\n /**\n * Then sampling rate for the session based sampler (default: 1). If a session is not part of a sample, no signals for this session are tracked.\n */\n samplingRate?: number;\n /**\n * Custom sampler function if custom sampling logic is needed.\n * @param context\n */\n sampler?: (context: SamplingContext) => number;\n /**\n * Custom function to generate session id. If available Faro uses this function instead of the internal one.\n */\n generateSessionId?: () => string;\n };\n\n /**\n * Meta object for user data\n */\n user?: MetaUser;\n\n /**\n * Meta object for view data\n */\n view?: MetaView;\n\n eventDomain?: string;\n\n /**\n * Only resource timings for fetch and xhr requests are tracked by default. Set this to true to track all resources (default: false).\n */\n trackResources?: boolean;\n\n /**\n * Track web vitals attribution data (default: false)\n */\n trackWebVitalsAttribution?: boolean;\n\n /**\n * Configuration for the console instrumentation\n */\n consoleInstrumentation?: {\n /**\n * Configure what console levels should be captured by Faro. By default the follwoing levels\n * are disabled: console.debug, console.trace, console.log\n *\n * If you want to collect all levels set captureConsoleDisabledLevels: [];\n * If you want to disable only some levels set captureConsoleDisabledLevels: [LogLevel.DEBUG, LogLevel.TRACE];\n */\n disabledLevels?: LogLevel[];\n /*\n * By default, Faro sends an error for console.error calls. If you want to send a log instead, set this to true.\n */\n consoleErrorAsLog?: boolean;\n };\n}\n\nexport type Patterns = Array<string | RegExp>;\n"]}
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  // auto-generated by bin/genVersion.ts
5
- exports.VERSION = '1.11.0';
5
+ exports.VERSION = '1.12.1';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../../src/version.ts"],"names":[],"mappings":";;;AAAA,sCAAsC;AACzB,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["// auto-generated by bin/genVersion.ts\nexport const VERSION = '1.11.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../../src/version.ts"],"names":[],"mappings":";;;AAAA,sCAAsC;AACzB,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["// auto-generated by bin/genVersion.ts\nexport const VERSION = '1.12.1';\n"]}
@@ -4,42 +4,154 @@ import type { InternalLoggerLevel } from '../internalLogger';
4
4
  import type { Meta, MetaApp, MetaItem, MetaSession, MetaUser, MetaView } from '../metas';
5
5
  import type { BatchExecutorOptions, BeforeSendHook, Transport } from '../transports';
6
6
  import type { UnpatchedConsole } from '../unpatchedConsole';
7
+ import type { LogLevel } from '../utils';
7
8
  type SamplingContext = {
8
9
  metas: Meta;
9
10
  };
10
11
  export interface Config<P = APIEvent> {
12
+ /**
13
+ * Application metadata
14
+ */
11
15
  app: MetaApp;
16
+ /**
17
+ * Set max number and max interval for signals to be batched before sending
18
+ */
12
19
  batching?: BatchExecutorOptions;
20
+ /**
21
+ * A flag for toggling deduplication for signals
22
+ */
13
23
  dedupe: boolean;
24
+ /**
25
+ * The key (name) to use for the global Faro object (default: 'faro')
26
+ */
14
27
  globalObjectKey: string;
28
+ /**
29
+ * The (custom) instrumentations to use with Faro
30
+ */
15
31
  instrumentations: Instrumentation[];
32
+ /**
33
+ * The level of information printed to console for internal messages (default: LogLevel.ERROR)
34
+ */
16
35
  internalLoggerLevel: InternalLoggerLevel;
36
+ /**
37
+ * Isolate Faro instance from other Faro instances on the same page. (default: false)
38
+ */
17
39
  isolate: boolean;
40
+ /**
41
+ * Custom function to serialize log arguments
42
+ */
18
43
  logArgsSerializer?: LogArgsSerializer;
44
+ /**
45
+ * Add custom Metas during Faro initialization
46
+ */
19
47
  metas: MetaItem[];
48
+ /**
49
+ * Custom function used to parse stack traces
50
+ */
20
51
  parseStacktrace: StacktraceParser;
52
+ /**
53
+ * Pause sending data (default: false)
54
+ */
21
55
  paused: boolean;
56
+ /**
57
+ * Prevent Faro from exposing itself to the global object (default: false)
58
+ */
22
59
  preventGlobalExposure: boolean;
60
+ /**
61
+ * The transports to use for sending beacons
62
+ */
23
63
  transports: Transport[];
64
+ /**
65
+ * Some instrumentations might override the default console methods but Faro instance provides a
66
+ * way to access the unmodified console methods.
67
+ *
68
+ * faro.unpatchedConsole.log('This is a log');
69
+ * faro.unpatchedConsole.warn('This is a warning');
70
+ */
24
71
  unpatchedConsole: UnpatchedConsole;
72
+ /**
73
+ * Function which invoked before pushing event to transport. Can be used to modify or filter events
74
+ */
25
75
  beforeSend?: BeforeSendHook<P>;
76
+ /**
77
+ * Error message patterns for errors that should be ignored
78
+ */
26
79
  ignoreErrors?: Patterns;
80
+ /**
81
+ * Path patterns for Endpoints that should be ignored form being tracked
82
+ */
27
83
  ignoreUrls?: Patterns;
84
+ /**
85
+ * Configuration for the built in session tracker
86
+ */
28
87
  sessionTracking?: {
88
+ /**
89
+ * Enable session tracking (default: true)
90
+ */
29
91
  enabled?: boolean;
92
+ /**
93
+ * Wether to use sticky sessions (default: false)
94
+ */
30
95
  persistent?: boolean;
96
+ /**
97
+ * Session metadata object to be used when initializing session tracking
98
+ */
31
99
  session?: MetaSession;
100
+ /**
101
+ * How long is a sticky session valid for recurring users (default: 15 minutes)
102
+ */
32
103
  maxSessionPersistenceTime?: number;
104
+ /**
105
+ * Called each time a session changes. This can be when a new session is created or when an existing session is updated.
106
+ * @param oldSession
107
+ * @param newSession
108
+ */
33
109
  onSessionChange?: (oldSession: MetaSession | null, newSession: MetaSession) => void;
110
+ /**
111
+ * Then sampling rate for the session based sampler (default: 1). If a session is not part of a sample, no signals for this session are tracked.
112
+ */
34
113
  samplingRate?: number;
114
+ /**
115
+ * Custom sampler function if custom sampling logic is needed.
116
+ * @param context
117
+ */
35
118
  sampler?: (context: SamplingContext) => number;
119
+ /**
120
+ * Custom function to generate session id. If available Faro uses this function instead of the internal one.
121
+ */
36
122
  generateSessionId?: () => string;
37
123
  };
124
+ /**
125
+ * Meta object for user data
126
+ */
38
127
  user?: MetaUser;
128
+ /**
129
+ * Meta object for view data
130
+ */
39
131
  view?: MetaView;
40
132
  eventDomain?: string;
133
+ /**
134
+ * Only resource timings for fetch and xhr requests are tracked by default. Set this to true to track all resources (default: false).
135
+ */
41
136
  trackResources?: boolean;
137
+ /**
138
+ * Track web vitals attribution data (default: false)
139
+ */
42
140
  trackWebVitalsAttribution?: boolean;
141
+ /**
142
+ * Configuration for the console instrumentation
143
+ */
144
+ consoleInstrumentation?: {
145
+ /**
146
+ * Configure what console levels should be captured by Faro. By default the follwoing levels
147
+ * are disabled: console.debug, console.trace, console.log
148
+ *
149
+ * If you want to collect all levels set captureConsoleDisabledLevels: [];
150
+ * If you want to disable only some levels set captureConsoleDisabledLevels: [LogLevel.DEBUG, LogLevel.TRACE];
151
+ */
152
+ disabledLevels?: LogLevel[];
153
+ consoleErrorAsLog?: boolean;
154
+ };
43
155
  }
44
156
  export type Patterns = Array<string | RegExp>;
45
157
  export {};
@@ -4,42 +4,154 @@ import type { InternalLoggerLevel } from '../internalLogger';
4
4
  import type { Meta, MetaApp, MetaItem, MetaSession, MetaUser, MetaView } from '../metas';
5
5
  import type { BatchExecutorOptions, BeforeSendHook, Transport } from '../transports';
6
6
  import type { UnpatchedConsole } from '../unpatchedConsole';
7
+ import type { LogLevel } from '../utils';
7
8
  type SamplingContext = {
8
9
  metas: Meta;
9
10
  };
10
11
  export interface Config<P = APIEvent> {
12
+ /**
13
+ * Application metadata
14
+ */
11
15
  app: MetaApp;
16
+ /**
17
+ * Set max number and max interval for signals to be batched before sending
18
+ */
12
19
  batching?: BatchExecutorOptions;
20
+ /**
21
+ * A flag for toggling deduplication for signals
22
+ */
13
23
  dedupe: boolean;
24
+ /**
25
+ * The key (name) to use for the global Faro object (default: 'faro')
26
+ */
14
27
  globalObjectKey: string;
28
+ /**
29
+ * The (custom) instrumentations to use with Faro
30
+ */
15
31
  instrumentations: Instrumentation[];
32
+ /**
33
+ * The level of information printed to console for internal messages (default: LogLevel.ERROR)
34
+ */
16
35
  internalLoggerLevel: InternalLoggerLevel;
36
+ /**
37
+ * Isolate Faro instance from other Faro instances on the same page. (default: false)
38
+ */
17
39
  isolate: boolean;
40
+ /**
41
+ * Custom function to serialize log arguments
42
+ */
18
43
  logArgsSerializer?: LogArgsSerializer;
44
+ /**
45
+ * Add custom Metas during Faro initialization
46
+ */
19
47
  metas: MetaItem[];
48
+ /**
49
+ * Custom function used to parse stack traces
50
+ */
20
51
  parseStacktrace: StacktraceParser;
52
+ /**
53
+ * Pause sending data (default: false)
54
+ */
21
55
  paused: boolean;
56
+ /**
57
+ * Prevent Faro from exposing itself to the global object (default: false)
58
+ */
22
59
  preventGlobalExposure: boolean;
60
+ /**
61
+ * The transports to use for sending beacons
62
+ */
23
63
  transports: Transport[];
64
+ /**
65
+ * Some instrumentations might override the default console methods but Faro instance provides a
66
+ * way to access the unmodified console methods.
67
+ *
68
+ * faro.unpatchedConsole.log('This is a log');
69
+ * faro.unpatchedConsole.warn('This is a warning');
70
+ */
24
71
  unpatchedConsole: UnpatchedConsole;
72
+ /**
73
+ * Function which invoked before pushing event to transport. Can be used to modify or filter events
74
+ */
25
75
  beforeSend?: BeforeSendHook<P>;
76
+ /**
77
+ * Error message patterns for errors that should be ignored
78
+ */
26
79
  ignoreErrors?: Patterns;
80
+ /**
81
+ * Path patterns for Endpoints that should be ignored form being tracked
82
+ */
27
83
  ignoreUrls?: Patterns;
84
+ /**
85
+ * Configuration for the built in session tracker
86
+ */
28
87
  sessionTracking?: {
88
+ /**
89
+ * Enable session tracking (default: true)
90
+ */
29
91
  enabled?: boolean;
92
+ /**
93
+ * Wether to use sticky sessions (default: false)
94
+ */
30
95
  persistent?: boolean;
96
+ /**
97
+ * Session metadata object to be used when initializing session tracking
98
+ */
31
99
  session?: MetaSession;
100
+ /**
101
+ * How long is a sticky session valid for recurring users (default: 15 minutes)
102
+ */
32
103
  maxSessionPersistenceTime?: number;
104
+ /**
105
+ * Called each time a session changes. This can be when a new session is created or when an existing session is updated.
106
+ * @param oldSession
107
+ * @param newSession
108
+ */
33
109
  onSessionChange?: (oldSession: MetaSession | null, newSession: MetaSession) => void;
110
+ /**
111
+ * Then sampling rate for the session based sampler (default: 1). If a session is not part of a sample, no signals for this session are tracked.
112
+ */
34
113
  samplingRate?: number;
114
+ /**
115
+ * Custom sampler function if custom sampling logic is needed.
116
+ * @param context
117
+ */
35
118
  sampler?: (context: SamplingContext) => number;
119
+ /**
120
+ * Custom function to generate session id. If available Faro uses this function instead of the internal one.
121
+ */
36
122
  generateSessionId?: () => string;
37
123
  };
124
+ /**
125
+ * Meta object for user data
126
+ */
38
127
  user?: MetaUser;
128
+ /**
129
+ * Meta object for view data
130
+ */
39
131
  view?: MetaView;
40
132
  eventDomain?: string;
133
+ /**
134
+ * Only resource timings for fetch and xhr requests are tracked by default. Set this to true to track all resources (default: false).
135
+ */
41
136
  trackResources?: boolean;
137
+ /**
138
+ * Track web vitals attribution data (default: false)
139
+ */
42
140
  trackWebVitalsAttribution?: boolean;
141
+ /**
142
+ * Configuration for the console instrumentation
143
+ */
144
+ consoleInstrumentation?: {
145
+ /**
146
+ * Configure what console levels should be captured by Faro. By default the follwoing levels
147
+ * are disabled: console.debug, console.trace, console.log
148
+ *
149
+ * If you want to collect all levels set captureConsoleDisabledLevels: [];
150
+ * If you want to disable only some levels set captureConsoleDisabledLevels: [LogLevel.DEBUG, LogLevel.TRACE];
151
+ */
152
+ disabledLevels?: LogLevel[];
153
+ consoleErrorAsLog?: boolean;
154
+ };
43
155
  }
44
156
  export type Patterns = Array<string | RegExp>;
45
157
  export {};
@@ -4,7 +4,7 @@ import type { Transport, TransportItem } from '../transports';
4
4
  export declare class MockTransport extends BaseTransport implements Transport {
5
5
  private ignoreURLs;
6
6
  readonly name = "@grafana/transport-mock";
7
- readonly version = "1.11.0";
7
+ readonly version = "1.12.1";
8
8
  items: TransportItem[];
9
9
  constructor(ignoreURLs?: Patterns);
10
10
  send(items: TransportItem[]): void | Promise<void>;
@@ -1 +1 @@
1
- export declare const VERSION = "1.11.0";
1
+ export declare const VERSION = "1.12.1";
@@ -4,7 +4,7 @@ import type { Transport, TransportItem } from '../transports';
4
4
  export declare class MockTransport extends BaseTransport implements Transport {
5
5
  private ignoreURLs;
6
6
  readonly name = "@grafana/transport-mock";
7
- readonly version = "1.11.0";
7
+ readonly version = "1.12.1";
8
8
  items: TransportItem[];
9
9
  constructor(ignoreURLs?: Patterns);
10
10
  send(items: TransportItem[]): void | Promise<void>;
@@ -1 +1 @@
1
- export declare const VERSION = "1.11.0";
1
+ export declare const VERSION = "1.12.1";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grafana/faro-core",
3
- "version": "1.11.0",
3
+ "version": "1.12.1",
4
4
  "description": "Core package of Faro.",
5
5
  "keywords": [
6
6
  "observability",
@@ -57,5 +57,5 @@
57
57
  "publishConfig": {
58
58
  "access": "public"
59
59
  },
60
- "gitHead": "b82e827db7ec58961b8930b0500f0cc976d3a24e"
60
+ "gitHead": "6d6b06892399e281df87c7b9d4f055464e649073"
61
61
  }