@openreplay/tracker 14.0.10 → 14.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/main/app/logger.d.ts +1 -0
- package/dist/cjs/main/app/observer/iframe_observer.d.ts +2 -0
- package/dist/cjs/main/app/observer/top_observer.d.ts +2 -0
- package/dist/lib/index.js +59 -26
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/main/app/logger.d.ts +1 -0
- package/dist/lib/main/app/observer/iframe_observer.d.ts +2 -0
- package/dist/lib/main/app/observer/top_observer.d.ts +2 -0
- package/package.json +5 -13
package/dist/cjs/index.js
CHANGED
|
@@ -74,7 +74,7 @@ class API {
|
|
|
74
74
|
const orig = this.options.ingestPoint || index_js_1.DEFAULT_INGEST_POINT;
|
|
75
75
|
req.open('POST', orig + '/v1/web/not-started');
|
|
76
76
|
req.send(JSON.stringify({
|
|
77
|
-
trackerVersion: '14.0.
|
|
77
|
+
trackerVersion: '14.0.12',
|
|
78
78
|
projectKey: this.options.projectKey,
|
|
79
79
|
doNotTrack,
|
|
80
80
|
reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,
|
|
@@ -10,6 +10,7 @@ export default class Logger {
|
|
|
10
10
|
private readonly level;
|
|
11
11
|
constructor(debugLevel?: ILogLevel);
|
|
12
12
|
private readonly shouldLog;
|
|
13
|
+
info: (...args: any[]) => void;
|
|
13
14
|
log: (...args: any[]) => void;
|
|
14
15
|
warn: (...args: any[]) => void;
|
|
15
16
|
error: (...args: any[]) => void;
|
|
@@ -18,7 +18,9 @@ export default class TopObserver extends Observer {
|
|
|
18
18
|
private readonly contextsSet;
|
|
19
19
|
attachContextCallback(cb: ContextCallback): void;
|
|
20
20
|
getDocumentOffset(doc: Document): Offset;
|
|
21
|
+
private iframeObserversArr;
|
|
21
22
|
private iframeObservers;
|
|
23
|
+
private docObservers;
|
|
22
24
|
private handleIframe;
|
|
23
25
|
private shadowRootObservers;
|
|
24
26
|
private handleShadowRoot;
|
package/dist/lib/index.js
CHANGED
|
@@ -3481,6 +3481,12 @@ class Logger {
|
|
|
3481
3481
|
this.shouldLog = (level) => {
|
|
3482
3482
|
return this.level >= level;
|
|
3483
3483
|
};
|
|
3484
|
+
this.info = (...args) => {
|
|
3485
|
+
if (this.shouldLog(LogLevel.Verbose)) {
|
|
3486
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
3487
|
+
console.info(...args);
|
|
3488
|
+
}
|
|
3489
|
+
};
|
|
3484
3490
|
this.log = (...args) => {
|
|
3485
3491
|
if (this.shouldLog(LogLevel.Log)) {
|
|
3486
3492
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
@@ -3527,23 +3533,26 @@ function processMapInBatches(map, batchSize, processBatchCallback) {
|
|
|
3527
3533
|
function isNodeStillActive(node) {
|
|
3528
3534
|
try {
|
|
3529
3535
|
if (!node.isConnected) {
|
|
3530
|
-
return false;
|
|
3536
|
+
return [false, 'not connected'];
|
|
3531
3537
|
}
|
|
3532
|
-
const
|
|
3538
|
+
const nodeIsDocument = node.nodeType === Node.DOCUMENT_NODE;
|
|
3539
|
+
const nodeWindow = nodeIsDocument
|
|
3540
|
+
? node.defaultView
|
|
3541
|
+
: node.ownerDocument?.defaultView;
|
|
3542
|
+
const ownerDoc = nodeIsDocument ? node : node.ownerDocument;
|
|
3533
3543
|
if (!nodeWindow) {
|
|
3534
|
-
return false;
|
|
3544
|
+
return [false, 'no window'];
|
|
3535
3545
|
}
|
|
3536
3546
|
if (nodeWindow.closed) {
|
|
3537
|
-
return false;
|
|
3547
|
+
return [false, 'window closed'];
|
|
3538
3548
|
}
|
|
3539
|
-
if (!
|
|
3540
|
-
return false;
|
|
3549
|
+
if (!ownerDoc?.documentElement.isConnected) {
|
|
3550
|
+
return [false, 'documentElement not connected'];
|
|
3541
3551
|
}
|
|
3542
|
-
return true;
|
|
3552
|
+
return [true, 'ok'];
|
|
3543
3553
|
}
|
|
3544
3554
|
catch (e) {
|
|
3545
|
-
|
|
3546
|
-
return false;
|
|
3555
|
+
return [false, e];
|
|
3547
3556
|
}
|
|
3548
3557
|
}
|
|
3549
3558
|
const defaults = {
|
|
@@ -3562,7 +3571,8 @@ class Maintainer {
|
|
|
3562
3571
|
this.stop();
|
|
3563
3572
|
this.interval = setInterval(() => {
|
|
3564
3573
|
processMapInBatches(this.nodes, this.options.batchSize, (node) => {
|
|
3565
|
-
|
|
3574
|
+
const isActive = isNodeStillActive(node)[0];
|
|
3575
|
+
if (!isActive) {
|
|
3566
3576
|
this.unregisterNode(node);
|
|
3567
3577
|
}
|
|
3568
3578
|
});
|
|
@@ -4066,7 +4076,7 @@ class IFrameObserver extends Observer {
|
|
|
4066
4076
|
const hostID = this.app.nodes.getID(iframe);
|
|
4067
4077
|
if (!doc || hostID === undefined) {
|
|
4068
4078
|
return;
|
|
4069
|
-
}
|
|
4079
|
+
}
|
|
4070
4080
|
// Have to observe document, because the inner <html> might be changed
|
|
4071
4081
|
this.observeRoot(doc, (docID) => {
|
|
4072
4082
|
//MBTODO: do not send if empty (send on load? it might be in-place iframe, like our replayer, which does not get loaded)
|
|
@@ -4074,6 +4084,7 @@ class IFrameObserver extends Observer {
|
|
|
4074
4084
|
this.app.debug.log('OpenReplay: Iframe document not bound');
|
|
4075
4085
|
return;
|
|
4076
4086
|
}
|
|
4087
|
+
this.docId = docID;
|
|
4077
4088
|
this.app.send(CreateIFrameDocument(hostID, docID));
|
|
4078
4089
|
});
|
|
4079
4090
|
}
|
|
@@ -4086,6 +4097,12 @@ class IFrameObserver extends Observer {
|
|
|
4086
4097
|
this.app.send(CreateIFrameDocument(rootNodeId, docID));
|
|
4087
4098
|
});
|
|
4088
4099
|
}
|
|
4100
|
+
disconnect() {
|
|
4101
|
+
if (this.docId !== undefined) {
|
|
4102
|
+
this.app.send(RemoveNode(this.docId));
|
|
4103
|
+
}
|
|
4104
|
+
super.disconnect();
|
|
4105
|
+
}
|
|
4089
4106
|
}
|
|
4090
4107
|
|
|
4091
4108
|
class ShadowRootObserver extends Observer {
|
|
@@ -4165,7 +4182,9 @@ class TopObserver extends Observer {
|
|
|
4165
4182
|
this.contextCallbacks = [];
|
|
4166
4183
|
// Attached once per Tracker instance
|
|
4167
4184
|
this.contextsSet = new WeakSet();
|
|
4185
|
+
this.iframeObserversArr = [];
|
|
4168
4186
|
this.iframeObservers = new WeakMap();
|
|
4187
|
+
this.docObservers = new WeakMap();
|
|
4169
4188
|
this.shadowRootObservers = new WeakMap();
|
|
4170
4189
|
this.app = params.app;
|
|
4171
4190
|
this.options = Object.assign({
|
|
@@ -4193,22 +4212,28 @@ class TopObserver extends Observer {
|
|
|
4193
4212
|
return this.iframeOffsets.getDocumentOffset(doc);
|
|
4194
4213
|
}
|
|
4195
4214
|
handleIframe(iframe) {
|
|
4196
|
-
let doc = null;
|
|
4197
4215
|
// setTimeout is required. Otherwise some event listeners (scroll, mousemove) applied in modules
|
|
4198
|
-
//
|
|
4216
|
+
// do not work on the iframe document when it 've been loaded dynamically ((why?))
|
|
4199
4217
|
const handle = this.app.safe(() => setTimeout(() => {
|
|
4200
4218
|
const id = this.app.nodes.getID(iframe);
|
|
4201
4219
|
if (id === undefined || !canAccessIframe(iframe))
|
|
4202
4220
|
return;
|
|
4203
4221
|
const currentWin = iframe.contentWindow;
|
|
4204
4222
|
const currentDoc = iframe.contentDocument;
|
|
4205
|
-
if (currentDoc
|
|
4206
|
-
|
|
4207
|
-
|
|
4208
|
-
observer.observe(iframe); // TODO: call unregisterNode for the previous doc if present (incapsulate: one iframe - one observer)
|
|
4209
|
-
doc = currentDoc;
|
|
4210
|
-
this.iframeOffsets.observe(iframe);
|
|
4223
|
+
if (!currentDoc) {
|
|
4224
|
+
this.app.debug.warn('no doc for iframe found', iframe);
|
|
4225
|
+
return;
|
|
4211
4226
|
}
|
|
4227
|
+
if (currentDoc && this.docObservers.has(currentDoc)) {
|
|
4228
|
+
this.app.debug.info('doc already observed for', id);
|
|
4229
|
+
return;
|
|
4230
|
+
}
|
|
4231
|
+
const observer = new IFrameObserver(this.app);
|
|
4232
|
+
this.iframeObservers.set(iframe, observer);
|
|
4233
|
+
this.docObservers.set(currentDoc, observer);
|
|
4234
|
+
this.iframeObserversArr.push(observer);
|
|
4235
|
+
observer.observe(iframe);
|
|
4236
|
+
this.iframeOffsets.observe(iframe);
|
|
4212
4237
|
if (currentWin &&
|
|
4213
4238
|
// Sometimes currentWin.window is null (not in specification). Such window object is not functional
|
|
4214
4239
|
currentWin === currentWin.window &&
|
|
@@ -4216,12 +4241,12 @@ class TopObserver extends Observer {
|
|
|
4216
4241
|
//TODO: more explicit logic
|
|
4217
4242
|
) {
|
|
4218
4243
|
this.contextsSet.add(currentWin);
|
|
4219
|
-
|
|
4244
|
+
// @ts-ignore https://github.com/microsoft/TypeScript/issues/41684
|
|
4220
4245
|
this.contextCallbacks.forEach((cb) => cb(currentWin));
|
|
4221
4246
|
}
|
|
4222
4247
|
// we need this delay because few iframes stacked one in another with rapid updates will break the player (or browser engine rather?)
|
|
4223
|
-
},
|
|
4224
|
-
iframe.addEventListener('load', handle);
|
|
4248
|
+
}, 250));
|
|
4249
|
+
iframe.addEventListener('load', handle);
|
|
4225
4250
|
handle();
|
|
4226
4251
|
}
|
|
4227
4252
|
handleShadowRoot(shRoot) {
|
|
@@ -4268,8 +4293,11 @@ class TopObserver extends Observer {
|
|
|
4268
4293
|
disconnect() {
|
|
4269
4294
|
this.iframeOffsets.clear();
|
|
4270
4295
|
Element.prototype.attachShadow = attachShadowNativeFn;
|
|
4296
|
+
this.iframeObserversArr.forEach((observer) => observer.disconnect());
|
|
4297
|
+
this.iframeObserversArr = [];
|
|
4271
4298
|
this.iframeObservers = new WeakMap();
|
|
4272
4299
|
this.shadowRootObservers = new WeakMap();
|
|
4300
|
+
this.docObservers = new WeakMap();
|
|
4273
4301
|
super.disconnect();
|
|
4274
4302
|
}
|
|
4275
4303
|
}
|
|
@@ -4532,6 +4560,11 @@ class Ticker {
|
|
|
4532
4560
|
}
|
|
4533
4561
|
}
|
|
4534
4562
|
|
|
4563
|
+
/**
|
|
4564
|
+
* this value is injected during build time via rollup
|
|
4565
|
+
* */
|
|
4566
|
+
// @ts-ignore
|
|
4567
|
+
const workerBodyFn = "!function(){\"use strict\";class t{constructor(t,s,i,e=10,n=250,h,r){this.onUnauthorised=s,this.onFailure=i,this.MAX_ATTEMPTS_COUNT=e,this.ATTEMPT_TIMEOUT=n,this.onCompress=h,this.pageNo=r,this.attemptsCount=0,this.busy=!1,this.queue=[],this.token=null,this.lastBatchNum=0,this.ingestURL=t+\"/v1/web/i\",this.isCompressing=void 0!==h}getQueueStatus(){return 0===this.queue.length&&!this.busy}authorise(t){this.token=t,this.busy||this.sendNext()}push(t){if(this.busy||!this.token)this.queue.push(t);else if(this.busy=!0,this.isCompressing&&this.onCompress)this.onCompress(t);else{const s=++this.lastBatchNum;this.sendBatch(t,!1,s)}}sendNext(){const t=this.queue.shift();if(t)if(this.busy=!0,this.isCompressing&&this.onCompress)this.onCompress(t);else{const s=++this.lastBatchNum;this.sendBatch(t,!1,s)}else this.busy=!1}retry(t,s,i){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure(`Failed to send batch after ${this.attemptsCount} attempts.`):(this.attemptsCount++,setTimeout((()=>this.sendBatch(t,s,i)),this.ATTEMPT_TIMEOUT*this.attemptsCount))}sendBatch(t,s,i){var e;const n=null==i?void 0:i.toString().replace(/^([^_]+)_([^_]+).*/,\"$1_$2_$3\");this.busy=!0;const h={Authorization:`Bearer ${this.token}`};s&&(h[\"Content-Encoding\"]=\"gzip\"),null!==this.token?fetch(`${this.ingestURL}?batch=${null!==(e=this.pageNo)&&void 0!==e?e:\"noPageNum\"}_${null!=n?n:\"noBatchNum\"}`,{body:t,method:\"POST\",headers:h,keepalive:t.length<65536}).then((e=>{if(401===e.status)return this.busy=!1,void this.onUnauthorised();e.status>=400?this.retry(t,s,`${null!=i?i:\"noBatchNum\"}_network:${e.status}`):(this.attemptsCount=0,this.sendNext())})).catch((e=>{console.warn(\"OpenReplay:\",e),this.retry(t,s,`${null!=i?i:\"noBatchNum\"}_reject:${e.message}`)})):setTimeout((()=>{this.sendBatch(t,s,`${null!=i?i:\"noBatchNum\"}_newToken`)}),500)}sendCompressed(t){const s=++this.lastBatchNum;this.sendBatch(t,!0,s)}sendUncompressed(t){const s=++this.lastBatchNum;this.sendBatch(t,!1,s)}clean(){this.sendNext(),setTimeout((()=>{this.token=null,this.queue.length=0}),10)}}const s=\"function\"==typeof TextEncoder?new TextEncoder:{encode(t){const s=t.length,i=new Uint8Array(3*s);let e=-1;for(let n=0,h=0,r=0;r!==s;){if(n=t.charCodeAt(r),r+=1,n>=55296&&n<=56319){if(r===s){i[e+=1]=239,i[e+=1]=191,i[e+=1]=189;break}if(h=t.charCodeAt(r),!(h>=56320&&h<=57343)){i[e+=1]=239,i[e+=1]=191,i[e+=1]=189;continue}if(n=1024*(n-55296)+h-56320+65536,r+=1,n>65535){i[e+=1]=240|n>>>18,i[e+=1]=128|n>>>12&63,i[e+=1]=128|n>>>6&63,i[e+=1]=128|63&n;continue}}n<=127?i[e+=1]=0|n:n<=2047?(i[e+=1]=192|n>>>6,i[e+=1]=128|63&n):(i[e+=1]=224|n>>>12,i[e+=1]=128|n>>>6&63,i[e+=1]=128|63&n)}return i.subarray(0,e+1)}};class i{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,s){this.data.set(t,s)}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=s.encode(t),e=i.byteLength;return!(!this.uint(e)||this.offset+e>this.size)&&(this.data.set(i,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}}class e extends i{encode(t){switch(t[0]){case 0:case 11:case 114:case 115:return this.uint(t[1]);case 4:case 44:case 47:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 5:case 20:case 38:case 70:case 75:case 76:case 77:case 82: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:case 24:case 51:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 12:case 61:case 71:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 13:case 14:case 17:case 50:case 54: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 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 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:case 27:case 30:case 41:case 45:case 46:case 63:case 64:case 79: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 28:case 29:case 42:case 117:case 118:return this.string(t[1]);case 37:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3]);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 48:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.int(t[5]);case 49:return this.int(t[1])&&this.int(t[2])&&this.uint(t[3])&&this.uint(t[4]);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 55:return this.boolean(t[1]);case 57:case 60:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 58:case 120: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 67:case 73:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 68:return this.uint(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4])&&this.uint(t[5])&&this.uint(t[6]);case 69:return this.uint(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 78:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 81:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.int(t[4])&&this.string(t[5]);case 83: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])&&this.uint(t[9]);case 84:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.uint(t[4])&&this.string(t[5])&&this.string(t[6]);case 112:return this.uint(t[1])&&this.string(t[2])&&this.boolean(t[3])&&this.string(t[4])&&this.int(t[5])&&this.int(t[6]);case 113:return this.uint(t[1])&&this.uint(t[2])&&this.string(t[3]);case 116: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])&&this.uint(t[9])&&this.boolean(t[10]);case 119:return this.string(t[1])&&this.uint(t[2]);case 121:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.uint(t[4]);case 122:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 123:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.uint(t[5])}}}class n{constructor(t,s,i,n,h,r){this.pageNo=t,this.timestamp=s,this.url=i,this.onBatch=n,this.tabId=h,this.onOfflineEnd=r,this.nextIndex=0,this.beaconSize=2e5,this.encoder=new e(this.beaconSize),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,s){for(let s=0;s<3;s++)this.sizeBuffer[s]=t>>8*s;this.encoder.set(this.sizeBuffer,s)}prepare(){if(!this.encoder.isEmpty)return;const t=[81,1,this.pageNo,this.nextIndex,this.timestamp,this.url],s=[118,this.tabId];this.writeType(t),this.writeFields(t),this.writeWithSize(s),this.isEmpty=!0}writeWithSize(t){const s=this.encoder;if(!this.writeType(t)||!s.skip(3))return!1;const i=s.getCurrentOffset(),e=this.writeFields(t);if(e){const e=s.getCurrentOffset()-i;if(e>16777215)return console.warn(\"OpenReplay: max message size overflow.\"),!1;this.writeSizeAt(e,i-3),s.checkpoint(),this.isEmpty=this.isEmpty&&0===t[0],this.nextIndex++}return e}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(t){if(\"q_end\"===t[0])return this.finaliseBatch(),this.onOfflineEnd();0===t[0]&&(this.timestamp=t[1]),122===t[0]&&(this.url=t[1]),this.writeWithSize(t)||(this.finaliseBatch(),this.writeWithSize(t)||(this.encoder=new e(this.beaconSizeLimit),this.prepare(),this.writeWithSize(t)?this.finaliseBatch():console.warn(\"OpenReplay: beacon size overflow. Skipping large message.\",t,this),this.encoder=new e(this.beaconSize),this.prepare()))}finaliseBatch(){if(this.isEmpty)return;const t=this.encoder.flush();this.onBatch(t),this.prepare()}clean(){this.encoder.reset()}}var h;!function(t){t[t.NotActive=0]=\"NotActive\",t[t.Starting=1]=\"Starting\",t[t.Stopping=2]=\"Stopping\",t[t.Active=3]=\"Active\",t[t.Stopped=4]=\"Stopped\"}(h||(h={}));let r=null,u=null,a=h.NotActive;function o(){u&&u.finaliseBatch()}function c(){return new Promise((t=>{a=h.Stopping,null!==p&&(clearInterval(p),p=null),u&&(u.clean(),u=null),r&&(r.clean(),setTimeout((()=>{r=null}),20)),setTimeout((()=>{a=h.NotActive,t(null)}),100)}))}function g(){[h.Stopped,h.Stopping].includes(a)||(postMessage(\"a_stop\"),c().then((()=>{postMessage(\"a_start\")})))}let l,p=null;self.onmessage=({data:s})=>{if(null!=s){if(\"stop\"===s)return o(),void c().then((()=>{a=h.Stopped}));if(\"forceFlushBatch\"!==s){if(!Array.isArray(s)){if(\"compressed\"===s.type){if(!r)return console.debug(\"OR WebWorker: sender not initialised. Compressed batch.\"),void g();s.batch&&r.sendCompressed(s.batch)}if(\"uncompressed\"===s.type){if(!r)return console.debug(\"OR WebWorker: sender not initialised. Uncompressed batch.\"),void g();s.batch&&r.sendUncompressed(s.batch)}return\"start\"===s.type?(a=h.Starting,r=new t(s.ingestPoint,(()=>{g()}),(t=>{!function(t){postMessage({type:\"failure\",reason:t}),c()}(t)}),s.connAttemptCount,s.connAttemptGap,(t=>{postMessage({type:\"compress\",batch:t},[t.buffer])}),s.pageNo),u=new n(s.pageNo,s.timestamp,s.url,(t=>{r&&r.push(t)}),s.tabId,(()=>postMessage({type:\"queue_empty\"}))),null===p&&(p=setInterval(o,1e4)),a=h.Active):\"auth\"===s.type?r?u?(r.authorise(s.token),void(s.beaconSizeLimit&&u.setBeaconSizeLimit(s.beaconSizeLimit))):(console.debug(\"OR WebWorker: writer not initialised. Received auth.\"),void g()):(console.debug(\"OR WebWorker: sender not initialised. Received auth.\"),void g()):void 0}if(u){const t=u;s.forEach((s=>{55===s[0]&&(s[1]?l=setTimeout((()=>g()),18e5):clearTimeout(l)),t.writeMessage(s)}))}else postMessage(\"not_init\"),g()}else o()}else o()}}();\n";
|
|
4535
4568
|
const CANCELED = 'canceled';
|
|
4536
4569
|
const uxtStorageKey = 'or_uxt_active';
|
|
4537
4570
|
const bufferStorageKey = 'or_buffer_1';
|
|
@@ -4585,7 +4618,7 @@ class App {
|
|
|
4585
4618
|
this.stopCallbacks = [];
|
|
4586
4619
|
this.commitCallbacks = [];
|
|
4587
4620
|
this.activityState = ActivityState.NotActive;
|
|
4588
|
-
this.version = '14.0.
|
|
4621
|
+
this.version = '14.0.12'; // TODO: version compatability check inside each plugin.
|
|
4589
4622
|
this.socketMode = false;
|
|
4590
4623
|
this.compressionThreshold = 24 * 1000;
|
|
4591
4624
|
this.bc = null;
|
|
@@ -4793,7 +4826,7 @@ class App {
|
|
|
4793
4826
|
source: thisTab,
|
|
4794
4827
|
context: this.contextId,
|
|
4795
4828
|
}, this.options.crossdomain?.parentDomain ?? '*');
|
|
4796
|
-
|
|
4829
|
+
this.debug.info('Trying to signal to parent, attempt:', retries + 1);
|
|
4797
4830
|
retries++;
|
|
4798
4831
|
};
|
|
4799
4832
|
for (let i = 0; i < maxRetries; i++) {
|
|
@@ -5064,7 +5097,7 @@ class App {
|
|
|
5064
5097
|
}
|
|
5065
5098
|
initWorker() {
|
|
5066
5099
|
try {
|
|
5067
|
-
this.worker = new Worker(URL.createObjectURL(new Blob(['"!function(){\\\"use strict\\\";class t{constructor(t,s,i,e=10,n=250,h,r){this.onUnauthorised=s,this.onFailure=i,this.MAX_ATTEMPTS_COUNT=e,this.ATTEMPT_TIMEOUT=n,this.onCompress=h,this.pageNo=r,this.attemptsCount=0,this.busy=!1,this.queue=[],this.token=null,this.lastBatchNum=0,this.ingestURL=t+\\\"/v1/web/i\\\",this.isCompressing=void 0!==h}getQueueStatus(){return 0===this.queue.length&&!this.busy}authorise(t){this.token=t,this.busy||this.sendNext()}push(t){if(this.busy||!this.token)this.queue.push(t);else if(this.busy=!0,this.isCompressing&&this.onCompress)this.onCompress(t);else{const s=++this.lastBatchNum;this.sendBatch(t,!1,s)}}sendNext(){const t=this.queue.shift();if(t)if(this.busy=!0,this.isCompressing&&this.onCompress)this.onCompress(t);else{const s=++this.lastBatchNum;this.sendBatch(t,!1,s)}else this.busy=!1}retry(t,s,i){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure(`Failed to send batch after ${this.attemptsCount} attempts.`):(this.attemptsCount++,setTimeout((()=>this.sendBatch(t,s,i)),this.ATTEMPT_TIMEOUT*this.attemptsCount))}sendBatch(t,s,i){var e;const n=null==i?void 0:i.toString().replace(/^([^_]+)_([^_]+).*/,\\\"$1_$2_$3\\\");this.busy=!0;const h={Authorization:`Bearer ${this.token}`};s&&(h[\\\"Content-Encoding\\\"]=\\\"gzip\\\"),null!==this.token?fetch(`${this.ingestURL}?batch=${null!==(e=this.pageNo)&&void 0!==e?e:\\\"noPageNum\\\"}_${null!=n?n:\\\"noBatchNum\\\"}`,{body:t,method:\\\"POST\\\",headers:h,keepalive:t.length<65536}).then((e=>{if(401===e.status)return this.busy=!1,void this.onUnauthorised();e.status>=400?this.retry(t,s,`${null!=i?i:\\\"noBatchNum\\\"}_network:${e.status}`):(this.attemptsCount=0,this.sendNext())})).catch((e=>{console.warn(\\\"OpenReplay:\\\",e),this.retry(t,s,`${null!=i?i:\\\"noBatchNum\\\"}_reject:${e.message}`)})):setTimeout((()=>{this.sendBatch(t,s,`${null!=i?i:\\\"noBatchNum\\\"}_newToken`)}),500)}sendCompressed(t){const s=++this.lastBatchNum;this.sendBatch(t,!0,s)}sendUncompressed(t){const s=++this.lastBatchNum;this.sendBatch(t,!1,s)}clean(){this.sendNext(),setTimeout((()=>{this.token=null,this.queue.length=0}),10)}}const s=\\\"function\\\"==typeof TextEncoder?new TextEncoder:{encode(t){const s=t.length,i=new Uint8Array(3*s);let e=-1;for(let n=0,h=0,r=0;r!==s;){if(n=t.charCodeAt(r),r+=1,n>=55296&&n<=56319){if(r===s){i[e+=1]=239,i[e+=1]=191,i[e+=1]=189;break}if(h=t.charCodeAt(r),!(h>=56320&&h<=57343)){i[e+=1]=239,i[e+=1]=191,i[e+=1]=189;continue}if(n=1024*(n-55296)+h-56320+65536,r+=1,n>65535){i[e+=1]=240|n>>>18,i[e+=1]=128|n>>>12&63,i[e+=1]=128|n>>>6&63,i[e+=1]=128|63&n;continue}}n<=127?i[e+=1]=0|n:n<=2047?(i[e+=1]=192|n>>>6,i[e+=1]=128|63&n):(i[e+=1]=224|n>>>12,i[e+=1]=128|n>>>6&63,i[e+=1]=128|63&n)}return i.subarray(0,e+1)}};class i{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,s){this.data.set(t,s)}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=s.encode(t),e=i.byteLength;return!(!this.uint(e)||this.offset+e>this.size)&&(this.data.set(i,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}}class e extends i{encode(t){switch(t[0]){case 0:case 11:case 114:case 115:return this.uint(t[1]);case 4:case 44:case 47:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 5:case 20:case 38:case 70:case 75:case 76:case 77:case 82: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:case 24:case 51:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 12:case 61:case 71:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 13:case 14:case 17:case 50:case 54: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 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 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:case 27:case 30:case 41:case 45:case 46:case 63:case 64:case 79: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 28:case 29:case 42:case 117:case 118:return this.string(t[1]);case 37:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3]);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 48:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.int(t[5]);case 49:return this.int(t[1])&&this.int(t[2])&&this.uint(t[3])&&this.uint(t[4]);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 55:return this.boolean(t[1]);case 57:case 60:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 58:case 120: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 67:case 73:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 68:return this.uint(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4])&&this.uint(t[5])&&this.uint(t[6]);case 69:return this.uint(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 78:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 81:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.int(t[4])&&this.string(t[5]);case 83: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])&&this.uint(t[9]);case 84:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.uint(t[4])&&this.string(t[5])&&this.string(t[6]);case 112:return this.uint(t[1])&&this.string(t[2])&&this.boolean(t[3])&&this.string(t[4])&&this.int(t[5])&&this.int(t[6]);case 113:return this.uint(t[1])&&this.uint(t[2])&&this.string(t[3]);case 116: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])&&this.uint(t[9])&&this.boolean(t[10]);case 119:return this.string(t[1])&&this.uint(t[2]);case 121:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.uint(t[4]);case 122:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 123:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.uint(t[5])}}}class n{constructor(t,s,i,n,h,r){this.pageNo=t,this.timestamp=s,this.url=i,this.onBatch=n,this.tabId=h,this.onOfflineEnd=r,this.nextIndex=0,this.beaconSize=2e5,this.encoder=new e(this.beaconSize),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,s){for(let s=0;s<3;s++)this.sizeBuffer[s]=t>>8*s;this.encoder.set(this.sizeBuffer,s)}prepare(){if(!this.encoder.isEmpty)return;const t=[81,1,this.pageNo,this.nextIndex,this.timestamp,this.url],s=[118,this.tabId];this.writeType(t),this.writeFields(t),this.writeWithSize(s),this.isEmpty=!0}writeWithSize(t){const s=this.encoder;if(!this.writeType(t)||!s.skip(3))return!1;const i=s.getCurrentOffset(),e=this.writeFields(t);if(e){const e=s.getCurrentOffset()-i;if(e>16777215)return console.warn(\\\"OpenReplay: max message size overflow.\\\"),!1;this.writeSizeAt(e,i-3),s.checkpoint(),this.isEmpty=this.isEmpty&&0===t[0],this.nextIndex++}return e}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(t){if(\\\"q_end\\\"===t[0])return this.finaliseBatch(),this.onOfflineEnd();0===t[0]&&(this.timestamp=t[1]),122===t[0]&&(this.url=t[1]),this.writeWithSize(t)||(this.finaliseBatch(),this.writeWithSize(t)||(this.encoder=new e(this.beaconSizeLimit),this.prepare(),this.writeWithSize(t)?this.finaliseBatch():console.warn(\\\"OpenReplay: beacon size overflow. Skipping large message.\\\",t,this),this.encoder=new e(this.beaconSize),this.prepare()))}finaliseBatch(){if(this.isEmpty)return;const t=this.encoder.flush();this.onBatch(t),this.prepare()}clean(){this.encoder.reset()}}var h;!function(t){t[t.NotActive=0]=\\\"NotActive\\\",t[t.Starting=1]=\\\"Starting\\\",t[t.Stopping=2]=\\\"Stopping\\\",t[t.Active=3]=\\\"Active\\\",t[t.Stopped=4]=\\\"Stopped\\\"}(h||(h={}));let r=null,u=null,a=h.NotActive;function o(){u&&u.finaliseBatch()}function c(){return new Promise((t=>{a=h.Stopping,null!==p&&(clearInterval(p),p=null),u&&(u.clean(),u=null),r&&(r.clean(),setTimeout((()=>{r=null}),20)),setTimeout((()=>{a=h.NotActive,t(null)}),100)}))}function g(){[h.Stopped,h.Stopping].includes(a)||(postMessage(\\\"a_stop\\\"),c().then((()=>{postMessage(\\\"a_start\\\")})))}let l,p=null;self.onmessage=({data:s})=>{if(null!=s){if(\\\"stop\\\"===s)return o(),void c().then((()=>{a=h.Stopped}));if(\\\"forceFlushBatch\\\"!==s){if(!Array.isArray(s)){if(\\\"compressed\\\"===s.type){if(!r)return console.debug(\\\"OR WebWorker: sender not initialised. Compressed batch.\\\"),void g();s.batch&&r.sendCompressed(s.batch)}if(\\\"uncompressed\\\"===s.type){if(!r)return console.debug(\\\"OR WebWorker: sender not initialised. Uncompressed batch.\\\"),void g();s.batch&&r.sendUncompressed(s.batch)}return\\\"start\\\"===s.type?(a=h.Starting,r=new t(s.ingestPoint,(()=>{g()}),(t=>{!function(t){postMessage({type:\\\"failure\\\",reason:t}),c()}(t)}),s.connAttemptCount,s.connAttemptGap,(t=>{postMessage({type:\\\"compress\\\",batch:t},[t.buffer])}),s.pageNo),u=new n(s.pageNo,s.timestamp,s.url,(t=>{r&&r.push(t)}),s.tabId,(()=>postMessage({type:\\\"queue_empty\\\"}))),null===p&&(p=setInterval(o,1e4)),a=h.Active):\\\"auth\\\"===s.type?r?u?(r.authorise(s.token),void(s.beaconSizeLimit&&u.setBeaconSizeLimit(s.beaconSizeLimit))):(console.debug(\\\"OR WebWorker: writer not initialised. Received auth.\\\"),void g()):(console.debug(\\\"OR WebWorker: sender not initialised. Received auth.\\\"),void g()):void 0}if(u){const t=u;s.forEach((s=>{55===s[0]&&(s[1]?l=setTimeout((()=>g()),18e5):clearTimeout(l)),t.writeMessage(s)}))}else postMessage(\\\"not_init\\\"),g()}else o()}else o()}}();"'], { type: 'text/javascript' })));
|
|
5100
|
+
this.worker = new Worker(URL.createObjectURL(new Blob([workerBodyFn], { type: 'text/javascript' })));
|
|
5068
5101
|
this.worker.onerror = (e) => {
|
|
5069
5102
|
this._debug('webworker_error', e);
|
|
5070
5103
|
};
|
|
@@ -8963,7 +8996,7 @@ class API {
|
|
|
8963
8996
|
const orig = this.options.ingestPoint || DEFAULT_INGEST_POINT;
|
|
8964
8997
|
req.open('POST', orig + '/v1/web/not-started');
|
|
8965
8998
|
req.send(JSON.stringify({
|
|
8966
|
-
trackerVersion: '14.0.
|
|
8999
|
+
trackerVersion: '14.0.12',
|
|
8967
9000
|
projectKey: this.options.projectKey,
|
|
8968
9001
|
doNotTrack,
|
|
8969
9002
|
reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,
|