@sentry/replay 7.81.1 → 7.83.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.
Files changed (45) hide show
  1. package/cjs/index.js +180 -70
  2. package/cjs/index.js.map +1 -1
  3. package/esm/index.js +182 -72
  4. package/esm/index.js.map +1 -1
  5. package/package.json +6 -6
  6. package/types/coreHandlers/handleDom.d.ts +3 -4
  7. package/types/coreHandlers/handleDom.d.ts.map +1 -1
  8. package/types/coreHandlers/handleFetch.d.ts +1 -1
  9. package/types/coreHandlers/handleGlobalEvent.d.ts.map +1 -1
  10. package/types/coreHandlers/handleHistory.d.ts +3 -7
  11. package/types/coreHandlers/handleHistory.d.ts.map +1 -1
  12. package/types/coreHandlers/handleNetworkBreadcrumbs.d.ts.map +1 -1
  13. package/types/coreHandlers/handleXhr.d.ts +1 -1
  14. package/types/coreHandlers/util/domUtils.d.ts +1 -7
  15. package/types/coreHandlers/util/domUtils.d.ts.map +1 -1
  16. package/types/coreHandlers/util/fetchUtils.d.ts +5 -1
  17. package/types/coreHandlers/util/fetchUtils.d.ts.map +1 -1
  18. package/types/coreHandlers/util/networkUtils.d.ts +4 -4
  19. package/types/coreHandlers/util/networkUtils.d.ts.map +1 -1
  20. package/types/coreHandlers/util/xhrUtils.d.ts.map +1 -1
  21. package/types/debug-build.d.ts +7 -0
  22. package/types/debug-build.d.ts.map +1 -0
  23. package/types/eventBuffer/EventBufferProxy.d.ts.map +1 -1
  24. package/types/eventBuffer/WorkerHandler.d.ts.map +1 -1
  25. package/types/replay.d.ts.map +1 -1
  26. package/types/types/performance.d.ts +1 -1
  27. package/types/types/performance.d.ts.map +1 -1
  28. package/types/types/request.d.ts +1 -1
  29. package/types/types/request.d.ts.map +1 -1
  30. package/types/util/addEvent.d.ts.map +1 -1
  31. package/types/util/getPrivacyOptions.d.ts.map +1 -1
  32. package/types/util/handleRecordingEmit.d.ts.map +1 -1
  33. package/types/util/log.d.ts.map +1 -1
  34. package/types/util/sendReplay.d.ts.map +1 -1
  35. package/types/util/shouldFilterRequest.d.ts.map +1 -1
  36. package/types-ts3.8/coreHandlers/handleDom.d.ts +3 -4
  37. package/types-ts3.8/coreHandlers/handleFetch.d.ts +1 -1
  38. package/types-ts3.8/coreHandlers/handleHistory.d.ts +3 -7
  39. package/types-ts3.8/coreHandlers/handleXhr.d.ts +1 -1
  40. package/types-ts3.8/coreHandlers/util/domUtils.d.ts +1 -7
  41. package/types-ts3.8/coreHandlers/util/fetchUtils.d.ts +5 -1
  42. package/types-ts3.8/coreHandlers/util/networkUtils.d.ts +7 -4
  43. package/types-ts3.8/debug-build.d.ts +7 -0
  44. package/types-ts3.8/types/performance.d.ts +1 -1
  45. package/types-ts3.8/types/request.d.ts +1 -1
package/cjs/index.js CHANGED
@@ -4341,12 +4341,13 @@ const handleDomListener = (
4341
4341
  }
4342
4342
 
4343
4343
  const isClick = handlerData.name === 'click';
4344
- const event = isClick && (handlerData.event );
4344
+ const event = isClick ? (handlerData.event ) : undefined;
4345
4345
  // Ignore clicks if ctrl/alt/meta/shift keys are held down as they alter behavior of clicks (e.g. open in new tab)
