@openreplay/tracker
Advanced tools
Comparing version 12.0.0-beta.9 to 12.0.0-beta.99
@@ -14,3 +14,3 @@ import FeatureFlags from '../modules/featureFlags.js'; | ||
import type { Options as NetworkOptions } from '../modules/network.js'; | ||
import type { Options as WebworkerOptions } from '../common/interaction.js'; | ||
import type { Options as WebworkerOptions, FromWorkerData } from '../common/interaction.js'; | ||
export interface StartOptions { | ||
@@ -92,3 +92,3 @@ userID?: string; | ||
private readonly version; | ||
private readonly worker?; | ||
private readonly workerManager?; | ||
private compressionThreshold; | ||
@@ -103,5 +103,6 @@ private restartAttempts; | ||
featureFlags: FeatureFlags; | ||
private tagWatcher; | ||
private readonly tagWatcher; | ||
constructor(projectKey: string, sessionToken: string | undefined, options: Partial<Options>, signalError: (error: string, apis: string[]) => void); | ||
private _debug; | ||
handleWorkerMsg(data: FromWorkerData): void; | ||
private readonly _debug; | ||
private _usingOldFetchPlugin; | ||
@@ -164,3 +165,3 @@ send(message: Message, urgent?: boolean): void; | ||
* start buffering messages without starting the actual session, which gives | ||
* user 30 seconds to "activate" and record session by calling `start()` on conditional trigger | ||
* user 30 seconds to "activate" and record session by calling `start()` on conditional trigger, | ||
* and we will then send buffered batch, so it won't get lost | ||
@@ -183,3 +184,3 @@ * */ | ||
* | ||
* Then when this.offlineRecording is called, it will preload this messages and clear the storage item | ||
* Then, when this.offlineRecording is called, it will preload this messages and clear the storage item | ||
* | ||
@@ -201,3 +202,3 @@ * Keeping the size of local storage reasonable is up to the end users of this library | ||
* so the session can be uploaded properly | ||
* @resolve {boolean} - if messages were loaded successfully | ||
* @resolve - if messages were loaded in service worker successfully | ||
* @reject {string} - error message | ||
@@ -204,0 +205,0 @@ * */ |
@@ -47,2 +47,3 @@ "use strict"; | ||
const tagWatcher_js_1 = __importDefault(require("../modules/tagWatcher.js")); | ||
const index_js_2 = __importDefault(require("./workerManager/index.js")); | ||
const CANCELED = 'canceled'; | ||
@@ -85,3 +86,3 @@ const uxtStorageKey = 'or_uxt_active'; | ||
this.activityState = ActivityState.NotActive; | ||
this.version = '12.0.0-beta.9'; // TODO: version compatability check inside each plugin. | ||
this.version = '12.0.0-beta.99'; // TODO: version compatability check inside each plugin. | ||
this.compressionThreshold = 24 * 1000; | ||
@@ -92,2 +93,16 @@ this.restartAttempts = 0; | ||
this.conditionsManager = null; | ||
this._debug = (context, e) => { | ||
if (this.options.__debug_report_edp !== null) { | ||
void fetch(this.options.__debug_report_edp, { | ||
method: 'POST', | ||
headers: { 'Content-Type': 'application/json' }, | ||
body: JSON.stringify({ | ||
context, | ||
// @ts-ignore | ||
error: `${e}`, | ||
}), | ||
}); | ||
} | ||
this.debug.error('OpenReplay error: ', context, e); | ||
}; | ||
this._usingOldFetchPlugin = false; | ||
@@ -181,50 +196,7 @@ this.coldStartCommitN = 0; | ||
try { | ||
this.worker = new Worker(URL.createObjectURL(new Blob(['"use strict";class t{constructor(t,s,i,e=10,n=1e3,h){this.onUnauthorised=s,this.onFailure=i,this.MAX_ATTEMPTS_COUNT=e,this.ATTEMPT_TIMEOUT=n,this.onCompress=h,this.attemptsCount=0,this.busy=!1,this.queue=[],this.token=null,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){this.busy||!this.token?this.queue.push(t):(this.busy=!0,this.isCompressing&&this.onCompress?this.onCompress(t):this.sendBatch(t))}sendNext(){const t=this.queue.shift();t?(this.busy=!0,this.isCompressing&&this.onCompress?this.onCompress(t):this.sendBatch(t)):this.busy=!1}retry(t,s){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure(`Failed to send batch after ${this.attemptsCount} attempts.`):(this.attemptsCount++,setTimeout((()=>this.sendBatch(t,s)),this.ATTEMPT_TIMEOUT*this.attemptsCount))}sendBatch(t,s){this.busy=!0;const i={Authorization:`Bearer ${this.token}`};s&&(i["Content-Encoding"]="gzip"),null!==this.token?fetch(this.ingestURL,{body:t,method:"POST",headers:i,keepalive:t.length<65536}).then((i=>{if(401===i.status)return this.busy=!1,void this.onUnauthorised();i.status>=400?this.retry(t,s):(this.attemptsCount=0,this.sendNext())})).catch((i=>{console.warn("OpenReplay:",i),this.retry(t,s)})):setTimeout((()=>{this.sendBatch(t,s)}),500)}sendCompressed(t){this.sendBatch(t,!0)}sendUncompressed(t){this.sendBatch(t,!1)}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:case 78: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 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 69:return this.uint(t[1])&&this.uint(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])}}}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]),4===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(){a=h.Stopping,null!==g&&(clearInterval(g),g=null),u&&(u.clean(),u=null),r&&(r.clean(),setTimeout((()=>{r=null}),20)),setTimeout((()=>{a=h.NotActive}),100)}function p(){a!==h.Stopped&&(postMessage("restart"),c())}let f,g=null;self.onmessage=({data:s})=>{if(null!=s){if("stop"===s)return o(),c(),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 p();s.batch&&r.sendCompressed(s.batch)}if("uncompressed"===s.type){if(!r)return console.debug("OR WebWorker: sender not initialised. Uncompressed batch."),void p();s.batch&&r.sendUncompressed(s.batch)}return"start"===s.type?(a=h.Starting,r=new t(s.ingestPoint,(()=>{p()}),(t=>{!function(t){postMessage({type:"failure",reason:t}),c()}(t)}),s.connAttemptCount,s.connAttemptGap,(t=>{postMessage({type:"compress",batch:t},[t.buffer])})),u=new n(s.pageNo,s.timestamp,s.url,(t=>{r&&r.push(t)}),s.tabId,(()=>postMessage({type:"queue_empty"}))),null===g&&(g=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 p()):(console.debug("OR WebWorker: sender not initialised. Received auth."),void p()):void 0}if(u){const t=u;s.forEach((s=>{55===s[0]&&(s[1]?f=setTimeout((()=>p()),18e5):clearTimeout(f)),t.writeMessage(s)}))}else postMessage("not_init"),p()}else o()}else o()};'], { type: 'text/javascript' }))); | ||
this.worker.onerror = (e) => { | ||
this._debug('webworker_error', e); | ||
}; | ||
this.worker.onmessage = ({ data }) => { | ||
var _a; | ||
if (data === 'restart') { | ||
this.stop(false); | ||
void this.start({}, true); | ||
} | ||
else if (data === 'not_init') { | ||
this.debug.warn('OR WebWorker: writer not initialised. Restarting tracker'); | ||
} | ||
else if (data.type === 'failure') { | ||
this.stop(false); | ||
this.debug.error('worker_failed', data.reason); | ||
this._debug('worker_failed', data.reason); | ||
} | ||
else if (data.type === 'compress') { | ||
const batch = data.batch; | ||
const batchSize = batch.byteLength; | ||
if (batchSize > this.compressionThreshold) { | ||
(0, fflate_1.gzip)(data.batch, { mtime: 0 }, (err, result) => { | ||
var _a; | ||
if (err) { | ||
this.debug.error('Openreplay compression error:', err); | ||
this.stop(false); | ||
if (this.restartAttempts < 3) { | ||
this.restartAttempts += 1; | ||
void this.start({}, true); | ||
} | ||
} | ||
else { | ||
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage({ type: 'compressed', batch: result }); | ||
} | ||
}); | ||
} | ||
else { | ||
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage({ type: 'uncompressed', batch: batch }); | ||
} | ||
} | ||
else if (data.type === 'queue_empty') { | ||
this.onSessionSent(); | ||
} | ||
}; | ||
const webworker = new Worker(URL.createObjectURL(new Blob(['"use strict";const t="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 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,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(i){const s=t.encode(i),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}}class s 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:case 78: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 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 69:return this.uint(t[1])&&this.uint(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])}}}class e{constructor(t,i,e,n,r,h){this.pageNo=t,this.timestamp=i,this.url=e,this.onBatch=n,this.tabId=r,this.onOfflineEnd=h,this.nextIndex=0,this.beaconSize=2e5,this.encoder=new s(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,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],i=[118,this.tabId];this.writeType(t),this.writeFields(t),this.writeWithSize(i),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}writeMessage(t){if("q_end"===t[0])return this.finaliseBatch(),this.onOfflineEnd();0===t[0]&&(this.timestamp=t[1]),4===t[0]&&(this.url=t[1]),this.writeWithSize(t)||(this.finaliseBatch(),this.writeWithSize(t)||(this.encoder=new s(this.beaconSizeLimit),this.prepare(),this.writeWithSize(t)?this.finaliseBatch():console.warn("OpenReplay: beacon size overflow. Skipping large message.",t,this),this.encoder=new s(this.beaconSize),this.prepare()))}finaliseBatch(){if(this.isEmpty)return;const t=this.encoder.flush();this.onBatch(t),this.prepare()}clean(){this.encoder.reset()}}var n;!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"}(n||(n={}));let r=null,h=n.NotActive;function a(t){postMessage({type:"status",data:t}),h=t}function u(){r&&r.finaliseBatch()}function c(){a(n.Stopping),null!==f&&(clearInterval(f),f=null),r&&(r.clean(),r=null),setTimeout((()=>{a(n.NotActive)}),100)}function o(){h!==n.Stopped&&(postMessage({type:"restart"}),c())}let f=null;self.onmessage=({data:t})=>{if(null!=t){if("writer_finalize"===t.type)return u(),h=n.Stopped;if("reset_writer"!==t.type){if("forceFlushBatch"!==t.type){if("to_writer"===t.type){let i=!1;t.data.forEach((t=>{r?r.writeMessage(t):i||(i=!0,postMessage({type:"not_init"}),o())}))}return"start"===t.type?(h=n.Starting,r=new e(t.pageNo,t.timestamp,t.url,(t=>{postMessage({type:"batch_ready",data:t},[t.buffer])}),t.tabId,(()=>postMessage({type:"queue_empty"}))),null===f&&(f=setInterval(u,1e4)),h=n.Active):"beacon_size_limit"===t.type?r?void(t.beaconSizeLimit&&r.setBeaconSizeLimit(t.beaconSizeLimit)):(console.debug("OR WebWorker: writer not initialised. Received auth."),void o()):void("restart"===t.type&&o())}u()}else c()}else u()};'], { type: 'text/javascript' }))); | ||
this.workerManager = new index_js_2.default(this, webworker, this._debug); | ||
const alertWorker = () => { | ||
if (this.worker) { | ||
this.worker.postMessage(null); | ||
if (this.workerManager) { | ||
this.workerManager.processMessage(null); | ||
} | ||
@@ -248,3 +220,3 @@ }; | ||
// you stole someone's identity | ||
reg: 'never-gonna-run-around-and-desert-you', | ||
regen: 'never-gonna-run-around-and-desert-you', | ||
}; | ||
@@ -267,3 +239,3 @@ if (this.bc) { | ||
} | ||
if (ev.data.line === proto.reg) { | ||
if (ev.data.line === proto.regen) { | ||
const sessionToken = ev.data.token; | ||
@@ -277,3 +249,3 @@ this.session.regenerateTabId(); | ||
this.bc.postMessage({ | ||
line: ev.data.source === thisTab ? proto.reg : proto.resp, | ||
line: ev.data.source === thisTab ? proto.regen : proto.resp, | ||
token, | ||
@@ -288,15 +260,42 @@ source: thisTab, | ||
} | ||
_debug(context, e) { | ||
if (this.options.__debug_report_edp !== null) { | ||
void fetch(this.options.__debug_report_edp, { | ||
method: 'POST', | ||
headers: { 'Content-Type': 'application/json' }, | ||
body: JSON.stringify({ | ||
context, | ||
// @ts-ignore | ||
error: `${e}`, | ||
}), | ||
}); | ||
handleWorkerMsg(data) { | ||
var _a; | ||
if (data.type === 'restart') { | ||
this.stop(false); | ||
void this.start({}, true); | ||
} | ||
this.debug.error('OpenReplay error: ', context, e); | ||
else if (data.type === 'not_init') { | ||
this.debug.warn('OR WebWorker: writer not initialised; restarting worker'); | ||
} | ||
else if (data.type === 'failure') { | ||
this.stop(false); | ||
this.debug.error('worker_failed', data.reason); | ||
this._debug('worker_failed', data.reason); | ||
} | ||
else if (data.type === 'compress') { | ||
const batch = data.batch; | ||
const batchSize = batch.byteLength; | ||
if (batchSize > this.compressionThreshold) { | ||
(0, fflate_1.gzip)(data.batch, { mtime: 0 }, (err, result) => { | ||
var _a; | ||
if (err) { | ||
this.debug.error('Openreplay compression error:', err); | ||
this.stop(false); | ||
if (this.restartAttempts < 3) { | ||
this.restartAttempts += 1; | ||
void this.start({}, true); | ||
} | ||
} | ||
else { | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.sendCompressedBatch(result); | ||
} | ||
}); | ||
} | ||
else { | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.sendUncompressedBatch(batch); | ||
} | ||
} | ||
else if (data.type === 'queue_empty') { | ||
this.onSessionSent(); | ||
} | ||
} | ||
@@ -342,3 +341,3 @@ send(message, urgent = false) { | ||
_nCommit() { | ||
if (this.worker !== undefined && this.messages.length) { | ||
if (this.workerManager !== undefined && this.messages.length) { | ||
(0, utils_js_1.requestIdleCb)(() => { | ||
@@ -349,3 +348,3 @@ var _a; | ||
// why I need to add opt chaining? | ||
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage(this.messages); | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.processMessage({ type: 'batch', data: this.messages }); | ||
this.commitCallbacks.forEach((cb) => cb(this.messages)); | ||
@@ -382,3 +381,3 @@ this.messages.length = 0; | ||
var _a; | ||
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage(messages); | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.processMessage({ type: 'batch', data: messages }); | ||
this.commitCallbacks.forEach((cb) => cb(messages)); | ||
@@ -528,3 +527,3 @@ messages.length = 0; | ||
* start buffering messages without starting the actual session, which gives | ||
* user 30 seconds to "activate" and record session by calling `start()` on conditional trigger | ||
* user 30 seconds to "activate" and record session by calling `start()` on conditional trigger, | ||
* and we will then send buffered batch, so it won't get lost | ||
@@ -655,3 +654,3 @@ * */ | ||
* | ||
* Then when this.offlineRecording is called, it will preload this messages and clear the storage item | ||
* Then, when this.offlineRecording is called, it will preload this messages and clear the storage item | ||
* | ||
@@ -679,3 +678,3 @@ * Keeping the size of local storage reasonable is up to the end users of this library | ||
* so the session can be uploaded properly | ||
* @resolve {boolean} - if messages were loaded successfully | ||
* @resolve - if messages were loaded in service worker successfully | ||
* @reject {string} - error message | ||
@@ -687,3 +686,3 @@ * */ | ||
const timestamp = (0, utils_js_1.now)(); | ||
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage({ | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.processMessage({ | ||
type: 'start', | ||
@@ -707,4 +706,3 @@ pageNo: this.session.incPageNo(), | ||
const { token, userBrowser, userCity, userCountry, userDevice, userOS, userState, beaconSizeLimit, projectID, } = await r.json(); | ||
(_b = this.worker) === null || _b === void 0 ? void 0 : _b.postMessage({ | ||
type: 'auth', | ||
(_b = this.workerManager) === null || _b === void 0 ? void 0 : _b.authorizeWorker({ | ||
token, | ||
@@ -729,2 +727,3 @@ beaconSizeLimit, | ||
_start(startOpts = {}, resetByWorker = false, conditionName) { | ||
var _a; | ||
const isColdStart = this.activityState === ActivityState.ColdStart; | ||
@@ -734,3 +733,3 @@ if (isColdStart && this.coldInterval) { | ||
} | ||
if (!this.worker) { | ||
if (!this.workerManager) { | ||
const reason = 'No worker found: perhaps, CSP is not set.'; | ||
@@ -762,3 +761,3 @@ this.signalError(reason, []); | ||
const timestamp = (0, utils_js_1.now)(); | ||
this.worker.postMessage({ | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.startWorker({ | ||
type: 'start', | ||
@@ -799,4 +798,4 @@ pageNo: this.session.incPageNo(), | ||
.then(async (r) => { | ||
var _a; | ||
if (!this.worker) { | ||
var _a, _b; | ||
if (!this.workerManager) { | ||
const reason = 'no worker found after start request (this might not happen)'; | ||
@@ -841,4 +840,3 @@ this.signalError(reason, []); | ||
}); | ||
this.worker.postMessage({ | ||
type: 'auth', | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.authorizeWorker({ | ||
token, | ||
@@ -865,3 +863,3 @@ beaconSizeLimit, | ||
this.canvasRecorder = | ||
(_a = this.canvasRecorder) !== null && _a !== void 0 ? _a : new canvas_js_1.default(this, { | ||
(_b = this.canvasRecorder) !== null && _b !== void 0 ? _b : new canvas_js_1.default(this, { | ||
fps: canvasFPS, | ||
@@ -973,3 +971,3 @@ quality: canvasQuality, | ||
var _a; | ||
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage('forceFlushBatch'); | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.processMessage({ type: 'forceFlushBatch' }); | ||
} | ||
@@ -1001,3 +999,3 @@ getTabId() { | ||
stop(stopWorker = true) { | ||
var _a; | ||
var _a, _b; | ||
if (this.activityState !== ActivityState.NotActive) { | ||
@@ -1013,6 +1011,6 @@ try { | ||
this.tagWatcher.clear(); | ||
if (this.worker && stopWorker) { | ||
this.worker.postMessage('stop'); | ||
if (this.workerManager && stopWorker) { | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.stopWorker(); | ||
} | ||
(_a = this.canvasRecorder) === null || _a === void 0 ? void 0 : _a.clear(); | ||
(_b = this.canvasRecorder) === null || _b === void 0 ? void 0 : _b.clear(); | ||
} | ||
@@ -1019,0 +1017,0 @@ finally { |
@@ -6,3 +6,57 @@ import Message from './messages.gen.js'; | ||
} | ||
type Start = { | ||
export type ToWorkerData = null | Stop | Batch | WorkerStart | BeaconSizeLimit | ToWriterData | ForceFlushBatch | CheckQueue | ResetWriter | WriterFinalize; | ||
export type FromWorkerData = Restart | Failure | NotInit | Compress | QEmpty | Status | BatchReady; | ||
type BatchReady = { | ||
type: 'batch_ready'; | ||
data: Uint8Array; | ||
}; | ||
type Status = { | ||
type: 'status'; | ||
data: number; | ||
}; | ||
type Compress = { | ||
type: 'compress'; | ||
batch: Uint8Array; | ||
}; | ||
type Restart = { | ||
type: 'restart'; | ||
}; | ||
type NotInit = { | ||
type: 'not_init'; | ||
}; | ||
type Stop = { | ||
type: 'stop'; | ||
}; | ||
type Batch = { | ||
type: 'batch'; | ||
data: Array<Message>; | ||
}; | ||
type ForceFlushBatch = { | ||
type: 'forceFlushBatch'; | ||
}; | ||
type CheckQueue = { | ||
type: 'check_queue'; | ||
}; | ||
type WriterFinalize = { | ||
type: 'writer_finalize'; | ||
}; | ||
type ResetWriter = { | ||
type: 'reset_writer'; | ||
}; | ||
type BeaconSizeLimit = { | ||
type: 'beacon_size_limit'; | ||
data: number; | ||
}; | ||
type ToWriterData = { | ||
type: 'to_writer'; | ||
data: Array<Message>; | ||
}; | ||
type Failure = { | ||
type: 'failure'; | ||
reason: string; | ||
}; | ||
type QEmpty = { | ||
type: 'queue_empty'; | ||
}; | ||
export type WorkerStart = { | ||
type: 'start'; | ||
@@ -15,25 +69,6 @@ ingestPoint: string; | ||
} & Options; | ||
type Auth = { | ||
type: 'auth'; | ||
export type WorkerAuth = { | ||
token: string; | ||
beaconSizeLimit?: number; | ||
}; | ||
export type ToWorkerData = null | 'stop' | Start | Auth | Array<Message> | { | ||
type: 'compressed'; | ||
batch: Uint8Array; | ||
} | { | ||
type: 'uncompressed'; | ||
batch: Uint8Array; | ||
} | 'forceFlushBatch' | 'check_queue'; | ||
type Failure = { | ||
type: 'failure'; | ||
reason: string; | ||
}; | ||
type QEmpty = { | ||
type: 'queue_empty'; | ||
}; | ||
export type FromWorkerData = 'restart' | Failure | 'not_init' | { | ||
type: 'compress'; | ||
batch: Uint8Array; | ||
} | QEmpty; | ||
export {}; |
@@ -85,3 +85,3 @@ import App from './app/index.js'; | ||
* so the session can be uploaded properly | ||
* @resolve {boolean} - if messages were loaded successfully | ||
* @resolve - if messages were loaded into service worker successfully | ||
* @reject {string} - error message | ||
@@ -88,0 +88,0 @@ * */ |
@@ -101,3 +101,3 @@ "use strict"; | ||
req.send(JSON.stringify({ | ||
trackerVersion: '12.0.0-beta.9', | ||
trackerVersion: '12.0.0-beta.99', | ||
projectKey: this.options.projectKey, | ||
@@ -339,3 +339,3 @@ doNotTrack, | ||
* so the session can be uploaded properly | ||
* @resolve {boolean} - if messages were loaded successfully | ||
* @resolve - if messages were loaded into service worker successfully | ||
* @reject {string} - error message | ||
@@ -342,0 +342,0 @@ * */ |
@@ -173,3 +173,2 @@ "use strict"; | ||
const operator = operators[evCond.operator]; | ||
console.log(operator, evCond, operator(message[1], evCond.value), operator(message[2], evCond.value)); | ||
if (operator && | ||
@@ -176,0 +175,0 @@ (operator(message[1], evCond.value) || operator(message[2], evCond.value))) { |
@@ -41,3 +41,4 @@ "use strict"; | ||
this.setTags(tags); | ||
this.sessionStorage.setItem(exports.WATCHED_TAGS_KEY, JSON.stringify(tags) || ''); | ||
const tagString = JSON.stringify(tags); | ||
this.sessionStorage.setItem(exports.WATCHED_TAGS_KEY, tagString || ''); | ||
} | ||
@@ -44,0 +45,0 @@ }) |
@@ -14,3 +14,3 @@ import FeatureFlags from '../modules/featureFlags.js'; | ||
import type { Options as NetworkOptions } from '../modules/network.js'; | ||
import type { Options as WebworkerOptions } from '../common/interaction.js'; | ||
import type { Options as WebworkerOptions, FromWorkerData } from '../common/interaction.js'; | ||
export interface StartOptions { | ||
@@ -92,3 +92,3 @@ userID?: string; | ||
private readonly version; | ||
private readonly worker?; | ||
private readonly workerManager?; | ||
private compressionThreshold; | ||
@@ -103,5 +103,6 @@ private restartAttempts; | ||
featureFlags: FeatureFlags; | ||
private tagWatcher; | ||
private readonly tagWatcher; | ||
constructor(projectKey: string, sessionToken: string | undefined, options: Partial<Options>, signalError: (error: string, apis: string[]) => void); | ||
private _debug; | ||
handleWorkerMsg(data: FromWorkerData): void; | ||
private readonly _debug; | ||
private _usingOldFetchPlugin; | ||
@@ -164,3 +165,3 @@ send(message: Message, urgent?: boolean): void; | ||
* start buffering messages without starting the actual session, which gives | ||
* user 30 seconds to "activate" and record session by calling `start()` on conditional trigger | ||
* user 30 seconds to "activate" and record session by calling `start()` on conditional trigger, | ||
* and we will then send buffered batch, so it won't get lost | ||
@@ -183,3 +184,3 @@ * */ | ||
* | ||
* Then when this.offlineRecording is called, it will preload this messages and clear the storage item | ||
* Then, when this.offlineRecording is called, it will preload this messages and clear the storage item | ||
* | ||
@@ -201,3 +202,3 @@ * Keeping the size of local storage reasonable is up to the end users of this library | ||
* so the session can be uploaded properly | ||
* @resolve {boolean} - if messages were loaded successfully | ||
* @resolve - if messages were loaded in service worker successfully | ||
* @reject {string} - error message | ||
@@ -204,0 +205,0 @@ * */ |
@@ -18,2 +18,3 @@ import ConditionsManager from '../modules/conditionsManager.js'; | ||
import TagWatcher from '../modules/tagWatcher.js'; | ||
import WebWorkerManager from './workerManager/index.js'; | ||
const CANCELED = 'canceled'; | ||
@@ -56,3 +57,3 @@ const uxtStorageKey = 'or_uxt_active'; | ||
this.activityState = ActivityState.NotActive; | ||
this.version = '12.0.0-beta.9'; // TODO: version compatability check inside each plugin. | ||
this.version = '12.0.0-beta.99'; // TODO: version compatability check inside each plugin. | ||
this.compressionThreshold = 24 * 1000; | ||
@@ -63,2 +64,16 @@ this.restartAttempts = 0; | ||
this.conditionsManager = null; | ||
this._debug = (context, e) => { | ||
if (this.options.__debug_report_edp !== null) { | ||
void fetch(this.options.__debug_report_edp, { | ||
method: 'POST', | ||
headers: { 'Content-Type': 'application/json' }, | ||
body: JSON.stringify({ | ||
context, | ||
// @ts-ignore | ||
error: `${e}`, | ||
}), | ||
}); | ||
} | ||
this.debug.error('OpenReplay error: ', context, e); | ||
}; | ||
this._usingOldFetchPlugin = false; | ||
@@ -152,50 +167,7 @@ this.coldStartCommitN = 0; | ||
try { | ||
this.worker = new Worker(URL.createObjectURL(new Blob(['"use strict";class t{constructor(t,s,i,e=10,n=1e3,h){this.onUnauthorised=s,this.onFailure=i,this.MAX_ATTEMPTS_COUNT=e,this.ATTEMPT_TIMEOUT=n,this.onCompress=h,this.attemptsCount=0,this.busy=!1,this.queue=[],this.token=null,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){this.busy||!this.token?this.queue.push(t):(this.busy=!0,this.isCompressing&&this.onCompress?this.onCompress(t):this.sendBatch(t))}sendNext(){const t=this.queue.shift();t?(this.busy=!0,this.isCompressing&&this.onCompress?this.onCompress(t):this.sendBatch(t)):this.busy=!1}retry(t,s){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure(`Failed to send batch after ${this.attemptsCount} attempts.`):(this.attemptsCount++,setTimeout((()=>this.sendBatch(t,s)),this.ATTEMPT_TIMEOUT*this.attemptsCount))}sendBatch(t,s){this.busy=!0;const i={Authorization:`Bearer ${this.token}`};s&&(i["Content-Encoding"]="gzip"),null!==this.token?fetch(this.ingestURL,{body:t,method:"POST",headers:i,keepalive:t.length<65536}).then((i=>{if(401===i.status)return this.busy=!1,void this.onUnauthorised();i.status>=400?this.retry(t,s):(this.attemptsCount=0,this.sendNext())})).catch((i=>{console.warn("OpenReplay:",i),this.retry(t,s)})):setTimeout((()=>{this.sendBatch(t,s)}),500)}sendCompressed(t){this.sendBatch(t,!0)}sendUncompressed(t){this.sendBatch(t,!1)}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:case 78: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 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 69:return this.uint(t[1])&&this.uint(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])}}}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]),4===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(){a=h.Stopping,null!==g&&(clearInterval(g),g=null),u&&(u.clean(),u=null),r&&(r.clean(),setTimeout((()=>{r=null}),20)),setTimeout((()=>{a=h.NotActive}),100)}function p(){a!==h.Stopped&&(postMessage("restart"),c())}let f,g=null;self.onmessage=({data:s})=>{if(null!=s){if("stop"===s)return o(),c(),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 p();s.batch&&r.sendCompressed(s.batch)}if("uncompressed"===s.type){if(!r)return console.debug("OR WebWorker: sender not initialised. Uncompressed batch."),void p();s.batch&&r.sendUncompressed(s.batch)}return"start"===s.type?(a=h.Starting,r=new t(s.ingestPoint,(()=>{p()}),(t=>{!function(t){postMessage({type:"failure",reason:t}),c()}(t)}),s.connAttemptCount,s.connAttemptGap,(t=>{postMessage({type:"compress",batch:t},[t.buffer])})),u=new n(s.pageNo,s.timestamp,s.url,(t=>{r&&r.push(t)}),s.tabId,(()=>postMessage({type:"queue_empty"}))),null===g&&(g=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 p()):(console.debug("OR WebWorker: sender not initialised. Received auth."),void p()):void 0}if(u){const t=u;s.forEach((s=>{55===s[0]&&(s[1]?f=setTimeout((()=>p()),18e5):clearTimeout(f)),t.writeMessage(s)}))}else postMessage("not_init"),p()}else o()}else o()};'], { type: 'text/javascript' }))); | ||
this.worker.onerror = (e) => { | ||
this._debug('webworker_error', e); | ||
}; | ||
this.worker.onmessage = ({ data }) => { | ||
var _a; | ||
if (data === 'restart') { | ||
this.stop(false); | ||
void this.start({}, true); | ||
} | ||
else if (data === 'not_init') { | ||
this.debug.warn('OR WebWorker: writer not initialised. Restarting tracker'); | ||
} | ||
else if (data.type === 'failure') { | ||
this.stop(false); | ||
this.debug.error('worker_failed', data.reason); | ||
this._debug('worker_failed', data.reason); | ||
} | ||
else if (data.type === 'compress') { | ||
const batch = data.batch; | ||
const batchSize = batch.byteLength; | ||
if (batchSize > this.compressionThreshold) { | ||
gzip(data.batch, { mtime: 0 }, (err, result) => { | ||
var _a; | ||
if (err) { | ||
this.debug.error('Openreplay compression error:', err); | ||
this.stop(false); | ||
if (this.restartAttempts < 3) { | ||
this.restartAttempts += 1; | ||
void this.start({}, true); | ||
} | ||
} | ||
else { | ||
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage({ type: 'compressed', batch: result }); | ||
} | ||
}); | ||
} | ||
else { | ||
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage({ type: 'uncompressed', batch: batch }); | ||
} | ||
} | ||
else if (data.type === 'queue_empty') { | ||
this.onSessionSent(); | ||
} | ||
}; | ||
const webworker = new Worker(URL.createObjectURL(new Blob(['"use strict";const t="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 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,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(i){const s=t.encode(i),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}}class s 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:case 78: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 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 69:return this.uint(t[1])&&this.uint(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])}}}class e{constructor(t,i,e,n,r,h){this.pageNo=t,this.timestamp=i,this.url=e,this.onBatch=n,this.tabId=r,this.onOfflineEnd=h,this.nextIndex=0,this.beaconSize=2e5,this.encoder=new s(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,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],i=[118,this.tabId];this.writeType(t),this.writeFields(t),this.writeWithSize(i),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}writeMessage(t){if("q_end"===t[0])return this.finaliseBatch(),this.onOfflineEnd();0===t[0]&&(this.timestamp=t[1]),4===t[0]&&(this.url=t[1]),this.writeWithSize(t)||(this.finaliseBatch(),this.writeWithSize(t)||(this.encoder=new s(this.beaconSizeLimit),this.prepare(),this.writeWithSize(t)?this.finaliseBatch():console.warn("OpenReplay: beacon size overflow. Skipping large message.",t,this),this.encoder=new s(this.beaconSize),this.prepare()))}finaliseBatch(){if(this.isEmpty)return;const t=this.encoder.flush();this.onBatch(t),this.prepare()}clean(){this.encoder.reset()}}var n;!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"}(n||(n={}));let r=null,h=n.NotActive;function a(t){postMessage({type:"status",data:t}),h=t}function u(){r&&r.finaliseBatch()}function c(){a(n.Stopping),null!==f&&(clearInterval(f),f=null),r&&(r.clean(),r=null),setTimeout((()=>{a(n.NotActive)}),100)}function o(){h!==n.Stopped&&(postMessage({type:"restart"}),c())}let f=null;self.onmessage=({data:t})=>{if(null!=t){if("writer_finalize"===t.type)return u(),h=n.Stopped;if("reset_writer"!==t.type){if("forceFlushBatch"!==t.type){if("to_writer"===t.type){let i=!1;t.data.forEach((t=>{r?r.writeMessage(t):i||(i=!0,postMessage({type:"not_init"}),o())}))}return"start"===t.type?(h=n.Starting,r=new e(t.pageNo,t.timestamp,t.url,(t=>{postMessage({type:"batch_ready",data:t},[t.buffer])}),t.tabId,(()=>postMessage({type:"queue_empty"}))),null===f&&(f=setInterval(u,1e4)),h=n.Active):"beacon_size_limit"===t.type?r?void(t.beaconSizeLimit&&r.setBeaconSizeLimit(t.beaconSizeLimit)):(console.debug("OR WebWorker: writer not initialised. Received auth."),void o()):void("restart"===t.type&&o())}u()}else c()}else u()};'], { type: 'text/javascript' }))); | ||
this.workerManager = new WebWorkerManager(this, webworker, this._debug); | ||
const alertWorker = () => { | ||
if (this.worker) { | ||
this.worker.postMessage(null); | ||
if (this.workerManager) { | ||
this.workerManager.processMessage(null); | ||
} | ||
@@ -219,3 +191,3 @@ }; | ||
// you stole someone's identity | ||
reg: 'never-gonna-run-around-and-desert-you', | ||
regen: 'never-gonna-run-around-and-desert-you', | ||
}; | ||
@@ -238,3 +210,3 @@ if (this.bc) { | ||
} | ||
if (ev.data.line === proto.reg) { | ||
if (ev.data.line === proto.regen) { | ||
const sessionToken = ev.data.token; | ||
@@ -248,3 +220,3 @@ this.session.regenerateTabId(); | ||
this.bc.postMessage({ | ||
line: ev.data.source === thisTab ? proto.reg : proto.resp, | ||
line: ev.data.source === thisTab ? proto.regen : proto.resp, | ||
token, | ||
@@ -259,15 +231,42 @@ source: thisTab, | ||
} | ||
_debug(context, e) { | ||
if (this.options.__debug_report_edp !== null) { | ||
void fetch(this.options.__debug_report_edp, { | ||
method: 'POST', | ||
headers: { 'Content-Type': 'application/json' }, | ||
body: JSON.stringify({ | ||
context, | ||
// @ts-ignore | ||
error: `${e}`, | ||
}), | ||
}); | ||
handleWorkerMsg(data) { | ||
var _a; | ||
if (data.type === 'restart') { | ||
this.stop(false); | ||
void this.start({}, true); | ||
} | ||
this.debug.error('OpenReplay error: ', context, e); | ||
else if (data.type === 'not_init') { | ||
this.debug.warn('OR WebWorker: writer not initialised; restarting worker'); | ||
} | ||
else if (data.type === 'failure') { | ||
this.stop(false); | ||
this.debug.error('worker_failed', data.reason); | ||
this._debug('worker_failed', data.reason); | ||
} | ||
else if (data.type === 'compress') { | ||
const batch = data.batch; | ||
const batchSize = batch.byteLength; | ||
if (batchSize > this.compressionThreshold) { | ||
gzip(data.batch, { mtime: 0 }, (err, result) => { | ||
var _a; | ||
if (err) { | ||
this.debug.error('Openreplay compression error:', err); | ||
this.stop(false); | ||
if (this.restartAttempts < 3) { | ||
this.restartAttempts += 1; | ||
void this.start({}, true); | ||
} | ||
} | ||
else { | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.sendCompressedBatch(result); | ||
} | ||
}); | ||
} | ||
else { | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.sendUncompressedBatch(batch); | ||
} | ||
} | ||
else if (data.type === 'queue_empty') { | ||
this.onSessionSent(); | ||
} | ||
} | ||
@@ -313,3 +312,3 @@ send(message, urgent = false) { | ||
_nCommit() { | ||
if (this.worker !== undefined && this.messages.length) { | ||
if (this.workerManager !== undefined && this.messages.length) { | ||
requestIdleCb(() => { | ||
@@ -320,3 +319,3 @@ var _a; | ||
// why I need to add opt chaining? | ||
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage(this.messages); | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.processMessage({ type: 'batch', data: this.messages }); | ||
this.commitCallbacks.forEach((cb) => cb(this.messages)); | ||
@@ -353,3 +352,3 @@ this.messages.length = 0; | ||
var _a; | ||
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage(messages); | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.processMessage({ type: 'batch', data: messages }); | ||
this.commitCallbacks.forEach((cb) => cb(messages)); | ||
@@ -499,3 +498,3 @@ messages.length = 0; | ||
* start buffering messages without starting the actual session, which gives | ||
* user 30 seconds to "activate" and record session by calling `start()` on conditional trigger | ||
* user 30 seconds to "activate" and record session by calling `start()` on conditional trigger, | ||
* and we will then send buffered batch, so it won't get lost | ||
@@ -626,3 +625,3 @@ * */ | ||
* | ||
* Then when this.offlineRecording is called, it will preload this messages and clear the storage item | ||
* Then, when this.offlineRecording is called, it will preload this messages and clear the storage item | ||
* | ||
@@ -650,3 +649,3 @@ * Keeping the size of local storage reasonable is up to the end users of this library | ||
* so the session can be uploaded properly | ||
* @resolve {boolean} - if messages were loaded successfully | ||
* @resolve - if messages were loaded in service worker successfully | ||
* @reject {string} - error message | ||
@@ -658,3 +657,3 @@ * */ | ||
const timestamp = now(); | ||
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage({ | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.processMessage({ | ||
type: 'start', | ||
@@ -678,4 +677,3 @@ pageNo: this.session.incPageNo(), | ||
const { token, userBrowser, userCity, userCountry, userDevice, userOS, userState, beaconSizeLimit, projectID, } = await r.json(); | ||
(_b = this.worker) === null || _b === void 0 ? void 0 : _b.postMessage({ | ||
type: 'auth', | ||
(_b = this.workerManager) === null || _b === void 0 ? void 0 : _b.authorizeWorker({ | ||
token, | ||
@@ -700,2 +698,3 @@ beaconSizeLimit, | ||
_start(startOpts = {}, resetByWorker = false, conditionName) { | ||
var _a; | ||
const isColdStart = this.activityState === ActivityState.ColdStart; | ||
@@ -705,3 +704,3 @@ if (isColdStart && this.coldInterval) { | ||
} | ||
if (!this.worker) { | ||
if (!this.workerManager) { | ||
const reason = 'No worker found: perhaps, CSP is not set.'; | ||
@@ -733,3 +732,3 @@ this.signalError(reason, []); | ||
const timestamp = now(); | ||
this.worker.postMessage({ | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.startWorker({ | ||
type: 'start', | ||
@@ -770,4 +769,4 @@ pageNo: this.session.incPageNo(), | ||
.then(async (r) => { | ||
var _a; | ||
if (!this.worker) { | ||
var _a, _b; | ||
if (!this.workerManager) { | ||
const reason = 'no worker found after start request (this might not happen)'; | ||
@@ -812,4 +811,3 @@ this.signalError(reason, []); | ||
}); | ||
this.worker.postMessage({ | ||
type: 'auth', | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.authorizeWorker({ | ||
token, | ||
@@ -836,3 +834,3 @@ beaconSizeLimit, | ||
this.canvasRecorder = | ||
(_a = this.canvasRecorder) !== null && _a !== void 0 ? _a : new CanvasRecorder(this, { | ||
(_b = this.canvasRecorder) !== null && _b !== void 0 ? _b : new CanvasRecorder(this, { | ||
fps: canvasFPS, | ||
@@ -944,3 +942,3 @@ quality: canvasQuality, | ||
var _a; | ||
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage('forceFlushBatch'); | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.processMessage({ type: 'forceFlushBatch' }); | ||
} | ||
@@ -972,3 +970,3 @@ getTabId() { | ||
stop(stopWorker = true) { | ||
var _a; | ||
var _a, _b; | ||
if (this.activityState !== ActivityState.NotActive) { | ||
@@ -984,6 +982,6 @@ try { | ||
this.tagWatcher.clear(); | ||
if (this.worker && stopWorker) { | ||
this.worker.postMessage('stop'); | ||
if (this.workerManager && stopWorker) { | ||
(_a = this.workerManager) === null || _a === void 0 ? void 0 : _a.stopWorker(); | ||
} | ||
(_a = this.canvasRecorder) === null || _a === void 0 ? void 0 : _a.clear(); | ||
(_b = this.canvasRecorder) === null || _b === void 0 ? void 0 : _b.clear(); | ||
} | ||
@@ -990,0 +988,0 @@ finally { |
@@ -6,3 +6,57 @@ import Message from './messages.gen.js'; | ||
} | ||
type Start = { | ||
export type ToWorkerData = null | Stop | Batch | WorkerStart | BeaconSizeLimit | ToWriterData | ForceFlushBatch | CheckQueue | ResetWriter | WriterFinalize; | ||
export type FromWorkerData = Restart | Failure | NotInit | Compress | QEmpty | Status | BatchReady; | ||
type BatchReady = { | ||
type: 'batch_ready'; | ||
data: Uint8Array; | ||
}; | ||
type Status = { | ||
type: 'status'; | ||
data: number; | ||
}; | ||
type Compress = { | ||
type: 'compress'; | ||
batch: Uint8Array; | ||
}; | ||
type Restart = { | ||
type: 'restart'; | ||
}; | ||
type NotInit = { | ||
type: 'not_init'; | ||
}; | ||
type Stop = { | ||
type: 'stop'; | ||
}; | ||
type Batch = { | ||
type: 'batch'; | ||
data: Array<Message>; | ||
}; | ||
type ForceFlushBatch = { | ||
type: 'forceFlushBatch'; | ||
}; | ||
type CheckQueue = { | ||
type: 'check_queue'; | ||
}; | ||
type WriterFinalize = { | ||
type: 'writer_finalize'; | ||
}; | ||
type ResetWriter = { | ||
type: 'reset_writer'; | ||
}; | ||
type BeaconSizeLimit = { | ||
type: 'beacon_size_limit'; | ||
data: number; | ||
}; | ||
type ToWriterData = { | ||
type: 'to_writer'; | ||
data: Array<Message>; | ||
}; | ||
type Failure = { | ||
type: 'failure'; | ||
reason: string; | ||
}; | ||
type QEmpty = { | ||
type: 'queue_empty'; | ||
}; | ||
export type WorkerStart = { | ||
type: 'start'; | ||
@@ -15,25 +69,6 @@ ingestPoint: string; | ||
} & Options; | ||
type Auth = { | ||
type: 'auth'; | ||
export type WorkerAuth = { | ||
token: string; | ||
beaconSizeLimit?: number; | ||
}; | ||
export type ToWorkerData = null | 'stop' | Start | Auth | Array<Message> | { | ||
type: 'compressed'; | ||
batch: Uint8Array; | ||
} | { | ||
type: 'uncompressed'; | ||
batch: Uint8Array; | ||
} | 'forceFlushBatch' | 'check_queue'; | ||
type Failure = { | ||
type: 'failure'; | ||
reason: string; | ||
}; | ||
type QEmpty = { | ||
type: 'queue_empty'; | ||
}; | ||
export type FromWorkerData = 'restart' | Failure | 'not_init' | { | ||
type: 'compress'; | ||
batch: Uint8Array; | ||
} | QEmpty; | ||
export {}; |
@@ -85,3 +85,3 @@ import App from './app/index.js'; | ||
* so the session can be uploaded properly | ||
* @resolve {boolean} - if messages were loaded successfully | ||
* @resolve - if messages were loaded into service worker successfully | ||
* @reject {string} - error message | ||
@@ -88,0 +88,0 @@ * */ |
@@ -70,3 +70,3 @@ import App, { DEFAULT_INGEST_POINT } from './app/index.js'; | ||
req.send(JSON.stringify({ | ||
trackerVersion: '12.0.0-beta.9', | ||
trackerVersion: '12.0.0-beta.99', | ||
projectKey: this.options.projectKey, | ||
@@ -308,3 +308,3 @@ doNotTrack, | ||
* so the session can be uploaded properly | ||
* @resolve {boolean} - if messages were loaded successfully | ||
* @resolve - if messages were loaded into service worker successfully | ||
* @reject {string} - error message | ||
@@ -311,0 +311,0 @@ * */ |
@@ -171,3 +171,2 @@ export default class ConditionsManager { | ||
const operator = operators[evCond.operator]; | ||
console.log(operator, evCond, operator(message[1], evCond.value), operator(message[2], evCond.value)); | ||
if (operator && | ||
@@ -174,0 +173,0 @@ (operator(message[1], evCond.value) || operator(message[2], evCond.value))) { |
@@ -38,3 +38,4 @@ export const WATCHED_TAGS_KEY = '__or__watched_tags__'; | ||
this.setTags(tags); | ||
this.sessionStorage.setItem(WATCHED_TAGS_KEY, JSON.stringify(tags) || ''); | ||
const tagString = JSON.stringify(tags); | ||
this.sessionStorage.setItem(WATCHED_TAGS_KEY, tagString || ''); | ||
} | ||
@@ -41,0 +42,0 @@ }) |
{ | ||
"name": "@openreplay/tracker", | ||
"description": "The OpenReplay tracker main package", | ||
"version": "12.0.0-beta.9", | ||
"version": "12.0.0-beta.99", | ||
"keywords": [ | ||
@@ -6,0 +6,0 @@ "logging", |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
3939675
306
23798
28