@openreplay/tracker 3.5.12 → 3.5.13-beta.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 (62) hide show
  1. package/cjs/app/guards.d.ts +17 -0
  2. package/cjs/app/guards.js +24 -0
  3. package/cjs/app/index.d.ts +4 -0
  4. package/cjs/app/index.js +20 -16
  5. package/cjs/app/nodes.d.ts +1 -1
  6. package/cjs/app/observer/observer.d.ts +2 -2
  7. package/cjs/app/observer/observer.js +38 -46
  8. package/cjs/app/observer/top_observer.js +3 -3
  9. package/cjs/app/sanitizer.js +2 -2
  10. package/cjs/index.js +1 -1
  11. package/cjs/modules/console.d.ts +1 -1
  12. package/cjs/modules/console.js +2 -1
  13. package/cjs/modules/cssrules.d.ts +1 -1
  14. package/cjs/modules/cssrules.js +2 -4
  15. package/cjs/modules/exception.d.ts +1 -1
  16. package/cjs/modules/img.d.ts +1 -1
  17. package/cjs/modules/img.js +2 -1
  18. package/cjs/modules/input.d.ts +1 -1
  19. package/cjs/modules/input.js +13 -12
  20. package/cjs/modules/longtasks.d.ts +1 -1
  21. package/cjs/modules/mouse.d.ts +1 -1
  22. package/cjs/modules/mouse.js +3 -2
  23. package/cjs/modules/performance.d.ts +1 -1
  24. package/cjs/modules/scroll.d.ts +1 -1
  25. package/cjs/modules/scroll.js +5 -5
  26. package/cjs/modules/timing.d.ts +1 -1
  27. package/cjs/modules/timing.js +2 -1
  28. package/cjs/modules/viewport.d.ts +1 -1
  29. package/lib/app/guards.d.ts +17 -0
  30. package/lib/app/guards.js +16 -0
  31. package/lib/app/index.d.ts +4 -0
  32. package/lib/app/index.js +20 -16
  33. package/lib/app/nodes.d.ts +1 -1
  34. package/lib/app/observer/observer.d.ts +2 -2
  35. package/lib/app/observer/observer.js +34 -42
  36. package/lib/app/observer/top_observer.js +3 -3
  37. package/lib/app/sanitizer.js +2 -2
  38. package/lib/common/tsconfig.tsbuildinfo +1 -1
  39. package/lib/index.js +1 -1
  40. package/lib/modules/console.d.ts +1 -1
  41. package/lib/modules/console.js +2 -1
  42. package/lib/modules/cssrules.d.ts +1 -1
  43. package/lib/modules/cssrules.js +2 -4
  44. package/lib/modules/exception.d.ts +1 -1
  45. package/lib/modules/img.d.ts +1 -1
  46. package/lib/modules/img.js +2 -1
  47. package/lib/modules/input.d.ts +1 -1
  48. package/lib/modules/input.js +13 -12
  49. package/lib/modules/longtasks.d.ts +1 -1
  50. package/lib/modules/mouse.d.ts +1 -1
  51. package/lib/modules/mouse.js +3 -2
  52. package/lib/modules/performance.d.ts +1 -1
  53. package/lib/modules/scroll.d.ts +1 -1
  54. package/lib/modules/scroll.js +5 -5
  55. package/lib/modules/timing.d.ts +1 -1
  56. package/lib/modules/timing.js +2 -1
  57. package/lib/modules/viewport.d.ts +1 -1
  58. package/package.json +1 -1
  59. package/cjs/app/context.d.ts +0 -18
  60. package/cjs/app/context.js +0 -73
  61. package/lib/app/context.d.ts +0 -18
  62. package/lib/app/context.js +0 -68
@@ -0,0 +1,17 @@
1
+ export declare function isSVGElement(node: Element): node is SVGElement;
2
+ export declare function isElementNode(node: Node): node is Element;
3
+ export declare function isTextNode(node: Node): node is Text;
4
+ export declare function isRootNode(node: Node): boolean;
5
+ declare type TagTypeMap = {
6
+ HTML: HTMLHtmlElement;
7
+ IMG: HTMLImageElement;
8
+ INPUT: HTMLInputElement;
9
+ TEXTAREA: HTMLTextAreaElement;
10
+ SELECT: HTMLSelectElement;
11
+ LABEL: HTMLLabelElement;
12
+ IFRAME: HTMLIFrameElement;
13
+ STYLE: HTMLStyleElement | SVGStyleElement;
14
+ LINK: HTMLLinkElement;
15
+ };
16
+ export declare function hasTag<T extends keyof TagTypeMap>(el: Node, tagName: T): el is TagTypeMap[typeof tagName];
17
+ export {};
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasTag = exports.isRootNode = exports.isTextNode = exports.isElementNode = exports.isSVGElement = void 0;
4
+ function isSVGElement(node) {
5
+ return node.namespaceURI === 'http://www.w3.org/2000/svg';
6
+ }
7
+ exports.isSVGElement = isSVGElement;
8
+ function isElementNode(node) {
9
+ return node.nodeType === Node.ELEMENT_NODE;
10
+ }
11
+ exports.isElementNode = isElementNode;
12
+ function isTextNode(node) {
13
+ return node.nodeType === Node.TEXT_NODE;
14
+ }
15
+ exports.isTextNode = isTextNode;
16
+ function isRootNode(node) {
17
+ return node.nodeType === Node.DOCUMENT_NODE ||
18
+ node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
19
+ }
20
+ exports.isRootNode = isRootNode;
21
+ function hasTag(el, tagName) {
22
+ return el.nodeName.toUpperCase() === tagName;
23
+ }
24
+ exports.hasTag = hasTag;
@@ -44,6 +44,8 @@ declare type AppOptions = {
44
44
  __is_snippet: boolean;
45
45
  __debug_report_edp: string | null;
46
46
  __debug__?: LoggerOptions;
47
+ localStorage: Storage;
48
+ sessionStorage: Storage;
47
49
  onStart?: StartCallback;
48
50
  } & WebworkerOptions;
