@openreplay/tracker 15.0.5 → 15.0.7

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/index.js CHANGED
@@ -3729,6 +3729,7 @@ class Nodes {
3729
3729
  }
3730
3730
 
3731
3731
  const iconCache = {};
3732
+ const svgUrlCache = {};
3732
3733
  const domParser = new DOMParser();
3733
3734
  async function parseUseEl(useElement, mode) {
3734
3735
  try {
@@ -3745,13 +3746,43 @@ async function parseUseEl(useElement, mode) {
3745
3746
  if (iconCache[symbolId]) {
3746
3747
  return iconCache[symbolId];
3747
3748
  }
3748
- const response = await fetch(url);
3749
- const svgText = await response.text();
3750
- const svgDoc = domParser.parseFromString(svgText, 'image/svg+xml');
3749
+ let svgDoc;
3750
+ if (svgUrlCache[url]) {
3751
+ if (svgUrlCache[url] === 1) {
3752
+ await new Promise((resolve) => {
3753
+ let tries = 0;
3754
+ const interval = setInterval(() => {
3755
+ if (tries > 100) {
3756
+ clearInterval(interval);
3757
+ resolve(false);
3758
+ }
3759
+ if (svgUrlCache[url] !== 1) {
3760
+ svgDoc = svgUrlCache[url];
3761
+ clearInterval(interval);
3762
+ resolve(true);
3763
+ }
3764
+ else {
3765
+ tries++;
3766
+ }
3767
+ }, 100);
3768
+ });
3769
+ }
3770
+ else {
3771
+ svgDoc = svgUrlCache[url] ?? `<svg xmlns="http://www.w3.org/2000/svg"></svg>`;
3772
+ }
3773
+ }
3774
+ else {
3775
+ svgUrlCache[url] = 1;
3776
+ const response = await fetch(url);
3777
+ const svgText = await response.text();
3778
+ svgDoc = domParser.parseFromString(svgText, 'image/svg+xml');
3779
+ svgUrlCache[url] = svgDoc;
3780
+ }
3781
+ // @ts-ignore
3751
3782
  const symbol = svgDoc.getElementById(symbolId);
3752
3783
  if (!symbol) {
3753
3784
  console.debug('Openreplay: Symbol not found in SVG.');
3754
- return;
3785
+ return '';
3755
3786
  }
3756
3787
  if (mode === 'inline') ;
3757
3788
  if (mode === 'svgtext') {
@@ -3806,7 +3837,7 @@ var RecentsType;
3806
3837
  RecentsType[RecentsType["Changed"] = 2] = "Changed";
3807
3838
  })(RecentsType || (RecentsType = {}));
3808
3839
  class Observer {
3809
- constructor(app, isTopContext = false) {
3840
+ constructor(app, isTopContext = false, options = { disableSprites: false }) {
3810
3841
  this.app = app;
3811
3842
  this.isTopContext = isTopContext;
3812
3843
  this.commited = [];
@@ -3814,6 +3845,8 @@ class Observer {
3814
3845
  this.indexes = [];
3815
3846
  this.attributesMap = new Map();
3816
3847
  this.textSet = new Set();
3848
+ this.disableSprites = false;
3849
+ this.disableSprites = options.disableSprites;
3817
3850
  this.observer = createMutationObserver(this.app.safe((mutations) => {
3818
3851
  for (const mutation of mutations) {
3819
3852
  // mutations order is sequential
@@ -3908,7 +3941,7 @@ class Observer {
3908
3941
  if (value === null) {
3909
3942
  this.app.send(RemoveNodeAttribute(id, name));
3910
3943
  }
3911
- if (isUseElement(node) && name === 'href') {
3944
+ if (isUseElement(node) && name === 'href' && !this.disableSprites) {
3912
3945
  parseUseEl(node, 'svgtext')
3913
3946
  .then((svgData) => {
3914
3947
  if (svgData) {
@@ -4262,7 +4295,11 @@ class IFrameOffsets {
4262
4295
  const attachShadowNativeFn = IN_BROWSER ? Element.prototype.attachShadow : () => new ShadowRoot();
4263
4296
  class TopObserver extends Observer {
4264
4297
  constructor(params) {
4265
- super(params.app, true);
4298
+ const opts = Object.assign({
4299
+ captureIFrames: true,
4300
+ disableSprites: false,
4301
+ }, params.options);
4302
+ super(params.app, true, opts);
4266
4303
  this.iframeOffsets = new IFrameOffsets();
4267
4304
  this.contextCallbacks = [];
4268
4305
  // Attached once per Tracker instance
@@ -4272,9 +4309,7 @@ class TopObserver extends Observer {
4272
4309
  this.docObservers = new WeakMap();
4273
4310
  this.shadowRootObservers = new WeakMap();
4274
4311
  this.app = params.app;
4275
- this.options = Object.assign({
4276
- captureIFrames: true,
4277
- }, params.options);
4312
+ this.options = opts;
4278
4313
  // IFrames
4279
4314
  this.app.nodes.attachNodeCallback((node) => {
4280
4315
  if (hasTag(node, 'iframe') &&
@@ -4703,7 +4738,7 @@ class App {
4703
4738
  this.stopCallbacks = [];
4704
4739
  this.commitCallbacks = [];
4705
4740
  this.activityState = ActivityState.NotActive;
4706
- this.version = '15.0.5'; // TODO: version compatability check inside each plugin.
4741
+ this.version = '15.0.7'; // TODO: version compatability check inside each plugin.
4707
4742
  this.socketMode = false;
4708
4743
  this.compressionThreshold = 24 * 1000;
4709
4744
  this.bc = null;
@@ -4974,7 +5009,7 @@ class App {
4974
5009
  this.canvasRecorder?.restartTracking();
4975
5010
  };
4976
5011
  this.flushBuffer = async (buffer) => {
4977
- return new Promise((res) => {
5012
+ return new Promise((res, reject) => {
4978
5013
  if (buffer.length === 0) {
4979
5014
  res(null);
4980
5015
  return;
@@ -4984,9 +5019,18 @@ class App {
4984
5019
  while (endIndex < buffer.length && buffer[endIndex][0] !== 0 /* MType.Timestamp */) {
4985
5020
  endIndex++;
4986
5021
  }
4987
- const messagesBatch = buffer.splice(0, endIndex);
4988
- this.postToWorker(messagesBatch);
4989
- res(null);
5022
+ requestIdleCb(() => {
5023
+ try {
5024
+ const messagesBatch = buffer.splice(0, endIndex);
5025
+ // Cast out the proxy object to a regular array.
5026
+ this.postToWorker(messagesBatch.map((x) => [...x]));
5027
+ res(null);
5028
+ }
5029
+ catch (e) {
5030
+ this._debug('flushBuffer', e);
5031
+ reject(new Error('flush buffer fail'));
5032
+ }
5033
+ });
4990
5034
  });
4991
5035
  };
4992
5036
  this.onUxtCb = [];
@@ -5027,6 +5071,7 @@ class App {
5027
5071
  fixedCanvasScaling: false,
5028
5072
  disableCanvas: false,
5029
5073
  captureIFrames: true,
5074
+ disableSprites: false,
5030
5075
  obscureTextEmails: true,
5031
5076
  obscureTextNumbers: false,
5032
5077
  crossdomain: {
@@ -9156,7 +9201,7 @@ class API {
9156
9201
  this.signalStartIssue = (reason, missingApi) => {
9157
9202
  const doNotTrack = this.checkDoNotTrack();
9158
9203
  console.log("Tracker couldn't start due to:", JSON.stringify({
9159
- trackerVersion: '15.0.5',
9204
+ trackerVersion: '15.0.7',
9160
9205
  projectKey: this.options.projectKey,
9161
9206
  doNotTrack,
9162
9207
  reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,