diff --git a/frontend/app/player/web/MessageManager.ts b/frontend/app/player/web/MessageManager.ts index 1f4e2d096..55139f158 100644 --- a/frontend/app/player/web/MessageManager.ts +++ b/frontend/app/player/web/MessageManager.ts @@ -2,7 +2,7 @@ import { Decoder } from "syncod"; import logger from 'App/logger'; -import type { Store } from 'Player'; +import type { Store, ILog } from 'Player'; import ListWalker from '../common/ListWalker'; import MouseMoveManager from './managers/MouseMoveManager'; @@ -15,8 +15,6 @@ import type { MouseClick, } from './messages'; -import Lists from './Lists'; - import Screen, { INITIAL_STATE as SCREEN_INITIAL_STATE, State as ScreenState, @@ -27,6 +25,13 @@ import type { SkipInterval } from './managers/ActivityManager'; import TabSessionManager, { TabState } from "Player/web/TabManager"; import ActiveTabManager from "Player/web/managers/ActiveTabManager"; +interface RawList { + event: Record[] & { tabId: string | null } + frustrations: Record[] & { tabId: string | null } + stack: Record[] & { tabId: string | null } + exceptions: ILog[] +} + export interface State extends ScreenState { skipIntervals: SkipInterval[], connType?: string, @@ -103,14 +108,27 @@ export default class MessageManager { } public getListsFullState = () => { - // fullstate by tab - console.log(Object.values(this.tabs)[0].getListsFullState()) + const fullState: Record = {} + for (let tab in Object.keys(this.tabs)) { + fullState[tab] = this.tabs[tab].getListsFullState() + } return Object.values(this.tabs)[0].getListsFullState() } - public updateLists(lists: Partial) { - // update each tab with tabid from events !!! - Object.values(this.tabs)[0]?.updateLists?.(lists) + public updateLists(lists: RawList) { + // update each tab with tabid from events + for (let tab in Object.keys(this.tabs)) { + const list = { + event: lists.event.filter((e) => e.tabId === tab), + frustrations: lists.frustrations.filter((e) => e.tabId === tab), + stack: lists.stack.filter((e) => e.tabId === tab), + exceptions: lists.exceptions.filter((e) => e.tabId === tab), + } + // saving some microseconds here probably + if (Object.values(list).some((l) => l.length > 0)) { + this.tabs[tab]!.updateLists(list) + } + } } public _sortMessagesHack = (msgs: Message[]) => { @@ -153,6 +171,8 @@ export default class MessageManager { } move(t: number): any { + // usually means waiting for messages from live session + if (Object.keys(this.tabs).length === 0) return; this.activeTabManager.moveReady(t).then(tabId => { // Moving mouse and setting :hover classes on ready view this.mouseMoveManager.move(t); diff --git a/frontend/app/player/web/WebPlayer.ts b/frontend/app/player/web/WebPlayer.ts index 64cc3dd8f..fb1c604b6 100644 --- a/frontend/app/player/web/WebPlayer.ts +++ b/frontend/app/player/web/WebPlayer.ts @@ -83,7 +83,7 @@ export default class WebPlayer extends Player { } updateLists = (session: any) => { - let lists = { + const lists = { event: session.events || [], frustrations: session.frustrations || [], stack: session.stackEvents || [], diff --git a/frontend/app/player/web/assist/AssistManager.ts b/frontend/app/player/web/assist/AssistManager.ts index d789b7efc..3c5436283 100644 --- a/frontend/app/player/web/assist/AssistManager.ts +++ b/frontend/app/player/web/assist/AssistManager.ts @@ -187,7 +187,7 @@ export default class AssistManager { }) socket.on('UPDATE_SESSION', (evData) => { - const { metadata, data } = evData + const { metadata = {}, data = {} } = evData const { tabId } = metadata const { active } = data this.clearDisconnectTimeout() diff --git a/frontend/app/player/web/assist/RemoteControl.ts b/frontend/app/player/web/assist/RemoteControl.ts index 92bcd8a0c..12a11c19c 100644 --- a/frontend/app/player/web/assist/RemoteControl.ts +++ b/frontend/app/player/web/assist/RemoteControl.ts @@ -55,7 +55,6 @@ export default class RemoteControl { } private emitData = (event: string, data?: any) => { - console.log('emit data', event, data, { meta: { tabId: this.store.get().currentTab }, data }) this.socket.emit(event, { meta: { tabId: this.store.get().currentTab }, data }) } diff --git a/frontend/app/player/web/messages/MStreamReader.ts b/frontend/app/player/web/messages/MStreamReader.ts index 003d56b31..1954c53e5 100644 --- a/frontend/app/player/web/messages/MStreamReader.ts +++ b/frontend/app/player/web/messages/MStreamReader.ts @@ -18,7 +18,10 @@ export default class MStreamReader { if (msg === null) { return null } if (msg.tp === MType.Timestamp) { this.startTs = this.startTs || msg.timestamp - this.t = msg.timestamp - this.startTs + const newT = msg.timestamp - this.startTs + if (newT > this.t) { + this.t = newT + } return this.readNext() } if (msg.tp === MType.TabData) { diff --git a/frontend/app/player/web/types/log.ts b/frontend/app/player/web/types/log.ts index 22a20d33c..645f0db99 100644 --- a/frontend/app/player/web/types/log.ts +++ b/frontend/app/player/web/types/log.ts @@ -13,6 +13,7 @@ export interface ILog { time: number index?: number errorId?: string + tabId?: string } export const Log = (log: ILog) => ({ diff --git a/frontend/app/types/session/event.ts b/frontend/app/types/session/event.ts index edb63cda7..a20bcc768 100644 --- a/frontend/app/types/session/event.ts +++ b/frontend/app/types/session/event.ts @@ -23,6 +23,7 @@ interface IEvent { key: number; label: string; targetPath: string; + tabId?: string; target: { path: string; label: string; @@ -69,12 +70,14 @@ class Event { time: IEvent['time']; label: IEvent['label']; target: IEvent['target']; + tabId: IEvent['tabId']; constructor(event: IEvent) { Object.assign(this, { time: event.time, label: event.label, key: event.key, + tabId: event.tabId, target: { path: event.target?.path || event.targetPath, label: event.target?.label, diff --git a/tracker/tracker-assist/package.json b/tracker/tracker-assist/package.json index 395bae34f..f61d88f73 100644 --- a/tracker/tracker-assist/package.json +++ b/tracker/tracker-assist/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker-assist", "description": "Tracker plugin for screen assistance through the WebRTC", - "version": "6.0.0", + "version": "6.0.1-4", "keywords": [ "WebRTC", "assistance", @@ -13,6 +13,7 @@ "type": "module", "main": "./lib/index.js", "scripts": { + "tsrun": "tsc", "lint": "eslint src --ext .ts,.js --fix --quiet", "build": "npm run build-es && npm run build-cjs", "build-es": "rm -Rf lib && tsc && npm run replace-versions", @@ -25,7 +26,8 @@ "prepare": "cd ../../ && husky install tracker/.husky/", "lint-front": "lint-staged", "test": "jest --coverage=false", - "test:ci": "jest --coverage=true" + "test:ci": "jest --coverage=true", + "postversion": "npm run build" }, "dependencies": { "csstype": "^3.0.10", @@ -43,13 +45,13 @@ "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.1", + "jest": "^29.3.1", + "jest-environment-jsdom": "^29.3.1", "lint-staged": "^13.0.3", "prettier": "^2.7.1", "replace-in-files-cli": "^1.0.0", - "typescript": "^4.6.0-dev.20211126", - "jest": "^29.3.1", - "jest-environment-jsdom": "^29.3.1", - "ts-jest": "^29.0.3" + "ts-jest": "^29.0.3", + "typescript": "^4.6.0-dev.20211126" }, "husky": { "hooks": { diff --git a/tracker/tracker-assist/src/Assist.ts b/tracker/tracker-assist/src/Assist.ts index 2653d603a..4061785a8 100644 --- a/tracker/tracker-assist/src/Assist.ts +++ b/tracker/tracker-assist/src/Assist.ts @@ -279,7 +279,10 @@ export default class Assist { } this.assistDemandedRestart = true this.app.stop() - this.app.start().then(() => { this.assistDemandedRestart = false }).catch(e => app.debug.error(e)) + setTimeout(() => { + this.app.start().then(() => { this.assistDemandedRestart = false }).catch(e => app.debug.error(e)) + // TODO: check if it's needed; basically allowing some time for the app to finish everything before starting again + }, 350) }) socket.on('AGENTS_CONNECTED', (ids: string[]) => { ids.forEach(id =>{ diff --git a/tracker/tracker-assist/tsconfig-cjs.json b/tracker/tracker-assist/tsconfig-cjs.json index 72d985654..7f85ad21f 100644 --- a/tracker/tracker-assist/tsconfig-cjs.json +++ b/tracker/tracker-assist/tsconfig-cjs.json @@ -2,6 +2,8 @@ "extends": "./tsconfig.json", "compilerOptions": { "module": "CommonJS", - "outDir": "./cjs" + "outDir": "./cjs", + "rootDir": "src" }, + "exclude": ["**/*.test.ts"] } \ No newline at end of file diff --git a/tracker/tracker-assist/tsconfig.json b/tracker/tracker-assist/tsconfig.json index 2faaed678..bb9a17073 100644 --- a/tracker/tracker-assist/tsconfig.json +++ b/tracker/tracker-assist/tsconfig.json @@ -8,6 +8,8 @@ "moduleResolution": "node", "allowSyntheticDefaultImports": true, "declaration": true, - "outDir": "./lib" - } + "outDir": "./lib", + "rootDir": "src" + }, + "exclude": ["**/*.test.ts"] } diff --git a/tracker/tracker/package.json b/tracker/tracker/package.json index 3804afd21..ba6554953 100644 --- a/tracker/tracker/package.json +++ b/tracker/tracker/package.json @@ -23,7 +23,8 @@ "prepare": "cd ../../ && husky install tracker/.husky/", "lint-front": "lint-staged", "test": "jest --coverage=false", - "test:ci": "jest --coverage=true" + "test:ci": "jest --coverage=true", + "postversion": "npm run build" }, "devDependencies": { "@babel/core": "^7.10.2", diff --git a/tracker/tracker/src/webworker/QueueSender.ts b/tracker/tracker/src/webworker/QueueSender.ts index f8cbaa43e..83b7e8f7b 100644 --- a/tracker/tracker/src/webworker/QueueSender.ts +++ b/tracker/tracker/src/webworker/QueueSender.ts @@ -135,6 +135,6 @@ export default class QueueSender { setTimeout(() => { this.token = null this.queue.length = 0 - }, 100) + }, 10) } } diff --git a/tracker/tracker/src/webworker/index.ts b/tracker/tracker/src/webworker/index.ts index 7f5605236..c7f781669 100644 --- a/tracker/tracker/src/webworker/index.ts +++ b/tracker/tracker/src/webworker/index.ts @@ -45,7 +45,7 @@ function resetSender(): void { // allowing some time to send last batch setTimeout(() => { sender = null - }, 500) + }, 20) } } @@ -57,7 +57,9 @@ function reset(): void { } resetWriter() resetSender() - workerStatus = WorkerStatus.NotActive + setTimeout(() => { + workerStatus = WorkerStatus.NotActive + }, 100) } function initiateRestart(): void {