@openreplay/tracker 17.2.4 → 17.2.6

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/dist/cjs/entry.js CHANGED
@@ -1746,7 +1746,7 @@ class CanvasRecorder {
1746
1746
  setTimeout(() => {
1747
1747
  this.app.nodes.scanTree(this.captureCanvas);
1748
1748
  this.app.nodes.attachNodeCallback(this.captureCanvas);
1749
- }, 250);
1749
+ }, 125);
1750
1750
  }
1751
1751
  sendSnaps(images, canvasId, createdAt) {
1752
1752
  if (Object.keys(this.snapshots).length === 0) {
@@ -1777,14 +1777,20 @@ class CanvasRecorder {
1777
1777
  }
1778
1778
  async uploadBatch(images, canvasId, createdAt) {
1779
1779
  if (this.options.isDebug) {
1780
- const fileEntries = [];
1781
- images.forEach((snapshot) => {
1782
- if (!snapshot.data)
1783
- return;
1784
- fileEntries.push({ data: snapshot.data, name: `${createdAt}_${canvasId}_${snapshot.id}.${this.fileExt}` });
1785
- });
1786
- void saveArchive(fileEntries, `canvas_${canvasId}_${createdAt}`);
1787
- return;
1780
+ const packed = await packFrames(images);
1781
+ if (packed) {
1782
+ const fileName = `${createdAt}_${canvasId}.${this.fileExt}.frames`;
1783
+ const url = URL.createObjectURL(new Blob([packed]));
1784
+ const link = document.createElement('a');
1785
+ link.href = url;
1786
+ link.download = fileName;
1787
+ link.style.display = 'none';
1788
+ document.body.appendChild(link);
1789
+ link.click();
1790
+ document.body.removeChild(link);
1791
+ URL.revokeObjectURL(url);
1792
+ }
1793
+ // fall through to also send to backend
1788
1794
  }
1789
1795
  let formData;
1790
1796
  if (this.options.framesSupport) {
@@ -1929,80 +1935,36 @@ function captureSnapshot(canvas, quality = 'medium', dummy, fixedScaling = false
1929
1935
  canvas.toBlob(onBlob, imageFormat, qualityInt[quality]);
1930
1936
  }
1931
1937
  }
1932
- async function saveArchive(files, archiveName) {
1933
- const zipBlob = await createZipBlob(files);
1934
- const url = URL.createObjectURL(zipBlob);
1935
- const link = document.createElement('a');
1936
- link.href = url;
1937
- link.download = `${archiveName}.zip`;
1938
- link.style.display = 'none';
1939
- document.body.appendChild(link);
1940
- link.click();
1941
- document.body.removeChild(link);
1942
- URL.revokeObjectURL(url);
1943
- }
1944
- async function createZipBlob(files) {
1945
- const parts = [];
1946
- const centralDir = [];
1938
+ async function packFrames(images) {
1939
+ const buffers = [];
1940
+ let totalSize = 0;
1941
+ for (const snapshot of images) {
1942
+ if (!snapshot.data)
1943
+ continue;
1944
+ const ab = await snapshot.data.arrayBuffer();
1945
+ buffers.push(ab);
1946
+ totalSize += 8 + 4 + ab.byteLength;
1947
+ }
1948
+ if (totalSize === 0)
1949
+ return null;
1950
+ const packed = new ArrayBuffer(totalSize);
1951
+ const view = new DataView(packed);
1952
+ const bytes = new Uint8Array(packed);
1947
1953
  let offset = 0;
1948
- for (const file of files) {
1949
- const nameBytes = new TextEncoder().encode(file.name);
1950
- const dataBytes = new Uint8Array(await file.data.arrayBuffer());
1951
- const crc = crc32(dataBytes);
1952
- // Local file header (30 bytes + filename)
1953
- const local = new Uint8Array(30 + nameBytes.length);
1954
- const lv = new DataView(local.buffer);
1955
- lv.setUint32(0, 0x04034b50, true);
1956
- lv.setUint16(4, 20, true);
1957
- lv.setUint16(8, 0, true);
1958
- lv.setUint32(14, crc, true);
1959
- lv.setUint32(18, dataBytes.length, true);
1960
- lv.setUint32(22, dataBytes.length, true);
1961
- lv.setUint16(26, nameBytes.length, true);
1962
- local.set(nameBytes, 30);
1963
- // Central directory entry (46 bytes + filename)
1964
- const cd = new Uint8Array(46 + nameBytes.length);
1965
- const cv = new DataView(cd.buffer);
1966
- cv.setUint32(0, 0x02014b50, true);
1967
- cv.setUint16(4, 20, true);
1968
- cv.setUint16(6, 20, true);
1969
- cv.setUint32(16, crc, true);
1970
- cv.setUint32(20, dataBytes.length, true);
1971
- cv.setUint32(24, dataBytes.length, true);
1972
- cv.setUint16(28, nameBytes.length, true);
1973
- cv.setUint32(42, offset, true);
1974
- cd.set(nameBytes, 46);
1975
- parts.push(local);
1976
- parts.push(dataBytes);
1977
- centralDir.push(cd);
1978
- offset += local.length + dataBytes.length;
1979
- }
1980
- const cdOffset = offset;
1981
- let cdSize = 0;
1982
- for (const entry of centralDir) {
1983
- parts.push(entry);
1984
- cdSize += entry.length;
1985
- }
1986
- // End of central directory (22 bytes)
1987
- const eocd = new Uint8Array(22);
1988
- const ev = new DataView(eocd.buffer);
1989
- ev.setUint32(0, 0x06054b50, true);
1990
- ev.setUint16(8, files.length, true);
1991
- ev.setUint16(10, files.length, true);
1992
- ev.setUint32(12, cdSize, true);
1993
- ev.setUint32(16, cdOffset, true);
1994
- parts.push(eocd);
1995
- return new Blob(parts, { type: 'application/zip' });
1996
- }
1997
- function crc32(data) {
1998
- let crc = 0xffffffff;
1999
- for (let i = 0; i < data.length; i++) {
2000
- crc ^= data[i];
2001
- for (let j = 0; j < 8; j++) {
2002
- crc = (crc >>> 1) ^ (crc & 1 ? 0xedb88320 : 0);
2003
- }
2004
- }
2005
- return (crc ^ 0xffffffff) >>> 0;
1954
+ for (let i = 0; i < images.length; i++) {
1955
+ if (!images[i].data)
1956
+ continue;
1957
+ const ab = buffers.shift();
1958
+ const ts = images[i].id;
1959
+ view.setUint32(offset, ts % 0x100000000, true);
1960
+ view.setUint32(offset + 4, Math.floor(ts / 0x100000000), true);
1961
+ offset += 8;
1962
+ view.setUint32(offset, ab.byteLength, true);
1963
+ offset += 4;
1964
+ bytes.set(new Uint8Array(ab), offset);
1965
+ offset += ab.byteLength;
1966
+ }
1967
+ return packed;
2006
1968
  }
2007
1969
 
2008
1970
  const LogLevel = {
@@ -3852,7 +3814,7 @@ class App {
3852
3814
  this.stopCallbacks = [];
3853
3815
  this.commitCallbacks = [];
3854
3816
  this.activityState = ActivityState.NotActive;
3855
- this.version = '17.2.4'; // TODO: version compatability check inside each plugin.
3817
+ this.version = '17.2.6'; // TODO: version compatability check inside each plugin.
3856
3818
  this.socketMode = false;
3857
3819
  this.compressionThreshold = 24 * 1000;
3858
3820
  this.bc = null;
@@ -3877,6 +3839,9 @@ class App {
3877
3839
  if (this.active())
3878
3840
  return;
3879
3841
  try {
3842
+ if (data.token) {
3843
+ this.session.setSessionToken(data.token, this.projectKey);
3844
+ }
3880
3845
  this.allowAppStart();
3881
3846
  void this.start();
3882
3847
  }
@@ -4017,8 +3982,12 @@ class App {
4017
3982
  }
4018
3983
  if (this.pollingQueue[nextCommand].includes(data.context)) {
4019
3984
  this.pollingQueue[nextCommand] = this.pollingQueue[nextCommand].filter((c) => c !== data.context);
3985
+ const message = { line: nextCommand };
3986
+ if (nextCommand === proto.startIframe) {
3987
+ message.token = this.session.getSessionToken(this.projectKey);
3988
+ }
4020
3989
  // @ts-ignore
4021
- event.source?.postMessage({ line: nextCommand }, '*');
3990
+ event.source?.postMessage(message, '*');
4022
3991
  if (this.pollingQueue[nextCommand].length === 0) {
4023
3992
  this.pollingQueue.order.shift();
4024
3993
  }
@@ -5036,7 +5005,6 @@ class App {
5036
5005
  if (startOpts.startCallback) {
5037
5006
  startOpts.startCallback(SuccessfulStart(onStartInfo));
5038
5007
  }
5039
- await this.tagWatcher.fetchTags(this.options.ingestPoint, token);
5040
5008
  this.activityState = ActivityState.Active;
5041
5009
  if (this.options.crossdomain?.enabled) {
5042
5010
  void this.bootChildrenFrames();
@@ -5073,6 +5041,7 @@ class App {
5073
5041
  }
5074
5042
  this.ticker.start();
5075
5043
  this.canvasRecorder?.startTracking();
5044
+ void this.tagWatcher.fetchTags(this.options.ingestPoint, token);
5076
5045
  return SuccessfulStart(onStartInfo);
5077
5046
  }
5078
5047
  catch (reason) {
@@ -6176,7 +6145,7 @@ function getUniqueSiblingClass(el) {
6176
6145
  return null;
6177
6146
  }
6178
6147
 
6179
- var e,o=-1,a=function(e){addEventListener("pageshow",(function(n){n.persisted&&(o=n.timeStamp,e(n));}),true);},c=function(){var e=self.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},u=function(){var e=c();return e&&e.activationStart||0},f=function(e,n){var t=c(),r="navigate";o>=0?r="back-forward-cache":t&&(document.prerendering||u()>0?r="prerender":document.wasDiscarded?r="restore":t.type&&(r=t.type.replace(/_/g,"-")));return {name:e,value:void 0===n?-1:n,rating:"good",delta:0,entries:[],id:"v4-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:r}},s=function(e,n,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){var r=new PerformanceObserver((function(e){Promise.resolve().then((function(){n(e.getEntries());}));}));return r.observe(Object.assign({type:e,buffered:!0},t||{})),r}}catch(e){}},d=function(e,n,t,r){var i,o;return function(a){n.value>=0&&(a||r)&&((o=n.value-(i||0))||void 0===i)&&(i=n.value,n.delta=o,n.rating=function(e,n){return e>n[1]?"poor":e>n[0]?"needs-improvement":"good"}(n.value,t),e(n));}},l=function(e){requestAnimationFrame((function(){return requestAnimationFrame((function(){return e()}))}));},p=function(e){document.addEventListener("visibilitychange",(function(){"hidden"===document.visibilityState&&e();}));},v=function(e){var n=false;return function(){n||(e(),n=true);}},m=-1,h=function(){return "hidden"!==document.visibilityState||document.prerendering?1/0:0},g=function(e){"hidden"===document.visibilityState&&m>-1&&(m="visibilitychange"===e.type?e.timeStamp:0,T());},y=function(){addEventListener("visibilitychange",g,true),addEventListener("prerenderingchange",g,true);},T=function(){removeEventListener("visibilitychange",g,true),removeEventListener("prerenderingchange",g,true);},E=function(){return m<0&&(m=h(),y(),a((function(){setTimeout((function(){m=h(),y();}),0);}))),{get firstHiddenTime(){return m}}},C=function(e){document.prerendering?addEventListener("prerenderingchange",(function(){return e()}),true):e();},b=[1800,3e3],S=function(e,n){n=n||{},C((function(){var t,r=E(),i=f("FCP"),o=s("paint",(function(e){e.forEach((function(e){"first-contentful-paint"===e.name&&(o.disconnect(),e.startTime<r.firstHiddenTime&&(i.value=Math.max(e.startTime-u(),0),i.entries.push(e),t(true)));}));}));o&&(t=d(e,i,b,n.reportAllChanges),a((function(r){i=f("FCP"),t=d(e,i,b,n.reportAllChanges),l((function(){i.value=performance.now()-r.timeStamp,t(true);}));})));}));},L=[.1,.25],w=function(e,n){n=n||{},S(v((function(){var t,r=f("CLS",0),i=0,o=[],c=function(e){e.forEach((function(e){if(!e.hadRecentInput){var n=o[0],t=o[o.length-1];i&&e.startTime-t.startTime<1e3&&e.startTime-n.startTime<5e3?(i+=e.value,o.push(e)):(i=e.value,o=[e]);}})),i>r.value&&(r.value=i,r.entries=o,t());},u=s("layout-shift",c);u&&(t=d(e,r,L,n.reportAllChanges),p((function(){c(u.takeRecords()),t(true);})),a((function(){i=0,r=f("CLS",0),t=d(e,r,L,n.reportAllChanges),l((function(){return t()}));})),setTimeout(t,0));})));},A=0,I=1/0,P=0,M=function(e){e.forEach((function(e){e.interactionId&&(I=Math.min(I,e.interactionId),P=Math.max(P,e.interactionId),A=P?(P-I)/7+1:0);}));},k=function(){return e?A:performance.interactionCount||0},F=function(){"interactionCount"in performance||e||(e=s("event",M,{type:"event",buffered:true,durationThreshold:0}));},D=[],x=new Map,R=0,B=function(){var e=Math.min(D.length-1,Math.floor((k()-R)/50));return D[e]},H=[],q=function(e){if(H.forEach((function(n){return n(e)})),e.interactionId||"first-input"===e.entryType){var n=D[D.length-1],t=x.get(e.interactionId);if(t||D.length<10||e.duration>n.latency){if(t)e.duration>t.latency?(t.entries=[e],t.latency=e.duration):e.duration===t.latency&&e.startTime===t.entries[0].startTime&&t.entries.push(e);else {var r={id:e.interactionId,latency:e.duration,entries:[e]};x.set(r.id,r),D.push(r);}D.sort((function(e,n){return n.latency-e.latency})),D.length>10&&D.splice(10).forEach((function(e){return x.delete(e.id)}));}}},O=function(e){var n=self.requestIdleCallback||self.setTimeout,t=-1;return e=v(e),"hidden"===document.visibilityState?e():(t=n(e),p(e)),t},N=[200,500],j=function(e,n){"PerformanceEventTiming"in self&&"interactionId"in PerformanceEventTiming.prototype&&(n=n||{},C((function(){var t;F();var r,i=f("INP"),o=function(e){O((function(){e.forEach(q);var n=B();n&&n.latency!==i.value&&(i.value=n.latency,i.entries=n.entries,r());}));},c=s("event",o,{durationThreshold:null!==(t=n.durationThreshold)&&void 0!==t?t:40});r=d(e,i,N,n.reportAllChanges),c&&(c.observe({type:"first-input",buffered:true}),p((function(){o(c.takeRecords()),r(true);})),a((function(){R=k(),D.length=0,x.clear(),i=f("INP"),r=d(e,i,N,n.reportAllChanges);})));})));},_=[2500,4e3],z={},G=function(e,n){n=n||{},C((function(){var t,r=E(),i=f("LCP"),o=function(e){n.reportAllChanges||(e=e.slice(-1)),e.forEach((function(e){e.startTime<r.firstHiddenTime&&(i.value=Math.max(e.startTime-u(),0),i.entries=[e],t());}));},c=s("largest-contentful-paint",o);if(c){t=d(e,i,_,n.reportAllChanges);var m=v((function(){z[i.id]||(o(c.takeRecords()),c.disconnect(),z[i.id]=true,t(true));}));["keydown","click"].forEach((function(e){addEventListener(e,(function(){return O(m)}),{once:true,capture:true});})),p(m),a((function(r){i=f("LCP"),t=d(e,i,_,n.reportAllChanges),l((function(){i.value=performance.now()-r.timeStamp,z[i.id]=true,t(true);}));}));}}));},J=[800,1800],K=function e(n){document.prerendering?C((function(){return e(n)})):"complete"!==document.readyState?addEventListener("load",(function(){return e(n)}),true):setTimeout(n,0);},Q=function(e,n){n=n||{};var t=f("TTFB"),r=d(e,t,J,n.reportAllChanges);K((function(){var i=c();i&&(t.value=Math.max(i.responseStart-u(),0),t.entries=[i],r(true),a((function(){t=f("TTFB",0),(r=d(e,t,J,n.reportAllChanges))(true);})));}));};
6148
+ let e=-1;const t=t=>{addEventListener("pageshow",(n=>{n.persisted&&(e=n.timeStamp,t(n));}),true);},n=(e,t,n,i)=>{let s,o;return r=>{t.value>=0&&(r||i)&&(o=t.value-(s??0),(o||void 0===s)&&(s=t.value,t.delta=o,t.rating=((e,t)=>e>t[1]?"poor":e>t[0]?"needs-improvement":"good")(t.value,n),e(t)));}},i=e=>{requestAnimationFrame((()=>requestAnimationFrame((()=>e()))));},s=()=>{const e=performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},o=()=>{const e=s();return e?.activationStart??0},r=(t,n=-1)=>{const i=s();let r="navigate";e>=0?r="back-forward-cache":i&&(document.prerendering||o()>0?r="prerender":document.wasDiscarded?r="restore":i.type&&(r=i.type.replace(/_/g,"-")));return {name:t,value:n,rating:"good",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},c=new WeakMap;function a(e,t){return c.get(e)||c.set(e,new t),c.get(e)}class d{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],n=this.o.at(-1);this.i&&t&&n&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e);}}const h=(e,t,n={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const i=new PerformanceObserver((e=>{Promise.resolve().then((()=>{t(e.getEntries());}));}));return i.observe({type:e,buffered:!0,...n}),i}}catch{}},f=e=>{let t=false;return ()=>{t||(e(),t=true);}};let u=-1;const l=new Set,m=()=>"hidden"!==document.visibilityState||document.prerendering?1/0:0,p=e=>{if("hidden"===document.visibilityState){if("visibilitychange"===e.type)for(const e of l)e();isFinite(u)||(u="visibilitychange"===e.type?e.timeStamp:0,removeEventListener("prerenderingchange",p,true));}},v=()=>{if(u<0){const e=o(),n=document.prerendering?void 0:globalThis.performance.getEntriesByType("visibility-state").filter((t=>"hidden"===t.name&&t.startTime>e))[0]?.startTime;u=n??m(),addEventListener("visibilitychange",p,true),addEventListener("prerenderingchange",p,true),t((()=>{setTimeout((()=>{u=m();}));}));}return {get firstHiddenTime(){return u},onHidden(e){l.add(e);}}},g=e=>{document.prerendering?addEventListener("prerenderingchange",(()=>e()),true):e();},y=[1800,3e3],E=(e,s={})=>{g((()=>{const c=v();let a,d=r("FCP");const f=h("paint",(e=>{for(const t of e)"first-contentful-paint"===t.name&&(f.disconnect(),t.startTime<c.firstHiddenTime&&(d.value=Math.max(t.startTime-o(),0),d.entries.push(t),a(true)));}));f&&(a=n(e,d,y,s.reportAllChanges),t((t=>{d=r("FCP"),a=n(e,d,y,s.reportAllChanges),i((()=>{d.value=performance.now()-t.timeStamp,a(true);}));})));}));},b=[.1,.25],L=(e,s={})=>{const o=v();E(f((()=>{let c,f=r("CLS",0);const u=a(s,d),l=e=>{for(const t of e)u.h(t);u.i>f.value&&(f.value=u.i,f.entries=u.o,c());},m=h("layout-shift",l);m&&(c=n(e,f,b,s.reportAllChanges),o.onHidden((()=>{l(m.takeRecords()),c(true);})),t((()=>{u.i=0,f=r("CLS",0),c=n(e,f,b,s.reportAllChanges),i((()=>c()));})),setTimeout(c));})));};let P=0,T=1/0,_=0;const M=e=>{for(const t of e)t.interactionId&&(T=Math.min(T,t.interactionId),_=Math.max(_,t.interactionId),P=_?(_-T)/7+1:0);};let w;const C=()=>w?P:performance.interactionCount??0,I=()=>{"interactionCount"in performance||w||(w=h("event",M,{type:"event",buffered:true,durationThreshold:0}));};let F=0;class k{u=[];l=new Map;m;p;v(){F=C(),this.u.length=0,this.l.clear();}L(){const e=Math.min(this.u.length-1,Math.floor((C()-F)/50));return this.u[e]}h(e){if(this.m?.(e),!e.interactionId&&"first-input"!==e.entryType)return;const t=this.u.at(-1);let n=this.l.get(e.interactionId);if(n||this.u.length<10||e.duration>t.P){if(n?e.duration>n.P?(n.entries=[e],n.P=e.duration):e.duration===n.P&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],P:e.duration},this.l.set(n.id,n),this.u.push(n)),this.u.sort(((e,t)=>t.P-e.P)),this.u.length>10){const e=this.u.splice(10);for(const t of e)this.l.delete(t.id);}this.p?.(n);}}}const A=e=>{const t=globalThis.requestIdleCallback||setTimeout;"hidden"===document.visibilityState?e():(e=f(e),addEventListener("visibilitychange",e,{once:true,capture:true}),t((()=>{e(),removeEventListener("visibilitychange",e,{capture:true});})));},B=[200,500],S=(e,i={})=>{if(!globalThis.PerformanceEventTiming||!("interactionId"in PerformanceEventTiming.prototype))return;const s=v();g((()=>{I();let o,c=r("INP");const d=a(i,k),f=e=>{A((()=>{for(const t of e)d.h(t);const t=d.L();t&&t.P!==c.value&&(c.value=t.P,c.entries=t.entries,o());}));},u=h("event",f,{durationThreshold:i.durationThreshold??40});o=n(e,c,B,i.reportAllChanges),u&&(u.observe({type:"first-input",buffered:true}),s.onHidden((()=>{f(u.takeRecords()),o(true);})),t((()=>{d.v(),c=r("INP"),o=n(e,c,B,i.reportAllChanges);})));}));};class N{m;h(e){this.m?.(e);}}const q=[2500,4e3],x=(e,s={})=>{g((()=>{const c=v();let d,u=r("LCP");const l=a(s,N),m=e=>{s.reportAllChanges||(e=e.slice(-1));for(const t of e)l.h(t),t.startTime<c.firstHiddenTime&&(u.value=Math.max(t.startTime-o(),0),u.entries=[t],d());},p=h("largest-contentful-paint",m);if(p){d=n(e,u,q,s.reportAllChanges);const o=f((()=>{m(p.takeRecords()),p.disconnect(),d(true);})),c=e=>{e.isTrusted&&(A(o),removeEventListener(e.type,c,{capture:true}));};for(const e of ["keydown","click","visibilitychange"])addEventListener(e,c,{capture:true});t((t=>{u=r("LCP"),d=n(e,u,q,s.reportAllChanges),i((()=>{u.value=performance.now()-t.timeStamp,d(true);}));}));}}));},H=[800,1800],O=e=>{document.prerendering?g((()=>O(e))):"complete"!==document.readyState?addEventListener("load",(()=>O(e)),true):setTimeout(e);},$=(e,i={})=>{let c=r("TTFB"),a=n(e,c,H,i.reportAllChanges);O((()=>{const d=s();d&&(c.value=Math.max(d.responseStart-o(),0),c.entries=[d],a(true),t((()=>{c=r("TTFB",0),a=n(e,c,H,i.reportAllChanges),a(true);})));}));};
6180
6149
 
6181
6150
  function getPaintBlocks(resources) {
6182
6151
  const paintBlocks = [];
@@ -6309,10 +6278,10 @@ function Timing (app, opts) {
6309
6278
  // onINP(): Chromium
6310
6279
  // onLCP(): Chromium, Firefox
6311
6280
  // onTTFB(): Chromium, Firefox, Safari
6312
- w(onVitalsSignal);
6313
- j(onVitalsSignal);
6314
- G(onVitalsSignal);
6315
- Q(onVitalsSignal);
6281
+ L(onVitalsSignal);
6282
+ S(onVitalsSignal);
6283
+ x(onVitalsSignal);
6284
+ $(onVitalsSignal);
6316
6285
  });
6317
6286
  app.attachStopCallback(function () {
6318
6287
  observer.disconnect();
@@ -7113,7 +7082,9 @@ class NetworkMessage {
7113
7082
  });
7114
7083
  if (!messageInfo)
7115
7084
  return null;
7116
- const isGraphql = messageInfo.url.includes("/graphql");
7085
+ const gqlHeader = "application/graphql-response";
7086
+ const isGraphql = messageInfo.url.includes("/graphql")
7087
+ || Object.values(messageInfo.request.headers).some(v => v.includes(gqlHeader));
7117
7088
  if (isGraphql && messageInfo.response.body && typeof messageInfo.response.body === 'string') {
7118
7089
  const isError = messageInfo.response.body.includes("errors");
7119
7090
  messageInfo.status = isError ? 400 : 200;
@@ -7419,6 +7390,7 @@ class FetchProxyHandler {
7419
7390
  this.tokenUrlMatcher = tokenUrlMatcher;
7420
7391
  }
7421
7392
  apply(target, _, argsList) {
7393
+ var _a;
7422
7394
  const input = argsList[0];
7423
7395
  const init = argsList[1];
7424
7396
  if (!input ||
@@ -7434,6 +7406,31 @@ class FetchProxyHandler {
7434
7406
  }
7435
7407
  const item = new NetworkMessage(this.ignoredHeaders, this.setSessionTokenHeader, this.sanitize);
7436
7408
  this.beforeFetch(item, input, init);
7409
+ const signal = (argsList[0] instanceof Request ? argsList[0].signal : undefined) ||
7410
+ ((_a = argsList[1]) === null || _a === void 0 ? void 0 : _a.signal);
7411
+ // guard to avoid double-send
7412
+ let abortedNotified = false;
7413
+ const notifyAbort = () => {
7414
+ if (abortedNotified)
7415
+ return;
7416
+ abortedNotified = true;
7417
+ item.endTime = performance.now();
7418
+ item.duration = item.endTime - (item.startTime || item.endTime);
7419
+ item.status = 0;
7420
+ item.statusText = "Aborted";
7421
+ item.readyState = 0;
7422
+ const msg = item.getMessage();
7423
+ if (msg)
7424
+ this.sendMessage(msg);
7425
+ };
7426
+ if (signal) {
7427
+ if (signal.aborted) {
7428
+ notifyAbort();
7429
+ }
7430
+ else {
7431
+ signal.addEventListener("abort", notifyAbort, { once: true });
7432
+ }
7433
+ }
7437
7434
  this.setSessionTokenHeader((name, value) => {
7438
7435
  if (this.tokenUrlMatcher !== undefined) {
7439
7436
  if (!this.tokenUrlMatcher(item.url)) {
@@ -7462,11 +7459,22 @@ class FetchProxyHandler {
7462
7459
  }
7463
7460
  });
7464
7461
  return target.apply(window, argsList)
7465
- .then(this.afterFetch(item))
7462
+ .then(this.afterFetch(item, () => {
7463
+ abortedNotified = true;
7464
+ }))
7466
7465
  .catch((e) => {
7467
- // mock finally
7468
7466
  item.endTime = performance.now();
7469
7467
  item.duration = item.endTime - (item.startTime || item.endTime);
7468
+ if (e && e.name === "AbortError") {
7469
+ item.status = 0;
7470
+ item.statusText = "Aborted";
7471
+ item.readyState = 0;
7472
+ if (!abortedNotified) {
7473
+ const msg = item.getMessage();
7474
+ if (msg)
7475
+ this.sendMessage(msg);
7476
+ }
7477
+ }
7470
7478
  throw e;
7471
7479
  });
7472
7480
  }
@@ -7518,8 +7526,10 @@ class FetchProxyHandler {
7518
7526
  item.requestData = genStringBody(init.body);
7519
7527
  }
7520
7528
  }
7521
- afterFetch(item) {
7529
+ afterFetch(item, onResolved) {
7522
7530
  return (resp) => {
7531
+ if (onResolved)
7532
+ onResolved === null || onResolved === void 0 ? void 0 : onResolved();
7523
7533
  item.endTime = performance.now();
7524
7534
  item.duration = item.endTime - (item.startTime || item.endTime);
7525
7535
  item.status = resp.status;
@@ -7555,7 +7565,15 @@ class FetchProxyHandler {
7555
7565
  }
7556
7566
  })
7557
7567
  .catch((e) => {
7558
- if (e.name !== "AbortError") {
7568
+ if (e.name === "AbortError") {
7569
+ item.status = 0;
7570
+ item.statusText = "Aborted";
7571
+ item.readyState = 0;
7572
+ const msg = item.getMessage();
7573
+ if (msg)
7574
+ this.sendMessage(msg);
7575
+ }
7576
+ else {
7559
7577
  throw e;
7560
7578
  }
7561
7579
  });
@@ -8245,6 +8263,8 @@ function webAnimations(app, options = {}) {
8245
8263
  const lastKF = anim.effect.getKeyframes().at(-1);
8246
8264
  if (!lastKF)
8247
8265
  return;
8266
+ if (!el || !(el instanceof Element) || !el.isConnected)
8267
+ return;
8248
8268
  const computedStyle = getComputedStyle(el);
8249
8269
  const keys = Object.keys(lastKF).filter((p) => !toIgnore.includes(p));
8250
8270
  // @ts-ignore
@@ -8656,7 +8676,7 @@ class ConstantProperties {
8656
8676
  user_id: this.user_id,
8657
8677
  distinct_id: this.deviceId,
8658
8678
  sdk_edition: 'web',
8659
- sdk_version: '17.2.4',
8679
+ sdk_version: '17.2.6',
8660
8680
  timezone: getUTCOffsetString(),
8661
8681
  search_engine: this.searchEngine,
8662
8682
  };
@@ -9358,7 +9378,7 @@ class API {
9358
9378
  this.signalStartIssue = (reason, missingApi) => {
9359
9379
  const doNotTrack = this.checkDoNotTrack();
9360
9380
  console.log("Tracker couldn't start due to:", JSON.stringify({
9361
- trackerVersion: '17.2.4',
9381
+ trackerVersion: '17.2.6',
9362
9382
  projectKey: this.options.projectKey,
9363
9383
  doNotTrack,
9364
9384
  reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,