@openreplay/tracker 5.0.1-beta.3 → 5.0.1
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/CHANGELOG.md +1 -0
- package/cjs/app/guards.d.ts +1 -0
- package/cjs/app/guards.js +5 -1
- package/cjs/app/index.d.ts +0 -3
- package/cjs/app/index.js +2 -3
- package/cjs/app/observer/observer.js +3 -0
- package/cjs/app/observer/top_observer.js +0 -2
- package/cjs/index.js +1 -1
- package/cjs/modules/mouse.js +1 -1
- package/cjs/modules/network.d.ts +1 -1
- package/cjs/modules/network.js +10 -44
- package/lib/app/guards.d.ts +1 -0
- package/lib/app/guards.js +3 -0
- package/lib/app/index.d.ts +0 -3
- package/lib/app/index.js +2 -3
- package/lib/app/observer/observer.js +4 -1
- package/lib/app/observer/top_observer.js +0 -2
- package/lib/index.js +1 -1
- package/lib/modules/mouse.js +1 -1
- package/lib/modules/network.d.ts +1 -1
- package/lib/modules/network.js +10 -44
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/cjs/app/guards.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export declare function isNode(sth: any): sth is Node;
|
|
2
2
|
export declare function isSVGElement(node: Element): node is SVGElement;
|
|
3
3
|
export declare function isElementNode(node: Node): node is Element;
|
|
4
|
+
export declare function isCommentNode(node: Node): node is Comment;
|
|
4
5
|
export declare function isTextNode(node: Node): node is Text;
|
|
5
6
|
export declare function isDocument(node: Node): node is Document;
|
|
6
7
|
export declare function isRootNode(node: Node): node is Document | DocumentFragment;
|
package/cjs/app/guards.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.hasTag = exports.isRootNode = exports.isDocument = exports.isTextNode = exports.isElementNode = exports.isSVGElement = exports.isNode = void 0;
|
|
3
|
+
exports.hasTag = exports.isRootNode = exports.isDocument = exports.isTextNode = exports.isCommentNode = exports.isElementNode = exports.isSVGElement = exports.isNode = void 0;
|
|
4
4
|
//@ts-ignore
|
|
5
5
|
function isNode(sth) {
|
|
6
6
|
return !!sth && sth.nodeType != null;
|
|
@@ -14,6 +14,10 @@ function isElementNode(node) {
|
|
|
14
14
|
return node.nodeType === Node.ELEMENT_NODE;
|
|
15
15
|
}
|
|
16
16
|
exports.isElementNode = isElementNode;
|
|
17
|
+
function isCommentNode(node) {
|
|
18
|
+
return node.nodeType === Node.COMMENT_NODE;
|
|
19
|
+
}
|
|
20
|
+
exports.isCommentNode = isCommentNode;
|
|
17
21
|
function isTextNode(node) {
|
|
18
22
|
return node.nodeType === Node.TEXT_NODE;
|
|
19
23
|
}
|
package/cjs/app/index.d.ts
CHANGED
|
@@ -9,7 +9,6 @@ import type { Options as ObserverOptions } from './observer/top_observer.js';
|
|
|
9
9
|
import type { Options as SanitizerOptions } from './sanitizer.js';
|
|
10
10
|
import type { Options as LoggerOptions } from './logger.js';
|
|
11
11
|
import type { Options as SessOptions } from './session.js';
|
|
12
|
-
import type { Options as NetworkOptions } from '../modules/network.js';
|
|
13
12
|
import type { Options as WebworkerOptions } from '../common/interaction.js';
|
|
14
13
|
export interface StartOptions {
|
|
15
14
|
userID?: string;
|
|
@@ -51,7 +50,6 @@ type AppOptions = {
|
|
|
51
50
|
localStorage: Storage | null;
|
|
52
51
|
sessionStorage: Storage | null;
|
|
53
52
|
onStart?: StartCallback;
|
|
54
|
-
network?: NetworkOptions;
|
|
55
53
|
} & WebworkerOptions & SessOptions;
|
|
56
54
|
export type Options = AppOptions & ObserverOptions & SanitizerOptions;
|
|
57
55
|
export declare const DEFAULT_INGEST_POINT = "https://api.openreplay.com/ingest";
|
|
@@ -71,7 +69,6 @@ export default class App {
|
|
|
71
69
|
private readonly stopCallbacks;
|
|
72
70
|
private readonly commitCallbacks;
|
|
73
71
|
private readonly options;
|
|
74
|
-
readonly networkOptions?: NetworkOptions;
|
|
75
72
|
private readonly revID;
|
|
76
73
|
private activityState;
|
|
77
74
|
private readonly version;
|
package/cjs/app/index.js
CHANGED
|
@@ -33,11 +33,10 @@ class App {
|
|
|
33
33
|
this.stopCallbacks = [];
|
|
34
34
|
this.commitCallbacks = [];
|
|
35
35
|
this.activityState = ActivityState.NotActive;
|
|
36
|
-
this.version = '5.0.1
|
|
36
|
+
this.version = '5.0.1'; // TODO: version compatability check inside each plugin.
|
|
37
37
|
this._usingOldFetchPlugin = false;
|
|
38
38
|
this.delay = 0;
|
|
39
39
|
this.projectKey = projectKey;
|
|
40
|
-
this.networkOptions = options.network;
|
|
41
40
|
this.options = Object.assign({
|
|
42
41
|
revID: '',
|
|
43
42
|
node_id: '__openreplay_id',
|
|
@@ -78,7 +77,7 @@ class App {
|
|
|
78
77
|
this.session.applySessionHash(sessionToken);
|
|
79
78
|
}
|
|
80
79
|
try {
|
|
81
|
-
this.worker = new Worker(URL.createObjectURL(new Blob(['"use strict";class t{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,this.busy||this.sendNext()}push(t){this.busy||!this.token?this.queue.push(t):this.sendBatch(t)}sendNext(){const t=this.queue.shift();t?this.sendBatch(t):this.busy=!1}retry(t){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure(`Failed to send batch after ${this.attemptsCount} attempts.`):(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();i.status>=400?this.retry(t):(this.attemptsCount=0,this.sendNext())}).catch(i=>{console.warn("OpenReplay:",i),this.retry(t)})}clean(){this.queue.length=0,this.token=null}}const i="function"==typeof TextEncoder?new TextEncoder:{encode(t){const i=t.length,s=new Uint8Array(3*i);let e=-1;for(let 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),!(r>=56320&&r<=57343)){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;continue}if(n=1024*(n-55296)+r-56320+65536,h+=1,n>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 s extends class{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}getCurrentOffset(){return this.offset}checkpoint(){this.checkpointOffset=this.offset}get isEmpty(){return 0===this.offset}skip(t){return this.offset+=t,this.offset<=this.size}set(t,i){this.data.set(t,i)}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 s=i.encode(t),e=s.byteLength;return!(!this.uint(e)||this.offset+e>this.size)&&(this.data.set(s,this.offset),this.offset+=e,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}{encode(t){switch(t[0]){case 0:return this.uint(t[1]);case 4:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 5:return this.uint(t[1])&&this.uint(t[2]);case 6:return this.int(t[1])&&this.int(t[2]);case 7:return!0;case 8:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.string(t[4])&&this.boolean(t[5]);case 9:case 10:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 11:return this.uint(t[1]);case 12:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 13:case 14:return this.uint(t[1])&&this.string(t[2]);case 16:return this.uint(t[1])&&this.int(t[2])&&this.int(t[3]);case 17:return this.uint(t[1])&&this.string(t[2]);case 18:return this.uint(t[1])&&this.string(t[2])&&this.int(t[3]);case 19:return this.uint(t[1])&&this.boolean(t[2]);case 20:return this.uint(t[1])&&this.uint(t[2]);case 21:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.string(t[5])&&this.uint(t[6])&&this.uint(t[7])&&this.uint(t[8]);case 22:return this.string(t[1])&&this.string(t[2]);case 23:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.uint(t[7])&&this.uint(t[8])&&this.uint(t[9]);case 24:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 27:return this.string(t[1])&&this.string(t[2]);case 28:case 29:return this.string(t[1]);case 30:return this.string(t[1])&&this.string(t[2]);case 37:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3]);case 38:return this.uint(t[1])&&this.uint(t[2]);case 39:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.uint(t[7]);case 40:return this.string(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 41:return this.string(t[1])&&this.string(t[2]);case 42:return this.string(t[1]);case 44:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 45:case 46:return this.string(t[1])&&this.string(t[2]);case 47:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 48:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 49:return this.int(t[1])&&this.int(t[2])&&this.uint(t[3])&&this.uint(t[4]);case 50:return this.uint(t[1])&&this.string(t[2]);case 51:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 53:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.string(t[7])&&this.string(t[8]);case 54:return this.uint(t[1])&&this.string(t[2]);case 55:return this.boolean(t[1]);case 57:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 58:return this.int(t[1]);case 59:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.string(t[5])&&this.string(t[6])&&this.string(t[7]);case 60:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 61:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 63:case 64:return this.string(t[1])&&this.string(t[2]);case 67:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 69:return this.uint(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 70:return this.uint(t[1])&&this.uint(t[2]);case 71:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 73:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 75:case 76:case 77:return this.uint(t[1])&&this.uint(t[2]);case 78:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 79:return this.string(t[1])&&this.string(t[2]);case 81:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.int(t[4])&&this.string(t[5]);case 82:return this.uint(t[1])&&this.uint(t[2])}}}class e{constructor(){this.idx=1,this.backDict={}}getKey(t){let i=!1;return this.backDict[t]||(i=!0,this.backDict[t]=this.idx++),[this.backDict[t],i]}}class n{constructor(t,i,n,r){this.pageNo=t,this.timestamp=i,this.url=n,this.onBatch=r,this.nextIndex=0,this.beaconSize=2e5,this.encoder=new s(this.beaconSize),this.strDict=new e,this.sizeBuffer=new Uint8Array(3),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepare()}writeType(t){return this.encoder.uint(t[0])}writeFields(t){return this.encoder.encode(t)}writeSizeAt(t,i){for(let i=0;i<3;i++)this.sizeBuffer[i]=t>>8*i;this.encoder.set(this.sizeBuffer,i)}prepare(){if(!this.encoder.isEmpty)return;const t=[81,1,this.pageNo,this.nextIndex,this.timestamp,this.url];this.writeType(t),this.writeFields(t),this.isEmpty=!0}writeWithSize(t){const i=this.encoder;if(!this.writeType(t)||!i.skip(3))return!1;const s=i.getCurrentOffset(),e=this.writeFields(t);if(e){const e=i.getCurrentOffset()-s;if(e>16777215)return console.warn("OpenReplay: max message size overflow."),!1;this.writeSizeAt(e,s-3),i.checkpoint(),this.isEmpty=this.isEmpty&&0===t[0],this.nextIndex++}return e}setBeaconSizeLimit(t){this.beaconSizeLimit=t}applyDict(t){const[i,s]=this.strDict.getKey(t);return s&&this.writeMessage([50,i,t]),i}writeMessage(t){0===t[0]&&(this.timestamp=t[1]),4===t[0]&&(this.url=t[1]),12===t[0]&&(t=[51,t[1],this.applyDict(t[2]),this.applyDict(t[3])]),this.writeWithSize(t)||(this.finaliseBatch(),this.writeWithSize(t)||(this.encoder=new s(this.beaconSizeLimit),this.prepare(),this.writeWithSize(t)||console.warn("OpenReplay: beacon size overflow. Skipping large message.",t,this),this.encoder=new s(this.beaconSize),this.prepare()))}finaliseBatch(){this.isEmpty||(this.onBatch(this.encoder.flush()),this.prepare())}clean(){this.encoder.reset()}}var r;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(r||(r={}));let h=null,u=null;r.NotActive;let a=0;function c(){u&&u.finaliseBatch()}function o(){r.Stopping,null!==
|
|
80
|
+
this.worker = new Worker(URL.createObjectURL(new Blob(['"use strict";class t{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,this.busy||this.sendNext()}push(t){this.busy||!this.token?this.queue.push(t):this.sendBatch(t)}sendNext(){const t=this.queue.shift();t?this.sendBatch(t):this.busy=!1}retry(t){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure(`Failed to send batch after ${this.attemptsCount} attempts.`):(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();i.status>=400?this.retry(t):(this.attemptsCount=0,this.sendNext())}).catch(i=>{console.warn("OpenReplay:",i),this.retry(t)})}clean(){this.queue.length=0,this.token=null}}const i="function"==typeof TextEncoder?new TextEncoder:{encode(t){const i=t.length,s=new Uint8Array(3*i);let e=-1;for(let 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),!(r>=56320&&r<=57343)){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;continue}if(n=1024*(n-55296)+r-56320+65536,h+=1,n>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 s extends class{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}getCurrentOffset(){return this.offset}checkpoint(){this.checkpointOffset=this.offset}get isEmpty(){return 0===this.offset}skip(t){return this.offset+=t,this.offset<=this.size}set(t,i){this.data.set(t,i)}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 s=i.encode(t),e=s.byteLength;return!(!this.uint(e)||this.offset+e>this.size)&&(this.data.set(s,this.offset),this.offset+=e,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}{encode(t){switch(t[0]){case 0:return this.uint(t[1]);case 4:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 5:return this.uint(t[1])&&this.uint(t[2]);case 6:return this.int(t[1])&&this.int(t[2]);case 7:return!0;case 8:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.string(t[4])&&this.boolean(t[5]);case 9:case 10:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 11:return this.uint(t[1]);case 12:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 13:case 14:return this.uint(t[1])&&this.string(t[2]);case 16:return this.uint(t[1])&&this.int(t[2])&&this.int(t[3]);case 17:return this.uint(t[1])&&this.string(t[2]);case 18:return this.uint(t[1])&&this.string(t[2])&&this.int(t[3]);case 19:return this.uint(t[1])&&this.boolean(t[2]);case 20:return this.uint(t[1])&&this.uint(t[2]);case 21:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.string(t[5])&&this.uint(t[6])&&this.uint(t[7])&&this.uint(t[8]);case 22:return this.string(t[1])&&this.string(t[2]);case 23:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.uint(t[7])&&this.uint(t[8])&&this.uint(t[9]);case 24:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 27:return this.string(t[1])&&this.string(t[2]);case 28:case 29:return this.string(t[1]);case 30:return this.string(t[1])&&this.string(t[2]);case 37:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3]);case 38:return this.uint(t[1])&&this.uint(t[2]);case 39:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.uint(t[7]);case 40:return this.string(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 41:return this.string(t[1])&&this.string(t[2]);case 42:return this.string(t[1]);case 44:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 45:case 46:return this.string(t[1])&&this.string(t[2]);case 47:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 48:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 49:return this.int(t[1])&&this.int(t[2])&&this.uint(t[3])&&this.uint(t[4]);case 50:return this.uint(t[1])&&this.string(t[2]);case 51:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 53:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.string(t[7])&&this.string(t[8]);case 54:return this.uint(t[1])&&this.string(t[2]);case 55:return this.boolean(t[1]);case 57:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 58:return this.int(t[1]);case 59:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.string(t[5])&&this.string(t[6])&&this.string(t[7]);case 60:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 61:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 63:case 64:return this.string(t[1])&&this.string(t[2]);case 67:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 69:return this.uint(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 70:return this.uint(t[1])&&this.uint(t[2]);case 71:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 73:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 75:case 76:case 77:return this.uint(t[1])&&this.uint(t[2]);case 78:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 79:return this.string(t[1])&&this.string(t[2]);case 81:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.int(t[4])&&this.string(t[5]);case 82:return this.uint(t[1])&&this.uint(t[2])}}}class e{constructor(){this.idx=1,this.backDict={}}getKey(t){let i=!1;return this.backDict[t]||(i=!0,this.backDict[t]=this.idx++),[this.backDict[t],i]}}class n{constructor(t,i,n,r){this.pageNo=t,this.timestamp=i,this.url=n,this.onBatch=r,this.nextIndex=0,this.beaconSize=2e5,this.encoder=new s(this.beaconSize),this.strDict=new e,this.sizeBuffer=new Uint8Array(3),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepare()}writeType(t){return this.encoder.uint(t[0])}writeFields(t){return this.encoder.encode(t)}writeSizeAt(t,i){for(let i=0;i<3;i++)this.sizeBuffer[i]=t>>8*i;this.encoder.set(this.sizeBuffer,i)}prepare(){if(!this.encoder.isEmpty)return;const t=[81,1,this.pageNo,this.nextIndex,this.timestamp,this.url];this.writeType(t),this.writeFields(t),this.isEmpty=!0}writeWithSize(t){const i=this.encoder;if(!this.writeType(t)||!i.skip(3))return!1;const s=i.getCurrentOffset(),e=this.writeFields(t);if(e){const e=i.getCurrentOffset()-s;if(e>16777215)return console.warn("OpenReplay: max message size overflow."),!1;this.writeSizeAt(e,s-3),i.checkpoint(),this.isEmpty=this.isEmpty&&0===t[0],this.nextIndex++}return e}setBeaconSizeLimit(t){this.beaconSizeLimit=t}applyDict(t){const[i,s]=this.strDict.getKey(t);return s&&this.writeMessage([50,i,t]),i}writeMessage(t){0===t[0]&&(this.timestamp=t[1]),4===t[0]&&(this.url=t[1]),12===t[0]&&(t=[51,t[1],this.applyDict(t[2]),this.applyDict(t[3])]),this.writeWithSize(t)||(this.finaliseBatch(),this.writeWithSize(t)||(this.encoder=new s(this.beaconSizeLimit),this.prepare(),this.writeWithSize(t)||console.warn("OpenReplay: beacon size overflow. Skipping large message.",t,this),this.encoder=new s(this.beaconSize),this.prepare()))}finaliseBatch(){this.isEmpty||(this.onBatch(this.encoder.flush()),this.prepare())}clean(){this.encoder.reset()}}var r;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(r||(r={}));let h=null,u=null;r.NotActive;let a=0;function c(){u&&u.finaliseBatch()}function o(){r.Stopping,null!==f&&(clearInterval(f),f=null),u&&(u.clean(),u=null),h&&(h.clean(),h=null),r.NotActive}function g(){postMessage("restart"),o()}let l,f=null;self.onmessage=({data:i})=>{if(null!=i){if("stop"===i)return c(),void o();if(!Array.isArray(i))return"start"===i.type?(r.Starting,h=new t(i.ingestPoint,()=>{g()},t=>{!function(t){postMessage({type:"failure",reason:t}),o()}(t)},i.connAttemptCount,i.connAttemptGap),u=new n(i.pageNo,i.timestamp,i.url,t=>h&&h.push(t)),null===f&&(f=setInterval(c,1e4)),r.Active):"auth"===i.type?h?u?(h.authorise(i.token),void(i.beaconSizeLimit&&u.setBeaconSizeLimit(i.beaconSizeLimit))):(console.debug("WebWorker: writer not initialised. Received auth."),void g()):(console.debug("WebWorker: sender not initialised. Received auth."),void g()):void 0;if(null!==u){const t=u;i.forEach(i=>{55===i[0]&&(i[1]?l=setTimeout(()=>g(),18e5):clearTimeout(l)),t.writeMessage(i)})}u||(postMessage("not_init"),0===a&&(a+=1,g()))}else c()};'], { type: 'text/javascript' })));
|
|
82
81
|
this.worker.onerror = (e) => {
|
|
83
82
|
this._debug('webworker_error', e);
|
|
84
83
|
};
|
|
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const messages_gen_js_1 = require("../messages.gen.js");
|
|
4
4
|
const guards_js_1 = require("../guards.js");
|
|
5
5
|
function isIgnored(node) {
|
|
6
|
+
if ((0, guards_js_1.isCommentNode)(node)) {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
6
9
|
if ((0, guards_js_1.isTextNode)(node)) {
|
|
7
10
|
return false;
|
|
8
11
|
}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const observer_js_1 = require("./observer.js");
|
|
4
4
|
const guards_js_1 = require("../guards.js");
|
|
5
|
-
const network_js_1 = require("../../modules/network.js");
|
|
6
5
|
const iframe_observer_js_1 = require("./iframe_observer.js");
|
|
7
6
|
const shadow_root_observer_js_1 = require("./shadow_root_observer.js");
|
|
8
7
|
const iframe_offsets_js_1 = require("./iframe_offsets.js");
|
|
@@ -68,7 +67,6 @@ class TopObserver extends observer_js_1.default {
|
|
|
68
67
|
//TODO: more explicit logic
|
|
69
68
|
) {
|
|
70
69
|
this.contextsSet.add(currentWin);
|
|
71
|
-
(0, network_js_1.default)(this.app, this.app.networkOptions, currentWin);
|
|
72
70
|
//@ts-ignore https://github.com/microsoft/TypeScript/issues/41684
|
|
73
71
|
this.contextCallbacks.forEach((cb) => cb(currentWin));
|
|
74
72
|
}
|
package/cjs/index.js
CHANGED
|
@@ -140,7 +140,7 @@ class API {
|
|
|
140
140
|
// no-cors issue only with text/plain or not-set Content-Type
|
|
141
141
|
// req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
|
|
142
142
|
req.send(JSON.stringify({
|
|
143
|
-
trackerVersion: '5.0.1
|
|
143
|
+
trackerVersion: '5.0.1',
|
|
144
144
|
projectKey: options.projectKey,
|
|
145
145
|
doNotTrack,
|
|
146
146
|
// TODO: add precise reason (an exact API missing)
|
package/cjs/modules/mouse.js
CHANGED
|
@@ -132,7 +132,7 @@ function default_1(app) {
|
|
|
132
132
|
const id = app.nodes.getID(target);
|
|
133
133
|
if (id !== undefined) {
|
|
134
134
|
sendMouseMove();
|
|
135
|
-
app.send((0, messages_gen_js_1.MouseClick)(id, mouseTarget === target ? Math.round(performance.now() - mouseTargetTime) : 0, getTargetLabel(target), getSelector(id, target)), true);
|
|
135
|
+
app.send((0, messages_gen_js_1.MouseClick)(id, mouseTarget === target ? Math.round(performance.now() - mouseTargetTime) : 0, getTargetLabel(target), isClickable(target) ? getSelector(id, target) : ''), true);
|
|
136
136
|
}
|
|
137
137
|
mouseTarget = null;
|
|
138
138
|
});
|
package/cjs/modules/network.d.ts
CHANGED
|
@@ -24,5 +24,5 @@ export interface Options {
|
|
|
24
24
|
capturePayload: boolean;
|
|
25
25
|
sanitizer?: Sanitizer;
|
|
26
26
|
}
|
|
27
|
-
export default function (app: App, opts?: Partial<Options
|
|
27
|
+
export default function (app: App, opts?: Partial<Options>): void;
|
|
28
28
|
export {};
|
package/cjs/modules/network.js
CHANGED
|
@@ -14,7 +14,7 @@ function getXHRRequestDataObject(xhr) {
|
|
|
14
14
|
function strMethod(method) {
|
|
15
15
|
return typeof method === 'string' ? method.toUpperCase() : 'GET';
|
|
16
16
|
}
|
|
17
|
-
function default_1(app, opts = {}
|
|
17
|
+
function default_1(app, opts = {}) {
|
|
18
18
|
const options = Object.assign({
|
|
19
19
|
failuresOnly: false,
|
|
20
20
|
ignoreHeaders: ['Cookie', 'Set-Cookie', 'Authorization'],
|
|
@@ -65,10 +65,8 @@ function default_1(app, opts = {}, customEnv) {
|
|
|
65
65
|
return JSON.stringify(r);
|
|
66
66
|
}
|
|
67
67
|
/* ====== Fetch ====== */
|
|
68
|
-
const origFetch =
|
|
69
|
-
|
|
70
|
-
: window.fetch.bind(window);
|
|
71
|
-
const trackFetch = (input, init = {}) => {
|
|
68
|
+
const origFetch = window.fetch.bind(window);
|
|
69
|
+
window.fetch = (input, init = {}) => {
|
|
72
70
|
if (!(typeof input === 'string' || input instanceof URL) || app.isServiceURL(String(input))) {
|
|
73
71
|
return origFetch(input, init);
|
|
74
72
|
}
|
|
@@ -142,19 +140,10 @@ function default_1(app, opts = {}, customEnv) {
|
|
|
142
140
|
return response;
|
|
143
141
|
});
|
|
144
142
|
};
|
|
145
|
-
if (customEnv) {
|
|
146
|
-
customEnv.fetch = trackFetch;
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
window.fetch = trackFetch;
|
|
150
|
-
}
|
|
151
143
|
/* ====== <> ====== */
|
|
152
144
|
/* ====== XHR ====== */
|
|
153
|
-
const nativeOpen =
|
|
154
|
-
|
|
155
|
-
: XMLHttpRequest.prototype.open;
|
|
156
|
-
function trackXMLHttpReqOpen(initMethod, url) {
|
|
157
|
-
// @ts-ignore ??? this -> XMLHttpRequest
|
|
145
|
+
const nativeOpen = XMLHttpRequest.prototype.open;
|
|
146
|
+
XMLHttpRequest.prototype.open = function (initMethod, url) {
|
|
158
147
|
const xhr = this;
|
|
159
148
|
setSessionTokenHeader((name, value) => xhr.setRequestHeader(name, value));
|
|
160
149
|
let startTime = 0;
|
|
@@ -193,45 +182,22 @@ function default_1(app, opts = {}, customEnv) {
|
|
|
193
182
|
}));
|
|
194
183
|
//TODO: handle error (though it has no Error API nor any useful information)
|
|
195
184
|
//xhr.addEventListener('error', (e) => {})
|
|
196
|
-
// @ts-ignore ??? this -> XMLHttpRequest
|
|
197
185
|
return nativeOpen.apply(this, arguments);
|
|
198
|
-
}
|
|
199
|
-
if (customEnv) {
|
|
200
|
-
customEnv.XMLHttpRequest.prototype.open = trackXMLHttpReqOpen.bind(customEnv);
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
XMLHttpRequest.prototype.open = trackXMLHttpReqOpen;
|
|
204
|
-
}
|
|
186
|
+
};
|
|
205
187
|
const nativeSend = XMLHttpRequest.prototype.send;
|
|
206
|
-
function
|
|
207
|
-
// @ts-ignore ??? this -> XMLHttpRequest
|
|
188
|
+
XMLHttpRequest.prototype.send = function (body) {
|
|
208
189
|
const rdo = getXHRRequestDataObject(this);
|
|
209
190
|
rdo.body = body;
|
|
210
|
-
// @ts-ignore ??? this -> XMLHttpRequest
|
|
211
191
|
return nativeSend.apply(this, arguments);
|
|
212
|
-
}
|
|
213
|
-
if (customEnv) {
|
|
214
|
-
customEnv.XMLHttpRequest.prototype.send = trackXHRSend.bind(customEnv);
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
XMLHttpRequest.prototype.send = trackXHRSend;
|
|
218
|
-
}
|
|
192
|
+
};
|
|
219
193
|
const nativeSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
|
|
220
|
-
function
|
|
194
|
+
XMLHttpRequest.prototype.setRequestHeader = function (name, value) {
|
|
221
195
|
if (!isHIgnored(name)) {
|
|
222
|
-
// @ts-ignore ??? this -> XMLHttpRequest
|
|
223
196
|
const rdo = getXHRRequestDataObject(this);
|
|
224
197
|
rdo.headers[name] = value;
|
|
225
198
|
}
|
|
226
|
-
// @ts-ignore ??? this -> XMLHttpRequest
|
|
227
199
|
return nativeSetRequestHeader.apply(this, arguments);
|
|
228
|
-
}
|
|
229
|
-
if (customEnv) {
|
|
230
|
-
customEnv.XMLHttpRequest.prototype.setRequestHeader = trackSetReqHeader.bind(customEnv);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
XMLHttpRequest.prototype.setRequestHeader = trackSetReqHeader;
|
|
234
|
-
}
|
|
200
|
+
};
|
|
235
201
|
/* ====== <> ====== */
|
|
236
202
|
}
|
|
237
203
|
exports.default = default_1;
|
package/lib/app/guards.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export declare function isNode(sth: any): sth is Node;
|
|
2
2
|
export declare function isSVGElement(node: Element): node is SVGElement;
|
|
3
3
|
export declare function isElementNode(node: Node): node is Element;
|
|
4
|
+
export declare function isCommentNode(node: Node): node is Comment;
|
|
4
5
|
export declare function isTextNode(node: Node): node is Text;
|
|
5
6
|
export declare function isDocument(node: Node): node is Document;
|
|
6
7
|
export declare function isRootNode(node: Node): node is Document | DocumentFragment;
|
package/lib/app/guards.js
CHANGED
|
@@ -8,6 +8,9 @@ export function isSVGElement(node) {
|
|
|
8
8
|
export function isElementNode(node) {
|
|
9
9
|
return node.nodeType === Node.ELEMENT_NODE;
|
|
10
10
|
}
|
|
11
|
+
export function isCommentNode(node) {
|
|
12
|
+
return node.nodeType === Node.COMMENT_NODE;
|
|
13
|
+
}
|
|
11
14
|
export function isTextNode(node) {
|
|
12
15
|
return node.nodeType === Node.TEXT_NODE;
|
|
13
16
|
}
|
package/lib/app/index.d.ts
CHANGED
|
@@ -9,7 +9,6 @@ import type { Options as ObserverOptions } from './observer/top_observer.js';
|
|
|
9
9
|
import type { Options as SanitizerOptions } from './sanitizer.js';
|
|
10
10
|
import type { Options as LoggerOptions } from './logger.js';
|
|
11
11
|
import type { Options as SessOptions } from './session.js';
|
|
12
|
-
import type { Options as NetworkOptions } from '../modules/network.js';
|
|
13
12
|
import type { Options as WebworkerOptions } from '../common/interaction.js';
|
|
14
13
|
export interface StartOptions {
|
|
15
14
|
userID?: string;
|
|
@@ -51,7 +50,6 @@ type AppOptions = {
|
|
|
51
50
|
localStorage: Storage | null;
|
|
52
51
|
sessionStorage: Storage | null;
|
|
53
52
|
onStart?: StartCallback;
|
|
54
|
-
network?: NetworkOptions;
|
|
55
53
|
} & WebworkerOptions & SessOptions;
|
|
56
54
|
export type Options = AppOptions & ObserverOptions & SanitizerOptions;
|
|
57
55
|
export declare const DEFAULT_INGEST_POINT = "https://api.openreplay.com/ingest";
|
|
@@ -71,7 +69,6 @@ export default class App {
|
|
|
71
69
|
private readonly stopCallbacks;
|
|
72
70
|
private readonly commitCallbacks;
|
|
73
71
|
private readonly options;
|
|
74
|
-
readonly networkOptions?: NetworkOptions;
|
|
75
72
|
private readonly revID;
|
|
76
73
|
private activityState;
|
|
77
74
|
private readonly version;
|
package/lib/app/index.js
CHANGED
|
@@ -30,11 +30,10 @@ export default class App {
|
|
|
30
30
|
this.stopCallbacks = [];
|
|
31
31
|
this.commitCallbacks = [];
|
|
32
32
|
this.activityState = ActivityState.NotActive;
|
|
33
|
-
this.version = '5.0.1
|
|
33
|
+
this.version = '5.0.1'; // TODO: version compatability check inside each plugin.
|
|
34
34
|
this._usingOldFetchPlugin = false;
|
|
35
35
|
this.delay = 0;
|
|
36
36
|
this.projectKey = projectKey;
|
|
37
|
-
this.networkOptions = options.network;
|
|
38
37
|
this.options = Object.assign({
|
|
39
38
|
revID: '',
|
|
40
39
|
node_id: '__openreplay_id',
|
|
@@ -75,7 +74,7 @@ export default class App {
|
|
|
75
74
|
this.session.applySessionHash(sessionToken);
|
|
76
75
|
}
|
|
77
76
|
try {
|
|
78
|
-
this.worker = new Worker(URL.createObjectURL(new Blob(['"use strict";class t{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,this.busy||this.sendNext()}push(t){this.busy||!this.token?this.queue.push(t):this.sendBatch(t)}sendNext(){const t=this.queue.shift();t?this.sendBatch(t):this.busy=!1}retry(t){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure(`Failed to send batch after ${this.attemptsCount} attempts.`):(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();i.status>=400?this.retry(t):(this.attemptsCount=0,this.sendNext())}).catch(i=>{console.warn("OpenReplay:",i),this.retry(t)})}clean(){this.queue.length=0,this.token=null}}const i="function"==typeof TextEncoder?new TextEncoder:{encode(t){const i=t.length,s=new Uint8Array(3*i);let e=-1;for(let 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),!(r>=56320&&r<=57343)){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;continue}if(n=1024*(n-55296)+r-56320+65536,h+=1,n>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 s extends class{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}getCurrentOffset(){return this.offset}checkpoint(){this.checkpointOffset=this.offset}get isEmpty(){return 0===this.offset}skip(t){return this.offset+=t,this.offset<=this.size}set(t,i){this.data.set(t,i)}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 s=i.encode(t),e=s.byteLength;return!(!this.uint(e)||this.offset+e>this.size)&&(this.data.set(s,this.offset),this.offset+=e,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}{encode(t){switch(t[0]){case 0:return this.uint(t[1]);case 4:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 5:return this.uint(t[1])&&this.uint(t[2]);case 6:return this.int(t[1])&&this.int(t[2]);case 7:return!0;case 8:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.string(t[4])&&this.boolean(t[5]);case 9:case 10:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 11:return this.uint(t[1]);case 12:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 13:case 14:return this.uint(t[1])&&this.string(t[2]);case 16:return this.uint(t[1])&&this.int(t[2])&&this.int(t[3]);case 17:return this.uint(t[1])&&this.string(t[2]);case 18:return this.uint(t[1])&&this.string(t[2])&&this.int(t[3]);case 19:return this.uint(t[1])&&this.boolean(t[2]);case 20:return this.uint(t[1])&&this.uint(t[2]);case 21:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.string(t[5])&&this.uint(t[6])&&this.uint(t[7])&&this.uint(t[8]);case 22:return this.string(t[1])&&this.string(t[2]);case 23:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.uint(t[7])&&this.uint(t[8])&&this.uint(t[9]);case 24:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 27:return this.string(t[1])&&this.string(t[2]);case 28:case 29:return this.string(t[1]);case 30:return this.string(t[1])&&this.string(t[2]);case 37:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3]);case 38:return this.uint(t[1])&&this.uint(t[2]);case 39:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.uint(t[7]);case 40:return this.string(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 41:return this.string(t[1])&&this.string(t[2]);case 42:return this.string(t[1]);case 44:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 45:case 46:return this.string(t[1])&&this.string(t[2]);case 47:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 48:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 49:return this.int(t[1])&&this.int(t[2])&&this.uint(t[3])&&this.uint(t[4]);case 50:return this.uint(t[1])&&this.string(t[2]);case 51:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 53:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.string(t[7])&&this.string(t[8]);case 54:return this.uint(t[1])&&this.string(t[2]);case 55:return this.boolean(t[1]);case 57:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 58:return this.int(t[1]);case 59:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.string(t[5])&&this.string(t[6])&&this.string(t[7]);case 60:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 61:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 63:case 64:return this.string(t[1])&&this.string(t[2]);case 67:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 69:return this.uint(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 70:return this.uint(t[1])&&this.uint(t[2]);case 71:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 73:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 75:case 76:case 77:return this.uint(t[1])&&this.uint(t[2]);case 78:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 79:return this.string(t[1])&&this.string(t[2]);case 81:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.int(t[4])&&this.string(t[5]);case 82:return this.uint(t[1])&&this.uint(t[2])}}}class e{constructor(){this.idx=1,this.backDict={}}getKey(t){let i=!1;return this.backDict[t]||(i=!0,this.backDict[t]=this.idx++),[this.backDict[t],i]}}class n{constructor(t,i,n,r){this.pageNo=t,this.timestamp=i,this.url=n,this.onBatch=r,this.nextIndex=0,this.beaconSize=2e5,this.encoder=new s(this.beaconSize),this.strDict=new e,this.sizeBuffer=new Uint8Array(3),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepare()}writeType(t){return this.encoder.uint(t[0])}writeFields(t){return this.encoder.encode(t)}writeSizeAt(t,i){for(let i=0;i<3;i++)this.sizeBuffer[i]=t>>8*i;this.encoder.set(this.sizeBuffer,i)}prepare(){if(!this.encoder.isEmpty)return;const t=[81,1,this.pageNo,this.nextIndex,this.timestamp,this.url];this.writeType(t),this.writeFields(t),this.isEmpty=!0}writeWithSize(t){const i=this.encoder;if(!this.writeType(t)||!i.skip(3))return!1;const s=i.getCurrentOffset(),e=this.writeFields(t);if(e){const e=i.getCurrentOffset()-s;if(e>16777215)return console.warn("OpenReplay: max message size overflow."),!1;this.writeSizeAt(e,s-3),i.checkpoint(),this.isEmpty=this.isEmpty&&0===t[0],this.nextIndex++}return e}setBeaconSizeLimit(t){this.beaconSizeLimit=t}applyDict(t){const[i,s]=this.strDict.getKey(t);return s&&this.writeMessage([50,i,t]),i}writeMessage(t){0===t[0]&&(this.timestamp=t[1]),4===t[0]&&(this.url=t[1]),12===t[0]&&(t=[51,t[1],this.applyDict(t[2]),this.applyDict(t[3])]),this.writeWithSize(t)||(this.finaliseBatch(),this.writeWithSize(t)||(this.encoder=new s(this.beaconSizeLimit),this.prepare(),this.writeWithSize(t)||console.warn("OpenReplay: beacon size overflow. Skipping large message.",t,this),this.encoder=new s(this.beaconSize),this.prepare()))}finaliseBatch(){this.isEmpty||(this.onBatch(this.encoder.flush()),this.prepare())}clean(){this.encoder.reset()}}var r;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(r||(r={}));let h=null,u=null;r.NotActive;let a=0;function c(){u&&u.finaliseBatch()}function o(){r.Stopping,null!==
|
|
77
|
+
this.worker = new Worker(URL.createObjectURL(new Blob(['"use strict";class t{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,this.busy||this.sendNext()}push(t){this.busy||!this.token?this.queue.push(t):this.sendBatch(t)}sendNext(){const t=this.queue.shift();t?this.sendBatch(t):this.busy=!1}retry(t){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure(`Failed to send batch after ${this.attemptsCount} attempts.`):(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();i.status>=400?this.retry(t):(this.attemptsCount=0,this.sendNext())}).catch(i=>{console.warn("OpenReplay:",i),this.retry(t)})}clean(){this.queue.length=0,this.token=null}}const i="function"==typeof TextEncoder?new TextEncoder:{encode(t){const i=t.length,s=new Uint8Array(3*i);let e=-1;for(let 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),!(r>=56320&&r<=57343)){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;continue}if(n=1024*(n-55296)+r-56320+65536,h+=1,n>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 s extends class{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}getCurrentOffset(){return this.offset}checkpoint(){this.checkpointOffset=this.offset}get isEmpty(){return 0===this.offset}skip(t){return this.offset+=t,this.offset<=this.size}set(t,i){this.data.set(t,i)}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 s=i.encode(t),e=s.byteLength;return!(!this.uint(e)||this.offset+e>this.size)&&(this.data.set(s,this.offset),this.offset+=e,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}{encode(t){switch(t[0]){case 0:return this.uint(t[1]);case 4:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 5:return this.uint(t[1])&&this.uint(t[2]);case 6:return this.int(t[1])&&this.int(t[2]);case 7:return!0;case 8:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.string(t[4])&&this.boolean(t[5]);case 9:case 10:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 11:return this.uint(t[1]);case 12:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 13:case 14:return this.uint(t[1])&&this.string(t[2]);case 16:return this.uint(t[1])&&this.int(t[2])&&this.int(t[3]);case 17:return this.uint(t[1])&&this.string(t[2]);case 18:return this.uint(t[1])&&this.string(t[2])&&this.int(t[3]);case 19:return this.uint(t[1])&&this.boolean(t[2]);case 20:return this.uint(t[1])&&this.uint(t[2]);case 21:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.string(t[5])&&this.uint(t[6])&&this.uint(t[7])&&this.uint(t[8]);case 22:return this.string(t[1])&&this.string(t[2]);case 23:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.uint(t[7])&&this.uint(t[8])&&this.uint(t[9]);case 24:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 27:return this.string(t[1])&&this.string(t[2]);case 28:case 29:return this.string(t[1]);case 30:return this.string(t[1])&&this.string(t[2]);case 37:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3]);case 38:return this.uint(t[1])&&this.uint(t[2]);case 39:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.uint(t[7]);case 40:return this.string(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 41:return this.string(t[1])&&this.string(t[2]);case 42:return this.string(t[1]);case 44:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 45:case 46:return this.string(t[1])&&this.string(t[2]);case 47:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 48:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 49:return this.int(t[1])&&this.int(t[2])&&this.uint(t[3])&&this.uint(t[4]);case 50:return this.uint(t[1])&&this.string(t[2]);case 51:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 53:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.string(t[7])&&this.string(t[8]);case 54:return this.uint(t[1])&&this.string(t[2]);case 55:return this.boolean(t[1]);case 57:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 58:return this.int(t[1]);case 59:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.string(t[5])&&this.string(t[6])&&this.string(t[7]);case 60:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 61:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 63:case 64:return this.string(t[1])&&this.string(t[2]);case 67:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 69:return this.uint(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 70:return this.uint(t[1])&&this.uint(t[2]);case 71:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 73:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 75:case 76:case 77:return this.uint(t[1])&&this.uint(t[2]);case 78:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 79:return this.string(t[1])&&this.string(t[2]);case 81:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.int(t[4])&&this.string(t[5]);case 82:return this.uint(t[1])&&this.uint(t[2])}}}class e{constructor(){this.idx=1,this.backDict={}}getKey(t){let i=!1;return this.backDict[t]||(i=!0,this.backDict[t]=this.idx++),[this.backDict[t],i]}}class n{constructor(t,i,n,r){this.pageNo=t,this.timestamp=i,this.url=n,this.onBatch=r,this.nextIndex=0,this.beaconSize=2e5,this.encoder=new s(this.beaconSize),this.strDict=new e,this.sizeBuffer=new Uint8Array(3),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepare()}writeType(t){return this.encoder.uint(t[0])}writeFields(t){return this.encoder.encode(t)}writeSizeAt(t,i){for(let i=0;i<3;i++)this.sizeBuffer[i]=t>>8*i;this.encoder.set(this.sizeBuffer,i)}prepare(){if(!this.encoder.isEmpty)return;const t=[81,1,this.pageNo,this.nextIndex,this.timestamp,this.url];this.writeType(t),this.writeFields(t),this.isEmpty=!0}writeWithSize(t){const i=this.encoder;if(!this.writeType(t)||!i.skip(3))return!1;const s=i.getCurrentOffset(),e=this.writeFields(t);if(e){const e=i.getCurrentOffset()-s;if(e>16777215)return console.warn("OpenReplay: max message size overflow."),!1;this.writeSizeAt(e,s-3),i.checkpoint(),this.isEmpty=this.isEmpty&&0===t[0],this.nextIndex++}return e}setBeaconSizeLimit(t){this.beaconSizeLimit=t}applyDict(t){const[i,s]=this.strDict.getKey(t);return s&&this.writeMessage([50,i,t]),i}writeMessage(t){0===t[0]&&(this.timestamp=t[1]),4===t[0]&&(this.url=t[1]),12===t[0]&&(t=[51,t[1],this.applyDict(t[2]),this.applyDict(t[3])]),this.writeWithSize(t)||(this.finaliseBatch(),this.writeWithSize(t)||(this.encoder=new s(this.beaconSizeLimit),this.prepare(),this.writeWithSize(t)||console.warn("OpenReplay: beacon size overflow. Skipping large message.",t,this),this.encoder=new s(this.beaconSize),this.prepare()))}finaliseBatch(){this.isEmpty||(this.onBatch(this.encoder.flush()),this.prepare())}clean(){this.encoder.reset()}}var r;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(r||(r={}));let h=null,u=null;r.NotActive;let a=0;function c(){u&&u.finaliseBatch()}function o(){r.Stopping,null!==f&&(clearInterval(f),f=null),u&&(u.clean(),u=null),h&&(h.clean(),h=null),r.NotActive}function g(){postMessage("restart"),o()}let l,f=null;self.onmessage=({data:i})=>{if(null!=i){if("stop"===i)return c(),void o();if(!Array.isArray(i))return"start"===i.type?(r.Starting,h=new t(i.ingestPoint,()=>{g()},t=>{!function(t){postMessage({type:"failure",reason:t}),o()}(t)},i.connAttemptCount,i.connAttemptGap),u=new n(i.pageNo,i.timestamp,i.url,t=>h&&h.push(t)),null===f&&(f=setInterval(c,1e4)),r.Active):"auth"===i.type?h?u?(h.authorise(i.token),void(i.beaconSizeLimit&&u.setBeaconSizeLimit(i.beaconSizeLimit))):(console.debug("WebWorker: writer not initialised. Received auth."),void g()):(console.debug("WebWorker: sender not initialised. Received auth."),void g()):void 0;if(null!==u){const t=u;i.forEach(i=>{55===i[0]&&(i[1]?l=setTimeout(()=>g(),18e5):clearTimeout(l)),t.writeMessage(i)})}u||(postMessage("not_init"),0===a&&(a+=1,g()))}else c()};'], { type: 'text/javascript' })));
|
|
79
78
|
this.worker.onerror = (e) => {
|
|
80
79
|
this._debug('webworker_error', e);
|
|
81
80
|
};
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { RemoveNodeAttribute, SetNodeAttribute, SetNodeAttributeURLBased, SetCSSDataURLBased, SetNodeData, CreateTextNode, CreateElementNode, MoveNode, RemoveNode, } from '../messages.gen.js';
|
|
2
|
-
import { isRootNode, isTextNode, isElementNode, isSVGElement, hasTag } from '../guards.js';
|
|
2
|
+
import { isRootNode, isTextNode, isElementNode, isSVGElement, hasTag, isCommentNode, } from '../guards.js';
|
|
3
3
|
function isIgnored(node) {
|
|
4
|
+
if (isCommentNode(node)) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
4
7
|
if (isTextNode(node)) {
|
|
5
8
|
return false;
|
|
6
9
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import Observer from './observer.js';
|
|
2
2
|
import { isElementNode, hasTag } from '../guards.js';
|
|
3
|
-
import Network from '../../modules/network.js';
|
|
4
3
|
import IFrameObserver from './iframe_observer.js';
|
|
5
4
|
import ShadowRootObserver from './shadow_root_observer.js';
|
|
6
5
|
import IFrameOffsets from './iframe_offsets.js';
|
|
@@ -66,7 +65,6 @@ export default class TopObserver extends Observer {
|
|
|
66
65
|
//TODO: more explicit logic
|
|
67
66
|
) {
|
|
68
67
|
this.contextsSet.add(currentWin);
|
|
69
|
-
Network(this.app, this.app.networkOptions, currentWin);
|
|
70
68
|
//@ts-ignore https://github.com/microsoft/TypeScript/issues/41684
|
|
71
69
|
this.contextCallbacks.forEach((cb) => cb(currentWin));
|
|
72
70
|
}
|
package/lib/index.js
CHANGED
|
@@ -135,7 +135,7 @@ export default class API {
|
|
|
135
135
|
// no-cors issue only with text/plain or not-set Content-Type
|
|
136
136
|
// req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
|
|
137
137
|
req.send(JSON.stringify({
|
|
138
|
-
trackerVersion: '5.0.1
|
|
138
|
+
trackerVersion: '5.0.1',
|
|
139
139
|
projectKey: options.projectKey,
|
|
140
140
|
doNotTrack,
|
|
141
141
|
// TODO: add precise reason (an exact API missing)
|
package/lib/modules/mouse.js
CHANGED
|
@@ -130,7 +130,7 @@ export default function (app) {
|
|
|
130
130
|
const id = app.nodes.getID(target);
|
|
131
131
|
if (id !== undefined) {
|
|
132
132
|
sendMouseMove();
|
|
133
|
-
app.send(MouseClick(id, mouseTarget === target ? Math.round(performance.now() - mouseTargetTime) : 0, getTargetLabel(target), getSelector(id, target)), true);
|
|
133
|
+
app.send(MouseClick(id, mouseTarget === target ? Math.round(performance.now() - mouseTargetTime) : 0, getTargetLabel(target), isClickable(target) ? getSelector(id, target) : ''), true);
|
|
134
134
|
}
|
|
135
135
|
mouseTarget = null;
|
|
136
136
|
});
|
package/lib/modules/network.d.ts
CHANGED
|
@@ -24,5 +24,5 @@ export interface Options {
|
|
|
24
24
|
capturePayload: boolean;
|
|
25
25
|
sanitizer?: Sanitizer;
|
|
26
26
|
}
|
|
27
|
-
export default function (app: App, opts?: Partial<Options
|
|
27
|
+
export default function (app: App, opts?: Partial<Options>): void;
|
|
28
28
|
export {};
|
package/lib/modules/network.js
CHANGED
|
@@ -12,7 +12,7 @@ function getXHRRequestDataObject(xhr) {
|
|
|
12
12
|
function strMethod(method) {
|
|
13
13
|
return typeof method === 'string' ? method.toUpperCase() : 'GET';
|
|
14
14
|
}
|
|
15
|
-
export default function (app, opts = {}
|
|
15
|
+
export default function (app, opts = {}) {
|
|
16
16
|
const options = Object.assign({
|
|
17
17
|
failuresOnly: false,
|
|
18
18
|
ignoreHeaders: ['Cookie', 'Set-Cookie', 'Authorization'],
|
|
@@ -63,10 +63,8 @@ export default function (app, opts = {}, customEnv) {
|
|
|
63
63
|
return JSON.stringify(r);
|
|
64
64
|
}
|
|
65
65
|
/* ====== Fetch ====== */
|
|
66
|
-
const origFetch =
|
|
67
|
-
|
|
68
|
-
: window.fetch.bind(window);
|
|
69
|
-
const trackFetch = (input, init = {}) => {
|
|
66
|
+
const origFetch = window.fetch.bind(window);
|
|
67
|
+
window.fetch = (input, init = {}) => {
|
|
70
68
|
if (!(typeof input === 'string' || input instanceof URL) || app.isServiceURL(String(input))) {
|
|
71
69
|
return origFetch(input, init);
|
|
72
70
|
}
|
|
@@ -140,19 +138,10 @@ export default function (app, opts = {}, customEnv) {
|
|
|
140
138
|
return response;
|
|
141
139
|
});
|
|
142
140
|
};
|
|
143
|
-
if (customEnv) {
|
|
144
|
-
customEnv.fetch = trackFetch;
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
window.fetch = trackFetch;
|
|
148
|
-
}
|
|
149
141
|
/* ====== <> ====== */
|
|
150
142
|
/* ====== XHR ====== */
|
|
151
|
-
const nativeOpen =
|
|
152
|
-
|
|
153
|
-
: XMLHttpRequest.prototype.open;
|
|
154
|
-
function trackXMLHttpReqOpen(initMethod, url) {
|
|
155
|
-
// @ts-ignore ??? this -> XMLHttpRequest
|
|
143
|
+
const nativeOpen = XMLHttpRequest.prototype.open;
|
|
144
|
+
XMLHttpRequest.prototype.open = function (initMethod, url) {
|
|
156
145
|
const xhr = this;
|
|
157
146
|
setSessionTokenHeader((name, value) => xhr.setRequestHeader(name, value));
|
|
158
147
|
let startTime = 0;
|
|
@@ -191,44 +180,21 @@ export default function (app, opts = {}, customEnv) {
|
|
|
191
180
|
}));
|
|
192
181
|
//TODO: handle error (though it has no Error API nor any useful information)
|
|
193
182
|
//xhr.addEventListener('error', (e) => {})
|
|
194
|
-
// @ts-ignore ??? this -> XMLHttpRequest
|
|
195
183
|
return nativeOpen.apply(this, arguments);
|
|
196
|
-
}
|
|
197
|
-
if (customEnv) {
|
|
198
|
-
customEnv.XMLHttpRequest.prototype.open = trackXMLHttpReqOpen.bind(customEnv);
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
XMLHttpRequest.prototype.open = trackXMLHttpReqOpen;
|
|
202
|
-
}
|
|
184
|
+
};
|
|
203
185
|
const nativeSend = XMLHttpRequest.prototype.send;
|
|
204
|
-
function
|
|
205
|
-
// @ts-ignore ??? this -> XMLHttpRequest
|
|
186
|
+
XMLHttpRequest.prototype.send = function (body) {
|
|
206
187
|
const rdo = getXHRRequestDataObject(this);
|
|
207
188
|
rdo.body = body;
|
|
208
|
-
// @ts-ignore ??? this -> XMLHttpRequest
|
|
209
189
|
return nativeSend.apply(this, arguments);
|
|
210
|
-
}
|
|
211
|
-
if (customEnv) {
|
|
212
|
-
customEnv.XMLHttpRequest.prototype.send = trackXHRSend.bind(customEnv);
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
XMLHttpRequest.prototype.send = trackXHRSend;
|
|
216
|
-
}
|
|
190
|
+
};
|
|
217
191
|
const nativeSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
|
|
218
|
-
function
|
|
192
|
+
XMLHttpRequest.prototype.setRequestHeader = function (name, value) {
|
|
219
193
|
if (!isHIgnored(name)) {
|
|
220
|
-
// @ts-ignore ??? this -> XMLHttpRequest
|
|
221
194
|
const rdo = getXHRRequestDataObject(this);
|
|
222
195
|
rdo.headers[name] = value;
|
|
223
196
|
}
|
|
224
|
-
// @ts-ignore ??? this -> XMLHttpRequest
|
|
225
197
|
return nativeSetRequestHeader.apply(this, arguments);
|
|
226
|
-
}
|
|
227
|
-
if (customEnv) {
|
|
228
|
-
customEnv.XMLHttpRequest.prototype.setRequestHeader = trackSetReqHeader.bind(customEnv);
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
XMLHttpRequest.prototype.setRequestHeader = trackSetReqHeader;
|
|
232
|
-
}
|
|
198
|
+
};
|
|
233
199
|
/* ====== <> ====== */
|
|
234
200
|
}
|