49
51
  export declare type Options = AppOptions & ObserverOptions & SanitizerOptions;
@@ -56,6 +58,8 @@ export default class App {
56
58
  readonly debug: Logger;
57
59
  readonly notify: Logger;
58
60
  readonly session: Session;
61
+ readonly localStorage: Storage;
62
+ readonly sessionStorage: Storage;
59
63
  private readonly messages;
60
64
  private readonly observer;
61
65
  private readonly startCallbacks;
package/cjs/app/index.js CHANGED
@@ -32,7 +32,7 @@ class App {
32
32
  this.stopCallbacks = [];
33
33
  this.commitCallbacks = [];
34
34
  this.activityState = ActivityState.NotActive;
35
- this.version = '3.5.12'; // TODO: version compatability check inside each plugin.
35
+ this.version = '3.5.13-beta.0'; // TODO: version compatability check inside each plugin.
36
36
  this.projectKey = projectKey;
37
37
  this.options = Object.assign({
38
38
  revID: '',
@@ -46,10 +46,9 @@ class App {
46
46
  verbose: false,
47
47
  __is_snippet: false,
48
48
  __debug_report_edp: null,
49
+ localStorage: window.localStorage,
50
+ sessionStorage: window.sessionStorage,
49
51
  }, options);
50
- if (sessionToken != null) {
51
- sessionStorage.setItem(this.options.session_token_key, sessionToken);
52
- }
53
52
  this.revID = this.options.revID;
54
53
  this.sanitizer = new sanitizer_js_1.default(this, options);
55
54
  this.nodes = new nodes_js_1.default(this.options.node_id);
@@ -59,6 +58,11 @@ class App {
59
58
  this.debug = new logger_js_1.default(this.options.__debug__);
60
59
  this.notify = new logger_js_1.default(this.options.verbose ? logger_js_1.LogLevel.Warnings : logger_js_1.LogLevel.Silent);
61
60
  this.session = new session_js_1.default(this);
61
+ this.localStorage = this.options.localStorage;
62
+ this.sessionStorage = this.options.sessionStorage;
63
+ if (sessionToken != null) {
64
+ this.sessionStorage.setItem(this.options.session_token_key, sessionToken);
65
+ }
62
66
  try {
63
67
  this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function i(...i){return new t(...i)}return i.prototype=t.prototype,i}const i=new Map;const s=t(class{constructor(t,i,s){this.pageNo=t,this.firstIndex=i,this.timestamp=s,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});i.set(80,s);const e=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});i.set(0,e);const n=t(class{constructor(t,i,s){this.url=t,this.referrer=i,this.navigationStart=s,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});i.set(4,n);const r=t(class{constructor(t,i){this.width=t,this.height=i,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});i.set(5,r);const h=t(class{constructor(t,i){this.x=t,this.y=i,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});i.set(6,h);const o=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});i.set(7,o);const c=t(class{constructor(t,i,s,e,n){this.id=t,this.parentID=i,this.index=s,this.tag=e,this.svg=n,this._id=8}encode(t){return t.uint(8)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)&&t.string(this.tag)&&t.boolean(this.svg)}});i.set(8,c);const a=t(class{constructor(t,i,s){this.id=t,this.parentID=i,this.index=s,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});i.set(9,a);const u=t(class{constructor(t,i,s){this.id=t,this.parentID=i,this.index=s,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});i.set(10,u);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});i.set(11,d);const l=t(class{constructor(t,i,s){this.id=t,this.name=i,this.value=s,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});i.set(12,l);const p=t(class{constructor(t,i){this.id=t,this.name=i,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});i.set(13,p);const m=t(class{constructor(t,i){this.id=t,this.data=i,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});i.set(14,m);const g=t(class{constructor(t,i,s){this.id=t,this.x=i,this.y=s,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});i.set(16,g);const f=t(class{constructor(t,i){this.id=t,this.label=i,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});i.set(17,f);const y=t(class{constructor(t,i,s){this.id=t,this.value=i,this.mask=s,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});i.set(18,y);const _=t(class{constructor(t,i){this.id=t,this.checked=i,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});i.set(19,_);const v=t(class{constructor(t,i){this.x=t,this.y=i,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});i.set(20,v);const b=t(class{constructor(t,i){this.level=t,this.value=i,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});i.set(22,b);const S=t(class{constructor(t,i,s,e,n,r,h,o,c){this.requestStart=t,this.responseStart=i,this.responseEnd=s,this.domContentLoadedEventStart=e,this.domContentLoadedEventEnd=n,this.loadEventStart=r,this.loadEventEnd=h,this.firstPaint=o,this.firstContentfulPaint=c,this._id=23}encode(t){return t.uint(23)&&t.uint(this.requestStart)&&t.uint(this.responseStart)&&t.uint(this.responseEnd)&&t.uint(this.domContentLoadedEventStart)&&t.uint(this.domContentLoadedEventEnd)&&t.uint(this.loadEventStart)&&t.uint(this.loadEventEnd)&&t.uint(this.firstPaint)&&t.uint(this.firstContentfulPaint)}});i.set(23,S);const w=t(class{constructor(t,i,s){this.speedIndex=t,this.visuallyComplete=i,this.timeToInteractive=s,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});i.set(24,w);const E=t(class{constructor(t,i,s){this.name=t,this.message=i,this.payload=s,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});i.set(25,E);const x=t(class{constructor(t,i){this.name=t,this.payload=i,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});i.set(27,x);const T=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});i.set(28,T);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});i.set(29,z);const k=t(class{constructor(t,i){this.key=t,this.value=i,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});i.set(30,k);const I=t(class{constructor(t,i,s){this.id=t,this.rule=i,this.index=s,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});i.set(37,I);const M=t(class{constructor(t,i){this.id=t,this.index=i,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});i.set(38,M);const B=t(class{constructor(t,i,s,e,n,r,h){this.method=t,this.url=i,this.request=s,this.response=e,this.status=n,this.timestamp=r,this.duration=h,this._id=39}encode(t){return t.uint(39)&&t.string(this.method)&&t.string(this.url)&&t.string(this.request)&&t.string(this.response)&&t.uint(this.status)&&t.uint(this.timestamp)&&t.uint(this.duration)}});i.set(39,B);const L=t(class{constructor(t,i,s,e){this.name=t,this.duration=i,this.args=s,this.result=e,this._id=40}encode(t){return t.uint(40)&&t.string(this.name)&&t.uint(this.duration)&&t.string(this.args)&&t.string(this.result)}});i.set(40,L);const C=t(class{constructor(t,i){this.key=t,this.value=i,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});i.set(41,C);const A=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});i.set(42,A);const U=t(class{constructor(t,i,s){this.action=t,this.state=i,this.duration=s,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});i.set(44,U);const N=t(class{constructor(t,i){this.mutation=t,this.state=i,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});i.set(45,N);const R=t(class{constructor(t,i){this.type=t,this.payload=i,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});i.set(46,R);const O=t(class{constructor(t,i,s){this.action=t,this.state=i,this.duration=s,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});i.set(47,O);const P=t(class{constructor(t,i,s,e){this.operationKind=t,this.operationName=i,this.variables=s,this.response=e,this._id=48}encode(t){return t.uint(48)&&t.string(this.operationKind)&&t.string(this.operationName)&&t.string(this.variables)&&t.string(this.response)}});i.set(48,P);const q=t(class{constructor(t,i,s,e){this.frames=t,this.ticks=i,this.totalJSHeapSize=s,this.usedJSHeapSize=e,this._id=49}encode(t){return t.uint(49)&&t.int(this.frames)&&t.int(this.ticks)&&t.uint(this.totalJSHeapSize)&&t.uint(this.usedJSHeapSize)}});i.set(49,q);const D=t(class{constructor(t,i,s,e,n,r,h,o){this.timestamp=t,this.duration=i,this.ttfb=s,this.headerSize=e,this.encodedBodySize=n,this.decodedBodySize=r,this.url=h,this.initiator=o,this._id=53}encode(t){return t.uint(53)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.ttfb)&&t.uint(this.headerSize)&&t.uint(this.encodedBodySize)&&t.uint(this.decodedBodySize)&&t.string(this.url)&&t.string(this.initiator)}});i.set(53,D);const W=t(class{constructor(t,i){this.downlink=t,this.type=i,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});i.set(54,W);const H=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});i.set(55,H);const J=t(class{constructor(t,i,s,e,n,r,h){this.timestamp=t,this.duration=i,this.context=s,this.containerType=e,this.containerSrc=n,this.containerId=r,this.containerName=h,this._id=59}encode(t){return t.uint(59)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.context)&&t.uint(this.containerType)&&t.string(this.containerSrc)&&t.string(this.containerId)&&t.string(this.containerName)}});i.set(59,J);const F=t(class{constructor(t,i,s,e){this.id=t,this.name=i,this.value=s,this.baseURL=e,this._id=60}encode(t){return t.uint(60)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)&&t.string(this.baseURL)}});i.set(60,F);const X=t(class{constructor(t,i,s){this.id=t,this.data=i,this.baseURL=s,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});i.set(61,X);const G=t(class{constructor(t,i){this.type=t,this.value=i,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});i.set(63,G);const K=t(class{constructor(t,i){this.name=t,this.payload=i,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});i.set(64,K);const j=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});i.set(65,j);const Q=t(class{constructor(t,i,s,e){this.id=t,this.rule=i,this.index=s,this.baseURL=e,this._id=67}encode(t){return t.uint(67)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)&&t.string(this.baseURL)}});i.set(67,Q);const V=t(class{constructor(t,i,s,e){this.id=t,this.hesitationTime=i,this.label=s,this.selector=e,this._id=69}encode(t){return t.uint(69)&&t.uint(this.id)&&t.uint(this.hesitationTime)&&t.string(this.label)&&t.string(this.selector)}});i.set(69,V);const Y=t(class{constructor(t,i){this.frameID=t,this.id=i,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});i.set(70,Y);class Z{constructor(t,i,s,e=10,n=1e3){this.onUnauthorised=i,this.onFailure=s,this.MAX_ATTEMPTS_COUNT=e,this.ATTEMPT_TIMEOUT=n,this.attemptsCount=0,this.busy=!1,this.queue=[],this.token=null,this.ingestURL=t+"/v1/web/i"}authorise(t){this.token=t}push(t){this.busy||!this.token?this.queue.push(t):this.sendBatch(t)}retry(t){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure():(this.attemptsCount++,setTimeout(()=>this.sendBatch(t),this.ATTEMPT_TIMEOUT*this.attemptsCount))}sendBatch(t){this.busy=!0,fetch(this.ingestURL,{body:t,method:"POST",headers:{Authorization:"Bearer "+this.token},keepalive:t.length<65536}).then(i=>{if(401===i.status)return this.busy=!1,void this.onUnauthorised();if(i.status>=400)return void this.retry(t);this.attemptsCount=0;const s=this.queue.shift();s?this.sendBatch(s):this.busy=!1}).catch(i=>{console.warn("OpenReplay:",i),this.retry(t)})}clean(){this.queue.length=0}}const tt="function"==typeof TextEncoder?new TextEncoder:{encode(t){const i=t.length,s=new Uint8Array(3*i);let e=-1;for(var n=0,r=0,h=0;h!==i;){if(n=t.charCodeAt(h),h+=1,n>=55296&&n<=56319){if(h===i){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;break}if(!((r=t.charCodeAt(h))>=56320&&r<=57343)){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;continue}if(h+=1,(n=1024*(n-55296)+r-56320+65536)>65535){s[e+=1]=240|n>>>18,s[e+=1]=128|n>>>12&63,s[e+=1]=128|n>>>6&63,s[e+=1]=128|63&n;continue}}n<=127?s[e+=1]=0|n:n<=2047?(s[e+=1]=192|n>>>6,s[e+=1]=128|63&n):(s[e+=1]=224|n>>>12,s[e+=1]=128|n>>>6&63,s[e+=1]=128|63&n)}return s.subarray(0,e+1)}};class it{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}checkpoint(){this.checkpointOffset=this.offset}isEmpty(){return 0===this.offset}boolean(t){return this.data[this.offset++]=+t,this.offset<=this.size}uint(t){for((t<0||t>Number.MAX_SAFE_INTEGER)&&(t=0);t>=128;)this.data[this.offset++]=t%256|128,t=Math.floor(t/128);return this.data[this.offset++]=t,this.offset<=this.size}int(t){return t=Math.round(t),this.uint(t>=0?2*t:-2*t-1)}string(t){const i=tt.encode(t),s=i.byteLength;return!(!this.uint(s)||this.offset+s>this.size)&&(this.data.set(i,this.offset),this.offset+=s,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}class st{constructor(t,i,s){this.pageNo=t,this.timestamp=i,this.onBatch=s,this.nextIndex=0,this.beaconSize=2e5,this.writer=new it(this.beaconSize),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepareBatchMeta()}prepareBatchMeta(){return new s(this.pageNo,this.nextIndex,this.timestamp).encode(this.writer)}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(t){if(t instanceof e&&(this.timestamp=t.timestamp),!t.encode(this.writer))for(this.isEmpty||(this.onBatch(this.writer.flush()),this.prepareBatchMeta());!t.encode(this.writer);){if(this.beaconSize===this.beaconSizeLimit)return console.warn("OpenReplay: beacon size overflow. Skipping large message."),this.writer.reset(),this.prepareBatchMeta(),void(this.isEmpty=!0);this.beaconSize=Math.min(2*this.beaconSize,this.beaconSizeLimit),this.writer=new it(this.beaconSize),this.prepareBatchMeta()}this.writer.checkpoint(),this.nextIndex++,this.isEmpty=!1}finaliseBatch(){this.isEmpty||(this.onBatch(this.writer.flush()),this.prepareBatchMeta(),this.isEmpty=!0)}clean(){this.writer.reset()}}let et=null,nt=null;function rt(){nt&&nt.finaliseBatch()}function ht(){null!==ct&&(clearInterval(ct),ct=null),nt&&(nt.clean(),nt=null)}let ot,ct=null;self.onmessage=({data:t})=>{if(null!=t){if("stop"===t)return rt(),void ht();if(Array.isArray(t)){if(!nt)throw new Error("WebWorker: writer not initialised.");const s=nt;t.forEach(t=>{const e=new(i.get(t._id));Object.assign(e,t),e instanceof H&&(e.hidden?ot=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(ot)),s.writeMessage(e)})}else{if("start"===t.type)return et=new Z(t.ingestPoint,()=>{self.postMessage("restart")},()=>{et&&(et.clean(),et=null),ht(),self.postMessage("failed")},t.connAttemptCount,t.connAttemptGap),nt=new st(t.pageNo,t.timestamp,t=>et&&et.push(t)),void(null===ct&&(ct=setInterval(rt,1e4)));if("auth"===t.type){if(!et)throw new Error("WebWorker: sender not initialised. Recieved auth.");if(!nt)throw new Error("WebWorker: writer not initialised. Recieved auth.");return et.authorise(t.token),void(t.beaconSizeLimit&&nt.setBeaconSizeLimit(t.beaconSizeLimit))}}}else rt()};
64
68
  `], { type: 'text/javascript' })));
@@ -166,7 +170,7 @@ class App {
166
170
  }
167
171
  getStartInfo() {
168
172
  return {
169
- userUUID: localStorage.getItem(this.options.local_uuid_key),
173
+ userUUID: this.localStorage.getItem(this.options.local_uuid_key),
170
174
  projectKey: this.projectKey,
171
175
  revID: this.revID,
172
176
  timestamp: (0, utils_js_1.timestamp)(),
@@ -178,7 +182,7 @@ class App {
178
182
  return Object.assign(Object.assign({}, this.session.getInfo()), this.getStartInfo());
179
183
  }
180
184
  getSessionToken() {
181
- const token = sessionStorage.getItem(this.options.session_token_key);
185
+ const token = this.sessionStorage.getItem(this.options.session_token_key);
182
186
  if (token !== null) {
183
187
  return token;
184
188
  }
@@ -220,10 +224,10 @@ class App {
220
224
  }
221
225
  resetNextPageSession(flag) {
222
226
  if (flag) {
223
- sessionStorage.setItem(this.options.session_reset_key, 't');
227
+ this.sessionStorage.setItem(this.options.session_reset_key, 't');
224
228
  }
225
229
  else {
226
- sessionStorage.removeItem(this.options.session_reset_key);
230
+ this.sessionStorage.removeItem(this.options.session_reset_key);
227
231
  }
228
232
  }
229
233
  _start(startOpts) {
@@ -235,12 +239,12 @@ class App {
235
239
  }
236
240
  this.activityState = ActivityState.Starting;
237
241
  let pageNo = 0;
238
- const pageNoStr = sessionStorage.getItem(this.options.session_pageno_key);
242
+ const pageNoStr = this.sessionStorage.getItem(this.options.session_pageno_key);
239
243
  if (pageNoStr != null) {
240
244
  pageNo = parseInt(pageNoStr);
241
245
  pageNo++;
242
246
  }
243
- sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
247
+ this.sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
244
248
  const startInfo = this.getStartInfo();
245
249
  const startWorkerMsg = {
246
250
  type: "start",
@@ -251,14 +255,14 @@ class App {
251
255
  connAttemptGap: this.options.connAttemptGap,
252
256
  };
253
257
  this.worker.postMessage(startWorkerMsg); // brings delay of 10th ms?
254
- const sReset = sessionStorage.getItem(this.options.session_reset_key);
255
- sessionStorage.removeItem(this.options.session_reset_key);
258
+ const sReset = this.sessionStorage.getItem(this.options.session_reset_key);
259
+ this.sessionStorage.removeItem(this.options.session_reset_key);
256
260
  return window.fetch(this.options.ingestPoint + '/v1/web/start', {
257
261
  method: 'POST',
258
262
  headers: {
259
263
  'Content-Type': 'application/json',
260
264
  },
261
- body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { userID: startOpts.userID || this.session.getInfo().userID, token: sessionStorage.getItem(this.options.session_token_key), deviceMemory: performance_js_1.deviceMemory,
265
+ body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { userID: startOpts.userID || this.session.getInfo().userID, token: this.sessionStorage.getItem(this.options.session_token_key), deviceMemory: performance_js_1.deviceMemory,
262
266
  jsHeapSizeLimit: performance_js_1.jsHeapSizeLimit, reset: startOpts.forceNew || sReset !== null })),
263
267
  })
264
268
  .then(r => {
@@ -281,8 +285,8 @@ class App {
281
285
  (typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
282
286
  return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`);
283
287
  }
284
- sessionStorage.setItem(this.options.session_token_key, token);
285
- localStorage.setItem(this.options.local_uuid_key, userUUID);
288
+ this.sessionStorage.setItem(this.options.session_token_key, token);
289
+ this.localStorage.setItem(this.options.local_uuid_key, userUUID);
286
290
  this.session.update(Object.assign({ sessionID }, startOpts));
287
291
  this.activityState = ActivityState.Active;
288
292
  const startWorkerMsg = {
@@ -303,7 +307,7 @@ class App {
303
307
  return SuccessfulStart(onStartInfo);
304
308
  })
305
309
  .catch(reason => {
306
- sessionStorage.removeItem(this.options.session_token_key);
310
+ this.sessionStorage.removeItem(this.options.session_token_key);
307
311
  this.stop();
308
312
  if (reason === CANCELED) {
309
313
  return UnsuccessfulStart(CANCELED);
@@ -7,7 +7,7 @@ export default class Nodes {
7
7
  constructor(node_id: string);
8
8
  attachNodeCallback(nodeCallback: NodeCallback): void;
9
9
  attachElementListener(type: string, node: Element, elementListener: EventListener): void;
10
- registerNode(node: Node): [number, boolean];
10
+ registerNode(node: Node): [id: number, isNew: boolean];
11
11
  unregisterNode(node: Node): number | undefined;
12
12
  callNodeCallbacks(node: Node): void;
13
13
  getID(node: Node): number | undefined;
@@ -4,11 +4,11 @@ export default abstract class Observer {
4
4
  protected readonly isTopContext: boolean;
5
5
  private readonly observer;
6
6
  private readonly commited;
7
- private readonly recents;
8
- private readonly myNodes;
9
7
  private readonly indexes;
10
8
  private readonly attributesList;
11
9
  private readonly textSet;
10
+ private readonly newSet;
11
+ private readonly affectedSet;
12
12
  constructor(app: App, isTopContext?: boolean);
13
13
  private clear;
14
14
  private sendNodeAttribute;
@@ -1,15 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const messages_js_1 = require("../../common/messages.js");
4
- const context_js_1 = require("../context.js");
5
- function isSVGElement(node) {
6
- return node.namespaceURI === 'http://www.w3.org/2000/svg';
7
- }
4
+ const guards_js_1 = require("../guards.js");
8
5
  function isIgnored(node) {
9
- if ((0, context_js_1.isInstance)(node, Text)) {
6
+ if ((0, guards_js_1.isTextNode)(node)) {
10
7
  return false;
11
8
  }
12
- if (!(0, context_js_1.isInstance)(node, Element)) {
9
+ if (!(0, guards_js_1.isElementNode)(node)) {
13
10
  return true;
14
11
  }
15
12
  const tag = node.tagName.toUpperCase();
@@ -24,11 +21,8 @@ function isIgnored(node) {
24
21
  tag === 'TITLE' ||
25
22
  tag === 'BASE');
26
23
  }
27
- function isRootNode(node) {
28
- return (0, context_js_1.isInstance)(node, Document) || (0, context_js_1.isInstance)(node, ShadowRoot);
29
- }
30
24
  function isObservable(node) {
31
- if (isRootNode(node)) {
25
+ if ((0, guards_js_1.isRootNode)(node)) {
32
26
  return true;
33
27
  }
34
28
  return !isIgnored(node);
@@ -38,20 +32,23 @@ class Observer {
38
32
  this.app = app;
39
33
  this.isTopContext = isTopContext;
40
34
  this.commited = [];
41
- this.recents = [];
42
- this.myNodes = [];
43
35
  this.indexes = [];
44
36
  this.attributesList = [];
45
37
  this.textSet = new Set();
38
+ this.newSet = new Set();
39
+ this.affectedSet = new Set();
46
40
  this.observer = new MutationObserver(this.app.safe((mutations) => {
47
41
  for (const mutation of mutations) {
48
42
  const target = mutation.target;
49
43
  const type = mutation.type;
50
- if (!isObservable(target) || !(0, context_js_1.inDocument)(target)) {
44
+ if (!isObservable(target) /*|| !inDocument() */) {
51
45
  continue;
52
46
  }
53
47
  if (type === 'childList') {
54
48
  for (let i = 0; i < mutation.removedNodes.length; i++) {
49
+ // TODO: handle node removal separately from binding.
50
+ // Node removals should go first in the commit.
51
+ // To check: MoveNode and other possible unbinding behaviours
55
52
  this.bindTree(mutation.removedNodes[i]);
56
53
  }
57
54
  for (let i = 0; i < mutation.addedNodes.length; i++) {
@@ -63,9 +60,6 @@ class Observer {
63
60
  if (id === undefined) {
64
61
  continue;
65
62
  }
66
- if (id >= this.recents.length) { // TODO: something more convinient
67
- this.recents[id] = undefined;
68
- }
69
63
  if (type === 'attributes') {
70
64
  const name = mutation.attributeName;
71
65
  if (name === null) {
@@ -76,10 +70,12 @@ class Observer {
76
70
  this.attributesList[id] = attr = new Set();
77
71
  }
78
72
  attr.add(name);
73
+ this.affectedSet.add(id);
79
74
  continue;
80
75
  }
81
76
  if (type === 'characterData') {
82
77
  this.textSet.add(id);
78
+ this.affectedSet.add(id);
83
79
  continue;
84
80
  }
85
81
  }
@@ -88,13 +84,14 @@ class Observer {
88
84
  }
89
85
  clear() {
90
86
  this.commited.length = 0;
91
- this.recents.length = 0;
92
87
  this.indexes.length = 1;
93
88
  this.attributesList.length = 0;
94
89
  this.textSet.clear();
90
+ this.newSet.clear();
91
+ this.affectedSet.clear();
95
92
  }
96
93
  sendNodeAttribute(id, node, name, value) {
97
- if (isSVGElement(node)) {
94
+ if ((0, guards_js_1.isSVGElement)(node)) {
98
95
  if (name.substr(0, 6) === 'xlink:') {
99
96
  name = name.substr(6);
100
97
  }
@@ -121,7 +118,7 @@ class Observer {
121
118
  return;
122
119
  }
123
120
  if (name === 'value' &&
124
- (0, context_js_1.isInstance)(node, HTMLInputElement) &&
121
+ (0, guards_js_1.hasTag)(node, "INPUT") &&
125
122
  node.type !== 'button' &&
126
123
  node.type !== 'reset' &&
127
124
  node.type !== 'submit') {
@@ -131,7 +128,7 @@ class Observer {
131
128
  this.app.send(new messages_js_1.RemoveNodeAttribute(id, name));
132
129
  return;
133
130
  }
134
- if (name === 'style' || name === 'href' && (0, context_js_1.isInstance)(node, HTMLLinkElement)) {
131
+ if (name === 'style' || name === 'href' && (0, guards_js_1.hasTag)(node, "LINK")) {
135
132
  this.app.send(new messages_js_1.SetNodeAttributeURLBased(id, name, value, this.app.getBaseHref()));
136
133
  return;
137
134
  }
@@ -141,7 +138,7 @@ class Observer {
141
138
  this.app.send(new messages_js_1.SetNodeAttribute(id, name, value));
142
139
  }
143
140
  sendNodeData(id, parentElement, data) {
144
- if ((0, context_js_1.isInstance)(parentElement, HTMLStyleElement) || (0, context_js_1.isInstance)(parentElement, SVGStyleElement)) {
141
+ if ((0, guards_js_1.hasTag)(parentElement, "STYLE")) {
145
142
  this.app.send(new messages_js_1.SetCSSDataURLBased(id, data, this.app.getBaseHref()));
146
143
  return;
147
144
  }
@@ -149,10 +146,11 @@ class Observer {
149
146
  this.app.send(new messages_js_1.SetNodeData(id, data));
150
147
  }
151
148
  bindNode(node) {
152
- const r = this.app.nodes.registerNode(node);
153
- const id = r[0];
154
- this.recents[id] = r[1] || this.recents[id] || false;
155
- this.myNodes[id] = true;
149
+ const [id, isNew] = this.app.nodes.registerNode(node);
150
+ if (isNew) {
151
+ this.newSet.add(id);
152
+ }
153
+ this.affectedSet.add(id);
156
154
  }
157
155
  bindTree(node) {
158
156
  if (!isObservable(node)) {
@@ -172,12 +170,13 @@ class Observer {
172
170
  }
173
171
  unbindNode(node) {
174
172
  const id = this.app.nodes.unregisterNode(node);
175
- if (id !== undefined && this.recents[id] === false) {
173
+ // if (id !== undefined && this.recents[id] === false) { // In the old version it === flase when bindNode() was called on node but it was not new
174
+ if (id !== undefined && !this.newSet.has(id) && this.affectedSet.has(id)) { // Unbinding logic should be simplified. Node removals should go first.
176
175
  this.app.send(new messages_js_1.RemoveNode(id));
177
176
  }
178
177
  }
179
178
  _commitNode(id, node) {
180
- if (isRootNode(node)) {
179
+ if ((0, guards_js_1.isRootNode)(node)) {
181
180
  return true;
182
181
  }
183
182
  const parent = node.parentNode;
@@ -185,7 +184,7 @@ class Observer {
185
184
  // Disable parent check for the upper context HTMLHtmlElement, because it is root there... (before)
186
185
  // TODO: get rid of "special" cases (there is an issue with CreateDocument altered behaviour though)
187
186
  // TODO: Clean the logic (though now it workd fine)
188
- if (!(0, context_js_1.isInstance)(node, HTMLHtmlElement) || !this.isTopContext) {
187
+ if (!(0, guards_js_1.hasTag)(node, "HTML") || !this.isTopContext) {
189
188
  if (parent === null) {
190
189
  this.unbindNode(node);
191
190
  return false;
@@ -212,24 +211,24 @@ class Observer {
212
211
  sibling = sibling.previousSibling;
213
212
  }
214
213
  if (sibling === null) {
215
- this.indexes[id] = 0; //
214
+ this.indexes[id] = 0;
216
215
  }
217
- const isNew = this.recents[id];
216
+ const isNew = this.newSet.has(id);
218
217
  const index = this.indexes[id];
219
218
  if (index === undefined) {
220
219
  throw 'commitNode: missing node index';
221
220
  }
222
221
  if (isNew === true) {
223
- if ((0, context_js_1.isInstance)(node, Element)) {
222
+ if ((0, guards_js_1.isElementNode)(node)) {
224
223
  if (parentID !== undefined) {
225
- this.app.send(new messages_js_1.CreateElementNode(id, parentID, index, node.tagName, isSVGElement(node)));
224
+ this.app.send(new messages_js_1.CreateElementNode(id, parentID, index, node.tagName, (0, guards_js_1.isSVGElement)(node)));
226
225
  }
227
226
  for (let i = 0; i < node.attributes.length; i++) {
228
227
  const attr = node.attributes[i];
229
228
  this.sendNodeAttribute(id, node, attr.nodeName, attr.value);
230
229
  }
231
230
  }
232
- else if ((0, context_js_1.isInstance)(node, Text)) {
231
+ else if ((0, guards_js_1.isTextNode)(node)) {
233
232
  // for text node id != 0, hence parentID !== undefined and parent is Element
234
233
  this.app.send(new messages_js_1.CreateTextNode(id, parentID, index));
235
234
  this.sendNodeData(id, parent, node.data);
@@ -237,11 +236,12 @@ class Observer {
237
236
  return true;
238
237
  }
239
238
  if (isNew === false && parentID !== undefined) {
239
+ // does this happen a lot?
240
240
  this.app.send(new messages_js_1.MoveNode(id, parentID, index));
241
241
  }
242
242
  const attr = this.attributesList[id];
243
243
  if (attr !== undefined) {
244
- if (!(0, context_js_1.isInstance)(node, Element)) {
244
+ if (!(0, guards_js_1.isElementNode)(node)) {
245
245
  throw 'commitNode: node is not an element';
246
246
  }
247
247
  for (const name of attr) {
@@ -249,7 +249,7 @@ class Observer {
249
249
  }
250
250
  }
251
251
  if (this.textSet.has(id)) {
252
- if (!(0, context_js_1.isInstance)(node, Text)) {
252
+ if (!(0, guards_js_1.isTextNode)(node)) {
253
253
  throw 'commitNode: node is not a text';
254
254
  }
255
255
  // for text node id != 0, hence parent is Element
@@ -270,19 +270,12 @@ class Observer {
270
270
  }
271
271
  commitNodes() {
272
272
  let node;
273
- for (let id = 0; id < this.recents.length; id++) {
274
- // TODO: make things/logic nice here.
275
- // commit required in any case if recents[id] true or false (in case of unbinding) or undefined (in case of attr change).
276
- // Possible solution: separate new node commit (recents) and new attribute/move node commit
277
- // Otherwise commitNode is called on each node, which might be a lot
278
- if (!this.myNodes[id]) {
279
- continue;
280
- }
273
+ this.affectedSet.forEach(id => {
281
274
  this.commitNode(id);
282
- if (this.recents[id] === true && (node = this.app.nodes.getNode(id))) {
275
+ if (this.newSet.has(id) && (node = this.app.nodes.getNode(id))) {
283
276
  this.app.nodes.callNodeCallbacks(node);
284
277
  }
285
- }
278
+ });
286
279
  this.clear();
287
280
  }
288
281
  // ISSSUE
@@ -302,7 +295,6 @@ class Observer {
302
295
  disconnect() {
303
296
  this.observer.disconnect();
304
297
  this.clear();
305
- this.myNodes.length = 0;
306
298
  }
307
299
  }
308
300
  exports.default = Observer;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const observer_js_1 = require("./observer.js");
4
- const context_js_1 = require("../context.js");
4
+ const guards_js_1 = require("../guards.js");
5
5
  const iframe_observer_js_1 = require("./iframe_observer.js");
6
6
  const shadow_root_observer_js_1 = require("./shadow_root_observer.js");
7
7
  const messages_js_1 = require("../../common/messages.js");
@@ -17,7 +17,7 @@ class TopObserver extends observer_js_1.default {
17
17
  }, options);
18
18
  // IFrames
19
19
  this.app.nodes.attachNodeCallback(node => {
20
- if ((0, context_js_1.isInstance)(node, HTMLIFrameElement) &&
20
+ if ((0, guards_js_1.hasTag)(node, "IFRAME") &&
21
21
  ((this.options.captureIFrames && !(0, utils_js_1.hasOpenreplayAttribute)(node, "obscured"))
22
22
  || (0, utils_js_1.hasOpenreplayAttribute)(node, "capture"))) {
23
23
  this.handleIframe(node);
@@ -25,7 +25,7 @@ class TopObserver extends observer_js_1.default {
25
25
  });
26
26
  // ShadowDOM
27
27
  this.app.nodes.attachNodeCallback(node => {
28
- if ((0, context_js_1.isInstance)(node, Element) && node.shadowRoot !== null) {
28
+ if ((0, guards_js_1.isElementNode)(node) && node.shadowRoot !== null) {
29
29
  this.handleShadowRoot(node.shadowRoot);
30
30
  }
31
31
  });
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const utils_js_1 = require("../utils.js");
4
- const context_js_1 = require("./context.js");
4
+ const guards_js_1 = require("./guards.js");
5
5
  class Sanitizer {
6
6
  constructor(app, options) {
7
7
  this.app = app;
@@ -13,7 +13,7 @@ class Sanitizer {
13
13
  }
14
14
  handleNode(id, parentID, node) {
15
15
  if (this.masked.has(parentID) ||
16
- ((0, context_js_1.isInstance)(node, Element) && (0, utils_js_1.hasOpenreplayAttribute)(node, 'masked'))) {
16
+ ((0, guards_js_1.isElementNode)(node) && (0, utils_js_1.hasOpenreplayAttribute)(node, 'masked'))) {
17
17
  this.masked.add(id);
18
18
  }
19
19
  }
package/cjs/index.js CHANGED
@@ -127,7 +127,7 @@ class API {
127
127
  // no-cors issue only with text/plain or not-set Content-Type
128
128
  // req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
129
129
  req.send(JSON.stringify({
130
- trackerVersion: '3.5.12',
130
+ trackerVersion: '3.5.13-beta.0',
131
131
  projectKey: options.projectKey,
132
132
  doNotTrack,
133
133
  // TODO: add precise reason (an exact API missing)
@@ -1,4 +1,4 @@
1
- import App from "../app/index.js";
1
+ import type App from "../app/index.js";
2
2
  export interface Options {
3
3
  consoleMethods: Array<string> | null;
4
4
  consoleThrottling: number;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const guards_js_1 = require("../app/guards.js");
3
4
  const utils_js_1 = require("../utils.js");
4
5
  const messages_js_1 = require("../common/messages.js");
5
6
  const printError = utils_js_1.IN_BROWSER && 'InstallTrigger' in window // detect Firefox
@@ -115,7 +116,7 @@ function default_1(app, opts) {
115
116
  });
116
117
  patchConsole(window.console);
117
118
  app.nodes.attachNodeCallback(app.safe(node => {
118
- if (node instanceof HTMLIFrameElement) {
119
+ if ((0, guards_js_1.hasTag)(node, "IFRAME")) { // TODO: newContextCallback
119
120
  let context = node.contentWindow;
120
121
  if (context) {
121
122
  patchConsole(context.console);
@@ -1,2 +1,2 @@
1
- import App from "../app/index.js";
1
+ import type App from "../app/index.js";
2
2
  export default function (app: App | null): void;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const messages_js_1 = require("../common/messages.js");
4
+ const guards_js_1 = require("../app/guards.js");
4
5
  function default_1(app) {
5
6
  if (app === null) {
6
7
  return;
@@ -32,10 +33,7 @@ function default_1(app) {
32
33
  return deleteRule.call(this, index);
33
34
  };
34
35
  app.nodes.attachNodeCallback((node) => {
35
- if (!(node instanceof HTMLStyleElement)) {
36
- return;
37
- }
38
- if (!(node.sheet instanceof CSSStyleSheet)) {
36
+ if (!(0, guards_js_1.hasTag)(node, "STYLE") || !node.sheet) {
39
37
  return;
40
38
  }
41
39
  if (node.textContent !== null && node.textContent.trim().length > 0) {
@@ -1,5 +1,5 @@
1
+ import type App from "../app/index.js";
1
2
  import type Message from "../common/messages.js";
2
- import App from "../app/index.js";
3
3
  export interface Options {
4
4
  captureExceptions: boolean;
5
5
  }
@@ -1,2 +1,2 @@
1
- import App from "../app/index.js";
1
+ import type App from "../app/index.js";
2
2
  export default function (app: App): void;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const utils_js_1 = require("../utils.js");
4
4
  const messages_js_1 = require("../common/messages.js");
5
+ const guards_js_1 = require("../app/guards.js");
5
6
  const PLACEHOLDER_SRC = "https://static.openreplay.com/tracker/placeholder.jpeg";
6
7
  function default_1(app) {
7
8
  function sendPlaceholder(id, node) {
@@ -49,7 +50,7 @@ function default_1(app) {
49
50
  }
50
51
  });
51
52
  app.nodes.attachNodeCallback((node) => {
52
- if (!(node instanceof HTMLImageElement)) {
53
+ if (!(0, guards_js_1.hasTag)(node, "IMG")) {
53
54
  return;
54
55
  }
55
56
  app.nodes.attachElementListener('error', node, sendImgSrc);
@@ -1,4 +1,4 @@
1
- import App from "../app/index.js";
1
+ import type App from "../app/index.js";
2
2
  declare type TextEditableElement = HTMLInputElement | HTMLTextAreaElement;
3
3
  export declare function getInputLabel(node: TextEditableElement): string;
4
4
  export declare const enum InputMode {