4346
4346
  if (
4347
4347
  isClick &&
4348
4348
  replay.clickDetector &&
4349
4349
  event &&
4350
+ event.target &&
4350
4351
  !event.altKey &&
4351
4352
  !event.metaKey &&
4352
4353
  !event.ctrlKey &&
@@ -4355,7 +4356,7 @@ const handleDomListener = (
4355
4356
  handleClick(
4356
4357
  replay.clickDetector,
4357
4358
  result ,
4358
- getClickTargetNode(handlerData.event) ,
4359
+ getClickTargetNode(handlerData.event ) ,
4359
4360
  );
4360
4361
  }
4361
4362
 
@@ -4411,7 +4412,7 @@ function getDomTarget(handlerData) {
4411
4412
 
4412
4413
  // Accessing event.target can throw (see getsentry/raven-js#838, #768)
4413
4414
  try {
4414
- target = isClick ? getClickTargetNode(handlerData.event) : getTargetNode(handlerData.event);
4415
+ target = isClick ? getClickTargetNode(handlerData.event ) : getTargetNode(handlerData.event );
4415
4416
  message = utils.htmlTreeAsString(target, { maxStringLength: 200 }) || '<unknown>';
4416
4417
  } catch (e) {
4417
4418
  message = '<unknown>';
@@ -4673,6 +4674,13 @@ function setupPerformanceObserver(replay) {
4673
4674
  };
4674
4675
  }
4675
4676
 
4677
+ /**
4678
+ * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.
4679
+ *
4680
+ * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.
4681
+ */
4682
+ const DEBUG_BUILD = (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__);
4683
+
4676
4684
  const r = `var t=Uint8Array,n=Uint16Array,r=Int32Array,e=new t([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),i=new t([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),a=new t([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),s=function(t,e){for(var i=new n(31),a=0;a<31;++a)i[a]=e+=1<<t[a-1];var s=new r(i[30]);for(a=1;a<30;++a)for(var o=i[a];o<i[a+1];++o)s[o]=o-i[a]<<5|a;return{b:i,r:s}},o=s(e,2),f=o.b,h=o.r;f[28]=258,h[258]=28;for(var l=s(i,0).r,u=new n(32768),c=0;c<32768;++c){var v=(43690&c)>>1|(21845&c)<<1;v=(61680&(v=(52428&v)>>2|(13107&v)<<2))>>4|(3855&v)<<4,u[c]=((65280&v)>>8|(255&v)<<8)>>1}var d=function(t,r,e){for(var i=t.length,a=0,s=new n(r);a<i;++a)t[a]&&++s[t[a]-1];var o,f=new n(r);for(a=1;a<r;++a)f[a]=f[a-1]+s[a-1]<<1;if(e){o=new n(1<<r);var h=15-r;for(a=0;a<i;++a)if(t[a])for(var l=a<<4|t[a],c=r-t[a],v=f[t[a]-1]++<<c,d=v|(1<<c)-1;v<=d;++v)o[u[v]>>h]=l}else for(o=new n(i),a=0;a<i;++a)t[a]&&(o[a]=u[f[t[a]-1]++]>>15-t[a]);return o},g=new t(288);for(c=0;c<144;++c)g[c]=8;for(c=144;c<256;++c)g[c]=9;for(c=256;c<280;++c)g[c]=7;for(c=280;c<288;++c)g[c]=8;var w=new t(32);for(c=0;c<32;++c)w[c]=5;var p=d(g,9,0),y=d(w,5,0),m=function(t){return(t+7)/8|0},b=function(n,r,e){return(null==r||r<0)&&(r=0),(null==e||e>n.length)&&(e=n.length),new t(n.subarray(r,e))},M=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],E=function(t,n,r){var e=new Error(n||M[t]);if(e.code=t,Error.captureStackTrace&&Error.captureStackTrace(e,E),!r)throw e;return e},z=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8},A=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8,t[e+2]|=r>>16},_=function(r,e){for(var i=[],a=0;a<r.length;++a)r[a]&&i.push({s:a,f:r[a]});var s=i.length,o=i.slice();if(!s)return{t:F,l:0};if(1==s){var f=new t(i[0].s+1);return f[i[0].s]=1,{t:f,l:1}}i.sort((function(t,n){return t.f-n.f})),i.push({s:-1,f:25001});var h=i[0],l=i[1],u=0,c=1,v=2;for(i[0]={s:-1,f:h.f+l.f,l:h,r:l};c!=s-1;)h=i[i[u].f<i[v].f?u++:v++],l=i[u!=c&&i[u].f<i[v].f?u++:v++],i[c++]={s:-1,f:h.f+l.f,l:h,r:l};var d=o[0].s;for(a=1;a<s;++a)o[a].s>d&&(d=o[a].s);var g=new n(d+1),w=x(i[c-1],g,0);if(w>e){a=0;var p=0,y=w-e,m=1<<y;for(o.sort((function(t,n){return g[n.s]-g[t.s]||t.f-n.f}));a<s;++a){var b=o[a].s;if(!(g[b]>e))break;p+=m-(1<<w-g[b]),g[b]=e}for(p>>=y;p>0;){var M=o[a].s;g[M]<e?p-=1<<e-g[M]++-1:++a}for(;a>=0&&p;--a){var E=o[a].s;g[E]==e&&(--g[E],++p)}w=e}return{t:new t(g),l:w}},x=function(t,n,r){return-1==t.s?Math.max(x(t.l,n,r+1),x(t.r,n,r+1)):n[t.s]=r},D=function(t){for(var r=t.length;r&&!t[--r];);for(var e=new n(++r),i=0,a=t[0],s=1,o=function(t){e[i++]=t},f=1;f<=r;++f)if(t[f]==a&&f!=r)++s;else{if(!a&&s>2){for(;s>138;s-=138)o(32754);s>2&&(o(s>10?s-11<<5|28690:s-3<<5|12305),s=0)}else if(s>3){for(o(a),--s;s>6;s-=6)o(8304);s>2&&(o(s-3<<5|8208),s=0)}for(;s--;)o(a);s=1,a=t[f]}return{c:e.subarray(0,i),n:r}},T=function(t,n){for(var r=0,e=0;e<n.length;++e)r+=t[e]*n[e];return r},k=function(t,n,r){var e=r.length,i=m(n+2);t[i]=255&e,t[i+1]=e>>8,t[i+2]=255^t[i],t[i+3]=255^t[i+1];for(var a=0;a<e;++a)t[i+a+4]=r[a];return 8*(i+4+e)},C=function(t,r,s,o,f,h,l,u,c,v,m){z(r,m++,s),++f[256];for(var b=_(f,15),M=b.t,E=b.l,x=_(h,15),C=x.t,U=x.l,F=D(M),I=F.c,S=F.n,L=D(C),O=L.c,j=L.n,q=new n(19),B=0;B<I.length;++B)++q[31&I[B]];for(B=0;B<O.length;++B)++q[31&O[B]];for(var G=_(q,7),H=G.t,J=G.l,K=19;K>4&&!H[a[K-1]];--K);var N,P,Q,R,V=v+5<<3,W=T(f,g)+T(h,w)+l,X=T(f,M)+T(h,C)+l+14+3*K+T(q,H)+2*q[16]+3*q[17]+7*q[18];if(c>=0&&V<=W&&V<=X)return k(r,m,t.subarray(c,c+v));if(z(r,m,1+(X<W)),m+=2,X<W){N=d(M,E,0),P=M,Q=d(C,U,0),R=C;var Y=d(H,J,0);z(r,m,S-257),z(r,m+5,j-1),z(r,m+10,K-4),m+=14;for(B=0;B<K;++B)z(r,m+3*B,H[a[B]]);m+=3*K;for(var Z=[I,O],$=0;$<2;++$){var tt=Z[$];for(B=0;B<tt.length;++B){var nt=31&tt[B];z(r,m,Y[nt]),m+=H[nt],nt>15&&(z(r,m,tt[B]>>5&127),m+=tt[B]>>12)}}}else N=p,P=g,Q=y,R=w;for(B=0;B<u;++B){var rt=o[B];if(rt>255){A(r,m,N[(nt=rt>>18&31)+257]),m+=P[nt+257],nt>7&&(z(r,m,rt>>23&31),m+=e[nt]);var et=31&rt;A(r,m,Q[et]),m+=R[et],et>3&&(A(r,m,rt>>5&8191),m+=i[et])}else A(r,m,N[rt]),m+=P[rt]}return A(r,m,N[256]),m+P[256]},U=new r([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),F=new t(0),I=function(){for(var t=new Int32Array(256),n=0;n<256;++n){for(var r=n,e=9;--e;)r=(1&r&&-306674912)^r>>>1;t[n]=r}return t}(),S=function(){var t=1,n=0;return{p:function(r){for(var e=t,i=n,a=0|r.length,s=0;s!=a;){for(var o=Math.min(s+2655,a);s<o;++s)i+=e+=r[s];e=(65535&e)+15*(e>>16),i=(65535&i)+15*(i>>16)}t=e,n=i},d:function(){return(255&(t%=65521))<<24|(65280&t)<<8|(255&(n%=65521))<<8|n>>8}}},L=function(a,s,o,f,u){if(!u&&(u={l:1},s.dictionary)){var c=s.dictionary.subarray(-32768),v=new t(c.length+a.length);v.set(c),v.set(a,c.length),a=v,u.w=c.length}return function(a,s,o,f,u,c){var v=c.z||a.length,d=new t(f+v+5*(1+Math.ceil(v/7e3))+u),g=d.subarray(f,d.length-u),w=c.l,p=7&(c.r||0);if(s){p&&(g[0]=c.r>>3);for(var y=U[s-1],M=y>>13,E=8191&y,z=(1<<o)-1,A=c.p||new n(32768),_=c.h||new n(z+1),x=Math.ceil(o/3),D=2*x,T=function(t){return(a[t]^a[t+1]<<x^a[t+2]<<D)&z},F=new r(25e3),I=new n(288),S=new n(32),L=0,O=0,j=c.i||0,q=0,B=c.w||0,G=0;j+2<v;++j){var H=T(j),J=32767&j,K=_[H];if(A[J]=K,_[H]=J,B<=j){var N=v-j;if((L>7e3||q>24576)&&(N>423||!w)){p=C(a,g,0,F,I,S,O,q,G,j-G,p),q=L=O=0,G=j;for(var P=0;P<286;++P)I[P]=0;for(P=0;P<30;++P)S[P]=0}var Q=2,R=0,V=E,W=J-K&32767;if(N>2&&H==T(j-W))for(var X=Math.min(M,N)-1,Y=Math.min(32767,j),Z=Math.min(258,N);W<=Y&&--V&&J!=K;){if(a[j+Q]==a[j+Q-W]){for(var $=0;$<Z&&a[j+$]==a[j+$-W];++$);if($>Q){if(Q=$,R=W,$>X)break;var tt=Math.min(W,$-2),nt=0;for(P=0;P<tt;++P){var rt=j-W+P&32767,et=rt-A[rt]&32767;et>nt&&(nt=et,K=rt)}}}W+=(J=K)-(K=A[J])&32767}if(R){F[q++]=268435456|h[Q]<<18|l[R];var it=31&h[Q],at=31&l[R];O+=e[it]+i[at],++I[257+it],++S[at],B=j+Q,++L}else F[q++]=a[j],++I[a[j]]}}for(j=Math.max(j,B);j<v;++j)F[q++]=a[j],++I[a[j]];p=C(a,g,w,F,I,S,O,q,G,j-G,p),w||(c.r=7&p|g[p/8|0]<<3,p-=7,c.h=_,c.p=A,c.i=j,c.w=B)}else{for(j=c.w||0;j<v+w;j+=65535){var st=j+65535;st>=v&&(g[p/8|0]=w,st=v),p=k(g,p+1,a.subarray(j,st))}c.i=v}return b(d,0,f+m(p)+u)}(a,null==s.level?6:s.level,null==s.mem?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(a.length)))):12+s.mem,o,f,u)},O=function(t,n,r){for(;r;++n)t[n]=r,r>>>=8},j=function(){function n(n,r){if("function"==typeof n&&(r=n,n={}),this.ondata=r,this.o=n||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new t(98304),this.o.dictionary){var e=this.o.dictionary.subarray(-32768);this.b.set(e,32768-e.length),this.s.i=32768-e.length}}return n.prototype.p=function(t,n){this.ondata(L(t,this.o,0,0,this.s),n)},n.prototype.push=function(n,r){this.ondata||E(5),this.s.l&&E(4);var e=n.length+this.s.z;if(e>this.b.length){if(e>2*this.b.length-32768){var i=new t(-32768&e);i.set(this.b.subarray(0,this.s.z)),this.b=i}var a=this.b.length-this.s.z;a&&(this.b.set(n.subarray(0,a),this.s.z),this.s.z=this.b.length,this.p(this.b,!1)),this.b.set(this.b.subarray(-32768)),this.b.set(n.subarray(a),32768),this.s.z=n.length-a+32768,this.s.i=32766,this.s.w=32768}else this.b.set(n,this.s.z),this.s.z+=n.length;this.s.l=1&r,(this.s.z>this.s.w+8191||r)&&(this.p(this.b,r||!1),this.s.w=this.s.i,this.s.i-=2)},n}();function q(t,n){n||(n={});var r=function(){var t=-1;return{p:function(n){for(var r=t,e=0;e<n.length;++e)r=I[255&r^n[e]]^r>>>8;t=r},d:function(){return~t}}}(),e=t.length;r.p(t);var i,a=L(t,n,10+((i=n).filename?i.filename.length+1:0),8),s=a.length;return function(t,n){var r=n.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=n.level<2?4:9==n.level?2:0,t[9]=3,0!=n.mtime&&O(t,4,Math.floor(new Date(n.mtime||Date.now())/1e3)),r){t[3]=8;for(var e=0;e<=r.length;++e)t[e+10]=r.charCodeAt(e)}}(a,n),O(a,s-8,r.d()),O(a,s-4,e),a}var B=function(){function t(t,n){this.c=S(),this.v=1,j.call(this,t,n)}return t.prototype.push=function(t,n){this.c.p(t),j.prototype.push.call(this,t,n)},t.prototype.p=function(t,n){var r=L(t,this.o,this.v&&(this.o.dictionary?6:2),n&&4,this.s);this.v&&(function(t,n){var r=n.level,e=0==r?0:r<6?1:9==r?3:2;if(t[0]=120,t[1]=e<<6|(n.dictionary&&32),t[1]|=31-(t[0]<<8|t[1])%31,n.dictionary){var i=S();i.p(n.dictionary),O(t,2,i.d())}}(r,this.o),this.v=0),n&&O(r,r.length-4,this.c.d()),this.ondata(r,n)},t}(),G="undefined"!=typeof TextEncoder&&new TextEncoder,H="undefined"!=typeof TextDecoder&&new TextDecoder;try{H.decode(F,{stream:!0})}catch(t){}var J=function(){function t(t){this.ondata=t}return t.prototype.push=function(t,n){this.ondata||E(5),this.d&&E(4),this.ondata(K(t),this.d=n||!1)},t}();function K(n,r){if(r){for(var e=new t(n.length),i=0;i<n.length;++i)e[i]=n.charCodeAt(i);return e}if(G)return G.encode(n);var a=n.length,s=new t(n.length+(n.length>>1)),o=0,f=function(t){s[o++]=t};for(i=0;i<a;++i){if(o+5>s.length){var h=new t(o+8+(a-i<<1));h.set(s),s=h}var l=n.charCodeAt(i);l<128||r?f(l):l<2048?(f(192|l>>6),f(128|63&l)):l>55295&&l<57344?(f(240|(l=65536+(1047552&l)|1023&n.charCodeAt(++i))>>18),f(128|l>>12&63),f(128|l>>6&63),f(128|63&l)):(f(224|l>>12),f(128|l>>6&63),f(128|63&l))}return b(s,0,o)}const N=new class{constructor(){this._init()}clear(){this._init()}addEvent(t){if(!t)throw new Error("Adding invalid event");const n=this._hasEvents?",":"";this.stream.push(n+t),this._hasEvents=!0}finish(){this.stream.push("]",!0);const t=function(t){let n=0;for(let r=0,e=t.length;r<e;r++)n+=t[r].length;const r=new Uint8Array(n);for(let n=0,e=0,i=t.length;n<i;n++){const i=t[n];r.set(i,e),e+=i.length}return r}(this._deflatedData);return this._init(),t}_init(){this._hasEvents=!1,this._deflatedData=[],this.deflate=new B,this.deflate.ondata=(t,n)=>{this._deflatedData.push(t)},this.stream=new J(((t,n)=>{this.deflate.push(t,n)})),this.stream.push("[")}},P={clear:()=>{N.clear()},addEvent:t=>N.addEvent(t),finish:()=>N.finish(),compress:t=>function(t){return q(K(t))}(t)};addEventListener("message",(function(t){const n=t.data.method,r=t.data.id,e=t.data.arg;if(n in P&&"function"==typeof P[n])try{const t=P[n](e);postMessage({id:r,method:n,success:!0,response:t})}catch(t){postMessage({id:r,method:n,success:!1,response:t.message}),console.error(t)}})),postMessage({id:void 0,method:"init",success:!0,response:void 0});`;
4677
4685
 
4678
4686
  function e(){const e=new Blob([r]);return URL.createObjectURL(e)}
@@ -4681,7 +4689,7 @@ function e(){const e=new Blob([r]);return URL.createObjectURL(e)}
4681
4689
  * Log a message in debug mode, and add a breadcrumb when _experiment.traceInternals is enabled.
4682
4690
  */
4683
4691
  function logInfo(message, shouldAddBreadcrumb) {
4684
- if (!(typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__)) {
4692
+ if (!DEBUG_BUILD) {
4685
4693
  return;
4686
4694
  }
4687
4695
 
@@ -4697,7 +4705,7 @@ function logInfo(message, shouldAddBreadcrumb) {
4697
4705
  * This is necessary when the breadcrumb may be added before the replay is initialized.
4698
4706
  */
4699
4707
  function logInfoNextTick(message, shouldAddBreadcrumb) {
4700
- if (!(typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__)) {
4708
+ if (!DEBUG_BUILD) {
4701
4709
  return;
4702
4710
  }
4703
4711
 
@@ -4884,7 +4892,7 @@ class WorkerHandler {
4884
4892
 
4885
4893
  if (!response.success) {
4886
4894
  // TODO: Do some error handling, not sure what
4887
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error('[Replay]', response.response);
4895
+ DEBUG_BUILD && utils.logger.error('[Replay]', response.response);
4888
4896
 
4889
4897
  reject(new Error('Error in compression worker'));
4890
4898
  return;
@@ -5114,7 +5122,7 @@ class EventBufferProxy {
5114
5122
  try {
5115
5123
  await Promise.all(addEventPromises);
5116
5124
  } catch (error) {
5117
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.warn('[Replay] Failed to add events when switching buffers.', error);
5125
+ DEBUG_BUILD && utils.logger.warn('[Replay] Failed to add events when switching buffers.', error);
5118
5126
  }
5119
5127
  }
5120
5128
  }
@@ -5469,10 +5477,10 @@ async function _addEvent(
5469
5477
  } catch (error) {
5470
5478
  const reason = error && error instanceof EventBufferSizeExceededError ? 'addEventSizeExceeded' : 'addEvent';
5471
5479
 
5472
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error(error);
5480
+ DEBUG_BUILD && utils.logger.error(error);
5473
5481
  await replay.stop({ reason });
5474
5482
 
5475
- const client = core.getCurrentHub().getClient();
5483
+ const client = core.getClient();
5476
5484
 
5477
5485
  if (client) {
5478
5486
  client.recordDroppedEvent('internal_sdk_error', 'replay');
@@ -5517,7 +5525,7 @@ function maybeApplyCallback(
5517
5525
  return callback(event);
5518
5526
  }
5519
5527
  } catch (error) {
5520
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&
5528
+ DEBUG_BUILD &&
5521
5529
  utils.logger.error('[Replay] An error occured in the `beforeAddRecordingEvent` callback, skipping the event...', error);
5522
5530
  return null;
5523
5531
  }
@@ -5618,7 +5626,7 @@ function handleErrorEvent(replay, event) {
5618
5626
  }
5619
5627
 
5620
5628
  function isBaseTransportSend() {
5621
- const client = core.getCurrentHub().getClient();
5629
+ const client = core.getClient();
5622
5630
  if (!client) {
5623
5631
  return false;
5624
5632
  }
@@ -5749,7 +5757,7 @@ function handleGlobalEventListener(
5749
5757
  // Unless `captureExceptions` is enabled, we want to ignore errors coming from rrweb
5750
5758
  // As there can be a bunch of stuff going wrong in internals there, that we don't want to bubble up to users
5751
5759
  if (isRrwebError(event, hint) && !replay.getOptions()._experiments.captureExceptions) {
5752
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.log('[Replay] Ignoring error from rrweb internals', event);
5760
+ DEBUG_BUILD && utils.logger.log('[Replay] Ignoring error from rrweb internals', event);
5753
5761
  return null;
5754
5762
  }
5755
5763
 
@@ -5824,7 +5832,7 @@ function handleHistory(handlerData) {
5824
5832
  }
5825
5833
 
5826
5834
  /**
5827
- * Returns a listener to be added to `addInstrumentationHandler('history', listener)`.
5835
+ * Returns a listener to be added to `addHistoryInstrumentationHandler(listener)`.
5828
5836
  */
5829
5837
  function handleHistorySpanListener(replay) {
5830
5838
  return (handlerData) => {
@@ -5856,7 +5864,7 @@ function handleHistorySpanListener(replay) {
5856
5864
  */
5857
5865
  function shouldFilterRequest(replay, url) {
5858
5866
  // If we enabled the `traceInternals` experiment, we want to trace everything
5859
- if ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && replay.getOptions()._experiments.traceInternals) {
5867
+ if (DEBUG_BUILD && replay.getOptions()._experiments.traceInternals) {
5860
5868
  return false;
5861
5869
  }
5862
5870
 
@@ -5913,7 +5921,7 @@ function handleFetch(handlerData) {
5913
5921
  }
5914
5922
 
5915
5923
  /**
5916
- * Returns a listener to be added to `addInstrumentationHandler('fetch', listener)`.
5924
+ * Returns a listener to be added to `addFetchInstrumentationHandler(listener)`.
5917
5925
  */
5918
5926
  function handleFetchSpanListener(replay) {
5919
5927
  return (handlerData) => {
@@ -5957,7 +5965,7 @@ function handleXhr(handlerData) {
5957
5965
  }
5958
5966
 
5959
5967
  /**
5960
- * Returns a listener to be added to `addInstrumentationHandler('xhr', listener)`.
5968
+ * Returns a listener to be added to `addXhrInstrumentationHandler(listener)`.
5961
5969
  */
5962
5970
  function handleXhrSpanListener(replay) {
5963
5971
  return (handlerData) => {
@@ -6024,23 +6032,47 @@ function parseContentLengthHeader(header) {
6024
6032
  function getBodyString(body) {
6025
6033
  try {
6026
6034
  if (typeof body === 'string') {
6027
- return body;
6035
+ return [body];
6028
6036
  }
6029
6037
 
6030
6038
  if (body instanceof URLSearchParams) {
6031
- return body.toString();
6039
+ return [body.toString()];
6032
6040
  }
6033
6041
 
6034
6042
  if (body instanceof FormData) {
6035
- return _serializeFormData(body);
6043
+ return [_serializeFormData(body)];
6036
6044
  }
6037
6045
  } catch (e2) {
6038
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.warn('[Replay] Failed to serialize body', body);
6046
+ DEBUG_BUILD && utils.logger.warn('[Replay] Failed to serialize body', body);
6047
+ return [undefined, 'BODY_PARSE_ERROR'];
6039
6048
  }
6040
6049
 
6041
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.info('[Replay] Skipping network body because of body type', body);
6050
+ DEBUG_BUILD && utils.logger.info('[Replay] Skipping network body because of body type', body);
6042
6051
 
6043
- return undefined;
6052
+ return [undefined];
6053
+ }
6054
+
6055
+ /** Merge a warning into an existing network request/response. */
6056
+ function mergeWarning(
6057
+ info,
6058
+ warning,
6059
+ ) {
6060
+ if (!info) {
6061
+ return {
6062
+ headers: {},
6063
+ size: undefined,
6064
+ _meta: {
6065
+ warnings: [warning],
6066
+ },
6067
+ };
6068
+ }
6069
+
6070
+ const newMeta = { ...info._meta };
6071
+ const existingWarnings = newMeta.warnings || [];
6072
+ newMeta.warnings = [...existingWarnings, warning];
6073
+
6074
+ info._meta = newMeta;
6075
+ return info;
6044
6076
  }
6045
6077
 
6046
6078
  /** Convert ReplayNetworkRequestData to a PerformanceEntry. */
@@ -6173,7 +6205,7 @@ function normalizeNetworkBody(body)
6173
6205
  return {
6174
6206
  body: jsonBody,
6175
6207
  };
6176
- } catch (e4) {
6208
+ } catch (e3) {
6177
6209
  // fall back to just send the body as string
6178
6210
  }
6179
6211
  }
@@ -6239,7 +6271,7 @@ async function captureFetchBreadcrumbToReplay(
6239
6271
  const result = makeNetworkReplayBreadcrumb('resource.fetch', data);
6240
6272
  addNetworkBreadcrumb(options.replay, result);
6241
6273
  } catch (error) {
6242
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error('[Replay] Failed to capture fetch breadcrumb', error);
6274
+ DEBUG_BUILD && utils.logger.error('[Replay] Failed to capture fetch breadcrumb', error);
6243
6275
  }
6244
6276
  }
6245
6277
 
@@ -6318,10 +6350,17 @@ function _getRequestInfo(
6318
6350
 
6319
6351
  // We only want to transmit string or string-like bodies
6320
6352
  const requestBody = _getFetchRequestArgBody(input);
6321
- const bodyStr = getBodyString(requestBody);
6322
- return buildNetworkRequestOrResponse(headers, requestBodySize, bodyStr);
6353
+ const [bodyStr, warning] = getBodyString(requestBody);
6354
+ const data = buildNetworkRequestOrResponse(headers, requestBodySize, bodyStr);
6355
+
6356
+ if (warning) {
6357
+ return mergeWarning(data, warning);
6358
+ }
6359
+
6360
+ return data;
6323
6361
  }
6324
6362
 
6363
+ /** Exported only for tests. */
6325
6364
  async function _getResponseInfo(
6326
6365
  captureDetails,
6327
6366
  {
@@ -6344,12 +6383,35 @@ async function _getResponseInfo(
6344
6383
  return buildNetworkRequestOrResponse(headers, responseBodySize, undefined);
6345
6384
  }
6346
6385
 
6347
- // Only clone the response if we need to
6348
- try {
6349
- // We have to clone this, as the body can only be read once
6350
- const res = response.clone();
6351
- const bodyText = await _parseFetchBody(res);
6386
+ const [bodyText, warning] = await _parseFetchResponseBody(response);
6387
+ const result = getResponseData(bodyText, {
6388
+ networkCaptureBodies,
6389
+ textEncoder,
6390
+ responseBodySize,
6391
+ captureDetails,
6392
+ headers,
6393
+ });
6394
+
6395
+ if (warning) {
6396
+ return mergeWarning(result, warning);
6397
+ }
6352
6398
 
6399
+ return result;
6400
+ }
6401
+
6402
+ function getResponseData(
6403
+ bodyText,
6404
+ {
6405
+ networkCaptureBodies,
6406
+ textEncoder,
6407
+ responseBodySize,
6408
+ captureDetails,
6409
+ headers,
6410
+ }
6411
+
6412
+ ,
6413
+ ) {
6414
+ try {
6353
6415
  const size =
6354
6416
  bodyText && bodyText.length && responseBodySize === undefined
6355
6417
  ? getBodySize(bodyText, textEncoder)
@@ -6365,17 +6427,25 @@ async function _getResponseInfo(
6365
6427
 
6366
6428
  return buildNetworkRequestOrResponse(headers, size, undefined);
6367
6429
  } catch (error) {
6368
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.warn('[Replay] Failed to serialize response body', error);
6430
+ DEBUG_BUILD && utils.logger.warn('[Replay] Failed to serialize response body', error);
6369
6431
  // fallback
6370
6432
  return buildNetworkRequestOrResponse(headers, responseBodySize, undefined);
6371
6433
  }
6372
6434
  }
6373
6435
 
6374
- async function _parseFetchBody(response) {
6436
+ async function _parseFetchResponseBody(response) {
6437
+ const res = _tryCloneResponse(response);
6438
+
6439
+ if (!res) {
6440
+ return [undefined, 'BODY_PARSE_ERROR'];
6441
+ }
6442
+
6375
6443
  try {
6376
- return await response.text();
6377
- } catch (e) {
6378
- return undefined;
6444
+ const text = await _tryGetResponseText(res);
6445
+ return [text];
6446
+ } catch (error) {
6447
+ DEBUG_BUILD && utils.logger.warn('[Replay] Failed to get text body from response', error);
6448
+ return [undefined, 'BODY_PARSE_ERROR'];
6379
6449
  }
6380
6450
  }
6381
6451
 
@@ -6438,6 +6508,40 @@ function getHeadersFromOptions(
6438
6508
  return getAllowedHeaders(headers, allowedHeaders);
6439
6509
  }
6440
6510
 
6511
+ function _tryCloneResponse(response) {
6512
+ try {
6513
+ // We have to clone this, as the body can only be read once
6514
+ return response.clone();
6515
+ } catch (error) {
6516
+ // this can throw if the response was already consumed before
6517
+ DEBUG_BUILD && utils.logger.warn('[Replay] Failed to clone response body', error);
6518
+ }
6519
+ }
6520
+
6521
+ /**
6522
+ * Get the response body of a fetch request, or timeout after 500ms.
6523
+ * Fetch can return a streaming body, that may not resolve (or not for a long time).
6524
+ * If that happens, we rather abort after a short time than keep waiting for this.
6525
+ */
6526
+ function _tryGetResponseText(response) {
6527
+ return new Promise((resolve, reject) => {
6528
+ const timeout = setTimeout(() => reject(new Error('Timeout while trying to read response body')), 500);
6529
+
6530
+ _getResponseText(response)
6531
+ .then(
6532
+ txt => resolve(txt),
6533
+ reason => reject(reason),
6534
+ )
6535
+ .finally(() => clearTimeout(timeout));
6536
+ });
6537
+ }
6538
+
6539
+ async function _getResponseText(response) {
6540
+ // Force this to be a promise, just to be safe
6541
+ // eslint-disable-next-line no-return-await
6542
+ return await response.text();
6543
+ }
6544
+
6441
6545
  /**
6442
6546
  * Capture an XHR breadcrumb to a replay.
6443
6547
  * This adds additional data (where approriate).
@@ -6454,7 +6558,7 @@ async function captureXhrBreadcrumbToReplay(
6454
6558
  const result = makeNetworkReplayBreadcrumb('resource.xhr', data);
6455
6559
  addNetworkBreadcrumb(options.replay, result);
6456
6560
  } catch (error) {
6457
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error('[Replay] Failed to capture xhr breadcrumb', error);
6561
+ DEBUG_BUILD && utils.logger.error('[Replay] Failed to capture xhr breadcrumb', error);
6458
6562
  }
6459
6563
  }
6460
6564
 
@@ -6527,8 +6631,8 @@ function _prepareXhrData(
6527
6631
  : {};
6528
6632
  const networkResponseHeaders = getAllowedHeaders(getResponseHeaders(xhr), options.networkResponseHeaders);
6529
6633
 
6530
- const requestBody = options.networkCaptureBodies ? getBodyString(input) : undefined;
6531
- const responseBody = options.networkCaptureBodies ? _getXhrResponseBody(xhr) : undefined;
6634
+ const [requestBody, requestWarning] = options.networkCaptureBodies ? getBodyString(input) : [undefined];
6635
+ const [responseBody, responseWarning] = options.networkCaptureBodies ? _getXhrResponseBody(xhr) : [undefined];
6532
6636
 
6533
6637
  const request = buildNetworkRequestOrResponse(networkRequestHeaders, requestBodySize, requestBody);
6534
6638
  const response = buildNetworkRequestOrResponse(networkResponseHeaders, responseBodySize, responseBody);
@@ -6539,8 +6643,8 @@ function _prepareXhrData(
6539
6643
  url,
6540
6644
  method,
6541
6645
  statusCode,
6542
- request,
6543
- response,
6646
+ request: requestWarning ? mergeWarning(request, requestWarning) : request,
6647
+ response: responseWarning ? mergeWarning(response, responseWarning) : response,
6544
6648
  };
6545
6649
  }
6546
6650
 
@@ -6563,7 +6667,7 @@ function _getXhrResponseBody(xhr) {
6563
6667
  const errors = [];
6564
6668
 
6565
6669
  try {
6566
- return xhr.responseText;
6670
+ return [xhr.responseText];
6567
6671
  } catch (e) {
6568
6672
  errors.push(e);
6569
6673
  }
@@ -6576,9 +6680,9 @@ function _getXhrResponseBody(xhr) {
6576
6680
  errors.push(e);
6577
6681
  }
6578
6682
 
6579
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.warn('[Replay] Failed to get xhr response body', ...errors);
6683
+ DEBUG_BUILD && utils.logger.warn('[Replay] Failed to get xhr response body', ...errors);
6580
6684
 
6581
- return undefined;
6685
+ return [undefined];
6582
6686
  }
6583
6687
 
6584
6688
  /**
@@ -6588,7 +6692,7 @@ function _getXhrResponseBody(xhr) {
6588
6692
  * (enriching it with further data that is _not_ added to the regular breadcrumbs)
6589
6693
  */
6590
6694
  function handleNetworkBreadcrumbs(replay) {
6591
- const client = core.getCurrentHub().getClient();
6695
+ const client = core.getClient();
6592
6696
 
6593
6697
  try {
6594
6698
  const textEncoder = new TextEncoder();
@@ -6615,8 +6719,8 @@ function handleNetworkBreadcrumbs(replay) {
6615
6719
  client.on('beforeAddBreadcrumb', (breadcrumb, hint) => beforeAddNetworkBreadcrumb(options, breadcrumb, hint));
6616
6720
  } else {
6617
6721
  // Fallback behavior
6618
- utils.addInstrumentationHandler('fetch', handleFetchSpanListener(replay));
6619
- utils.addInstrumentationHandler('xhr', handleXhrSpanListener(replay));
6722
+ utils.addFetchInstrumentationHandler(handleFetchSpanListener(replay));
6723
+ utils.addXhrInstrumentationHandler(handleXhrSpanListener(replay));
6620
6724
  }
6621
6725
  } catch (e2) {
6622
6726
  // Do nothing
@@ -6652,7 +6756,7 @@ function beforeAddNetworkBreadcrumb(
6652
6756
  void captureFetchBreadcrumbToReplay(breadcrumb, hint, options);
6653
6757
  }
6654
6758
  } catch (e) {
6655
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.warn('Error when enriching network breadcrumb');
6759
+ DEBUG_BUILD && utils.logger.warn('Error when enriching network breadcrumb');
6656
6760
  }
6657
6761
  }
6658
6762
 
@@ -6786,11 +6890,11 @@ function normalizeConsoleBreadcrumb(
6786
6890
  function addGlobalListeners(replay) {
6787
6891
  // Listeners from core SDK //
6788
6892
  const scope = core.getCurrentHub().getScope();
6789
- const client = core.getCurrentHub().getClient();
6893
+ const client = core.getClient();
6790
6894
 
6791
6895
  scope.addScopeListener(handleScopeListener(replay));
6792
- utils.addInstrumentationHandler('dom', handleDomListener(replay));
6793
- utils.addInstrumentationHandler('history', handleHistorySpanListener(replay));
6896
+ utils.addClickKeypressInstrumentationHandler(handleDomListener(replay));
6897
+ utils.addHistoryInstrumentationHandler(handleHistorySpanListener(replay));
6794
6898
  handleNetworkBreadcrumbs(replay);
6795
6899
 
6796
6900
  // Tag all (non replay) events that get sent to Sentry with the current
@@ -6958,7 +7062,7 @@ function getHandleRecordingEmit(replay) {
6958
7062
  return (event, _isCheckout) => {
6959
7063
  // If this is false, it means session is expired, create and a new session and wait for checkout
6960
7064
  if (!replay.checkAndHandleExpiredSession()) {
6961
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.warn('[Replay] Received replay event after session expired.');
7065
+ DEBUG_BUILD && utils.logger.warn('[Replay] Received replay event after session expired.');
6962
7066
 
6963
7067
  return;
6964
7068
  }
@@ -7375,7 +7479,7 @@ async function sendReplay(
7375
7479
  _retryCount: retryConfig.count,
7376
7480
  });
7377
7481
 
7378
- if ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && options._experiments && options._experiments.captureExceptions) {
7482
+ if (DEBUG_BUILD && options._experiments && options._experiments.captureExceptions) {
7379
7483
  core.captureException(err);
7380
7484
  }
7381
7485
 
@@ -8107,9 +8211,9 @@ class ReplayContainer {
8107
8211
 
8108
8212
  /** A wrapper to conditionally capture exceptions. */
8109
8213
  _handleException(error) {
8110
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error('[Replay]', error);
8214
+ DEBUG_BUILD && utils.logger.error('[Replay]', error);
8111
8215
 
8112
- if ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && this._options._experiments && this._options._experiments.captureExceptions) {
8216
+ if (DEBUG_BUILD && this._options._experiments && this._options._experiments.captureExceptions) {
8113
8217
  core.captureException(error);
8114
8218
  }
8115
8219
  }
@@ -8426,7 +8530,7 @@ class ReplayContainer {
8426
8530
  const replayId = this.getSessionId();
8427
8531
 
8428
8532
  if (!this.session || !this.eventBuffer || !replayId) {
8429
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error('[Replay] No session or eventBuffer found to flush.');
8533
+ DEBUG_BUILD && utils.logger.error('[Replay] No session or eventBuffer found to flush.');
8430
8534
  return;
8431
8535
  }
8432
8536
 
@@ -8488,7 +8592,7 @@ class ReplayContainer {
8488
8592
  // In this case, we want to completely stop the replay - otherwise, we may get inconsistent segments
8489
8593
  void this.stop({ reason: 'sendReplay' });
8490
8594
 
8491
- const client = core.getCurrentHub().getClient();
8595
+ const client = core.getClient();
8492
8596
 
8493
8597
  if (client) {
8494
8598
  client.recordDroppedEvent('send_error', 'replay');
@@ -8511,7 +8615,7 @@ class ReplayContainer {
8511
8615
  }
8512
8616
 
8513
8617
  if (!this.checkAndHandleExpiredSession()) {
8514
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error('[Replay] Attempting to finish replay event after session expired.');
8618
+ DEBUG_BUILD && utils.logger.error('[Replay] Attempting to finish replay event after session expired.');
8515
8619
  return;
8516
8620
  }
8517
8621
 
@@ -8569,7 +8673,7 @@ class ReplayContainer {
8569
8673
  try {
8570
8674
  await this._flushLock;
8571
8675
  } catch (err) {
8572
- (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && utils.logger.error(err);
8676
+ DEBUG_BUILD && utils.logger.error(err);
8573
8677
  } finally {
8574
8678
  this._debouncedFlush();
8575
8679
  }
@@ -8638,10 +8742,12 @@ function getOption(
8638
8742
  allSelectors.push(`.${deprecatedClassOption}`);
8639
8743
  }
8640
8744
 
8641
- // eslint-disable-next-line no-console
8642
- console.warn(
8643
- '[Replay] You are using a deprecated configuration item for privacy. Read the documentation on how to use the new privacy configuration.',
8644
- );
8745
+ utils.consoleSandbox(() => {
8746
+ // eslint-disable-next-line no-console
8747
+ console.warn(
8748
+ '[Replay] You are using a deprecated configuration item for privacy. Read the documentation on how to use the new privacy configuration.',
8749
+ );
8750
+ });
8645
8751
  }
8646
8752
 
8647
8753
  return allSelectors.join(',');
@@ -9053,14 +9159,16 @@ Sentry.init({ replaysOnErrorSampleRate: ${errorSampleRate} })`,
9053
9159
 
9054
9160
  /** Parse Replay-related options from SDK options */
9055
9161
  function loadReplayOptionsFromClient(initialOptions) {
9056
- const client = core.getCurrentHub().getClient();
9162
+ const client = core.getClient();
9057
9163
  const opt = client && (client.getOptions() );
9058
9164
 
9059
9165
  const finalOptions = { sessionSampleRate: 0, errorSampleRate: 0, ...utils.dropUndefinedKeys(initialOptions) };
9060
9166
 
9061
9167
  if (!opt) {
9062
- // eslint-disable-next-line no-console
9063
- console.warn('SDK client is not available.');
9168
+ utils.consoleSandbox(() => {
9169
+ // eslint-disable-next-line no-console
9170
+ console.warn('SDK client is not available.');
9171
+ });
9064
9172
  return finalOptions;
9065
9173
  }
9066
9174
 
@@ -9070,10 +9178,12 @@ function loadReplayOptionsFromClient(initialOptions) {
9070
9178
  opt.replaysSessionSampleRate == null &&
9071
9179
  opt.replaysOnErrorSampleRate == null
9072
9180
  ) {
9073
- // eslint-disable-next-line no-console
9074
- console.warn(
9075
- 'Replay is disabled because neither `replaysSessionSampleRate` nor `replaysOnErrorSampleRate` are set.',
9076
- );
9181
+ utils.consoleSandbox(() => {
9182
+ // eslint-disable-next-line no-console
9183
+ console.warn(
9184
+ 'Replay is disabled because neither `replaysSessionSampleRate` nor `replaysOnErrorSampleRate` are set.',
9185
+ );
9186
+ });
9077
9187
  }
9078
9188
 
9079
9189
  if (typeof opt.replaysSessionSampleRate === 'number') {