blinker-sdk 1.0.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +226 -147
- package/dist/blinker.min.js +452 -1
- package/dist/capture/deduplication.d.ts +26 -0
- package/dist/capture/deduplication.d.ts.map +1 -0
- package/dist/capture/errorHandler.d.ts +5 -0
- package/dist/capture/errorHandler.d.ts.map +1 -0
- package/dist/capture/index.d.ts +4 -0
- package/dist/capture/index.d.ts.map +1 -0
- package/dist/capture/types.d.ts +13 -0
- package/dist/capture/types.d.ts.map +1 -0
- package/dist/context/SessionManager.d.ts +16 -0
- package/dist/context/SessionManager.d.ts.map +1 -0
- package/dist/context/UserContext.d.ts +19 -0
- package/dist/context/UserContext.d.ts.map +1 -0
- package/dist/context/index.d.ts +4 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/types.d.ts +18 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/core/Blinker.d.ts +42 -0
- package/dist/core/Blinker.d.ts.map +1 -0
- package/dist/core/config.d.ts +26 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/types.d.ts +50 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/filters/FilterEngine.d.ts +9 -0
- package/dist/filters/FilterEngine.d.ts.map +1 -0
- package/dist/filters/defaults.d.ts +3 -0
- package/dist/filters/defaults.d.ts.map +1 -0
- package/dist/filters/index.d.ts +4 -0
- package/dist/filters/index.d.ts.map +1 -0
- package/dist/filters/types.d.ts +8 -0
- package/dist/filters/types.d.ts.map +1 -0
- package/dist/index.cjs.js +2154 -264
- package/dist/index.d.ts +7 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +2154 -264
- package/dist/queue/EventQueue.d.ts +21 -0
- package/dist/queue/EventQueue.d.ts.map +1 -0
- package/dist/queue/index.d.ts +4 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/storage.d.ts +16 -0
- package/dist/queue/storage.d.ts.map +1 -0
- package/dist/queue/types.d.ts +19 -0
- package/dist/queue/types.d.ts.map +1 -0
- package/dist/sampling/RateLimiter.d.ts +12 -0
- package/dist/sampling/RateLimiter.d.ts.map +1 -0
- package/dist/sampling/Sampler.d.ts +16 -0
- package/dist/sampling/Sampler.d.ts.map +1 -0
- package/dist/sampling/index.d.ts +4 -0
- package/dist/sampling/index.d.ts.map +1 -0
- package/dist/sampling/types.d.ts +10 -0
- package/dist/sampling/types.d.ts.map +1 -0
- package/dist/transport/index.d.ts +3 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/sender.d.ts +4 -0
- package/dist/transport/sender.d.ts.map +1 -0
- package/dist/transport/types.d.ts +12 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/utils/browser.d.ts +10 -0
- package/dist/utils/browser.d.ts.map +1 -0
- package/dist/utils/hash.d.ts +4 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/widget/Avatar.d.ts +20 -0
- package/dist/widget/Avatar.d.ts.map +1 -0
- package/dist/widget/Dialog.d.ts +25 -0
- package/dist/widget/Dialog.d.ts.map +1 -0
- package/dist/widget/QuestionEngine.d.ts +7 -0
- package/dist/widget/QuestionEngine.d.ts.map +1 -0
- package/dist/widget/Widget.d.ts +28 -0
- package/dist/widget/Widget.d.ts.map +1 -0
- package/dist/widget/index.d.ts +8 -0
- package/dist/widget/index.d.ts.map +1 -0
- package/dist/widget/styles.d.ts +5 -0
- package/dist/widget/styles.d.ts.map +1 -0
- package/dist/widget/types.d.ts +46 -0
- package/dist/widget/types.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/Blinker.d.ts +0 -65
- package/dist/Blinker.d.ts.map +0 -1
- package/dist/errorHandler.d.ts +0 -19
- package/dist/errorHandler.d.ts.map +0 -1
- package/dist/sender.d.ts +0 -11
- package/dist/sender.d.ts.map +0 -1
- package/dist/types.d.ts +0 -92
- package/dist/types.d.ts.map +0 -1
package/dist/blinker.min.js
CHANGED
|
@@ -1 +1,452 @@
|
|
|
1
|
-
"use strict";var BlinkerSDK=(()=>{var
|
|
1
|
+
"use strict";var BlinkerSDK=(()=>{var _=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames;var ce=Object.prototype.hasOwnProperty;var ge=(i,e)=>{for(var t in e)_(i,t,{get:e[t],enumerable:!0})},he=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ue(e))!ce.call(i,n)&&n!==t&&_(i,n,{get:()=>e[n],enumerable:!(r=de(e,n))||r.enumerable});return i};var pe=i=>he(_({},"__esModule",{value:!0}),i);var xe={};ge(xe,{Blinker:()=>m,DEFAULT_FILTERS:()=>p,DEFAULT_WIDGET_CONFIG:()=>R,blinker:()=>ae,default:()=>ke});var z="https://api.blinker.live",w={EVENT_QUEUE:"blinker_event_queue",SESSION:"blinker_session",USER_CONTEXT:"blinker_user_context"},h={captureErrors:!0,captureRejections:!0,enableBatching:!0,batchSize:10,flushInterval:5e3,enableOfflineStorage:!0,maxStoredEvents:100,enableDeduplication:!0,deduplicationWindow:6e4,maxEventsPerMinute:100,sampleRate:1,debug:!1},x={OFFLINE_RETRY_TIMEOUT:3e4,MIN_FLUSH_INTERVAL:1e3,MAX_FLUSH_INTERVAL:6e4};var p={ignoreHttpCodes:[401,403],ignoreErrorTypes:[],ignoreMessagePatterns:["ResizeObserver loop","Script error","ResizeObserver loop completed"],captureAll:!1};var D="[Blinker]";function U(i){let e=()=>{};return i?{log:(...t)=>console.log(D,...t),warn:(...t)=>console.warn(D,...t),error:(...t)=>console.error(D,...t)}:{log:e,warn:e,error:e}}var Q=U(!1);function B(i){Q=U(i)}function d(){return Q}var E=class{constructor(e){var t,r,n,o;this.filters={ignoreHttpCodes:(t=e==null?void 0:e.ignoreHttpCodes)!=null?t:p.ignoreHttpCodes,ignoreErrorTypes:(r=e==null?void 0:e.ignoreErrorTypes)!=null?r:p.ignoreErrorTypes,ignoreMessagePatterns:(n=e==null?void 0:e.ignoreMessagePatterns)!=null?n:p.ignoreMessagePatterns,captureAll:(o=e==null?void 0:e.captureAll)!=null?o:p.captureAll}}shouldCapture(e,t,r){let n=d();if(this.filters.captureAll)return!0;if(r!==void 0&&this.filters.ignoreHttpCodes.includes(r))return n.log("Event filtered out by HTTP code:",r),!1;if(t&&this.filters.ignoreErrorTypes.includes(t))return n.log("Event filtered out by error type:",t),!1;for(let o of this.filters.ignoreMessagePatterns)if(e.toLowerCase().includes(o.toLowerCase()))return n.log("Event filtered out by message pattern:",o),!1;if(r===void 0){let o=e.match(/(?:HTTP\s*|status[:\s]*)?(\d{3})(?:\s|$|:)/i);if(o){let s=parseInt(o[1],10);if(s>=100&&s<600&&this.filters.ignoreHttpCodes.includes(s))return n.log("Event filtered out by extracted HTTP code:",s),!1}}return!0}getFilters(){return{...this.filters}}updateFilters(e){var t,r,n,o;this.filters={ignoreHttpCodes:(t=e.ignoreHttpCodes)!=null?t:this.filters.ignoreHttpCodes,ignoreErrorTypes:(r=e.ignoreErrorTypes)!=null?r:this.filters.ignoreErrorTypes,ignoreMessagePatterns:(n=e.ignoreMessagePatterns)!=null?n:this.filters.ignoreMessagePatterns,captureAll:(o=e.captureAll)!=null?o:this.filters.captureAll}}};function g(){return typeof window!="undefined"}function H(){if(!g())return!1;try{let i="__blinker_test__";return localStorage.setItem(i,"test"),localStorage.removeItem(i),!0}catch(i){return!1}}function N(){if(!g())return!1;try{let i="__blinker_test__";return sessionStorage.setItem(i,"test"),sessionStorage.removeItem(i),!0}catch(i){return!1}}function f(){var i;return g()&&(i=navigator.onLine)!=null?i:!0}function V(){if(g())return window.location.href}function G(){return g()?window.location.pathname:"unknown"}function j(){if(g())return navigator.userAgent}function Y(){if(g())return document.referrer||void 0}var C=class{constructor(e=100){this.storageKey=w.EVENT_QUEUE;this.maxEvents=e,this.available=H()}isAvailable(){return this.available}store(e){if(!this.available)return!1;let t=d();try{let r=this.getAll(),n={event:e,storedAt:new Date().toISOString(),retries:0};for(r.push(n);r.length>this.maxEvents;)r.shift();return localStorage.setItem(this.storageKey,JSON.stringify(r)),t.log(`Event stored offline. Total stored: ${r.length}`),!0}catch(r){return t.error("Failed to store event offline:",r),!1}}storeMany(e){if(!this.available||e.length===0)return 0;let t=d(),r=0;try{let n=this.getAll();for(let o of e){let s={event:o,storedAt:new Date().toISOString(),retries:0};n.push(s),r++}for(;n.length>this.maxEvents;)n.shift();return localStorage.setItem(this.storageKey,JSON.stringify(n)),t.log(`Stored ${r} events offline. Total stored: ${n.length}`),r}catch(n){return t.error("Failed to store events offline:",n),r}}getAll(){if(!this.available)return[];try{let e=localStorage.getItem(this.storageKey);return e?JSON.parse(e):[]}catch(e){return[]}}retrieveAll(){if(!this.available)return[];let e=d();try{let t=this.getAll();return t.length===0?[]:(localStorage.removeItem(this.storageKey),e.log(`Retrieved ${t.length} stored events`),t.map(r=>r.event))}catch(t){return e.error("Failed to retrieve stored events:",t),[]}}count(){return this.getAll().length}clear(){if(this.available)try{localStorage.removeItem(this.storageKey)}catch(e){}}};async function J(i,e,t){let r=d(),n=`${i.replace(/\/$/,"")}/events`;if(t.length===0)return{success:!0,count:0};let o=async()=>{try{let a=t.length===1?K(t[0]):{events:t.map(K)},l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json","x-blinker-token":e},body:JSON.stringify(a)});if(!l.ok){let u=await l.text().catch(()=>"Unknown error");return r.error(`Failed to send events: ${l.status} - ${u}`),{success:!1,error:`HTTP ${l.status}: ${u}`}}return r.log(`Events sent successfully: ${t.length} event(s)`),{success:!0,count:t.length}}catch(a){let l=a instanceof Error?a.message:"Unknown error";return r.error("Error sending events:",l),{success:!1,error:l}}},s=await o();return!s.success&&g()&&!f()&&(r.log("Offline, waiting for connection to retry..."),await fe(x.OFFLINE_RETRY_TIMEOUT))?(r.log("Back online, retrying..."),o()):s}function K(i){return{type:i.type,message:i.message,payload:i.payload||{},timestamp:i.timestamp,url:i.url,userAgent:i.userAgent,sessionId:i.sessionId,userId:i.userId,userTraits:i.userTraits,context:i.context,count:i.count}}function fe(i){return new Promise(e=>{if(!g()){e(!1);return}let t=setTimeout(()=>e(!1),i),r=()=>{clearTimeout(t),window.removeEventListener("online",r),e(!0)};window.addEventListener("online",r)})}var T=class{constructor(e,t){this.queue=[];this.flushTimer=null;this.isFlushing=!1;this.handleOnline=()=>{d().log("Back online, flushing stored events"),this.flush()};var r,n,o,s,a;this.token=e,this.config={enableBatching:(r=t==null?void 0:t.enableBatching)!=null?r:h.enableBatching,batchSize:(n=t==null?void 0:t.batchSize)!=null?n:h.batchSize,flushInterval:Math.max(x.MIN_FLUSH_INTERVAL,Math.min((o=t==null?void 0:t.flushInterval)!=null?o:h.flushInterval,x.MAX_FLUSH_INTERVAL)),enableOfflineStorage:(s=t==null?void 0:t.enableOfflineStorage)!=null?s:h.enableOfflineStorage,maxStoredEvents:(a=t==null?void 0:t.maxStoredEvents)!=null?a:h.maxStoredEvents},this.storage=new C(this.config.maxStoredEvents),this.config.enableBatching&&this.startFlushTimer(),g()&&this.config.enableOfflineStorage&&window.addEventListener("online",this.handleOnline)}async add(e){let t=d();return this.config.enableBatching?(this.queue.push(e),t.log(`Event queued. Queue size: ${this.queue.length}`),this.queue.length>=this.config.batchSize?this.flush():{success:!0}):this.sendImmediately([e])}async flush(){let e=d();if(this.isFlushing)return e.log("Flush already in progress, skipping"),{success:!0};let t=[...this.queue];if(this.queue=[],this.config.enableOfflineStorage&&f()){let r=this.storage.retrieveAll();r.length>0&&(t.unshift(...r),e.log(`Including ${r.length} stored offline events`))}if(t.length===0)return{success:!0,count:0};this.isFlushing=!0;try{let r=await this.sendImmediately(t);return!r.success&&this.config.enableOfflineStorage&&!f()&&(e.log("Send failed while offline, storing events"),this.storage.storeMany(t)),r}finally{this.isFlushing=!1}}async sendImmediately(e){let t=d();return!f()&&this.config.enableOfflineStorage?(t.log("Offline, storing events for later"),{success:!0,count:this.storage.storeMany(e)}):J(z,this.token,e)}getStats(){let e=this.queue.length,t=this.storage.count();return{queueSize:e,storedSize:t,totalPending:e+t}}size(){return this.queue.length}startFlushTimer(){this.flushTimer||(this.flushTimer=setInterval(()=>{this.queue.length>0&&this.flush()},this.config.flushInterval))}stopFlushTimer(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null)}destroy(){this.stopFlushTimer(),g()&&window.removeEventListener("online",this.handleOnline),this.queue.length>0&&f()?this.flush():this.queue.length>0&&this.config.enableOfflineStorage&&this.storage.storeMany(this.queue),this.queue=[]}};function me(i){let e=5381;for(let t=0;t<i.length;t++)e=(e<<5)+e^i.charCodeAt(t);return(e>>>0).toString(16)}function X(i,e){let t=i;if(e){let n=e.split(`
|
|
2
|
+
`).slice(1,4).map(o=>o.replace(/:\d+:\d+\)?$/,"").trim()).join("|");t+="|"+n}return me(t)}function v(){let i=Date.now().toString(36),e=Math.random().toString(36).substring(2,10);return`${i}-${e}`}var I=class{constructor(){this.session=null;this.storageKey=w.SESSION;this.storageAvailable=N(),this.initSession()}initSession(){let e=d();if(this.storageAvailable)try{let t=sessionStorage.getItem(this.storageKey);if(t){this.session=JSON.parse(t),e.log("Session restored:",this.session.id);return}}catch(t){}this.session={id:v(),startedAt:new Date().toISOString(),pageViews:0,lastActivityAt:new Date().toISOString()},this.persist(),e.log("New session created:",this.session.id)}getSessionId(){var e,t;return(t=(e=this.session)==null?void 0:e.id)!=null?t:v()}getSession(){return this.session||this.initSession(),{...this.session}}recordPageView(){this.session&&(this.session.pageViews++,this.session.lastActivityAt=new Date().toISOString(),this.persist())}touch(){this.session&&(this.session.lastActivityAt=new Date().toISOString(),this.persist())}getDuration(){if(!this.session)return 0;let e=new Date(this.session.startedAt).getTime();return Date.now()-e}persist(){if(!(!this.storageAvailable||!this.session))try{sessionStorage.setItem(this.storageKey,JSON.stringify(this.session))}catch(e){}}endSession(){if(this.storageAvailable)try{sessionStorage.removeItem(this.storageKey)}catch(e){}this.session=null}};var L=class{constructor(e){this.user=null;this.customContext={};this.sessionManager=e}identify(e,t){let r=d();this.user={userId:e,traits:t?{...t}:void 0,identifiedAt:new Date().toISOString()},r.log("User identified:",e)}getUserId(){var e;return(e=this.user)==null?void 0:e.userId}getUserTraits(){var e;return(e=this.user)!=null&&e.traits?{...this.user.traits}:void 0}isIdentified(){return this.user!==null}setContext(e,t){let r=d();this.customContext[e]=t,r.log("Context set:",e)}getContextValue(e){return this.customContext[e]}getCustomContext(){return{...this.customContext}}getEventContext(){var e,t;return{sessionId:this.sessionManager.getSessionId(),userId:(e=this.user)==null?void 0:e.userId,userTraits:(t=this.user)!=null&&t.traits?{...this.user.traits}:void 0,custom:{...this.customContext}}}clearIdentity(){let e=d();this.user=null,e.log("User identity cleared")}clearAll(){let e=d();this.user=null,this.customContext={},e.log("All context cleared")}};var Z=60*1e3,M=class{constructor(e){this.maxPerMinute=e!=null?e:h.maxEventsPerMinute,this.state={count:0,windowStart:Date.now(),dropped:0}}allow(){let e=d();if(this.maxPerMinute===0)return!0;let t=Date.now();return t-this.state.windowStart>=Z&&(this.state.dropped>0&&e.warn(`Rate limit: ${this.state.dropped} events dropped in last minute`),this.state={count:0,windowStart:t,dropped:0}),this.state.count<this.maxPerMinute?(this.state.count++,!0):(this.state.dropped++,this.state.dropped===1&&e.warn(`Rate limit reached: ${this.maxPerMinute} events/minute`),!1)}getState(){return{...this.state}}getRemaining(){return this.maxPerMinute===0?1/0:Date.now()-this.state.windowStart>=Z?this.maxPerMinute:Math.max(0,this.maxPerMinute-this.state.count)}reset(){this.state={count:0,windowStart:Date.now(),dropped:0}}setLimit(e){this.maxPerMinute=e}};var q=class{constructor(e){this.sampled=0;this.dropped=0;this.sampleRate=Math.max(0,Math.min(1,e!=null?e:h.sampleRate))}shouldSample(e=!1){let t=d();return e?(this.sampled++,!0):this.sampleRate>=1?(this.sampled++,!0):this.sampleRate<=0?(this.dropped++,!1):Math.random()<this.sampleRate?(this.sampled++,!0):(this.dropped++,t.log("Event sampled out"),!1)}getStats(){return{sampled:this.sampled,dropped:this.dropped,rate:this.sampleRate}}setRate(e){this.sampleRate=Math.max(0,Math.min(1,e))}getRate(){return this.sampleRate}resetStats(){this.sampled=0,this.dropped=0}};var A=class{constructor(e,t){this.entries=new Map;this.cleanupTimer=null;this.enabled=e!=null?e:h.enableDeduplication,this.windowMs=t!=null?t:h.deduplicationWindow,this.enabled&&this.startCleanup()}check(e,t){let r=X(e,t);if(!this.enabled)return{shouldSend:!0,fingerprint:r,count:1,isDuplicate:!1};let n=d(),o=Date.now(),s=this.entries.get(r);if(s){if(o-s.firstSeen<this.windowMs)return s.count++,s.lastSeen=o,n.log(`Duplicate error detected (count: ${s.count}):`,e.substring(0,50)),{shouldSend:!1,fingerprint:r,count:s.count,isDuplicate:!0};this.entries.delete(r)}return this.entries.set(r,{fingerprint:r,firstSeen:o,count:1,lastSeen:o}),{shouldSend:!0,fingerprint:r,count:1,isDuplicate:!1}}getCount(e){var t,r;return(r=(t=this.entries.get(e))==null?void 0:t.count)!=null?r:1}flush(){let e=Array.from(this.entries.values()).filter(t=>t.count>1);return this.entries.clear(),e}startCleanup(){this.cleanupTimer=setInterval(()=>{this.cleanup()},this.windowMs)}cleanup(){let e=Date.now(),t=d(),r=0;for(let[n,o]of this.entries)e-o.firstSeen>=this.windowMs&&(this.entries.delete(n),r++);r>0&&t.log(`Deduplication cleanup: removed ${r} expired entries`)}destroy(){this.cleanupTimer&&(clearInterval(this.cleanupTimer),this.cleanupTimer=null),this.entries.clear()}getStats(){return{entries:this.entries.size,enabled:this.enabled,windowMs:this.windowMs}}};var y=null,k=null,P=!1;function ee(i,e={}){let{captureErrors:t=!0,captureRejections:r=!0}=e,n=d();if(P){n.warn("Error handlers already set up");return}if(!g()){n.log("Not in browser environment, skipping error handlers");return}t&&(y=window.onerror,window.onerror=function(o,s,a,l,u){let c=typeof o=="string"?o:o.type||"Unknown error",b={source:s,lineno:a,colno:l,stack:u==null?void 0:u.stack,errorType:u==null?void 0:u.name};return n.log("Captured error:",c),i("error",c,b),typeof y=="function"?y.call(window,o,s,a,l,u):!1}),r&&(k=window.onunhandledrejection,window.onunhandledrejection=function(o){let s="Unhandled Rejection",a={},l=o.reason;if(l instanceof Error)s=l.message||s,a.stack=l.stack,a.errorType=l.name;else if(typeof l=="string")s=l;else if(l!=null)try{s=JSON.stringify(l)}catch(u){s=String(l)}n.log("Captured unhandled rejection:",s),i("error",s,a),typeof k=="function"&&k.call(window,o)}),P=!0,n.log("Error handlers set up")}function te(){let i=d();g()&&(y!==void 0&&(window.onerror=y),k!==void 0&&(window.onunhandledrejection=k),y=null,k=null,P=!1,i.log("Error handlers torn down"))}var R={enabled:!1,theme:{primary:"#6366f1",background:"#ffffff",text:"#1f2937",accent:"#10b981"},messages:{greeting:"Opa! Algo n\xE3o saiu como esperado.",subtext:"Pode nos ajudar a entender o que aconteceu?",thankYou:"Valeu! J\xE1 estamos olhando isso.",buttonSend:"Enviar",buttonSkip:"Agora n\xE3o"},position:"bottom-right",delay:2e3,maxShowsPerSession:2,cooldownMinutes:30};var $=class{constructor(e,t){this.element=null;this.pupilLeft=null;this.pupilRight=null;this.mouseTrackingEnabled=!0;this.theme=e,this.onClick=t,this.handleMouseMove=this.handleMouseMove.bind(this)}create(){let e=document.createElementNS("http://www.w3.org/2000/svg","svg");return e.setAttribute("viewBox","0 0 100 100"),e.setAttribute("class","blinker-avatar"),e.innerHTML=this.getSVGContent(),e.addEventListener("click",this.onClick),e.addEventListener("mouseenter",()=>this.setState("hover")),e.addEventListener("mouseleave",()=>this.setState("idle")),this.element=e,this.pupilLeft=e.querySelector(".blinker-pupil-left"),this.pupilRight=e.querySelector(".blinker-pupil-right"),document.addEventListener("mousemove",this.handleMouseMove),e}getSVGContent(){return`
|
|
3
|
+
<defs>
|
|
4
|
+
<linearGradient id="blinker-body-gradient" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
5
|
+
<stop offset="0%" style="stop-color:${this.theme.primary};stop-opacity:1" />
|
|
6
|
+
<stop offset="100%" style="stop-color:${this.adjustColor(this.theme.primary,-30)};stop-opacity:1" />
|
|
7
|
+
</linearGradient>
|
|
8
|
+
<filter id="blinker-shadow" x="-20%" y="-20%" width="140%" height="140%">
|
|
9
|
+
<feDropShadow dx="0" dy="4" stdDeviation="4" flood-opacity="0.2"/>
|
|
10
|
+
</filter>
|
|
11
|
+
</defs>
|
|
12
|
+
|
|
13
|
+
<!-- Glow effect -->
|
|
14
|
+
<ellipse class="blinker-avatar-glow" cx="50" cy="85" rx="25" ry="8" />
|
|
15
|
+
|
|
16
|
+
<!-- Body -->
|
|
17
|
+
<g class="blinker-avatar-body" filter="url(#blinker-shadow)">
|
|
18
|
+
<!-- Main body shape - rounded rectangle with personality -->
|
|
19
|
+
<path d="
|
|
20
|
+
M 25 30
|
|
21
|
+
Q 25 15, 50 15
|
|
22
|
+
Q 75 15, 75 30
|
|
23
|
+
L 75 65
|
|
24
|
+
Q 75 85, 50 85
|
|
25
|
+
Q 25 85, 25 65
|
|
26
|
+
Z
|
|
27
|
+
" fill="url(#blinker-body-gradient)" />
|
|
28
|
+
|
|
29
|
+
<!-- Antenna/Top detail -->
|
|
30
|
+
<circle cx="50" cy="12" r="4" fill="${this.theme.primary}" />
|
|
31
|
+
<line x1="50" y1="16" x2="50" y2="22" stroke="${this.theme.primary}" stroke-width="3" stroke-linecap="round" />
|
|
32
|
+
</g>
|
|
33
|
+
|
|
34
|
+
<!-- Face -->
|
|
35
|
+
<g class="blinker-avatar-face">
|
|
36
|
+
<!-- Left eye container -->
|
|
37
|
+
<ellipse class="blinker-avatar-eye blinker-avatar-eye-left" cx="38" cy="42" rx="10" ry="11" />
|
|
38
|
+
<!-- Right eye container -->
|
|
39
|
+
<ellipse class="blinker-avatar-eye blinker-avatar-eye-right" cx="62" cy="42" rx="10" ry="11" />
|
|
40
|
+
|
|
41
|
+
<!-- Left pupil -->
|
|
42
|
+
<circle class="blinker-avatar-pupil blinker-pupil-left" cx="38" cy="43" r="5" />
|
|
43
|
+
<!-- Right pupil -->
|
|
44
|
+
<circle class="blinker-avatar-pupil blinker-pupil-right" cx="62" cy="43" r="5" />
|
|
45
|
+
|
|
46
|
+
<!-- Eye shine -->
|
|
47
|
+
<circle cx="35" cy="40" r="2" fill="white" opacity="0.8" />
|
|
48
|
+
<circle cx="59" cy="40" r="2" fill="white" opacity="0.8" />
|
|
49
|
+
|
|
50
|
+
<!-- Mouth -->
|
|
51
|
+
<path class="blinker-avatar-mouth" d="M 40 60 Q 50 68, 60 60" />
|
|
52
|
+
</g>
|
|
53
|
+
|
|
54
|
+
<!-- Decorative elements -->
|
|
55
|
+
<circle cx="30" cy="55" r="3" fill="${this.theme.primary}" opacity="0.3" />
|
|
56
|
+
<circle cx="70" cy="55" r="3" fill="${this.theme.primary}" opacity="0.3" />
|
|
57
|
+
`}handleMouseMove(e){if(!this.mouseTrackingEnabled||!this.element||!this.pupilLeft||!this.pupilRight)return;let t=this.element.getBoundingClientRect(),r=t.left+t.width/2,n=t.top+t.height/2,o=(e.clientX-r)/50,s=(e.clientY-n)/50,a=3,l=Math.max(-a,Math.min(a,o)),u=Math.max(-a,Math.min(a,s));this.pupilLeft.setAttribute("transform",`translate(${l}, ${u})`),this.pupilRight.setAttribute("transform",`translate(${l}, ${u})`)}setState(e){this.element&&(this.element.classList.remove("idle","hover","minimized","talking"),this.element.classList.add(e))}setMinimized(e){this.element&&(e?(this.element.classList.add("minimized"),this.mouseTrackingEnabled=!1):(this.element.classList.remove("minimized"),this.mouseTrackingEnabled=!0))}updateTheme(e){this.theme=e,this.element&&(this.element.innerHTML=this.getSVGContent(),this.pupilLeft=this.element.querySelector(".blinker-pupil-left"),this.pupilRight=this.element.querySelector(".blinker-pupil-right"))}adjustColor(e,t){let r=parseInt(e.replace("#",""),16),n=Math.max(0,Math.min(255,(r>>16)+t)),o=Math.max(0,Math.min(255,(r>>8&255)+t)),s=Math.max(0,Math.min(255,(r&255)+t));return`#${(n<<16|o<<8|s).toString(16).padStart(6,"0")}`}getElement(){return this.element}destroy(){document.removeEventListener("mousemove",this.handleMouseMove),this.element&&(this.element.removeEventListener("click",this.onClick),this.element.remove(),this.element=null)}};var W=class{constructor(e,t,r){this.overlay=null;this.dialog=null;this.questions=[];this.answers={};this.errorId="";this.state="questions";this.config=e,this.onSubmit=t,this.onClose=r}open(e,t){this.errorId=e,this.questions=t,this.answers={},this.state="questions",this.render()}close(){this.overlay&&(this.overlay.remove(),this.overlay=null),this.dialog&&(this.dialog.remove(),this.dialog=null),this.onClose()}render(){this.close(),this.overlay=document.createElement("div"),this.overlay.className="blinker-dialog-overlay",this.overlay.addEventListener("click",()=>this.close()),this.dialog=document.createElement("div"),this.dialog.className=`blinker-dialog ${this.config.position}`,this.dialog.innerHTML=this.state==="questions"?this.getQuestionsHTML():this.getThankYouHTML(),document.body.appendChild(this.overlay),document.body.appendChild(this.dialog),this.attachEventListeners()}getQuestionsHTML(){let{messages:e}=this.config;return`
|
|
58
|
+
<div class="blinker-dialog-header">
|
|
59
|
+
<svg class="blinker-dialog-avatar" viewBox="0 0 100 100">
|
|
60
|
+
<defs>
|
|
61
|
+
<linearGradient id="dialog-gradient" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
62
|
+
<stop offset="0%" style="stop-color:${this.config.theme.primary}" />
|
|
63
|
+
<stop offset="100%" style="stop-color:${this.adjustColor(this.config.theme.primary,-30)}" />
|
|
64
|
+
</linearGradient>
|
|
65
|
+
</defs>
|
|
66
|
+
<path d="M 25 30 Q 25 15, 50 15 Q 75 15, 75 30 L 75 65 Q 75 85, 50 85 Q 25 85, 25 65 Z" fill="url(#dialog-gradient)" />
|
|
67
|
+
<ellipse cx="38" cy="42" rx="10" ry="11" fill="${this.config.theme.background}" />
|
|
68
|
+
<ellipse cx="62" cy="42" rx="10" ry="11" fill="${this.config.theme.background}" />
|
|
69
|
+
<circle cx="38" cy="43" r="5" fill="${this.config.theme.text}" />
|
|
70
|
+
<circle cx="62" cy="43" r="5" fill="${this.config.theme.text}" />
|
|
71
|
+
<path d="M 40 60 Q 50 68, 60 60" stroke="${this.config.theme.background}" stroke-width="2" fill="none" stroke-linecap="round" />
|
|
72
|
+
</svg>
|
|
73
|
+
<div class="blinker-dialog-title">
|
|
74
|
+
<p class="blinker-dialog-greeting">${e.greeting}</p>
|
|
75
|
+
<p class="blinker-dialog-subtext">${e.subtext}</p>
|
|
76
|
+
</div>
|
|
77
|
+
<button class="blinker-dialog-close" aria-label="Fechar">
|
|
78
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
79
|
+
<path d="M18 6L6 18M6 6l12 12" />
|
|
80
|
+
</svg>
|
|
81
|
+
</button>
|
|
82
|
+
</div>
|
|
83
|
+
<div class="blinker-dialog-body">
|
|
84
|
+
${this.questions.map(t=>this.getQuestionHTML(t)).join("")}
|
|
85
|
+
</div>
|
|
86
|
+
<div class="blinker-dialog-footer">
|
|
87
|
+
<button class="blinker-btn blinker-btn-secondary" data-action="skip">
|
|
88
|
+
${e.buttonSkip}
|
|
89
|
+
</button>
|
|
90
|
+
<button class="blinker-btn blinker-btn-primary" data-action="submit">
|
|
91
|
+
${e.buttonSend}
|
|
92
|
+
</button>
|
|
93
|
+
</div>
|
|
94
|
+
`}getQuestionHTML(e){var r;let t=e.required?" *":"";switch(e.type){case"text":return`
|
|
95
|
+
<div class="blinker-question" data-question-id="${e.id}">
|
|
96
|
+
<label class="blinker-question-label">${e.text}${t}</label>
|
|
97
|
+
<textarea
|
|
98
|
+
class="blinker-question-input blinker-question-textarea"
|
|
99
|
+
placeholder="Digite sua resposta..."
|
|
100
|
+
data-question-id="${e.id}"
|
|
101
|
+
></textarea>
|
|
102
|
+
</div>
|
|
103
|
+
`;case"select":return`
|
|
104
|
+
<div class="blinker-question" data-question-id="${e.id}">
|
|
105
|
+
<label class="blinker-question-label">${e.text}${t}</label>
|
|
106
|
+
<select class="blinker-question-input blinker-question-select" data-question-id="${e.id}">
|
|
107
|
+
<option value="">Selecione...</option>
|
|
108
|
+
${(r=e.options)==null?void 0:r.map(n=>`<option value="${n}">${n}</option>`).join("")}
|
|
109
|
+
</select>
|
|
110
|
+
</div>
|
|
111
|
+
`;case"boolean":return`
|
|
112
|
+
<div class="blinker-question" data-question-id="${e.id}">
|
|
113
|
+
<label class="blinker-question-label">${e.text}${t}</label>
|
|
114
|
+
<div class="blinker-question-boolean">
|
|
115
|
+
<button type="button" data-question-id="${e.id}" data-value="true">Sim</button>
|
|
116
|
+
<button type="button" data-question-id="${e.id}" data-value="false">N\xE3o</button>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
`;default:return""}}getThankYouHTML(){return`
|
|
120
|
+
<div class="blinker-thank-you">
|
|
121
|
+
<svg class="blinker-thank-you-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
122
|
+
<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14" />
|
|
123
|
+
<polyline points="22 4 12 14.01 9 11.01" />
|
|
124
|
+
</svg>
|
|
125
|
+
<p class="blinker-thank-you-text">${this.config.messages.thankYou}</p>
|
|
126
|
+
</div>
|
|
127
|
+
`}attachEventListeners(){if(!this.dialog)return;let e=this.dialog.querySelector(".blinker-dialog-close");e==null||e.addEventListener("click",()=>this.close());let t=this.dialog.querySelector('[data-action="submit"]');t==null||t.addEventListener("click",()=>this.handleSubmit());let r=this.dialog.querySelector('[data-action="skip"]');r==null||r.addEventListener("click",()=>this.close()),this.dialog.querySelectorAll("textarea").forEach(a=>{a.addEventListener("input",l=>{let u=l.target,c=u.dataset.questionId;c&&(this.answers[c]=u.value)})}),this.dialog.querySelectorAll("select").forEach(a=>{a.addEventListener("change",l=>{let u=l.target,c=u.dataset.questionId;c&&(this.answers[c]=u.value)})}),this.dialog.querySelectorAll(".blinker-question-boolean button").forEach(a=>{a.addEventListener("click",l=>{let u=l.target,c=u.dataset.questionId,b=u.dataset.value==="true";if(c){this.answers[c]=b;let F=u.parentElement;F==null||F.querySelectorAll("button").forEach(le=>le.classList.remove("selected")),u.classList.add("selected")}})})}handleSubmit(){var n;let e=this.questions.filter(o=>o.required);if(e.some(o=>{let s=this.answers[o.id];return s===void 0||s===""})){let o=e.find(s=>!this.answers[s.id]);if(o){let s=(n=this.dialog)==null?void 0:n.querySelector(`[data-question-id="${o.id}"]`);s instanceof HTMLElement&&(s.focus(),s.style.borderColor="#ef4444",setTimeout(()=>{s.style.borderColor=""},2e3))}return}let r={errorId:this.errorId,answers:{...this.answers},submittedAt:new Date().toISOString()};this.onSubmit(r),this.state="thankyou",this.render(),setTimeout(()=>{this.close()},2500)}updateConfig(e){this.config=e}adjustColor(e,t){let r=parseInt(e.replace("#",""),16),n=Math.max(0,Math.min(255,(r>>16)+t)),o=Math.max(0,Math.min(255,(r>>8&255)+t)),s=Math.max(0,Math.min(255,(r&255)+t));return`#${(n<<16|o<<8|s).toString(16).padStart(6,"0")}`}isOpen(){return this.dialog!==null}};var be=[{id:"what_doing",text:"O que voc\xEA estava tentando fazer?",type:"text",required:!0}],ve=[{id:"server_error",condition:i=>i.httpCode!==void 0&&i.httpCode>=500,priority:10,questions:[{id:"form_filled",text:"Voc\xEA preencheu algum formul\xE1rio antes disso?",type:"boolean"},{id:"data_lost",text:"Voc\xEA perdeu algum dado importante?",type:"boolean"}]},{id:"network_error",condition:i=>i.message.toLowerCase().includes("network")||i.message.toLowerCase().includes("fetch")||i.message.toLowerCase().includes("failed to fetch")||i.errorType==="TypeError"&&i.message.includes("fetch"),priority:9,questions:[{id:"internet_working",text:"Sua internet est\xE1 funcionando normalmente?",type:"boolean"},{id:"using_vpn",text:"Voc\xEA est\xE1 usando VPN ou proxy?",type:"boolean"}]},{id:"timeout_error",condition:i=>i.message.toLowerCase().includes("timeout")||i.message.toLowerCase().includes("timed out"),priority:8,questions:[{id:"page_slow",text:"A p\xE1gina estava lenta antes do erro?",type:"boolean"},{id:"first_time",text:"\xC9 a primeira vez que isso acontece?",type:"boolean"}]},{id:"auth_error",condition:i=>i.httpCode===401||i.httpCode===403||i.message.toLowerCase().includes("unauthorized")||i.message.toLowerCase().includes("forbidden"),priority:7,questions:[{id:"logged_in",text:"Voc\xEA estava logado no sistema?",type:"boolean"},{id:"session_expired",text:"Ficou muito tempo sem usar o sistema?",type:"boolean"}]},{id:"not_found",condition:i=>i.httpCode===404,priority:6,questions:[{id:"how_arrived",text:"Como voc\xEA chegou nessa p\xE1gina?",type:"select",options:["Digitei o link","Cliquei em um bot\xE3o","Usei o menu","Outro"]}]},{id:"validation_error",condition:i=>i.httpCode===400||i.httpCode===422||i.message.toLowerCase().includes("validation")||i.message.toLowerCase().includes("invalid"),priority:5,questions:[{id:"what_filled",text:"O que voc\xEA preencheu no formul\xE1rio?",type:"text"},{id:"special_chars",text:"Usou caracteres especiais ou emojis?",type:"boolean"}]},{id:"ui_error",condition:i=>i.errorType==="TypeError"||i.message.toLowerCase().includes("undefined")||i.message.toLowerCase().includes("null"),priority:4,questions:[{id:"clicked_what",text:"Voc\xEA clicou em algo espec\xEDfico?",type:"text"},{id:"page_loaded",text:"A p\xE1gina tinha carregado completamente?",type:"boolean"}]},{id:"load_error",condition:i=>i.message.toLowerCase().includes("chunk")||i.message.toLowerCase().includes("loading")||i.message.toLowerCase().includes("script"),priority:3,questions:[{id:"refreshed",text:"Voc\xEA tentou atualizar a p\xE1gina?",type:"boolean"},{id:"browser",text:"Qual navegador voc\xEA est\xE1 usando?",type:"select",options:["Chrome","Firefox","Safari","Edge","Outro"]}]}],ye=[{id:"happened_before",text:"Isso j\xE1 aconteceu antes?",type:"boolean"},{id:"additional_info",text:"Algo mais que possa nos ajudar?",type:"text",required:!1}],O=class{inferQuestions(e,t){let r={message:e,type:"error",httpCode:t==null?void 0:t.httpCode,errorType:t==null?void 0:t.errorType,stack:t==null?void 0:t.stack},n=ve.filter(a=>a.condition(r)).sort((a,l)=>l.priority-a.priority),o=[...be],s=new Set(o.map(a=>a.id));for(let a of n.slice(0,2))for(let l of a.questions)s.has(l.id)||(o.push(l),s.add(l.id));if(o.length<3)for(let a of ye)!s.has(a.id)&&o.length<4&&(o.push(a),s.add(a.id));return o.slice(0,4)}shouldShowWidget(e,t,r){if(r!==void 0)return r;if((t==null?void 0:t.httpCode)!==void 0&&(t.httpCode>=500||t.httpCode===400||t.httpCode===422))return!0;let n=["unexpected","critical","fatal","crash","failed to","cannot read","cannot access","undefined is not","null is not"],o=e.toLowerCase();return n.some(s=>o.includes(s))}};function ie(i){if(document.getElementById("blinker-widget-styles"))return;let e=document.createElement("style");e.id="blinker-widget-styles",e.textContent=oe(i),document.head.appendChild(e)}function re(){let i=document.getElementById("blinker-widget-styles");i&&i.remove()}function ne(i){let e=document.getElementById("blinker-widget-styles");e&&(e.textContent=oe(i))}function oe(i){return`
|
|
128
|
+
@keyframes blinker-breathe {
|
|
129
|
+
0%, 100% { transform: scale(1); }
|
|
130
|
+
50% { transform: scale(1.05); }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@keyframes blinker-pulse {
|
|
134
|
+
0%, 100% { opacity: 1; }
|
|
135
|
+
50% { opacity: 0.7; }
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@keyframes blinker-float {
|
|
139
|
+
0%, 100% { transform: translateY(0); }
|
|
140
|
+
50% { transform: translateY(-5px); }
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
@keyframes blinker-fade-in {
|
|
144
|
+
from { opacity: 0; transform: scale(0.8) translateY(20px); }
|
|
145
|
+
to { opacity: 1; transform: scale(1) translateY(0); }
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@keyframes blinker-fade-out {
|
|
149
|
+
from { opacity: 1; transform: scale(1) translateY(0); }
|
|
150
|
+
to { opacity: 0; transform: scale(0.8) translateY(20px); }
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
@keyframes blinker-slide-up {
|
|
154
|
+
from { opacity: 0; transform: translateY(30px); }
|
|
155
|
+
to { opacity: 1; transform: translateY(0); }
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
@keyframes blinker-eye-blink {
|
|
159
|
+
0%, 45%, 55%, 100% { transform: scaleY(1); }
|
|
160
|
+
50% { transform: scaleY(0.1); }
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
@keyframes blinker-glow {
|
|
164
|
+
0%, 100% { filter: drop-shadow(0 0 8px ${i.primary}40); }
|
|
165
|
+
50% { filter: drop-shadow(0 0 15px ${i.primary}60); }
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.blinker-widget-container {
|
|
169
|
+
position: fixed;
|
|
170
|
+
z-index: 999999;
|
|
171
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.blinker-widget-container.bottom-right {
|
|
175
|
+
bottom: 20px;
|
|
176
|
+
right: 20px;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.blinker-widget-container.bottom-left {
|
|
180
|
+
bottom: 20px;
|
|
181
|
+
left: 20px;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.blinker-avatar {
|
|
185
|
+
width: 60px;
|
|
186
|
+
height: 60px;
|
|
187
|
+
cursor: pointer;
|
|
188
|
+
animation: blinker-float 3s ease-in-out infinite, blinker-glow 2s ease-in-out infinite;
|
|
189
|
+
transition: transform 0.3s ease;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.blinker-avatar:hover {
|
|
193
|
+
transform: scale(1.1);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.blinker-avatar.minimized {
|
|
197
|
+
width: 40px;
|
|
198
|
+
height: 40px;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.blinker-avatar-body {
|
|
202
|
+
fill: ${i.primary};
|
|
203
|
+
animation: blinker-breathe 4s ease-in-out infinite;
|
|
204
|
+
transform-origin: center;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.blinker-avatar-eye {
|
|
208
|
+
fill: ${i.background};
|
|
209
|
+
animation: blinker-eye-blink 4s ease-in-out infinite;
|
|
210
|
+
transform-origin: center;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.blinker-avatar-eye-left {
|
|
214
|
+
animation-delay: 0.1s;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.blinker-avatar-pupil {
|
|
218
|
+
fill: ${i.text};
|
|
219
|
+
transition: transform 0.1s ease;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.blinker-avatar-mouth {
|
|
223
|
+
stroke: ${i.background};
|
|
224
|
+
stroke-width: 2;
|
|
225
|
+
fill: none;
|
|
226
|
+
stroke-linecap: round;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.blinker-avatar-glow {
|
|
230
|
+
fill: ${i.primary};
|
|
231
|
+
opacity: 0.3;
|
|
232
|
+
animation: blinker-pulse 2s ease-in-out infinite;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.blinker-dialog-overlay {
|
|
236
|
+
position: fixed;
|
|
237
|
+
top: 0;
|
|
238
|
+
left: 0;
|
|
239
|
+
right: 0;
|
|
240
|
+
bottom: 0;
|
|
241
|
+
background: rgba(0, 0, 0, 0.3);
|
|
242
|
+
z-index: 999998;
|
|
243
|
+
animation: blinker-fade-in 0.3s ease;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.blinker-dialog {
|
|
247
|
+
position: fixed;
|
|
248
|
+
z-index: 999999;
|
|
249
|
+
width: 340px;
|
|
250
|
+
max-width: calc(100vw - 40px);
|
|
251
|
+
background: ${i.background};
|
|
252
|
+
border-radius: 16px;
|
|
253
|
+
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
|
|
254
|
+
animation: blinker-slide-up 0.4s ease;
|
|
255
|
+
overflow: hidden;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.blinker-dialog.bottom-right {
|
|
259
|
+
bottom: 90px;
|
|
260
|
+
right: 20px;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.blinker-dialog.bottom-left {
|
|
264
|
+
bottom: 90px;
|
|
265
|
+
left: 20px;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.blinker-dialog-header {
|
|
269
|
+
padding: 20px 20px 0;
|
|
270
|
+
display: flex;
|
|
271
|
+
align-items: flex-start;
|
|
272
|
+
gap: 12px;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.blinker-dialog-avatar {
|
|
276
|
+
width: 40px;
|
|
277
|
+
height: 40px;
|
|
278
|
+
flex-shrink: 0;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.blinker-dialog-title {
|
|
282
|
+
flex: 1;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.blinker-dialog-greeting {
|
|
286
|
+
font-size: 16px;
|
|
287
|
+
font-weight: 600;
|
|
288
|
+
color: ${i.text};
|
|
289
|
+
margin: 0 0 4px;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.blinker-dialog-subtext {
|
|
293
|
+
font-size: 13px;
|
|
294
|
+
color: ${i.text}99;
|
|
295
|
+
margin: 0;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
.blinker-dialog-close {
|
|
299
|
+
background: none;
|
|
300
|
+
border: none;
|
|
301
|
+
padding: 4px;
|
|
302
|
+
cursor: pointer;
|
|
303
|
+
color: ${i.text}66;
|
|
304
|
+
border-radius: 6px;
|
|
305
|
+
transition: all 0.2s;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.blinker-dialog-close:hover {
|
|
309
|
+
background: ${i.text}10;
|
|
310
|
+
color: ${i.text};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
.blinker-dialog-body {
|
|
314
|
+
padding: 20px;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.blinker-question {
|
|
318
|
+
margin-bottom: 16px;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.blinker-question:last-child {
|
|
322
|
+
margin-bottom: 0;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.blinker-question-label {
|
|
326
|
+
display: block;
|
|
327
|
+
font-size: 14px;
|
|
328
|
+
font-weight: 500;
|
|
329
|
+
color: ${i.text};
|
|
330
|
+
margin-bottom: 8px;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.blinker-question-input {
|
|
334
|
+
width: 100%;
|
|
335
|
+
padding: 10px 12px;
|
|
336
|
+
border: 1px solid ${i.text}20;
|
|
337
|
+
border-radius: 8px;
|
|
338
|
+
font-size: 14px;
|
|
339
|
+
color: ${i.text};
|
|
340
|
+
background: ${i.background};
|
|
341
|
+
transition: border-color 0.2s, box-shadow 0.2s;
|
|
342
|
+
box-sizing: border-box;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
.blinker-question-input:focus {
|
|
346
|
+
outline: none;
|
|
347
|
+
border-color: ${i.primary};
|
|
348
|
+
box-shadow: 0 0 0 3px ${i.primary}20;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
.blinker-question-input::placeholder {
|
|
352
|
+
color: ${i.text}50;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
.blinker-question-textarea {
|
|
356
|
+
resize: vertical;
|
|
357
|
+
min-height: 80px;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
.blinker-question-select {
|
|
361
|
+
appearance: none;
|
|
362
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
|
|
363
|
+
background-repeat: no-repeat;
|
|
364
|
+
background-position: right 12px center;
|
|
365
|
+
padding-right: 36px;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
.blinker-question-boolean {
|
|
369
|
+
display: flex;
|
|
370
|
+
gap: 8px;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.blinker-question-boolean button {
|
|
374
|
+
flex: 1;
|
|
375
|
+
padding: 10px;
|
|
376
|
+
border: 1px solid ${i.text}20;
|
|
377
|
+
border-radius: 8px;
|
|
378
|
+
background: ${i.background};
|
|
379
|
+
color: ${i.text};
|
|
380
|
+
font-size: 14px;
|
|
381
|
+
cursor: pointer;
|
|
382
|
+
transition: all 0.2s;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
.blinker-question-boolean button:hover {
|
|
386
|
+
border-color: ${i.primary};
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
.blinker-question-boolean button.selected {
|
|
390
|
+
background: ${i.primary};
|
|
391
|
+
border-color: ${i.primary};
|
|
392
|
+
color: white;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.blinker-dialog-footer {
|
|
396
|
+
padding: 16px 20px 20px;
|
|
397
|
+
display: flex;
|
|
398
|
+
gap: 8px;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
.blinker-btn {
|
|
402
|
+
flex: 1;
|
|
403
|
+
padding: 12px 16px;
|
|
404
|
+
border-radius: 8px;
|
|
405
|
+
font-size: 14px;
|
|
406
|
+
font-weight: 500;
|
|
407
|
+
cursor: pointer;
|
|
408
|
+
transition: all 0.2s;
|
|
409
|
+
border: none;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
.blinker-btn-primary {
|
|
413
|
+
background: ${i.accent};
|
|
414
|
+
color: white;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
.blinker-btn-primary:hover {
|
|
418
|
+
filter: brightness(1.1);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
.blinker-btn-primary:disabled {
|
|
422
|
+
opacity: 0.5;
|
|
423
|
+
cursor: not-allowed;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
.blinker-btn-secondary {
|
|
427
|
+
background: ${i.text}10;
|
|
428
|
+
color: ${i.text}99;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
.blinker-btn-secondary:hover {
|
|
432
|
+
background: ${i.text}20;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
.blinker-thank-you {
|
|
436
|
+
text-align: center;
|
|
437
|
+
padding: 40px 20px;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
.blinker-thank-you-icon {
|
|
441
|
+
width: 48px;
|
|
442
|
+
height: 48px;
|
|
443
|
+
margin: 0 auto 16px;
|
|
444
|
+
color: ${i.accent};
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
.blinker-thank-you-text {
|
|
448
|
+
font-size: 16px;
|
|
449
|
+
color: ${i.text};
|
|
450
|
+
margin: 0;
|
|
451
|
+
}
|
|
452
|
+
`}var se="blinker_widget_state",S=class{constructor(e){this.container=null;this.avatar=null;this.dialog=null;this.onFeedbackSubmit=null;this.config={...R,...e},this.state=this.loadState(),this.questionEngine=new O}init(e){this.config.enabled&&typeof document!="undefined"&&(this.onFeedbackSubmit=e||null,ie(this.config.theme),this.createContainer())}createContainer(){if(this.container)return;this.container=document.createElement("div"),this.container.className=`blinker-widget-container ${this.config.position}`,document.body.appendChild(this.container),this.avatar=new $(this.config.theme,()=>this.handleAvatarClick());let e=this.avatar.create();this.container.appendChild(e),this.dialog=new W(this.config,t=>this.handleFeedbackSubmit(t),()=>this.handleDialogClose()),this.hide()}show(e,t,r,n){if(!this.config.enabled||!this.container||!this.avatar||!this.questionEngine.shouldShowWidget(t,r,n)||!this.canShowWidget())return;let s=this.questionEngine.inferQuestions(t,r);this.state.currentErrorId=e,this.state.questions=s,this.state.isVisible=!0,this.state.showCount++,this.state.lastShowTime=Date.now(),this.saveState(),this.container.style.display="block",this.avatar.setMinimized(!1)}hide(){this.container&&(this.state.isVisible=!1,this.state.isDialogOpen=!1,this.container.style.display="none")}handleAvatarClick(){var e;!this.dialog||!this.state.currentErrorId||(this.state.isDialogOpen?this.dialog.close():(this.state.isDialogOpen=!0,this.dialog.open(this.state.currentErrorId,this.state.questions),(e=this.avatar)==null||e.setMinimized(!0)))}handleFeedbackSubmit(e){this.onFeedbackSubmit&&this.onFeedbackSubmit(e)}handleDialogClose(){var e;this.state.isDialogOpen=!1,(e=this.avatar)==null||e.setMinimized(!1),setTimeout(()=>{this.hide()},500)}canShowWidget(){if(this.state.showCount>=this.config.maxShowsPerSession)return!1;if(this.state.lastShowTime){let e=this.config.cooldownMinutes*60*1e3;if(Date.now()-this.state.lastShowTime<e)return!1}return!0}loadState(){let e={isVisible:!1,isMinimized:!1,isDialogOpen:!1,currentErrorId:null,questions:[],showCount:0,lastShowTime:null};if(typeof sessionStorage=="undefined")return e;try{let t=sessionStorage.getItem(se);if(t){let r=JSON.parse(t);return{...e,showCount:r.showCount||0,lastShowTime:r.lastShowTime||null}}}catch(t){}return e}saveState(){if(typeof sessionStorage!="undefined")try{sessionStorage.setItem(se,JSON.stringify({showCount:this.state.showCount,lastShowTime:this.state.lastShowTime}))}catch(e){}}updateConfig(e){var t,r;this.config={...this.config,...e},e.theme&&(ne(this.config.theme),(t=this.avatar)==null||t.updateTheme(this.config.theme)),(r=this.dialog)==null||r.updateConfig(this.config)}getConfig(){return{...this.config}}isVisible(){return this.state.isVisible}isDialogOpen(){return this.state.isDialogOpen}destroy(){var e,t;(e=this.avatar)==null||e.destroy(),(t=this.dialog)==null||t.close(),this.container&&(this.container.remove(),this.container=null),re(),this.avatar=null,this.dialog=null}};var m=class{constructor(){this.config=null;this.initialized=!1;this.filterEngine=null;this.queue=null;this.sessionManager=null;this.userContext=null;this.rateLimiter=null;this.sampler=null;this.deduplicator=null;this.widget=null}init(e){var r,n;if(this.initialized){d().warn("SDK already initialized");return}if(!e.token)throw new Error("[Blinker] Token is required");this.config={...h,...e},B((r=this.config.debug)!=null?r:!1);let t=d();this.filterEngine=new E(e.filters),t.log("Filter engine initialized"),this.queue=new T(e.token,{enableBatching:this.config.enableBatching,batchSize:this.config.batchSize,flushInterval:this.config.flushInterval,enableOfflineStorage:this.config.enableOfflineStorage,maxStoredEvents:this.config.maxStoredEvents}),t.log("Event queue initialized"),this.sessionManager=new I,this.userContext=new L(this.sessionManager),t.log("Context managers initialized"),this.rateLimiter=new M(this.config.maxEventsPerMinute),this.sampler=new q(this.config.sampleRate),t.log("Sampling modules initialized"),this.deduplicator=new A(this.config.enableDeduplication,this.config.deduplicationWindow),t.log("Deduplicator initialized"),(this.config.captureErrors||this.config.captureRejections)&&(ee((o,s,a)=>this.handleCapturedError(o,s,a),{captureErrors:this.config.captureErrors,captureRejections:this.config.captureRejections}),t.log("Error handlers set up")),(n=this.config.widget)!=null&&n.enabled&&(this.widget=new S(this.config.widget),this.widget.init(o=>this.handleWidgetFeedback(o)),t.log("Widget initialized")),this.initialized=!0,t.log("SDK initialized successfully")}handleCapturedError(e,t,r){var s,a,l,u,c;if(!((s=this.filterEngine)!=null&&s.shouldCapture(t,r.errorType,r.httpCode)))return;let n=(a=this.deduplicator)==null?void 0:a.check(t,r.stack);if(n&&!n.shouldSend)return;let o=v();this.track(e,t,{...r,errorId:o,count:n==null?void 0:n.count}),this.widget&&((u=(l=this.config)==null?void 0:l.widget)!=null&&u.enabled)&&setTimeout(()=>{var b;(b=this.widget)==null||b.show(o,t,r)},(c=this.config.widget.delay)!=null?c:2e3)}handleWidgetFeedback(e){d().log("Widget feedback received:",e.errorId),this.track("feedback","User feedback submitted",{errorId:e.errorId,answers:e.answers,submittedAt:e.submittedAt})}track(e,t,r){var l,u,c;if(!this.initialized||!this.config)return Promise.resolve({success:!1,error:"SDK not initialized"});let n=d(),o=e==="error";if(!((l=this.rateLimiter)!=null&&l.allow()))return n.log("Event dropped due to rate limit"),Promise.resolve({success:!1,error:"Rate limited"});if(!((u=this.sampler)!=null&&u.shouldSample(o)))return Promise.resolve({success:!0,error:"Sampled out"});let s=(c=this.userContext)==null?void 0:c.getEventContext(),a={id:v(),type:e,message:t,payload:r,timestamp:new Date().toISOString(),url:V(),userAgent:j(),sessionId:s==null?void 0:s.sessionId,userId:s==null?void 0:s.userId,userTraits:s==null?void 0:s.userTraits,context:s==null?void 0:s.custom};return n.log("Tracking event:",e,t.substring(0,50)),this.queue.add(a)}captureError(e,t){var u,c;let r=e instanceof Error?e.message:e,n=e instanceof Error?e.name:void 0,o=e instanceof Error?e.stack:void 0,s=t==null?void 0:t.httpCode;if(!((u=this.filterEngine)!=null&&u.shouldCapture(r,n,s)))return Promise.resolve({success:!0,error:"Filtered out"});let a=(c=this.deduplicator)==null?void 0:c.check(r,o);if(a&&!a.shouldSend)return Promise.resolve({success:!0,error:"Deduplicated"});let l={...t,errorType:n,stack:o,count:a==null?void 0:a.count};return this.track("error",r,l)}trackPageView(e,t){var n;let r=e||G();return(n=this.sessionManager)==null||n.recordPageView(),this.track("pageview",r,{...t,referrer:Y()})}identify(e,t){var r;(r=this.userContext)==null||r.identify(e,t)}setContext(e,t){var r;(r=this.userContext)==null||r.setContext(e,t)}getContext(){var e,t;return(t=(e=this.userContext)==null?void 0:e.getCustomContext())!=null?t:{}}clearContext(){var e;(e=this.userContext)==null||e.clearAll()}getSessionId(){var e,t;return(t=(e=this.sessionManager)==null?void 0:e.getSessionId())!=null?t:""}getSession(){var e,t;return(t=(e=this.sessionManager)==null?void 0:e.getSession())!=null?t:null}async flush(){var e;await((e=this.queue)==null?void 0:e.flush())}getQueueSize(){var e,t;return(t=(e=this.queue)==null?void 0:e.size())!=null?t:0}isInitialized(){return this.initialized}getConfig(){if(!this.config)return null;let{token:e,...t}=this.config;return t}getFilters(){var e,t;return(t=(e=this.filterEngine)==null?void 0:e.getFilters())!=null?t:{...p}}showWidget(e,t,r){var n;(n=this.widget)==null||n.show(e,t,r)}hideWidget(){var e;(e=this.widget)==null||e.hide()}getWidgetConfig(){var e,t;return(t=(e=this.widget)==null?void 0:e.getConfig())!=null?t:null}updateWidgetConfig(e){var t;(t=this.widget)==null||t.updateConfig(e)}isWidgetVisible(){var e,t;return(t=(e=this.widget)==null?void 0:e.isVisible())!=null?t:!1}destroy(){var t,r,n,o;let e=d();(t=this.queue)==null||t.destroy(),te(),(r=this.deduplicator)==null||r.destroy(),(n=this.sessionManager)==null||n.endSession(),(o=this.widget)==null||o.destroy(),this.config=null,this.initialized=!1,this.filterEngine=null,this.queue=null,this.sessionManager=null,this.userContext=null,this.rateLimiter=null,this.sampler=null,this.deduplicator=null,this.widget=null,e.log("SDK destroyed"),B(!1)}};var ae=new m;var ke=ae;return pe(xe);})();
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { DeduplicationEntry } from './types';
|
|
2
|
+
export interface DeduplicationResult {
|
|
3
|
+
shouldSend: boolean;
|
|
4
|
+
fingerprint: string;
|
|
5
|
+
count: number;
|
|
6
|
+
isDuplicate: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class Deduplicator {
|
|
9
|
+
private enabled;
|
|
10
|
+
private windowMs;
|
|
11
|
+
private entries;
|
|
12
|
+
private cleanupTimer;
|
|
13
|
+
constructor(enabled?: boolean, windowMs?: number);
|
|
14
|
+
check(message: string, stack?: string): DeduplicationResult;
|
|
15
|
+
getCount(fingerprint: string): number;
|
|
16
|
+
flush(): DeduplicationEntry[];
|
|
17
|
+
private startCleanup;
|
|
18
|
+
private cleanup;
|
|
19
|
+
destroy(): void;
|
|
20
|
+
getStats(): {
|
|
21
|
+
entries: number;
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
windowMs: number;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=deduplication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deduplication.d.ts","sourceRoot":"","sources":["../../src/capture/deduplication.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAKlD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,YAAY,CAA+C;gBAEvD,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM;IAShD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAiD3D,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIrC,KAAK,IAAI,kBAAkB,EAAE;IAM7B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,OAAO;IAiBf,OAAO,IAAI,IAAI;IAQf,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAOpE"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ErrorCallback, ErrorHandlerOptions } from './types';
|
|
2
|
+
export declare function setupErrorHandlers(callback: ErrorCallback, options?: ErrorHandlerOptions): void;
|
|
3
|
+
export declare function teardownErrorHandlers(): void;
|
|
4
|
+
export declare function isErrorHandlersSetup(): boolean;
|
|
5
|
+
//# sourceMappingURL=errorHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/capture/errorHandler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAQlE,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,mBAAwB,GAChC,IAAI,CA+EN;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAoB5C;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/capture/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BlinkerErrorPayload } from '../core/types';
|
|
2
|
+
export type ErrorCallback = (type: string, message: string, payload: BlinkerErrorPayload) => void;
|
|
3
|
+
export interface ErrorHandlerOptions {
|
|
4
|
+
captureErrors?: boolean;
|
|
5
|
+
captureRejections?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface DeduplicationEntry {
|
|
8
|
+
fingerprint: string;
|
|
9
|
+
firstSeen: number;
|
|
10
|
+
count: number;
|
|
11
|
+
lastSeen: number;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/capture/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,KACzB,IAAI,CAAC;AAEV,MAAM,WAAW,mBAAmB;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SessionInfo } from './types';
|
|
2
|
+
export declare class SessionManager {
|
|
3
|
+
private session;
|
|
4
|
+
private readonly storageKey;
|
|
5
|
+
private storageAvailable;
|
|
6
|
+
constructor();
|
|
7
|
+
private initSession;
|
|
8
|
+
getSessionId(): string;
|
|
9
|
+
getSession(): SessionInfo;
|
|
10
|
+
recordPageView(): void;
|
|
11
|
+
touch(): void;
|
|
12
|
+
getDuration(): number;
|
|
13
|
+
private persist;
|
|
14
|
+
endSession(): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=SessionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/context/SessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAM3C,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IACnD,OAAO,CAAC,gBAAgB,CAAU;;IAOlC,OAAO,CAAC,WAAW;IA2BnB,YAAY,IAAI,MAAM;IAItB,UAAU,IAAI,WAAW;IAOzB,cAAc,IAAI,IAAI;IAQtB,KAAK,IAAI,IAAI;IAOb,WAAW,IAAI,MAAM;IAMrB,OAAO,CAAC,OAAO;IAUf,UAAU,IAAI,IAAI;CAUnB"}
|