From 2823d92710efe7f9601fd7dddb910008616705f0 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 31 Mar 2023 10:26:57 +0200 Subject: [PATCH 01/24] fix(tracker): remove restart restriction ? --- tracker/tracker/src/webworker/index.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tracker/tracker/src/webworker/index.ts b/tracker/tracker/src/webworker/index.ts index 5afa42cee..e821cc6bd 100644 --- a/tracker/tracker/src/webworker/index.ts +++ b/tracker/tracker/src/webworker/index.ts @@ -24,7 +24,7 @@ const AUTO_SEND_INTERVAL = 10 * 1000 let sender: QueueSender | null = null let writer: BatchWriter | null = null let workerStatus: WorkerStatus = WorkerStatus.NotActive -let afterSleepRestarts = 0 +// let afterSleepRestarts = 0 function finalize(): void { if (!writer) { return @@ -98,10 +98,7 @@ self.onmessage = ({ data }: any): any => { } if (!writer) { postMessage('not_init') - if (afterSleepRestarts === 0) { - afterSleepRestarts += 1 - initiateRestart() - } + initiateRestart() } return } From a2da0b3fb5859f4d38a75918e8d392e9b8cac707 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 31 Mar 2023 10:32:14 +0200 Subject: [PATCH 02/24] fix(ui): remove random console log --- .../shared/SessionSettings/components/ListingVisibility.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx b/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx index 8bea8b004..b7c1a0f61 100644 --- a/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx +++ b/frontend/app/components/shared/SessionSettings/components/ListingVisibility.tsx @@ -52,7 +52,6 @@ function ListingVisibility() { min={0} placeholder="E.g 10" onChange={({ target: { value } }: any) => { - console.log('value', value) changeSettings({ count: value > 0 ? value : '' }) }} /> From cf728eb310e9c69076c6ee26c6350f3f340eae69 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 31 Mar 2023 10:40:26 +0200 Subject: [PATCH 03/24] fix(ui): fix session loader --- frontend/app/components/Session/WebPlayer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/components/Session/WebPlayer.tsx b/frontend/app/components/Session/WebPlayer.tsx index 07fab2877..94ed4f8b5 100644 --- a/frontend/app/components/Session/WebPlayer.tsx +++ b/frontend/app/components/Session/WebPlayer.tsx @@ -100,7 +100,7 @@ function WebPlayer(props: any) { contextValue.player.play(); }; - if (!session) return ; + if (!session.sessionId) return ; return ( From 848520790b2447aa90499ccf9e45784431bce00e Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 31 Mar 2023 11:24:14 +0200 Subject: [PATCH 04/24] fix(ui): jump to first event in session automatically --- frontend/app/components/Session/WebPlayer.tsx | 4 ++++ frontend/app/player/create.ts | 1 + frontend/app/player/web/MessageManager.ts | 2 ++ frontend/app/player/web/WebPlayer.ts | 5 ++++- tracker/tracker/CHANGELOG.md | 9 +++++++++ tracker/tracker/src/main/modules/mouse.ts | 1 - 6 files changed, 20 insertions(+), 2 deletions(-) diff --git a/frontend/app/components/Session/WebPlayer.tsx b/frontend/app/components/Session/WebPlayer.tsx index 94ed4f8b5..5a9280f55 100644 --- a/frontend/app/components/Session/WebPlayer.tsx +++ b/frontend/app/components/Session/WebPlayer.tsx @@ -84,6 +84,10 @@ function WebPlayer(props: any) { if (activeTab === '' && !showNoteModal && isPlayerReady) { contextValue.player && contextValue.player.play() } + const visualOffset = contextValue.player?.checkVisualOffset?.() || 0 + if (visualOffset !== 0) { + contextValue.player.jump(visualOffset) + } }, [activeTab, isPlayerReady, showNoteModal]) // LAYOUT (TODO: local layout state - useContext or something..) diff --git a/frontend/app/player/create.ts b/frontend/app/player/create.ts index 2d46c5b0e..67cde7453 100644 --- a/frontend/app/player/create.ts +++ b/frontend/app/player/create.ts @@ -23,6 +23,7 @@ export function createWebPlayer(session: Record, wrapStore?: (s:IWe } const player = new WebPlayer(store, session, false) + window.__or_player = player; return [player, store] } diff --git a/frontend/app/player/web/MessageManager.ts b/frontend/app/player/web/MessageManager.ts index fbce59bb0..4e07b4059 100644 --- a/frontend/app/player/web/MessageManager.ts +++ b/frontend/app/player/web/MessageManager.ts @@ -116,6 +116,7 @@ export default class MessageManager { private sessionStart: number; private navigationStartOffset: number = 0; private lastMessageTime: number = 0; + public firstVisualEvent: number = 0; constructor( private readonly session: any /*Session*/, @@ -467,6 +468,7 @@ export default class MessageManager { default: switch (msg.tp) { case MType.CreateDocument: + if (this.firstVisualEvent === 0) this.firstVisualEvent = msg.time; this.windowNodeCounter.reset(); this.performanceTrackManager.setCurrentNodesCount(this.windowNodeCounter.count); break; diff --git a/frontend/app/player/web/WebPlayer.ts b/frontend/app/player/web/WebPlayer.ts index c44ddc7b2..f83a6a832 100644 --- a/frontend/app/player/web/WebPlayer.ts +++ b/frontend/app/player/web/WebPlayer.ts @@ -66,7 +66,6 @@ export default class WebPlayer extends Player { // @ts-ignore window.playerJumpToTime = this.jump.bind(this) - } updateLists = (session: any) => { @@ -147,6 +146,10 @@ export default class WebPlayer extends Player { this.screen.cursor.showTag(name) } + checkVisualOffset = () => { + return this.messageManager.firstVisualEvent + } + clean = () => { super.clean() this.screen.clean() diff --git a/tracker/tracker/CHANGELOG.md b/tracker/tracker/CHANGELOG.md index 2cd9d01e4..c04c48bd4 100644 --- a/tracker/tracker/CHANGELOG.md +++ b/tracker/tracker/CHANGELOG.md @@ -1,5 +1,12 @@ +# 6.0.1 + +- fix webworker writer re-init request +- remove useless logs + # 6.0.0 + **(Compatible with OpenReplay v1.11.0+ only)** + - **[breaking]:** Capture mouse thrashing, input hesitation+duration, click hesitation - Capture DOM node drop event (>30% nodes removed) - Capture iframe network requests @@ -18,7 +25,9 @@ - Use `@medv/finder` instead of our own implementation of `getSelector` for better clickmaps experience ## 5.0.0 + **(Compatible with OpenReplay v1.10.0+ only)** + - **[breaking]:** string dictionary to reduce session size - Added "tel" to supported input types - Added `{ withCurrentTime: true }` to `tracker.getSessionURL` method which will return sessionURL with current session's timestamp diff --git a/tracker/tracker/src/main/modules/mouse.ts b/tracker/tracker/src/main/modules/mouse.ts index 5bba2ddda..e09955ced 100644 --- a/tracker/tracker/src/main/modules/mouse.ts +++ b/tracker/tracker/src/main/modules/mouse.ts @@ -142,7 +142,6 @@ export default function (app: App, options?: MouseHandlerOptions): void { const acceleration = (nextVelocity - velocity) / shakeCheckInterval if (directionChangeCount > 3 && acceleration > shakeThreshold) { - console.log('Mouse shake detected!') app.send(MouseThrashing(now())) } From e41209c0e5c7dda710ab17a85981adbf5fa6d031 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 31 Mar 2023 11:41:09 +0200 Subject: [PATCH 05/24] fix(ui) - userDeviceHeapSize null --- frontend/app/components/Session_/Performance/Performance.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/components/Session_/Performance/Performance.tsx b/frontend/app/components/Session_/Performance/Performance.tsx index fa4828af1..2d251a9fd 100644 --- a/frontend/app/components/Session_/Performance/Performance.tsx +++ b/frontend/app/components/Session_/Performance/Performance.tsx @@ -492,5 +492,5 @@ function Performance({ } export const ConnectedPerformance = connect((state: any) => ({ - userDeviceHeapSize: state.getIn(['sessions', 'current']).userDeviceHeapSize, + userDeviceHeapSize: state.getIn(['sessions', 'current']).userDeviceHeapSize || 0, }))(observer(Performance)); From 655797865ef79e840662d7c1a5bf5e16ad0c1f0c Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Fri, 31 Mar 2023 10:42:17 +0100 Subject: [PATCH 06/24] feat(DB): fixed missing enum value --- ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql | 3 ++- scripts/schema/db/init_dbs/postgresql/init_schema.sql | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql b/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql index 0418c5d7d..5265f4b00 100644 --- a/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql +++ b/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql @@ -414,7 +414,8 @@ $$ 'ml_excessive_scrolling', 'ml_slow_resources', 'custom', - 'js_exception' + 'js_exception', + 'mouse_thrashing' ); END IF; diff --git a/scripts/schema/db/init_dbs/postgresql/init_schema.sql b/scripts/schema/db/init_dbs/postgresql/init_schema.sql index 2fe532636..cd5e0e2db 100644 --- a/scripts/schema/db/init_dbs/postgresql/init_schema.sql +++ b/scripts/schema/db/init_dbs/postgresql/init_schema.sql @@ -316,7 +316,8 @@ $$ 'ml_excessive_scrolling', 'ml_slow_resources', 'custom', - 'js_exception' + 'js_exception', + 'mouse_thrashing' ); CREATE TABLE issues From 8152d9c81f9037dc8448bce88b932a6bf23b940a Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Fri, 31 Mar 2023 10:59:22 +0100 Subject: [PATCH 07/24] feat(chalice): changed health check endpoint --- api/routers/subs/health.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/routers/subs/health.py b/api/routers/subs/health.py index fdef52509..65c39ad4f 100644 --- a/api/routers/subs/health.py +++ b/api/routers/subs/health.py @@ -6,7 +6,7 @@ from routers.base import get_routers public_app, app, app_apikey = get_routers() -@app.get('/health', tags=["health-check"]) +@app.get('/healthz', tags=["health-check"]) def get_global_health_status(): return {"data": health.get_health()} From 2a9d7cefec63bb4cf3244713cfa06a9b9fdab2dc Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 31 Mar 2023 12:02:25 +0200 Subject: [PATCH 08/24] fix(ui): use public healthstatus route --- frontend/app/components/Header/HealthStatus/getHealth.ts | 4 ++-- frontend/app/components/Signup/Signup.js | 2 +- frontend/app/services/HealthService.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/app/components/Header/HealthStatus/getHealth.ts b/frontend/app/components/Header/HealthStatus/getHealth.ts index 70bd8914c..c378b0e8f 100644 --- a/frontend/app/components/Header/HealthStatus/getHealth.ts +++ b/frontend/app/components/Header/HealthStatus/getHealth.ts @@ -26,8 +26,8 @@ function mapResponse(resp: Record) { return { overallHealth, healthMap }; } -export async function getHealthRequest() { - const r = await healthService.fetchStatus(); +export async function getHealthRequest(isPublic?: boolean) { + const r = await healthService.fetchStatus(isPublic); const healthMap = mapResponse(r); const asked = new Date().getTime(); localStorage.setItem(healthResponseKey, JSON.stringify(healthMap)); diff --git a/frontend/app/components/Signup/Signup.js b/frontend/app/components/Signup/Signup.js index fc2dfcec4..c6b02f88a 100644 --- a/frontend/app/components/Signup/Signup.js +++ b/frontend/app/components/Signup/Signup.js @@ -54,7 +54,7 @@ export default class Signup extends React.Component { getHealth = async () => { this.setState({ healthStatusLoading: true }); - const { healthMap } = await getHealthRequest(); + const { healthMap } = await getHealthRequest(true); this.setState({ healthStatus: healthMap, healthStatusLoading: false }); } diff --git a/frontend/app/services/HealthService.ts b/frontend/app/services/HealthService.ts index 7d2b3cc7f..bc6815a2c 100644 --- a/frontend/app/services/HealthService.ts +++ b/frontend/app/services/HealthService.ts @@ -1,8 +1,8 @@ import BaseService from './BaseService'; export default class HealthService extends BaseService { - fetchStatus(): Promise { - return this.client.get('/health') + fetchStatus(isPublic?: boolean): Promise { + return this.client.get(isPublic ? '/health' : '/healthz') .then(r => r.json()) .then(j => j.data || {}) } From 7bfc88d88d9d0d7aa7dbe45e74f3514450000c2a Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Fri, 31 Mar 2023 11:07:37 +0100 Subject: [PATCH 09/24] feat(DB): changed get version --- ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql | 2 +- scripts/schema/db/init_dbs/postgresql/init_schema.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql b/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql index 5265f4b00..14b7162db 100644 --- a/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql +++ b/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql @@ -7,7 +7,7 @@ CREATE EXTENSION IF NOT EXISTS pgcrypto; CREATE OR REPLACE FUNCTION openreplay_version() RETURNS text AS $$ -SELECT 'v1.10.0-ee' +SELECT 'v1.11.0-ee' $$ LANGUAGE sql IMMUTABLE; diff --git a/scripts/schema/db/init_dbs/postgresql/init_schema.sql b/scripts/schema/db/init_dbs/postgresql/init_schema.sql index cd5e0e2db..73b2a29ce 100644 --- a/scripts/schema/db/init_dbs/postgresql/init_schema.sql +++ b/scripts/schema/db/init_dbs/postgresql/init_schema.sql @@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS events; CREATE OR REPLACE FUNCTION openreplay_version() RETURNS text AS $$ -SELECT 'v1.10.0' +SELECT 'v1.11.0' $$ LANGUAGE sql IMMUTABLE; From 6fb85aaa2bce29c281973ab527e3b743ead350db Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Fri, 31 Mar 2023 11:07:37 +0100 Subject: [PATCH 10/24] feat(DB): changed get version --- ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql | 2 +- scripts/schema/db/init_dbs/postgresql/init_schema.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql b/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql index 5265f4b00..14b7162db 100644 --- a/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql +++ b/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql @@ -7,7 +7,7 @@ CREATE EXTENSION IF NOT EXISTS pgcrypto; CREATE OR REPLACE FUNCTION openreplay_version() RETURNS text AS $$ -SELECT 'v1.10.0-ee' +SELECT 'v1.11.0-ee' $$ LANGUAGE sql IMMUTABLE; diff --git a/scripts/schema/db/init_dbs/postgresql/init_schema.sql b/scripts/schema/db/init_dbs/postgresql/init_schema.sql index cd5e0e2db..73b2a29ce 100644 --- a/scripts/schema/db/init_dbs/postgresql/init_schema.sql +++ b/scripts/schema/db/init_dbs/postgresql/init_schema.sql @@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS events; CREATE OR REPLACE FUNCTION openreplay_version() RETURNS text AS $$ -SELECT 'v1.10.0' +SELECT 'v1.11.0' $$ LANGUAGE sql IMMUTABLE; From 3588eddfd320ac8fd2b43aef30f054cd4417f785 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Fri, 31 Mar 2023 12:15:12 +0200 Subject: [PATCH 11/24] style(player):rm unused;rename few vars --- frontend/app/player/common/ListWalker.ts | 23 ++++--------------- .../app/player/web/managers/DOM/DOMManager.ts | 6 ----- .../app/player/web/managers/DOM/VirtualDOM.ts | 2 +- 3 files changed, 5 insertions(+), 26 deletions(-) diff --git a/frontend/app/player/common/ListWalker.ts b/frontend/app/player/common/ListWalker.ts index fbd44007b..ca3d409ac 100644 --- a/frontend/app/player/common/ListWalker.ts +++ b/frontend/app/player/common/ListWalker.ts @@ -1,7 +1,7 @@ import type { Timed } from './types'; export default class ListWalker { - private p = 0 + private p = 0 /* Pointer to the "current" item */ constructor(private _list: Array = []) {} append(m: T): void { @@ -130,7 +130,7 @@ export default class ListWalker { return changed ? this.list[ this.p - 1 ] : null; } - moveApply(t: number, fn: (msg: T) => void, fnBack?: (msg: T) => void): void { + async moveWait(t: number, callback: (msg: T) => Promise | undefined): Promise { // Applying only in increment order for now if (t < this.timeNow) { this.reset(); @@ -138,23 +138,8 @@ export default class ListWalker { const list = this.list while (list[this.p] && list[this.p].time <= t) { - fn(this.moveNext()) - } - while (fnBack && this.p > 0 && list[ this.p - 1 ].time > t) { - fnBack(this.movePrev()); - } - } - - async moveWait(t: number, fn: (msg: T) => Promise | undefined): Promise { - // Applying only in increment order for now - if (t < this.timeNow) { - this.reset(); - } - - const list = this.list - while (list[this.p] && list[this.p].time <= t) { - const ret = fn(this.list[ this.p++ ]); - if (ret) { await ret } + const maybePromise = callback(this.list[ this.p++ ]); + if (maybePromise) { await maybePromise } } } diff --git a/frontend/app/player/web/managers/DOM/DOMManager.ts b/frontend/app/player/web/managers/DOM/DOMManager.ts index d5cbdd845..5ae59c5c4 100644 --- a/frontend/app/player/web/managers/DOM/DOMManager.ts +++ b/frontend/app/player/web/managers/DOM/DOMManager.ts @@ -39,7 +39,6 @@ export default class DOMManager extends ListWalker { private readonly vTexts: Map = new Map() // map vs object here? private readonly vElements: Map = new Map() private readonly vRoots: Map = new Map() - private activeIframeRoots: Map = new Map() private styleSheets: Map = new Map() private ppStyleSheets: Map = new Map() private stringDict: Record = {} @@ -197,7 +196,6 @@ export default class DOMManager extends ListWalker { // todo: start from 0-node (sync logic with tracker) this.vTexts.clear() this.stylesManager.reset() - this.activeIframeRoots.clear() this.stringDict = {} return case MType.CreateTextNode: @@ -333,12 +331,8 @@ export default class DOMManager extends ListWalker { logger.warn("No default iframe doc", msg, host) return } - // remove old root of the same iframe if present - const oldRootId = this.activeIframeRoots.get(msg.frameID) - oldRootId != null && this.vRoots.delete(oldRootId) const vDoc = new VDocument(doc) - this.activeIframeRoots.set(msg.frameID, msg.id) this.vRoots.set(msg.id, vDoc) return; } else if (host instanceof Element) { // shadow DOM diff --git a/frontend/app/player/web/managers/DOM/VirtualDOM.ts b/frontend/app/player/web/managers/DOM/VirtualDOM.ts index d9fd3f77a..a528ae658 100644 --- a/frontend/app/player/web/managers/DOM/VirtualDOM.ts +++ b/frontend/app/player/web/managers/DOM/VirtualDOM.ts @@ -135,7 +135,7 @@ export class VStyleElement extends VElement { this.stylesheetCallbacks = [] } else { // console.warn("Style onload: sheet is null") ? - // sometimes logs shit ton of errors for some reason + // sometimes logs sheet ton of errors for some reason } this.loaded = true } From b5600605a78ec754779c2d63be2d0e5d7371768c Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 31 Mar 2023 12:26:11 +0200 Subject: [PATCH 12/24] fix(ui): fix jump to first visual element --- frontend/app/components/Session/WebPlayer.tsx | 16 ++++++++-------- frontend/app/player/web/MessageManager.ts | 6 ++++-- frontend/app/player/web/WebPlayer.ts | 4 ---- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/frontend/app/components/Session/WebPlayer.tsx b/frontend/app/components/Session/WebPlayer.tsx index 5a9280f55..af0b51b41 100644 --- a/frontend/app/components/Session/WebPlayer.tsx +++ b/frontend/app/components/Session/WebPlayer.tsx @@ -74,21 +74,21 @@ function WebPlayer(props: any) { } }, [session.events, session.errors, contextValue.player]) - const isPlayerReady = contextValue.store?.get().ready + const { ready: isPlayerReady, firstVisualEvent: visualOffset } = contextValue.store?.get() || {} React.useEffect(() => { if (showNoteModal) { contextValue.player.pause() } - if (activeTab === '' && !showNoteModal && isPlayerReady) { - contextValue.player && contextValue.player.play() + if (activeTab === '' && !showNoteModal && isPlayerReady && contextValue.player) { + contextValue.player.play() + + if (visualOffset !== 0) { + contextValue.player.jump(visualOffset) + } } - const visualOffset = contextValue.player?.checkVisualOffset?.() || 0 - if (visualOffset !== 0) { - contextValue.player.jump(visualOffset) - } - }, [activeTab, isPlayerReady, showNoteModal]) + }, [activeTab, isPlayerReady, showNoteModal, visualOffset]) // LAYOUT (TODO: local layout state - useContext or something..) useEffect( diff --git a/frontend/app/player/web/MessageManager.ts b/frontend/app/player/web/MessageManager.ts index 4e07b4059..5566b5cc6 100644 --- a/frontend/app/player/web/MessageManager.ts +++ b/frontend/app/player/web/MessageManager.ts @@ -65,6 +65,7 @@ export interface State extends ScreenState, ListsState { ready: boolean, lastMessageTime: number, + firstVisualEvent: number, } @@ -91,6 +92,7 @@ export default class MessageManager { cssLoading: false, ready: false, lastMessageTime: 0, + firstVisualEvent: 0, } private locationEventManager: ListWalker/**/ = new ListWalker(); @@ -116,7 +118,7 @@ export default class MessageManager { private sessionStart: number; private navigationStartOffset: number = 0; private lastMessageTime: number = 0; - public firstVisualEvent: number = 0; + private firstVisualEventSet = false; constructor( private readonly session: any /*Session*/, @@ -468,7 +470,7 @@ export default class MessageManager { default: switch (msg.tp) { case MType.CreateDocument: - if (this.firstVisualEvent === 0) this.firstVisualEvent = msg.time; + if (!this.firstVisualEventSet) this.state.update({ firstVisualEvent: msg.time }); this.windowNodeCounter.reset(); this.performanceTrackManager.setCurrentNodesCount(this.windowNodeCounter.count); break; diff --git a/frontend/app/player/web/WebPlayer.ts b/frontend/app/player/web/WebPlayer.ts index f83a6a832..a2e22ef5c 100644 --- a/frontend/app/player/web/WebPlayer.ts +++ b/frontend/app/player/web/WebPlayer.ts @@ -146,10 +146,6 @@ export default class WebPlayer extends Player { this.screen.cursor.showTag(name) } - checkVisualOffset = () => { - return this.messageManager.firstVisualEvent - } - clean = () => { super.clean() this.screen.clean() From 8fa5bc6f758e04683f809cddabb5cddb4a2b2c11 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 31 Mar 2023 12:36:13 +0200 Subject: [PATCH 13/24] fix(player): fix for parser --- frontend/app/player/web/MessageManager.ts | 2 +- frontend/app/player/web/messages/RawMessageReader.gen.ts | 5 ++--- ...ntend~app~player~web~messages~RawMessageReader.gen.ts.erb | 5 ++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/frontend/app/player/web/MessageManager.ts b/frontend/app/player/web/MessageManager.ts index 5566b5cc6..eee29593e 100644 --- a/frontend/app/player/web/MessageManager.ts +++ b/frontend/app/player/web/MessageManager.ts @@ -224,7 +224,7 @@ export default class MessageManager { fileReader.append(b) const msgs: Array = [] for (let msg = fileReader.readNext();msg !== null;msg = fileReader.readNext()) { - msg && msgs.push(msg) + msgs.push(msg) } const sorted = msgs.sort((m1, m2) => { // @ts-ignore diff --git a/frontend/app/player/web/messages/RawMessageReader.gen.ts b/frontend/app/player/web/messages/RawMessageReader.gen.ts index 0ae41e9a4..135960cef 100644 --- a/frontend/app/player/web/messages/RawMessageReader.gen.ts +++ b/frontend/app/player/web/messages/RawMessageReader.gen.ts @@ -800,9 +800,8 @@ export default class RawMessageReader extends PrimitiveReader { } default: - console.error(`Unrecognizable message type: ${ tp }; Pointer at the position ${this.p} of ${this.buf.length}`) - // skipping unrecognized messages - return false; + throw new Error(`Unrecognizable message type: ${ tp }; Pointer at the position ${this.p} of ${this.buf.length}`) + return null; } } } diff --git a/mobs/templates/frontend~app~player~web~messages~RawMessageReader.gen.ts.erb b/mobs/templates/frontend~app~player~web~messages~RawMessageReader.gen.ts.erb index 4b59b9d59..3c9268366 100644 --- a/mobs/templates/frontend~app~player~web~messages~RawMessageReader.gen.ts.erb +++ b/mobs/templates/frontend~app~player~web~messages~RawMessageReader.gen.ts.erb @@ -30,9 +30,8 @@ export default class RawMessageReader extends PrimitiveReader { } <% end %> default: - console.error(`Unrecognizable message type: ${ tp }; Pointer at the position ${this.p} of ${this.buf.length}`) - // skipping unrecognized messages - return false; + throw new Error(`Unrecognizable message type: ${ tp }; Pointer at the position ${this.p} of ${this.buf.length}`) + return null; } } } From b60b0378cc12d618f728af269bf09a947ba2f844 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Fri, 31 Mar 2023 12:04:15 +0100 Subject: [PATCH 14/24] feat(chalice): changed projects sort --- api/chalicelib/core/projects.py | 2 +- ee/api/chalicelib/core/projects.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/chalicelib/core/projects.py b/api/chalicelib/core/projects.py index 865a4a73c..0ec2ab97c 100644 --- a/api/chalicelib/core/projects.py +++ b/api/chalicelib/core/projects.py @@ -83,7 +83,7 @@ def get_projects(tenant_id, recording_state=False, gdpr=None, recorded=False, st FROM public.projects AS s {extra_join} WHERE s.deleted_at IS NULL - ORDER BY s.project_id {") AS raw" if recorded else ""};""", {"now": TimeUTC.now()}) + ORDER BY s.name {") AS raw" if recorded else ""};""", {"now": TimeUTC.now()}) cur.execute(query) rows = cur.fetchall() # if recorded is requested, check if it was saved or computed diff --git a/ee/api/chalicelib/core/projects.py b/ee/api/chalicelib/core/projects.py index 467f4185e..4d77f7ba5 100644 --- a/ee/api/chalicelib/core/projects.py +++ b/ee/api/chalicelib/core/projects.py @@ -95,7 +95,7 @@ def get_projects(tenant_id, recording_state=False, gdpr=None, recorded=False, st {role_query if user_id is not None else ""} WHERE s.tenant_id =%(tenant_id)s AND s.deleted_at IS NULL - ORDER BY s.project_id {") AS raw" if recorded else ""};""", + ORDER BY s.name {") AS raw" if recorded else ""};""", {"tenant_id": tenant_id, "user_id": user_id, "now": TimeUTC.now()}) cur.execute(query) rows = cur.fetchall() From d4fc1c76f5f9250b880e1b924b420068d9fdb243 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 31 Mar 2023 14:25:32 +0200 Subject: [PATCH 15/24] fix(player): fix potential error --- .../app/components/Session/Player/LivePlayer/LiveControls.tsx | 2 +- frontend/app/components/Session_/Player/Controls/Controls.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/app/components/Session/Player/LivePlayer/LiveControls.tsx b/frontend/app/components/Session/Player/LivePlayer/LiveControls.tsx index c17902380..7a5ccb8d3 100644 --- a/frontend/app/components/Session/Player/LivePlayer/LiveControls.tsx +++ b/frontend/app/components/Session/Player/LivePlayer/LiveControls.tsx @@ -14,7 +14,7 @@ import { fetchSessions } from 'Duck/liveSearch'; import AssistDuration from './AssistDuration'; import Timeline from './Timeline'; import ControlButton from 'Components/Session_/Player/Controls/ControlButton'; - +import { SKIP_INTERVALS } from 'Components/Session_/Player/Controls/Controls' import styles from 'Components/Session_/Player/Controls/controls.module.css'; function Controls(props: any) { diff --git a/frontend/app/components/Session_/Player/Controls/Controls.tsx b/frontend/app/components/Session_/Player/Controls/Controls.tsx index 37d8bdbef..0ee93cf92 100644 --- a/frontend/app/components/Session_/Player/Controls/Controls.tsx +++ b/frontend/app/components/Session_/Player/Controls/Controls.tsx @@ -31,7 +31,7 @@ import PlayerControls from './components/PlayerControls'; import styles from './controls.module.css'; import XRayButton from 'Shared/XRayButton'; -const SKIP_INTERVALS = { +export const SKIP_INTERVALS = { 2: 2e3, 5: 5e3, 10: 1e4, From 2895795e8feafa7da4b8c10ee727fb20733e884c Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 31 Mar 2023 11:54:01 +0200 Subject: [PATCH 16/24] change(ui) - search cleanup --- .../shared/MainSearchBar/MainSearchBar.tsx | 55 +++++------ .../SessionSearchField/SessionSearchField.tsx | 96 +++++++++---------- 2 files changed, 69 insertions(+), 82 deletions(-) diff --git a/frontend/app/components/shared/MainSearchBar/MainSearchBar.tsx b/frontend/app/components/shared/MainSearchBar/MainSearchBar.tsx index e3c9cd9a8..2bdd2514c 100644 --- a/frontend/app/components/shared/MainSearchBar/MainSearchBar.tsx +++ b/frontend/app/components/shared/MainSearchBar/MainSearchBar.tsx @@ -2,51 +2,40 @@ import React from 'react'; import SessionSearchField from 'Shared/SessionSearchField'; import SavedSearch from 'Shared/SavedSearch'; import { Button } from 'UI'; -// import { clearSearch } from 'Duck/search'; import { connect } from 'react-redux'; -import { edit as editFilter, addFilterByKeyAndValue, clearSearch, fetchFilterSearch } from 'Duck/search'; +import { clearSearch } from 'Duck/search'; interface Props { - clearSearch: () => void; - appliedFilter: any; - optionsReady: boolean; - editFilter: any, - addFilterByKeyAndValue: any, - fetchFilterSearch: any, + clearSearch: () => void; + appliedFilter: any; } const MainSearchBar = (props: Props) => { - const { appliedFilter } = props; + const { appliedFilter } = props; const hasFilters = appliedFilter && appliedFilter.filters && appliedFilter.filters.size > 0; return (
-
- -
-
+
+ +
+
-
+
- ) -} -export default connect(state => ({ + ); +}; +export default connect( + (state: any) => ({ appliedFilter: state.getIn(['search', 'instance']), - optionsReady: state.getIn(['customFields', 'optionsReady']) -}), { + }), + { clearSearch, - editFilter, - addFilterByKeyAndValue, - fetchFilterSearch -})(MainSearchBar); + } +)(MainSearchBar); diff --git a/frontend/app/components/shared/SessionSearchField/SessionSearchField.tsx b/frontend/app/components/shared/SessionSearchField/SessionSearchField.tsx index 0e6529e18..b5c663452 100644 --- a/frontend/app/components/shared/SessionSearchField/SessionSearchField.tsx +++ b/frontend/app/components/shared/SessionSearchField/SessionSearchField.tsx @@ -4,66 +4,64 @@ import { Input } from 'UI'; import FilterModal from 'Shared/Filters/FilterModal'; import { debounce } from 'App/utils'; import { assist as assistRoute, isRoute } from 'App/routes'; +import { addFilterByKeyAndValue, fetchFilterSearch } from 'Duck/search'; const ASSIST_ROUTE = assistRoute(); interface Props { - fetchFilterSearch: (query: any) => void; - addFilterByKeyAndValue: (key: string, value: string) => void; - filterList: any; - filterListLive: any; - filterSearchListLive: any; - filterSearchList: any; + fetchFilterSearch: (query: any) => void; + addFilterByKeyAndValue: (key: string, value: string) => void; + filterSearchListLive: any; + filterSearchList: any; } function SessionSearchField(props: Props) { - const debounceFetchFilterSearch = React.useCallback(debounce(props.fetchFilterSearch, 1000), []); - const [showModal, setShowModal] = useState(false); - const [searchQuery, setSearchQuery] = useState(''); + const debounceFetchFilterSearch = React.useCallback(debounce(props.fetchFilterSearch, 1000), []); + const [showModal, setShowModal] = useState(false); + const [searchQuery, setSearchQuery] = useState(''); - const onSearchChange = ({ target: { value } }: any) => { - setSearchQuery(value); - debounceFetchFilterSearch({ q: value }); - }; + const onSearchChange = ({ target: { value } }: any) => { + setSearchQuery(value); + debounceFetchFilterSearch({ q: value }); + }; - const onAddFilter = (filter: any) => { - props.addFilterByKeyAndValue(filter.key, filter.value); - }; + const onAddFilter = (filter: any) => { + props.addFilterByKeyAndValue(filter.key, filter.value); + }; - return ( -
- setShowModal(true)} - onBlur={() => setTimeout(setShowModal, 200, false)} - onChange={onSearchChange} - placeholder={'Search sessions using any captured event (click, input, page, error...)'} - id="search" - type="search" - autoComplete="off" - className="hover:border-gray-medium text-lg placeholder-lg" - /> + return ( +
+ setShowModal(true)} + onBlur={() => setTimeout(setShowModal, 200, false)} + onChange={onSearchChange} + placeholder={'Search sessions using any captured event (click, input, page, error...)'} + id="search" + type="search" + autoComplete="off" + className="hover:border-gray-medium text-lg placeholder-lg" + /> - {showModal && ( -
- -
- )} + {showModal && ( +
+
- ); + )} +
+ ); } export default connect( - (state: any) => ({ - filterSearchList: state.getIn(['search', 'filterSearchList']), - filterSearchListLive: state.getIn(['liveSearch', 'filterSearchList']), - filterList: state.getIn(['search', 'filterList']), - filterListLive: state.getIn(['search', 'filterListLive']), - }), - {} + (state: any) => ({ + filterSearchList: state.getIn(['search', 'filterSearchList']), + filterSearchListLive: state.getIn(['liveSearch', 'filterSearchList']), + }), + { addFilterByKeyAndValue, fetchFilterSearch } )(SessionSearchField); From c38dd87f3f30f2e999180ab174afb13cfc2c98ab Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 31 Mar 2023 14:13:48 +0200 Subject: [PATCH 17/24] change(ui) - search to add or values from search field --- frontend/app/duck/search.js | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/frontend/app/duck/search.js b/frontend/app/duck/search.js index 54b3f0132..9e4b9396e 100644 --- a/frontend/app/duck/search.js +++ b/frontend/app/duck/search.js @@ -349,20 +349,38 @@ export const hasFilterApplied = (filters, filter) => { return !filter.isEvent && filters.some((f) => f.key === filter.key); }; +const getAppliedFilterIndex = (filters, filterToFind) => { + if (!filterToFind.isEvent) { + return filters.findIndex((filter) => filter.key === filterToFind.key); + } + return -1; + }; + export const addFilter = (filter) => (dispatch, getState) => { filter.value = checkFilterValue(filter.value); filter.filters = filter.filters - ? filter.filters.map((subFilter) => ({ - ...subFilter, - value: checkFilterValue(subFilter.value), - })) - : null; - const instance = getState().getIn(['search', 'instance']); + ? filter.filters.map((subFilter) => ({ + ...subFilter, + value: checkFilterValue(subFilter.value), + })) + : null; - if (hasFilterApplied(instance.filters, filter)) { + const instance = getState().getIn(['search', 'instance']); + const filters = instance.get('filters'); + const index = getAppliedFilterIndex(filters, filter); + + if (index !== -1) { + const oldFilter = filters.get(index); + const updatedFilter = { + ...oldFilter, + value: oldFilter.value.concat(filter.value), + }; + + const updatedFilters = filters.set(index, updatedFilter); + return dispatch(edit(instance.set('filters', updatedFilters))); } else { - const filters = instance.filters.push(filter); - return dispatch(edit(instance.set('filters', filters))); + const updatedFilters = filters.push(filter); + return dispatch(edit(instance.set('filters', updatedFilters))); } }; From 70c63f7b07495b459f1b2efd8d3cdbc9a9109618 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 31 Mar 2023 14:36:44 +0200 Subject: [PATCH 18/24] change(ui) - search live vs recorded --- .../AssistSearchField/AssistSearchField.tsx | 2 +- .../Filters/FilterModal/FilterModal.tsx | 185 ++++++++++-------- .../SessionSearchField/SessionSearchField.tsx | 37 ++-- 3 files changed, 129 insertions(+), 95 deletions(-) diff --git a/frontend/app/components/Assist/AssistSearchField/AssistSearchField.tsx b/frontend/app/components/Assist/AssistSearchField/AssistSearchField.tsx index df53e4404..2481d2785 100644 --- a/frontend/app/components/Assist/AssistSearchField/AssistSearchField.tsx +++ b/frontend/app/components/Assist/AssistSearchField/AssistSearchField.tsx @@ -18,7 +18,7 @@ function AssistSearchField(props: Props) { return (
- +