@openreplay/tracker 15.0.6 → 16.0.2-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.
- package/README.md +1 -1
- package/dist/cjs/common/interaction.d.ts +2 -2
- package/dist/cjs/common/messages.gen.d.ts +14 -1
- package/dist/cjs/index.js +63 -17
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/main/app/index.d.ts +2 -0
- package/dist/cjs/main/app/messages.gen.d.ts +2 -0
- package/dist/cjs/main/modules/attributeSender.d.ts +3 -4
- package/dist/lib/common/interaction.d.ts +2 -2
- package/dist/lib/common/messages.gen.d.ts +14 -1
- package/dist/lib/index.js +63 -17
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/main/app/index.d.ts +2 -0
- package/dist/lib/main/app/messages.gen.d.ts +2 -0
- package/dist/lib/main/modules/attributeSender.d.ts +3 -4
- package/dist/types/common/interaction.d.ts +2 -2
- package/dist/types/common/messages.gen.d.ts +14 -1
- package/dist/types/main/app/index.d.ts +2 -0
- package/dist/types/main/app/messages.gen.d.ts +2 -0
- package/dist/types/main/modules/attributeSender.d.ts +3 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ Please use [bun](https://bun.sh/) to install and build this library. Any submitt
|
|
|
8
8
|
|
|
9
9
|
## Documentation
|
|
10
10
|
|
|
11
|
-
For launch options and available public methods, [refer to the documentation](https://docs.openreplay.com/
|
|
11
|
+
For launch options and available public methods, [refer to the documentation](https://docs.openreplay.com/en/sdk/methods)
|
|
12
12
|
|
|
13
13
|
## Installation
|
|
14
14
|
|
|
@@ -22,7 +22,7 @@ export type ToWorkerData = null | 'stop' | Start | Auth | Array<Message> | {
|
|
|
22
22
|
} | {
|
|
23
23
|
type: 'uncompressed';
|
|
24
24
|
batch: Uint8Array;
|
|
25
|
-
} | 'forceFlushBatch' | 'check_queue';
|
|
25
|
+
} | 'forceFlushBatch' | 'check_queue' | 'heartbeat_q';
|
|
26
26
|
type Failure = {
|
|
27
27
|
type: 'failure';
|
|
28
28
|
reason: string;
|
|
@@ -33,5 +33,5 @@ type QEmpty = {
|
|
|
33
33
|
export type FromWorkerData = 'a_stop' | 'a_start' | Failure | 'not_init' | {
|
|
34
34
|
type: 'compress';
|
|
35
35
|
batch: Uint8Array;
|
|
36
|
-
} | QEmpty;
|
|
36
|
+
} | QEmpty | 'heartbeat_a';
|
|
37
37
|
export {};
|
|
@@ -24,6 +24,8 @@ export declare const enum Type {
|
|
|
24
24
|
UserID = 28,
|
|
25
25
|
UserAnonymousID = 29,
|
|
26
26
|
Metadata = 30,
|
|
27
|
+
StringDictGlobal = 34,
|
|
28
|
+
SetNodeAttributeDictGlobal = 35,
|
|
27
29
|
CSSInsertRule = 37,
|
|
28
30
|
CSSDeleteRule = 38,
|
|
29
31
|
Fetch = 39,
|
|
@@ -221,6 +223,17 @@ export type Metadata = [
|
|
|
221
223
|
string,
|
|
222
224
|
string
|
|
223
225
|
];
|
|
226
|
+
export type StringDictGlobal = [
|
|
227
|
+
Type.StringDictGlobal,
|
|
228
|
+
number,
|
|
229
|
+
string
|
|
230
|
+
];
|
|
231
|
+
export type SetNodeAttributeDictGlobal = [
|
|
232
|
+
Type.SetNodeAttributeDictGlobal,
|
|
233
|
+
number,
|
|
234
|
+
number,
|
|
235
|
+
number
|
|
236
|
+
];
|
|
224
237
|
export type CSSInsertRule = [
|
|
225
238
|
Type.CSSInsertRule,
|
|
226
239
|
number,
|
|
@@ -563,5 +576,5 @@ export type WebVitals = [
|
|
|
563
576
|
string,
|
|
564
577
|
string
|
|
565
578
|
];
|
|
566
|
-
type Message = Timestamp | SetPageLocationDeprecated | SetViewportSize | SetViewportScroll | CreateDocument | CreateElementNode | CreateTextNode | MoveNode | RemoveNode | SetNodeAttribute | RemoveNodeAttribute | SetNodeData | SetNodeScroll | SetInputTarget | SetInputValue | SetInputChecked | MouseMove | NetworkRequestDeprecated | ConsoleLog | PageLoadTiming | PageRenderTiming | CustomEvent | UserID | UserAnonymousID | Metadata | CSSInsertRule | CSSDeleteRule | Fetch | Profiler | OTable | StateAction | ReduxDeprecated | Vuex | MobX | NgRx | GraphQLDeprecated | PerformanceTrack | StringDictDeprecated | SetNodeAttributeDictDeprecated | StringDict | SetNodeAttributeDict | ResourceTimingDeprecated | ConnectionInformation | SetPageVisibility | LoadFontFace | SetNodeFocus | LongTask | SetNodeAttributeURLBased | SetCSSDataURLBased | TechnicalInfo | CustomIssue | CSSInsertRuleURLBased | MouseClick | MouseClickDeprecated | CreateIFrameDocument | AdoptedSSReplaceURLBased | AdoptedSSInsertRuleURLBased | AdoptedSSDeleteRule | AdoptedSSAddOwner | AdoptedSSRemoveOwner | JSException | Zustand | BatchMetadata | PartitionedMessage | NetworkRequest | WSChannel | InputChange | SelectionChange | MouseThrashing | UnbindNodes | ResourceTiming | TabChange | TabData | CanvasNode | TagTrigger | Redux | SetPageLocation | GraphQL | WebVitals;
|
|
579
|
+
type Message = Timestamp | SetPageLocationDeprecated | SetViewportSize | SetViewportScroll | CreateDocument | CreateElementNode | CreateTextNode | MoveNode | RemoveNode | SetNodeAttribute | RemoveNodeAttribute | SetNodeData | SetNodeScroll | SetInputTarget | SetInputValue | SetInputChecked | MouseMove | NetworkRequestDeprecated | ConsoleLog | PageLoadTiming | PageRenderTiming | CustomEvent | UserID | UserAnonymousID | Metadata | StringDictGlobal | SetNodeAttributeDictGlobal | CSSInsertRule | CSSDeleteRule | Fetch | Profiler | OTable | StateAction | ReduxDeprecated | Vuex | MobX | NgRx | GraphQLDeprecated | PerformanceTrack | StringDictDeprecated | SetNodeAttributeDictDeprecated | StringDict | SetNodeAttributeDict | ResourceTimingDeprecated | ConnectionInformation | SetPageVisibility | LoadFontFace | SetNodeFocus | LongTask | SetNodeAttributeURLBased | SetCSSDataURLBased | TechnicalInfo | CustomIssue | CSSInsertRuleURLBased | MouseClick | MouseClickDeprecated | CreateIFrameDocument | AdoptedSSReplaceURLBased | AdoptedSSInsertRuleURLBased | AdoptedSSDeleteRule | AdoptedSSAddOwner | AdoptedSSRemoveOwner | JSException | Zustand | BatchMetadata | PartitionedMessage | NetworkRequest | WSChannel | InputChange | SelectionChange | MouseThrashing | UnbindNodes | ResourceTiming | TabChange | TabData | CanvasNode | TagTrigger | Redux | SetPageLocation | GraphQL | WebVitals;
|
|
567
580
|
export default Message;
|
package/dist/cjs/index.js
CHANGED
|
@@ -716,9 +716,9 @@ try {
|
|
|
716
716
|
catch (e) { }
|
|
717
717
|
|
|
718
718
|
class StringDictionary {
|
|
719
|
-
constructor(
|
|
720
|
-
this.
|
|
721
|
-
this.
|
|
719
|
+
constructor() {
|
|
720
|
+
this.lastTs = 0;
|
|
721
|
+
this.lastSuffix = 1;
|
|
722
722
|
/** backwards dictionary of
|
|
723
723
|
* [repeated str:key]
|
|
724
724
|
* */
|
|
@@ -727,8 +727,18 @@ class StringDictionary {
|
|
|
727
727
|
let isNew = false;
|
|
728
728
|
if (!this.backDict[str]) {
|
|
729
729
|
isNew = true;
|
|
730
|
-
|
|
731
|
-
|
|
730
|
+
// shaving the first 2 digits of the timestamp (since they are irrelevant for next millennia)
|
|
731
|
+
const shavedTs = Date.now() % 10 ** (13 - 2);
|
|
732
|
+
let id = shavedTs;
|
|
733
|
+
if (id === this.lastTs) {
|
|
734
|
+
id = id * 10000 + this.lastSuffix;
|
|
735
|
+
this.lastSuffix += 1;
|
|
736
|
+
}
|
|
737
|
+
else {
|
|
738
|
+
this.lastSuffix = 1;
|
|
739
|
+
}
|
|
740
|
+
this.backDict[str] = id;
|
|
741
|
+
this.lastTs = shavedTs;
|
|
732
742
|
}
|
|
733
743
|
return [this.backDict[str], isNew];
|
|
734
744
|
};
|
|
@@ -743,7 +753,7 @@ class AttributeSender {
|
|
|
743
753
|
}
|
|
744
754
|
else {
|
|
745
755
|
const message = [
|
|
746
|
-
|
|
756
|
+
35 /* Type.SetNodeAttributeDictGlobal */,
|
|
747
757
|
id,
|
|
748
758
|
this.applyDict(name),
|
|
749
759
|
this.applyDict(value),
|
|
@@ -753,17 +763,17 @@ class AttributeSender {
|
|
|
753
763
|
};
|
|
754
764
|
this.app = options.app;
|
|
755
765
|
this.isDictDisabled = options.isDictDisabled;
|
|
756
|
-
this.dict = new StringDictionary(
|
|
766
|
+
this.dict = new StringDictionary();
|
|
757
767
|
}
|
|
758
768
|
applyDict(str) {
|
|
759
769
|
const [key, isNew] = this.dict.getKey(str);
|
|
760
770
|
if (isNew) {
|
|
761
|
-
this.app.send([
|
|
771
|
+
this.app.send([34 /* Type.StringDictGlobal */, key, str]);
|
|
762
772
|
}
|
|
763
773
|
return key;
|
|
764
774
|
}
|
|
765
775
|
clear() {
|
|
766
|
-
this.dict = new StringDictionary(
|
|
776
|
+
this.dict = new StringDictionary();
|
|
767
777
|
}
|
|
768
778
|
}
|
|
769
779
|
|
|
@@ -1244,7 +1254,7 @@ function hasOpenreplayAttribute(e, attr) {
|
|
|
1244
1254
|
if (DEPRECATED_ATTRS[attr]) {
|
|
1245
1255
|
deprecationWarn(`"${newName}" attribute`,
|
|
1246
1256
|
// @ts-ignore
|
|
1247
|
-
`"${DEPRECATED_ATTRS[attr]}" attribute`, '/
|
|
1257
|
+
`"${DEPRECATED_ATTRS[attr]}" attribute`, '/en/sdk/sanitize-data');
|
|
1248
1258
|
}
|
|
1249
1259
|
return true;
|
|
1250
1260
|
}
|
|
@@ -1652,6 +1662,21 @@ function Metadata(key, value) {
|
|
|
1652
1662
|
value,
|
|
1653
1663
|
];
|
|
1654
1664
|
}
|
|
1665
|
+
function StringDictGlobal(key, value) {
|
|
1666
|
+
return [
|
|
1667
|
+
34 /* Messages.Type.StringDictGlobal */,
|
|
1668
|
+
key,
|
|
1669
|
+
value,
|
|
1670
|
+
];
|
|
1671
|
+
}
|
|
1672
|
+
function SetNodeAttributeDictGlobal(id, name, value) {
|
|
1673
|
+
return [
|
|
1674
|
+
35 /* Messages.Type.SetNodeAttributeDictGlobal */,
|
|
1675
|
+
id,
|
|
1676
|
+
name,
|
|
1677
|
+
value,
|
|
1678
|
+
];
|
|
1679
|
+
}
|
|
1655
1680
|
function CSSInsertRule(id, rule, index) {
|
|
1656
1681
|
return [
|
|
1657
1682
|
37 /* Messages.Type.CSSInsertRule */,
|
|
@@ -2160,6 +2185,7 @@ var _Messages = /*#__PURE__*/Object.freeze({
|
|
|
2160
2185
|
SetNodeAttribute: SetNodeAttribute,
|
|
2161
2186
|
SetNodeAttributeDict: SetNodeAttributeDict,
|
|
2162
2187
|
SetNodeAttributeDictDeprecated: SetNodeAttributeDictDeprecated,
|
|
2188
|
+
SetNodeAttributeDictGlobal: SetNodeAttributeDictGlobal,
|
|
2163
2189
|
SetNodeAttributeURLBased: SetNodeAttributeURLBased,
|
|
2164
2190
|
SetNodeData: SetNodeData,
|
|
2165
2191
|
SetNodeFocus: SetNodeFocus,
|
|
@@ -2172,6 +2198,7 @@ var _Messages = /*#__PURE__*/Object.freeze({
|
|
|
2172
2198
|
StateAction: StateAction,
|
|
2173
2199
|
StringDict: StringDict,
|
|
2174
2200
|
StringDictDeprecated: StringDictDeprecated,
|
|
2201
|
+
StringDictGlobal: StringDictGlobal,
|
|
2175
2202
|
TabChange: TabChange,
|
|
2176
2203
|
TabData: TabData,
|
|
2177
2204
|
TagTrigger: TagTrigger,
|
|
@@ -3984,7 +4011,7 @@ class Observer {
|
|
|
3984
4011
|
const walker = document.createTreeWalker(node, NodeFilter.SHOW_ELEMENT + NodeFilter.SHOW_TEXT, {
|
|
3985
4012
|
acceptNode: (node) => {
|
|
3986
4013
|
if (this.app.nodes.getID(node) !== undefined) {
|
|
3987
|
-
this.app.debug.
|
|
4014
|
+
this.app.debug.warn('! Node is already bound', node);
|
|
3988
4015
|
}
|
|
3989
4016
|
return isIgnored(node) || this.app.nodes.getID(node) !== undefined
|
|
3990
4017
|
? NodeFilter.FILTER_REJECT
|
|
@@ -4649,7 +4676,7 @@ class Ticker {
|
|
|
4649
4676
|
* this value is injected during build time via rollup
|
|
4650
4677
|
* */
|
|
4651
4678
|
// @ts-ignore
|
|
4652
|
-
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 52: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 43:case 63:case 64:case 79:case 124: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";
|
|
4679
|
+
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}`};if(s&&(h[\"Content-Encoding\"]=\"gzip\"),null===this.token)return void setTimeout((()=>{this.sendBatch(t,s,`${null!=i?i:\"noBatchNum\"}_newToken`)}),500);const r=new AbortController,a=setTimeout((()=>{r.abort()}),3e4);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,signal:r.signal}).then((e=>{if(clearTimeout(a),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=>{clearTimeout(a),console.warn(\"OpenReplay:\",e),this.retry(t,s,`${null!=i?i:\"noBatchNum\"}_reject:${e.message}`)}))}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 35:case 51:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 12:case 52:case 61:case 71:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 13:case 14:case 17:case 34: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 43:case 63:case 64:case 79:case 124: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,a=null,u=h.NotActive;function o(){a&&a.finaliseBatch()}function c(){return new Promise((t=>{u=h.Stopping,null!==p&&(clearInterval(p),p=null),a&&(a.clean(),a=null),r&&(r.clean(),setTimeout((()=>{r=null}),20)),setTimeout((()=>{u=h.NotActive,t(null)}),100)}))}function l(){[h.Stopped,h.Stopping].includes(u)||(postMessage(\"a_stop\"),c().then((()=>{postMessage(\"a_start\")})))}let g,p=null;self.onmessage=({data:s})=>{if(null!=s)if(\"heartbeat_q\"!==s){if(\"stop\"===s)return o(),void c().then((()=>{u=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 l();s.batch&&r.sendCompressed(s.batch)}if(\"uncompressed\"===s.type){if(!r)return console.debug(\"OR WebWorker: sender not initialised. Uncompressed batch.\"),void l();s.batch&&r.sendUncompressed(s.batch)}return\"start\"===s.type?(u=h.Starting,r=new t(s.ingestPoint,(()=>{l()}),(t=>{!function(t){postMessage({type:\"failure\",reason:t}),c()}(t)}),s.connAttemptCount,s.connAttemptGap,(t=>{postMessage({type:\"compress\",batch:t},[t.buffer])}),s.pageNo),a=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)),u=h.Active):\"auth\"===s.type?r?a?(r.authorise(s.token),void(s.beaconSizeLimit&&a.setBeaconSizeLimit(s.beaconSizeLimit))):(console.debug(\"OR WebWorker: writer not initialised. Received auth.\"),void l()):(console.debug(\"OR WebWorker: sender not initialised. Received auth.\"),void l()):void 0}if(a){const t=a;s.forEach((s=>{55===s[0]&&(s[1]?g=setTimeout((()=>l()),18e5):clearTimeout(g)),t.writeMessage(s)}))}else postMessage(\"not_init\"),l()}else o()}else postMessage(\"heartbeat_a\");else o()}}();\n";
|
|
4653
4680
|
const CANCELED = 'canceled';
|
|
4654
4681
|
const uxtStorageKey = 'or_uxt_active';
|
|
4655
4682
|
const bufferStorageKey = 'or_buffer_1';
|
|
@@ -4703,7 +4730,7 @@ class App {
|
|
|
4703
4730
|
this.stopCallbacks = [];
|
|
4704
4731
|
this.commitCallbacks = [];
|
|
4705
4732
|
this.activityState = ActivityState.NotActive;
|
|
4706
|
-
this.version = '
|
|
4733
|
+
this.version = '16.0.2-beta.0'; // TODO: version compatability check inside each plugin.
|
|
4707
4734
|
this.socketMode = false;
|
|
4708
4735
|
this.compressionThreshold = 24 * 1000;
|
|
4709
4736
|
this.bc = null;
|
|
@@ -4935,6 +4962,8 @@ class App {
|
|
|
4935
4962
|
}
|
|
4936
4963
|
};
|
|
4937
4964
|
this.startTimeout = null;
|
|
4965
|
+
this.heartbeatInterval = null;
|
|
4966
|
+
this.restartTimeout = null;
|
|
4938
4967
|
this.coldStartCommitN = 0;
|
|
4939
4968
|
this.delay = 0;
|
|
4940
4969
|
this.attachStartCallback = (cb, useSafe = false) => {
|
|
@@ -4987,13 +5016,13 @@ class App {
|
|
|
4987
5016
|
requestIdleCb(() => {
|
|
4988
5017
|
try {
|
|
4989
5018
|
const messagesBatch = buffer.splice(0, endIndex);
|
|
4990
|
-
// Cast out
|
|
5019
|
+
// Cast out potential proxy objects (produced from vue.js deep reactivity, for example) to a regular array.
|
|
4991
5020
|
this.postToWorker(messagesBatch.map((x) => [...x]));
|
|
4992
5021
|
res(null);
|
|
4993
5022
|
}
|
|
4994
5023
|
catch (e) {
|
|
4995
5024
|
this._debug('flushBuffer', e);
|
|
4996
|
-
reject(new Error('
|
|
5025
|
+
reject(new Error('flushBuffer failed'));
|
|
4997
5026
|
}
|
|
4998
5027
|
});
|
|
4999
5028
|
});
|
|
@@ -5214,6 +5243,17 @@ class App {
|
|
|
5214
5243
|
this.worker.postMessage(null);
|
|
5215
5244
|
}
|
|
5216
5245
|
};
|
|
5246
|
+
this.heartbeatInterval = setInterval(() => {
|
|
5247
|
+
if (this.worker) {
|
|
5248
|
+
this.worker.postMessage('heartbeat_q');
|
|
5249
|
+
this.restartTimeout = setTimeout(() => {
|
|
5250
|
+
this.stop();
|
|
5251
|
+
this.waitStatus(ActivityState.NotActive).then(() => {
|
|
5252
|
+
void this.start(this.prevOpts);
|
|
5253
|
+
});
|
|
5254
|
+
}, 10000);
|
|
5255
|
+
}
|
|
5256
|
+
}, 20000);
|
|
5217
5257
|
// keep better tactics, discard others?
|
|
5218
5258
|
this.attachEventListener(window, 'beforeunload', alertWorker, false);
|
|
5219
5259
|
this.attachEventListener(document.body, 'mouseleave', alertWorker, false, false);
|
|
@@ -5244,6 +5284,12 @@ class App {
|
|
|
5244
5284
|
else if (data === 'not_init') {
|
|
5245
5285
|
this.debug.warn('OR WebWorker: writer not initialised. Restarting tracker');
|
|
5246
5286
|
}
|
|
5287
|
+
else if (data === 'heartbeat_a') {
|
|
5288
|
+
if (this.restartTimeout) {
|
|
5289
|
+
clearTimeout(this.restartTimeout);
|
|
5290
|
+
this.restartTimeout = null;
|
|
5291
|
+
}
|
|
5292
|
+
}
|
|
5247
5293
|
else if (data.type === 'failure') {
|
|
5248
5294
|
this.stop(false);
|
|
5249
5295
|
this.debug.error('worker_failed', data.reason);
|
|
@@ -9115,7 +9161,7 @@ function Tabs (app) {
|
|
|
9115
9161
|
}
|
|
9116
9162
|
|
|
9117
9163
|
const Messages = _Messages;
|
|
9118
|
-
const DOCS_SETUP = '/
|
|
9164
|
+
const DOCS_SETUP = '/en/sdk';
|
|
9119
9165
|
function processOptions(obj) {
|
|
9120
9166
|
if (obj == null) {
|
|
9121
9167
|
console.error(`OpenReplay: invalid options argument type. Please, check documentation on ${DOCS_HOST}${DOCS_SETUP}`);
|
|
@@ -9165,7 +9211,7 @@ class API {
|
|
|
9165
9211
|
this.signalStartIssue = (reason, missingApi) => {
|
|
9166
9212
|
const doNotTrack = this.checkDoNotTrack();
|
|
9167
9213
|
console.log("Tracker couldn't start due to:", JSON.stringify({
|
|
9168
|
-
trackerVersion: '
|
|
9214
|
+
trackerVersion: '16.0.2-beta.0',
|
|
9169
9215
|
projectKey: this.options.projectKey,
|
|
9170
9216
|
doNotTrack,
|
|
9171
9217
|
reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,
|