From 48af7b93b950524a9c8ca445b518cb82fc91bd9c Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Tue, 23 May 2023 14:53:25 +0200 Subject: [PATCH] fix(tracker): ignore beacons from same tab, only ask if token isnt present yet, add small delay before start to wait for answer --- tracker/tracker/src/main/app/index.ts | 28 +++++++++++++++++++----- tracker/tracker/src/main/modules/tabs.ts | 6 +++-- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/tracker/tracker/src/main/app/index.ts b/tracker/tracker/src/main/app/index.ts index 6d7167b98..ee000d818 100644 --- a/tracker/tracker/src/main/app/index.ts +++ b/tracker/tracker/src/main/app/index.ts @@ -47,9 +47,10 @@ type UnsuccessfulStart = { success: false } -type RickRoll = +type RickRoll = { source: string } & ( | { line: 'never-gonna-give-you-up' } | { line: 'never-gonna-let-you-down'; token: string } +) const UnsuccessfulStart = (reason: string): UnsuccessfulStart => ({ reason, success: false }) const SuccessfulStart = (body: OnStartInfo): SuccessfulStart => ({ ...body, success: true }) @@ -221,21 +222,25 @@ export default class App { this._debug('worker_start', e) } - const token = this.session.getSessionToken() - if (!token) { - this.bc.postMessage({ line: 'never-gonna-give-you-up' }) + const thisTab = this.session.getTabId() + + if (!this.session.getSessionToken()) { + this.bc.postMessage({ line: 'never-gonna-give-you-up', source: thisTab }) } this.bc.onmessage = (ev: MessageEvent) => { + if (ev.data.source === thisTab) return if (ev.data.line === 'never-gonna-let-you-down') { const sessionToken = ev.data.token this.session.setSessionToken(sessionToken) } if (ev.data.line === 'never-gonna-give-you-up') { + const token = this.session.getSessionToken() if (token) { this.bc.postMessage({ line: 'never-gonna-let-you-down', token, + source: thisTab, }) } } @@ -493,6 +498,7 @@ export default class App { const sessionToken = this.session.getSessionToken() const isNewSession = needNewSessionID || !sessionToken + console.log('OpenReplay: starting session', needNewSessionID, sessionToken) return window .fetch(this.options.ingestPoint + '/v1/web/start', { method: 'POST', @@ -603,15 +609,25 @@ export default class App { }) } + /** + * basically we ask other tabs during constructor + * and here we just apply 10ms delay just in case + * */ start(...args: Parameters): Promise { if (!document.hidden) { - return this._start(...args) + return new Promise((resolve) => { + setTimeout(() => { + resolve(this._start(...args)) + }, 10) + }) } else { return new Promise((resolve) => { const onVisibilityChange = () => { if (!document.hidden) { document.removeEventListener('visibilitychange', onVisibilityChange) - resolve(this._start(...args)) + setTimeout(() => { + resolve(this._start(...args)) + }, 10) } } document.addEventListener('visibilitychange', onVisibilityChange) diff --git a/tracker/tracker/src/main/modules/tabs.ts b/tracker/tracker/src/main/modules/tabs.ts index 1ede30685..f35000061 100644 --- a/tracker/tracker/src/main/modules/tabs.ts +++ b/tracker/tracker/src/main/modules/tabs.ts @@ -3,8 +3,10 @@ import { TabChange } from '../app/messages.gen.js' export default function (app: App): void { function changeTab() { - console.log(!document.hidden, app.session.getTabId()) - if (!document.hidden) app.safe(() => app.send(TabChange(app.session.getTabId()))) + if (!document.hidden) { + app.debug.log('Openreplay: tab change to' + app.session.getTabId()) + app.send(TabChange(app.session.getTabId())) + } } if (document.hidden !== undefined) {